Repository: so1n/protobuf_to_pydantic (language: python)

Issue:
Feat, support mutli config



Discussion / hints:

Fix patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a380c51..a0f5ea1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
 repos:
   - repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v1.0.0
+    rev: v1.8.0
     hooks:
       - id: mypy
         exclude: "^example/example_proto|^example/proto|^protobuf_to_pydantic/protos|test_p2p_validate.py$|test_pgv_validate.py$|protobuf_to_pydantic/contrib/proto_parser.py|example/validate_example/demo_gen_code_by_pgv.py|example/p2p_validate_example/demo_gen_code_by_p2p.py|protobuf_to_pydantic/_pydantic_adapter.py|protobuf_to_pydantic/customer_validator/__init__.py|protobuf_to_pydantic/customer_validator/v1.py|protobuf_to_pydantic/customer_validator/v2.py|protobuf_to_pydantic/customer_con_type/__init__.py|protobuf_to_pydantic/customer_con_type/v1.py|protobuf_to_pydantic/customer_con_type/v2.py|protobuf_to_pydantic/grpc_types.py"
diff --git a/README.md b/README.md
index 59d5343..c0c49d1 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,10 @@ pip install protobuf_to_pydantic[all]
 # Usage
 ## 1.code generation
 `protobuf-to-pydantic` currently has two methods to generate `Pydantic Model` objects based on Protobuf files.：
-- 1: Use the `Protoc` plug-in to generate the corresponding `Python` code file through the Protobuf file。
-- 2: Generate the corresponding `Pydantic Model` object through the `Message` object in `Python` runtime。
+- 1: Plugin Mode: Use the `Protoc` plug-in to generate the corresponding `Python` code file through the Protobuf file。
+- 2: Runtime Mode: Generate the corresponding `Pydantic Model` object through the `Message` object in `Python` runtime。
 
-### 1.1.Directly generate `Pydantic Model` code files through plug-ins
+### 1.1.Plugin Mode
 #### 1.1.0.Install dependencies
 The `protobuf-to-pydantic` plug-in depends on `mypy-protobuf`, need to install `mypy-protobuf` through the following command first:
 ```bash
@@ -71,9 +71,10 @@ After running the command, the `protobuf-to-pydantic` plugin writes the generate
 #### 1.1.2.Plug-in configuration
 The `protobuf-to-pydantic` plugin supports loading configuration by reading a `Python` file。
 
-> In order to ensure that the variables of the configuration file can be introduced normally, the configuration file must be stored in the current path of the running command.。
+> In order to ensure that the variables of the configuration file can be introduced normally, the configuration file should be stored in the current path where the command is run.
+
+An example configuration that can be read by 'protobuf_to_pydantic' would look like:
 
-An example configuration that can be read by `protobuf-to-pydantic` is as follows:
 ```Python
 import logging
 from typing import List, Type
@@ -82,31 +83,35 @@ from google.protobuf.any_pb2 import Any  # type: ignore
 from pydantic import confloat, conint
 from pydantic.fields import FieldInfo
 
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.template import Template
 
 # Configure the log output format and log level of the plugin, which is very useful when debugging
-logging.basicConfig(format="[%(asctime)s %(levelname)s] %(message)s", datefmt="%y-%m-%d %H:%M:%S", level=logging.DEBUG)
+logging.basicConfig(
+  format="[%(asctime)s %(levelname)s] %(message)s",
+  datefmt="%y-%m-%d %H:%M:%S",
+  level=logging.DEBUG
+)
 
 
 class CustomerField(FieldInfo):
-    pass
+  pass
 
 
 def customer_any() -> Any:
-    return Any  # type: ignore
+  return Any  # type: ignore
 
 
 # For the configuration of the local template, see the use of the local template for details
 local_dict = {
-    "CustomerField": CustomerField,
-    "confloat": confloat,
-    "conint": conint,
-    "customer_any": customer_any,
+  "CustomerField": CustomerField,
+  "confloat": confloat,
+  "conint": conint,
+  "customer_any": customer_any,
 }
 # Specifies the start of key comments
 comment_prefix = "p2p"
 # Specify the class of the template, can extend the template by inheriting this class, see the chapter on custom templates for details
-desc_template: Type[DescTemplate] = DescTemplate
+template: Type[Template] = Template
 # Specify the protobuf files of which packages to ignore, and the messages of the ignored packages will not be parsed
 ignore_pkg_list: List[str] = ["validate", "p2p_validate"]
 # Specifies the generated file name suffix (without .py)
@@ -126,27 +131,32 @@ In addition to the configuration options in the example configuration file,
 the `protobuf-to-pydantic` plug-in also supports other configuration options.
 The specific configuration instructions are as follows：
 
-| Configuration name            | Functional module                      | Type                                            | Hidden meaning                                                                                                                                      |
-|-------------------------------|----------------------------------------|-------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
-| local_dict                    | Template                               | dict                                            | Holds variables for the `local` template                                                                                                            |
-| desc_template                 | Template                               | protobuf_to_pydantic.desc_template.DescTemplate | Implementation of the template class                                                                                                                |
-| comment_prefix                | Template                               | str                                             | Comment prefix.Only strings with a fixed prefix will be used by the template                                                                        |
-| customer_import_set           | Code generation                        | `Set[str]`                                      | A collection of custom import statements, such as `from typing import Set`or `import typing`, that will write data in order to the source code file |
-| customer_deque                | Code generation                        | `deque[str]`                                    | Custom source file content, used to add custom content                                                                                              |
-| module_path                   | str                                    | str                                             | Used to define the root path of the project or module, which helps `protobuf-to-pydantic`to better automatically generate module import statements   |
-| pyproject_file_path           | Code generation                        | str                                             | Define the pyproject file path, which defaults to the current project path                                                                          |
-| code_indent                   | Code generation                        | int                                             | Defines the number of indentation Spaces in the code; the default is 4                                                                              |
-| ignore_pkg_list               | Code generation(Limit plug-ins only)   | `list[str]`                                     | Definition ignores parsing of the specified package file                                                                                            |
-| base_model_class              | Model Code generation, Code generation | `Type[BaseModel]`                               | Define the parent class of the generated Model                                                                                                      |
-| file_name_suffix              | Code generation                        | str                                             | Define the generated file suffix, default `_p2p.py`                                                                                                 |
-| file_descriptor_proto_to_code | Code generation(Limit plug-ins only)   | `Type[FileDescriptorProtoToCode]`               | Define the `FileDescriptorProtoToCode` to use                                                                                                       |
-
+| Configuration name            | Functional module                      | Type                                            | Hidden meaning                                                                                                                                                   |
+|-------------------------------|----------------------------------------|-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| local_dict                    | Template                               | dict                                            | Holds variables for the `local` template                                                                                                                         |
+| template                 | Template                               | protobuf_to_pydantic.template.Template | Implementation of the template class                                                                                                                             |
+| comment_prefix                | Template                               | str                                             | Comment prefix.Only strings with a fixed prefix will be used by the template                                                                                     |
+| parse_comment                 | comment(plugin only)                   | bool                                            | If true, the annotation rule is compatible                                                                                                                       |
+| customer_import_set           | Code generation                        | `Set[str]`                                      | A collection of custom import statements, such as `from typing import Set`or `import typing`, that will write data in order to the source code file              |
+| customer_deque                | Code generation                        | `deque[str]`                                    | Custom source file content, used to add custom content                                                                                                           |
+| module_path                   | str                                    | str                                             | Used to define the root path of the project or module, which helps `protobuf-to-pydantic`to better automatically generate module import statements               |
+| pyproject_file_path           | Code generation                        | str                                             | Define the pyproject file path, which defaults to the current project path                                                                                       |
+| code_indent                   | Code generation                        | int                                             | Defines the number of indentation Spaces in the code; the default is 4                                                                                           |
+| ignore_pkg_list               | Code generation(plugin only)           | `list[str]`                                     | Definition ignores parsing of the specified package file                                                                                                         |
+| base_model_class              | Model Code generation, Code generation | `Type[BaseModel]`                               | Define the parent class of the generated Model                                                                                                                   |
+| file_name_suffix              | Code generation                        | str                                             | Define the generated file suffix, default `_p2p.py`                                                                                                              |
+| file_descriptor_proto_to_code | Code generation(plugin only)           | `Type[FileDescriptorProtoToCode]`               | Define the `FileDescriptorProtoToCode` to use                                                                                                                    |
+| protobuf_type_config          | Code generation(plugin only) | `Dict[str, ProtobufTypeConfigModel]`            | Compatible with non-standard ones Message, See[ConfigModel note](https://github.com/so1n/protobuf_to_pydantic/blob/master/protobuf_to_pydantic/plugin/config.py) |
+| pkg_config                    |Code generation(plugin only)| `Dict[str, "ConfigModel"]`                        | Adapt the corresponding configuration for each PKG                                                                                                               |
 
+> Note:
+>   - 1:For more information, see the configuration instructions[/protobuf_to_pydantic/plugin/config.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/protobuf_to_pydantic/plugin/config.py)
+>   - 2:See for directions of use[/example/plugin_config.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/plugin_config.py)
 #### 1.1.3.buf-cli
 If you are using `buf-cli` to manage Protobuf files,
 then you can also use `protobuf-to-pydantic` in `buf-cli`, See [How to use `protobuf-to-pydantic` in `buf-cli`](https://github.com/so1n/protobuf_to_pydantic/blob/master/buf-plugin/README.md)
 
-### 1.2.Generate a `Pydantic Model` object in Python runtime
+### 1.2.Runtime Mode
 `protobuf_to_pydantic` can generate the corresponding `PydanticModel` object based on the `Message` object at runtime。
 
 For example, the `UserMessage` in the following Protobuf file named `demo.proto`:
@@ -211,10 +221,88 @@ The `msg_to_pydantic_model` func is customizable just like plugins, with the fol
 | local_dict                                | Variables used by the `local` template                    |
 | pydantic_base                             | Generates the parent class of the `Pydantic Model` object |
 | pydantic_module                           | Generate the `Module` of the `Pydantic Model` object      |
-| desc_template                             | Template class to use                                     |
+| template                             | Template class to use                                     |
 | message_type_dict_by_type_name            | Protobuf type mapping to `Python` type                    |
 | message_default_factory_dict_by_type_name | Protobuf type mapping to the Python type factory          |
 
+Among them, `parse_msg_desc_method` defines the rule information where `protobuf_to_pydantic` obtains the Message object.
+
+### 1.2.1.parse_msg_desc_method
+By default, the value of `parse_msg_desc_method` is empty. In this case, `protobuf_to_pydantic` obtains the parameter validation rules through the Option of the Message object.
+
+If the parameter validation rules are declared through comments, then `protobuf_to_pydantic` can only obtain the parameter validation rules through the other.
+
+- 1:The value of `parse_msg_desc_method` is the `Python` module corresponding to `Message`
+
+  In this case, `protobuf-to-pydantic` can obtain additional information about each field in the Message object through the comments in the `.pyi` file corresponding to the `Python` module during the running process.
+  For example, in the above sample code, the `Python` module corresponding to `demo_pb2.UserMessage` is `demo_pb2`.
+
+  > Note: This feature requires the use of the [mypy-protobuf](https://github.com/nipunn1313/mypy-protobuf) plug-in when generating the corresponding `Python` code from the Protobuf file, and the specified pyi file output path must be the same as the generated `Python` code path to take effect.
+  > Before execution, please install `protobuf-to-pydantic` using the `python -m pip install protobuf-to-pydantic[mypy-protobuf]` command
+
+- 2:The value of `parse_msg_desc_method` is the path to the Protobuf file
+
+  In addition to obtaining comments through `.pyi` files, `protobuf-to-pydantic` also supports obtaining information about each field through comments in the Protobuf file to which the Message object belongs.
+  Using this feat is very simple. Just set the value of `parse_msg_desc_method` to the root directory path specified when the Message object is generated.
+
+  > When using this method, make sure to install `protobuf-to-pydantic` via `python -m pip install protobuf-to-pydantic[lark]` and that the Protobuf files are present in your project.
+
+  For example, the project structure of the `protobuf-to-pydantic` sample code is as follows:
+  ```bash
+  ./protobuf_to_pydantic/
+  ├── example/
+  │ ├── python_example_proto_code/
+  │ └── example_proto/
+  ├── protobuf_to_pydantic/
+  └── /
+  ```
+  The Protobuf file is stored in the `example/example_proto` folder, and then run the following command in the `example` directory to generate the `Python` code file corresponding to Protobuf:
+  ```bash
+  cd example
+
+  python -m grpc_tools.protoc
+    --python_out=./python_example_proto_code \
+    --grpc_python_out=./python_example_proto_code \
+    -I. \
+  # or
+  protoc
+    --python_out=./python_example_proto_code \
+    --grpc_python_out=./python_example_proto_code \
+    -I. \
+  ```
+  Then the path that needs to be filled in for `parse_msg_desc_method` is `./protobuf_to_pydantic/example`.
+  For example, the following sample code:
+  ```python
+  # pydantic Version v1
+  from typing import Type
+  from protobuf_to_pydantic import msg_to_pydantic_model
+  from pydantic import BaseModel
+
+  # import protobuf gen python obj
+  from example.proto_3_20_pydanticv1.example.example_proto.demo import demo_pb2
+
+  UserModel: Type[BaseModel] = msg_to_pydantic_model(
+      demo_pb2.UserMessage, parse_msg_desc_method="./protobuf_to_pydantic/example"
+  )
+  print(
+      {
+          k: v.field_info
+          for k, v in UserModel.__fields__.items()
+      }
+  )
+  # output
+  # {
+  #   'uid': FieldInfo(default=PydanticUndefined, title='UID', description='user union id', extra={'example': '10086'}),
+  #   'age': FieldInfo(default=0, title='use age', ge=0, extra={'example': 18}),
+  #   'height': FieldInfo(default=0.0, ge=0, le=2, extra={}),
+  #   'sex': FieldInfo(default=0, extra={}),
+  #   'is_adult': FieldInfo(default=False, extra={}),
+  #   'user_name': FieldInfo(default='', description='user name', min_length=1, max_length=10, extra={'example': 'so1n'})
+  # }
+  ```
+  As you can see, the only difference in this code is the value of `parse_msg_desc_method`, but the output is the same.
+
+### 1.3.Generate files
 
 In addition to generating the corresponding `Pydantic Model` object at runtime,
 `protobuf-to-pydantic` also supports converting `Pydantic Model` objects to Python code text at runtime (only compatible with `Pydantic Model` objects generated by `protobuf-to-pydantic`).
@@ -249,7 +337,8 @@ Among them, text annotations and P2P rules are consistent, they both support mos
 
 > NOTE:
 >  - 1.Text annotation rules are not the focus of subsequent functional iterative development, and it is recommended to use P2P verification rules.
->  - 2.`Protoc Plug-in` only support `PGV` and `P2P` rule.
+>  - 2.In plugin mode, annotation rules are written slightly differently, See[demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate_by_comment/demo.proto)
+>  - 3.The plugin mode automatically selects the most suitable parameter verification rule.
 
 
 ### 2.1.Text annotations
@@ -292,7 +381,6 @@ In this example, each annotation that can be used by `protobuf_to_pydantic` star
 
 > Note:
 >   - 1.Currently only single-line comments are supported and comments must be a complete Json data (no line breaks).
->   - 2.multi line comments are not supported。
 
 When these annotations are written, `protobuf_to_pydantic` will bring the corresponding information for each field when converting the Message into the corresponding `Pydantic.BaseModel` object, as follows:
 
@@ -324,73 +412,6 @@ print(
 ```
 It can be seen that the output fields carry the corresponding information, which is consistent with the comments of the Protobuf file.
 
-In addition, this code differs from the previous section in that the `msg_to_pydantic_model` function has a keyword argument named `parse_msg_desc_method` and its value is the 'demo_pb2' module.
-This parameter enables `protobuf-to-pydantic` to obtain additional information about each field in the Message object through comments in the `.pyi` file of the `demo_pb2` module.
-
-> Note: This function needs to use the [mypy-protobuf](https://github.com/nipunn1313/mypy-protobuf) plugin when generating the corresponding `Python code through the Protobuf file, and the specified pyi file output path is the same as the generated `Python` code path to take effect.
-> And need to install `protobuf-to-pydantic` via the `python -m pip install protobuf-to-pydantic[mypy-protobuf]` command
-
-In addition to getting comments from the `.pyi` file, `protobuf-to-pydantic` also supports getting comment information for each field through comments on the Protobuf file to which the Message object belongs.
-Using this feature is as simple as setting the value of `parse_msg_desc_method` to the root directory path specified when the Message object was generated.
-
-> When using this method, make sure to install `protobuf-to-pydantic` via `python -m pip install protobuf-to-pydantic[lark]`, and also make sure that the Protobuf file exists in the project.
-
-For example, the project structure of the `protobuf-to-pydantic` sample code is as follows:
-```bash
-./protobuf_to_pydantic/
-├── example/
-│ ├── python_example_proto_code/
-│ └── example_proto/
-├── protobuf_to_pydantic/
-└── /
-```
-
-The Protobuf file is stored in the `example/example_proto` folder, and then run the following command in the `example` directory to generate the `Python` code file corresponding to Protobuf:
-```bash
-cd example
-
-python -m grpc_tools.protoc
-  --python_out=./python_example_proto_code \
-  --grpc_python_out=./python_example_proto_code \
-  -I. \
-# or
-protoc
-  --python_out=./python_example_proto_code \
-  --grpc_python_out=./python_example_proto_code \
-  -I. \
-```
-Then the path that needs to be filled in for `parse_msg_desc_method` at this time is `./protobuf_to_pydantic/example`.
-The following sample code:
-```python
-# pydantic Version v1
-from typing import Type
-from protobuf_to_pydantic import msg_to_pydantic_model
-from pydantic import BaseModel
-
-# import protobuf gen python obj
-from example.proto_3_20_pydanticv1.example.example_proto.demo import demo_pb2
-
-UserModel: Type[BaseModel] = msg_to_pydantic_model(
-    demo_pb2.UserMessage, parse_msg_desc_method="./protobuf_to_pydantic/example"
-)
-print(
-    {
-        k: v.field_info
-        for k, v in UserModel.__fields__.items()
-    }
-)
-# output
-# {
-#   `uid`: FieldInfo(default=PydanticUndefined, title=`UID`, description=`user union id`, extra={`example`: `10086`}),
-#   `age`: FieldInfo(default=0, title=`use age`, ge=0, extra={`example`: 18}),
-#   `height`: FieldInfo(default=0.0, ge=0, le=2, extra={}),
-#   `sex`: FieldInfo(default=0, extra={}),
-#   `is_adult`: FieldInfo(default=False, extra={}),
-#   `user_name`: FieldInfo(default=``, description=`user name`, min_length=1, max_length=10, extra={`example`: `so1n`})
-# }
-```
-As you can see, the only difference in this code is the value of the `parse_msg_desc_method`, but through the output result, you can see that the field carries the same information as the result obtained through the module.
-
 ### 2.2.PGV(protoc-gen-validate)
 At present, the commonly used parameter verification project in the Protobuf ecosystem is [protoc-gen-validate](https://github.com/envoyproxy/protoc-gen-validate)，
 It has become a common standard in Protobuf because it supports multiple languages and requires only one writing of `PGV` rules to make the generated `Message` object support the corresponding validation rules.
@@ -431,7 +452,10 @@ print(
 
 > Note:
 >  - 1.For the usage of `PGV`, see: [protoc-gen-validate doc](https://github.com/bufbuild/protoc-gen-validate/blob/v0.10.2-SNAPSHOT.17/README.md)
->  - 2.Need to install `PGV` through `pip install protoc_gen_validate` or download [validate.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/common/validate.proto) to the protobuf directory in the project to write pgv rules in the Protobuf file.
+>  - 2.There are three ways to introduce validate
+>    - 2.1.Install `PGV` through  `pip install protoc_gen_validate`
+>    - 2.2.Download [validate.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/common/validate.proto)to the protobuf directory in the project。
+>    - 2.3.Install `PGV `through [buf-cli](https://github.com/so1n/protobuf_to_pydantic/blob/master/buf-plugin/README_ZH.md)
 
 
 ### 2.3.P2P
@@ -526,7 +550,7 @@ print(
 ### 2.4.`P2P` and text annotation rule other parameter support
 The `protobuf-to-pydantic` text annotation rules and the `P2P` rules support most of the parameters in `FieldInfo`, as described in the [Pydantic Field doc](https://docs.pydantic.dev/latest/usage/fields/)。
 
-> The new parameters added to `Pydantic V2` will be supported in version 2.1, for now `P2P` rule naming is still written on the basis of `Pydantic V1`, but automatic mapping to `Pydantic V2` naming is supported.
+> The new parameters added to `Pydantic V2` will be supported in next version , for now `P2P` rule naming is still written on the basis of `Pydantic V1`, but automatic mapping to `Pydantic V2` naming is supported.
 
 Other partial changes in meaning and new parameters are described as follows:
 
@@ -736,7 +760,7 @@ class UserPayMessage(BaseModel):
     exp: float = FieldInfo()
 ```
 #### 2.5.5.Customized templates
-Currently `protobuf-to-pydantic` only supports a few simple templates, if have more template needs, can extend the templates by inheriting the `DescTemplate` class.
+Currently `protobuf-to-pydantic` only supports a few simple templates, if have more template needs, can extend the templates by inheriting the `Template` class.
 
 For example, there is an odd feature that requires the default value of a field to be the timestamp of the time when the `Pydantic Model` object was generated, but the timestamps used are available in lengths of 10 and 13, so the following Protobuf file needs to be written to support defining the length of the timestamps:
 ```protobuf
@@ -751,34 +775,36 @@ message TimestampTest{
 }
 ```
 As you can see, the Protobuf file customizes the syntax of `p2p@timestamp|{x}`, where `x` has only two values, 10 and 13. The next step is to write code based on this template behavior, which looks like this.
+
 ```python
 import time
-from protobuf_to_pydantic.gen_model import DescTemplate
+from protobuf_to_pydantic.gen_model import Template
+
 
-class CustomDescTemplate(DescTemplate):
-    def template_timestamp(self, length_str: str) -> int:
-        timestamp: float = time.time()
-        if length_str == "10":
-            return int(timestamp)
-        elif length_str == "13":
-            return int(timestamp * 100)
-        else:
-            raise KeyError(f"timestamp template not support value:{length_str}")
+class CustomTemplate(Template):
+  def template_timestamp(self, length_str: str) -> int:
+    timestamp: float = time.time()
+    if length_str == "10":
+      return int(timestamp)
+    elif length_str == "13":
+      return int(timestamp * 100)
+    else:
+      raise KeyError(f"timestamp template not support value:{length_str}")
 
 
-from .demo_pb2 import TimestampTest # fake code
+from .demo_pb2 import TimestampTest  # fake code
 from protobuf_to_pydantic import msg_to_pydantic_model
 
 msg_to_pydantic_model(
-    TimestampTest,
-    desc_template=CustomDescTemplate   # <-- Use a custom template class
+  TimestampTest,
+  template=CustomTemplate  # <-- Use a custom template class
 )
 ```
-This code first creates a class `CustomDescTemplate` that inherits from `DescTemplate`.
-`DescTemplate` will forwards to the corresponding `template_{template name}` method based on the naming of the template, so this class needs to define the `template_timestamp` method to implement the `p2p@timestamp` template functionality.
+This code first creates a class `CustomTemplate` that inherits from `Template`.
+During the execution process, it is found that when the parameter verification rule starts with `p2p@`, the parameter will be sent to the `template_{template name}` method corresponding to the `Template` class, so `CustomTemplate` defines the `template_timestamp` method to implement the `p2p@timestamp` template function.
 In addition, the `length_str` variable received in this method is either 10 in `p2p@timestamp|10` or 13 in `p2p@timestamp|13`.
 
-Then load the `CustomDescTemplate` through the `msg_to_pydantic_model` function, then the following code will be generated (assuming that the code is generated at a timestamp of 1600000000):
+Then load the `CustomTemplate` through the `msg_to_pydantic_model` function, then the following code will be generated (assuming that the code is generated at a timestamp of 1600000000):
 ```python
 from pydantic import BaseModel
 from pydantic.fields import FieldInfo
@@ -787,6 +813,9 @@ class TimestampTest(BaseModel):
     timestamp_10: int = FieldInfo(default=1600000000)
     timestamp_13: int = FieldInfo(default=1600000000000)
 ```
+
+> Note: In plugin mode, you can declare a template class to be loaded through a configuration file.
+
 ## 3.Code format
 The code generated directly through `protobuf-to-pydantic` is not perfect, but it is possible to indirectly generate code that conforms to the `Python` specification through different formatting tools.
 Currently, `protobuf-to-pydantic` supports formatting tools such as `autoflake`, `black` and `isort`. If the corresponding formatting tool is installed in the current `Python` environment, then `protobuf-to-pydantic` will call the tool to format the generated code before outputting it to a file.
@@ -852,9 +881,11 @@ Generate `Pydantic Model`(Pydantic V1): [proto_pydanticv1/demo_gen_code_by_p2p.p
 
 Generate `Pydantic Model`(Pydantic V2): [proto_pydanticv2/demo_gen_code_by_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/demo_gen_code_by_p2p.py)
 ### 4.5.Protoc Plugin-in
-Protobuf field: [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/demo/demo.proto)，[validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/validate/demo.proto)，[p2p_validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate/demo.proto)
-
-> Note: The Protoc plugin only supports P2P and PGV rules
+Protobuf field:
+ - [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/demo/demo.proto)
+ - [validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/validate/demo.proto)
+ - [p2p_validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate/demo.proto)
+ - [p2p_validate_by_comment/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate_by_comment/demo.proto)
 
 `Pydantic Model` generated via `demo/demo.proto`(Pydantic V1):[example_proto/demo/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py)
 
@@ -862,8 +893,12 @@ Protobuf field: [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/b
 
 `Pydantic Model` generated via `validate/demo.proto`(Pydantic V1):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py)
 
-`Pydantic Model` generated via `validate/demo.proto`(Pydantic V1):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py)
+`Pydantic Model` generated via `validate/demo.proto`(Pydantic V2):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py)
 
 `Pydantic Model` generated via `p2p_validate/demo.proto`(Pydantic V1):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py)
 
-`Pydantic Model` generated via `p2p_validate/demo.proto`(Pydantic V1):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py)
+`Pydantic Model` generated via `p2p_validate/demo.proto`(Pydantic V2):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py)
+
+`Pydantic Model` generated via `p2p_validate_by_comment/demo.proto`(Pydantic V1):[example/example_proto/p2p_validate_by_comment](https://github.com/so1n/protobuf_to_pydantic/tree/master/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment)
+
+`Pydantic Model` generated via `p2p_validate_by_comment/demo.proto`(Pydantic V2):[example/example_proto/p2p_validate_by_comment](https://github.com/so1n/protobuf_to_pydantic/tree/master/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment)
diff --git a/README_ZH.md b/README_ZH.md
index 0421f20..7c7a404 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -31,10 +31,10 @@ pip install protobuf_to_pydantic[all]
 # 使用
 ## 1.代码生成
 `protobuf-to-pydantic`目前拥有两种方法基于Protobuf文件生成`Pydantic Model`对象：
-- 1: 以`Protoc`插件的方式通过Protobuf文件生成对应的`Python`代码文件。
-- 2: 在`Python`运行时根据`Message`对象生成对应的`Pydantic Model`对象。
+- 1: 插件模式：以`Protoc`插件的方式通过Protobuf文件生成对应的`Python`代码文件。
+- 2: 运行时模式：在`Python`运行时根据`Message`对象生成对应的`Pydantic Model`对象。
 
-### 1.1.通过插件直接生成`Pydantic Model`代码文件
+### 1.1.插件模式
 #### 1.1.0.安装依赖
 `protobuf-to-pydantic`插件依赖`mypy-protobuf`，需要先通过如下命令安装`mypy-protobuf`:
 ```bash
@@ -66,9 +66,10 @@ protoc -I. --protobuf-to-pydantic_out=. example.proto
 #### 1.1.2.插件的配置
 `protobuf-to-pydantic`插件支持通过读取一个`Python`文件来加载配置。
 
-> 为了保证能够正常的引入配置文件的变量，配置文件必须存放在运行命令的当前路径下。
+> 为了保证能够正常的引入配置文件的变量，配置文件应尽量存放在运行命令的当前路径下。
+
+一个可以被`protobuf-to-pydantic`读取的配置内容大概如下:
 
-一个可以被`protobuf-to-pydantic`读取的示例配置内容如下:
 ```Python
 import logging
 from typing import List, Type
@@ -77,31 +78,35 @@ from google.protobuf.any_pb2 import Any  # type: ignore
 from pydantic import confloat, conint
 from pydantic.fields import FieldInfo
 
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.template import Template
 
 # 配置插件的日志输出格式，和日志等级，在DEBUG的时候非常有用
-logging.basicConfig(format="[%(asctime)s %(levelname)s] %(message)s", datefmt="%y-%m-%d %H:%M:%S", level=logging.DEBUG)
+logging.basicConfig(
+  format="[%(asctime)s %(levelname)s] %(message)s",
+  datefmt="%y-%m-%d %H:%M:%S",
+  level=logging.DEBUG
+)
 
 
 class CustomerField(FieldInfo):
-    pass
+  pass
 
 
 def customer_any() -> Any:
-    return Any  # type: ignore
+  return Any  # type: ignore
 
 
 # local模板的配置，详见local模板的使用
 local_dict = {
-    "CustomerField": CustomerField,
-    "confloat": confloat,
-    "conint": conint,
-    "customer_any": customer_any,
+  "CustomerField": CustomerField,
+  "confloat": confloat,
+  "conint": conint,
+  "customer_any": customer_any,
 }
 # 指定关键注释的开头
 comment_prefix = "p2p"
 # 指定模板的类，可以通过继承该类拓展模板，详见自定义模板章节
-desc_template: Type[DescTemplate] = DescTemplate
+template: Type[Template] = Template
 # 指定要忽略的哪些package的protobuf文件，被忽略的package的message不会被解析
 ignore_pkg_list: List[str] = ["validate", "p2p_validate"]
 # 指定生成的文件名后缀(不包含.py)
@@ -120,28 +125,34 @@ protoc -I. --protobuf-to-pydantic_out=config_path=plugin_config.py:. example.pro
 
 除了示例的配置文件中配置选项外，`protobuf-to-pydantic`插件还支持其他的配置选项，具体的配置说明如下：
 
-|配置名|所属功能|类型|含义|
-|---|---|---|---|
-|local_dict|模板|dict|存放供`local`模板使用的变量|
-|desc_template|模板|protobuf_to_pydantic.desc_template.DescTemplate|模板类的实现|
-|comment_prefix|模板|str|注释前缀，只有固定前缀的字符串才会被模板使用|
-|customer_import_set|代码生成|`Set[str]`|自定义import语句的集合，会写入到源码文件中，如`from typing import Set`或者是`import typing`|
-|customer_deque|代码生成|`deque[str]`|自定义源码文件内容，用于增加自定义内容|
-|module_path|代码生成|str|用于定义项目/模块的根路径，辅助`protobuf-to-pydantic`能更好的自动生成模块的引入语句|
-|pyproject_file_path|代码生成|str|定义pyproject文件路径，默认为当前项目的路径|
-|code_indent|代码生成|int|定义代码的缩进空格数量，默认为4|
-|ignore_pkg_list|代码生成(只限插件)|`list[str]`|定义忽略指定package文件的解析|
-|base_model_class|Model生成，代码生成|`Type[BaseModel]`|定义生成的Model的父类|
-|file_name_suffix|代码生成|str|定义生成的文件后缀，默认为`_p2p.py`|
-|file_descriptor_proto_to_code|代码生成(只限Protoc插件)|`Type[FileDescriptorProtoToCode]`|定义使用的FileDescriptorProtoToCode|
+| 配置名                           | 所属功能             | 类型                                              | 含义                                                                                                                               |
+|-------------------------------|------------------|-------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
+| local_dict                    | 模板               | dict                                            | 存放供`local`模板使用的变量                                                                                                                |
+| template                 | 模板               | protobuf_to_pydantic.template.Template | 模板类的实现                                                                                                                           |
+| comment_prefix                | 模板               | str                                             | 注释前缀，只有固定前缀的字符串才会被模板使用                                                                                                           |
+| parse_comment                 | 注释(只限Protoc插件)   | bool                                            | 如果为True，则会兼容注释形式的参数校验规则                                                                                                          |
+| customer_import_set           | 代码生成             | `Set[str]`                                      | 自定义import语句的集合，会写入到源码文件中，如`from typing import Set`或者是`import typing`                                                             |
+| customer_deque                | 代码生成             | `deque[str]`                                    | 自定义源码文件内容，用于增加自定义内容                                                                                                              |
+| module_path                   | 代码生成             | str                                             | 用于定义项目/模块的根路径，辅助`protobuf-to-pydantic`能更好的自动生成模块的引入语句                                                                            |
+| pyproject_file_path           | 代码生成             | str                                             | 定义pyproject文件路径，默认为当前项目的路径                                                                                                       |
+| code_indent                   | 代码生成             | int                                             | 定义代码的缩进空格数量，默认为4                                                                                                                 |
+| ignore_pkg_list               | 代码生成(只限插件)       | `list[str]`                                     | 定义忽略指定package文件的解析                                                                                                               |
+| base_model_class              | Model生成，代码生成     | `Type[BaseModel]`                               | 定义生成的Model的父类                                                                                                                    |
+| file_name_suffix              | 代码生成             | str                                             | 定义生成的文件后缀，默认为`_p2p.py`                                                                                                           |
+| file_descriptor_proto_to_code | 代码生成(只限Protoc插件) | `Type[FileDescriptorProtoToCode]`               | 定义使用的FileDescriptorProtoToCode                                                                                                   |
+| protobuf_type_config          | 代码生成(只限Protoc插件) | `Dict[str, ProtobufTypeConfigModel]`            | 兼容不规范的Message，具体见[ConfigModel说明](https://github.com/so1n/protobuf_to_pydantic/blob/master/protobuf_to_pydantic/plugin/config.py) |
+| pkg_config                    |代码生成(只限Protoc插件)| `Dict[str, "ConfigModel"]`                        | 为每一个pkg适配对应的配置                                                                                                                   |
 
 
+> Note:
+>   - 1:配置的具体说明见[/protobuf_to_pydantic/plugin/config.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/protobuf_to_pydantic/plugin/config.py)
+>   - 2:使用方法见[/example/plugin_config.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/plugin_config.py)
 #### 1.1.3.buf-cli
 如果你是使用`buf-cli`来管理Protobuf文件，那么也可以在`buf-cli`中使用`protobuf-to-pydantic`，具体请访问[如何在`buf-cli`中使用使用`protobuf-to-pydantic`](https://github.com/so1n/protobuf_to_pydantic/blob/master/buf-plugin/README_ZH.md)了解详情。
 
 
-### 1.2.在Python运行时生成`Pydantic Model`对象
-`protobuf-to-pydantic`可以在运行时根据`Message`对象生成对应的 `Pydantic Model`对象。
+### 1.2.运行时模式
+`protobuf-to-pydantic`可以在运行时根据`Message`对象的信息生成对应的 `Pydantic Model`对象。
 
 例如下面一个名为`demo.proto`的Protobuf文件中的`UserMessage`：
 ```protobuf
@@ -205,12 +216,88 @@ print(
 |local_dict| `local`模板使用的变量                  |
 |pydantic_base| 生成`Pydantic Model`对象的父类         |
 |pydantic_module| 生成`Pydantic Model`对象的`Module`   |
-|desc_template| 使用的模板类                          |
+|template| 使用的模板类                          |
 |message_type_dict_by_type_name| Protobuf类型与`Python`类型的映射      |
 |message_default_factory_dict_by_type_name| Protobuf类型与`Python`类型工厂的映射    |
 
+其中，`parse_msg_desc_method`是定义`protobuf_to_pydantic`从哪里获取到Message对象的规则信息。
+
+### 1.2.1.parse_msg_desc_method
+默认情况下，`parse_msg_desc_method`的值为空，此时`protobuf_to_pydantic`会通过Message对象的Option获取参数校验规则。
+
+如果参数校验的规则是通过注释声明的，那么`protobuf_to_pydantic`只能通过另外两种形式来获取参数校验规则。
+
+- 1:`parse_msg_desc_method`的值为`Message`对应的`Python`模块
+
+  在这种情况下，`protobuf-to-pydantic`在运行的过程能够通过`Python`模块对应的`.pyi`文件中的的注释来获取Message对象中每个字段的附加信息。
+  比如上述示例代码中`demo_pb2.UserMessage`对应的`Python`模块为`demo_pb2`。
 
+  > 注：该功能需要在通过Protobuf文件生成对应的`Python`代码时使用[mypy-protobuf](https://github.com/nipunn1313/mypy-protobuf)插件，且指定的pyi文件输出路径与生成的`Python`代码路径相同时才能生效。
+  > 在执行前请通过`python -m pip install protobuf-to-pydantic[mypy-protobuf]`命令安装`protobuf-to-pydantic`
+
+- 2:`parse_msg_desc_method`的值为Protobuf文件的路径
+
+  除了通过`.pyi`文件获取注释外，`protobuf-to-pydantic`还支持通过Message对象所属的Protobuf文件的注释来获取每个字段的注释信息。
+使用这个功能很简单，只需要把`parse_msg_desc_method`的值设置为Message对象生成时指定的根目录路径即可。
+
+  > 在使用该方法时，请确保通过`python -m pip install protobuf-to-pydantic[lark]`安装`protobuf-to-pydantic`，同时也要确保Protobuf文件存在于项目中。
+
+  比如`protobuf-to-pydantic`示例代码的项目结构如下:
+  ```bash
+  ./protobuf_to_pydantic/
+  ├── example/
+  │ ├── python_example_proto_code/
+  │ └── example_proto/
+  ├── protobuf_to_pydantic/
+  └── /
+  ```
+  其中Protobuf文件存放在`example/example_proto`文件夹中，然后在`example`目录下运行如下命令生成Protobuf对应的`Python`代码文件:
+  ```bash
+  cd example
+
+  python -m grpc_tools.protoc
+    --python_out=./python_example_proto_code \
+    --grpc_python_out=./python_example_proto_code \
+    -I. \
+  # or
+  protoc
+    --python_out=./python_example_proto_code \
+    --grpc_python_out=./python_example_proto_code \
+    -I. \
+  ```
+  那么此时`parse_msg_desc_method`需要填写的路径是`./protobuf_to_pydantic/example`。
+  比如下面的示例代码：
+  ```python
+  # pydantic Version v1
+  from typing import Type
+  from protobuf_to_pydantic import msg_to_pydantic_model
+  from pydantic import BaseModel
+
+  # import protobuf gen python obj
+  from example.proto_3_20_pydanticv1.example.example_proto.demo import demo_pb2
+
+  UserModel: Type[BaseModel] = msg_to_pydantic_model(
+      demo_pb2.UserMessage, parse_msg_desc_method="./protobuf_to_pydantic/example"
+  )
+  print(
+      {
+          k: v.field_info
+          for k, v in UserModel.__fields__.items()
+      }
+  )
+  # output
+  # {
+  #   'uid': FieldInfo(default=PydanticUndefined, title='UID', description='user union id', extra={'example': '10086'}),
+  #   'age': FieldInfo(default=0, title='use age', ge=0, extra={'example': 18}),
+  #   'height': FieldInfo(default=0.0, ge=0, le=2, extra={}),
+  #   'sex': FieldInfo(default=0, extra={}),
+  #   'is_adult': FieldInfo(default=False, extra={}),
+  #   'user_name': FieldInfo(default='', description='user name', min_length=1, max_length=10, extra={'example': 'so1n'})
+  # }
+  ```
+  可以看到，这份代码的唯一区别就是`parse_msg_desc_method`的值不同，但是输出结果中每个字段携带的信息与通过模块获取的结果是一样的。
 
+### 1.3.直接生成文件
 除了在运行时生成对应的`Pydantic Model`对象外，`protobuf-to-pydantic`还支持在运行时将`Pydantic Model`对象转为对应的`Python`代码文本（仅兼容`protobuf-to-pydantic`生成的`Pydantic Model`对象)。
 其中，`pydantic_model_to_py_code`用于生成代码源码，`pydantic_model_to_py_file`用于生成代码文件，`pydantic_model_to_py_file`函数的示例代码如下：
 ```Python
@@ -227,20 +314,20 @@ pydantic_model_to_py_file(
 代码运行的时候，会先把`demo_pb2.NestedMessage`转换为`Pydantic Model`对象，接着传入到`pydantic_model_to_py_file`函数中，由`pydantic_model_to_py_file`生成对应的源码内容再写入到`demo_gen_code.py`文件中。
 
 ## 2.参数校验
-在上一节中，Protobuf文件生成的`Pydantic Model`对象非常简单，这是因为Protobuf文件没有足够的参数验证相关信息。
-为了使生成的`Pydantic Model`对象中的每个字段都拥有参数校验功能，需要在Protobuf文件中完善字段对应的参数校验规则。
-
-目前`protobuf-to-pydantic`支持的校验规则有三种：
+在上一节中，Protobuf文件生成的`Pydantic Model`对象非常简单，这是因为Protobuf文件没有足够的参数验证信息。
+为了使生成的`Pydantic Model`对象中的每个字段都拥有参数校验功能，需要完善Protobuf文件中每个Message的字段的参数校验规则。
+目前`protobuf-to-pydantic`支持下面三种参数校验规则：
 - 1.文本注释
 - 2.PGV(protoc-geb-validate)
 - 3.P2P
 
-通过这些规则，`protobuf-to-pydantic`生成的`Pydantic Model`对象将拥有参数校验功能。
+通过这些规则，可以让`protobuf-to-pydantic`生成的`Pydantic Model`对象拥有参数校验功能。
 其中文本注释和P2P的规则是一致的，它们都支持`Pydantic Field`中的大多数参数，部分有变化和新增的参数见[2.4.`P2P`与文本注释的其它参数支持](#24p2p与文本注释的其它参数支持)
 
 > NOTE:
 >  - 1.文本注释规则不是后续功能迭代开发的重点，推荐使用P2P校验规则。
->  - 2.插件生成代码只支持PGV和P2P校验规则。
+>  - 2.插件模式下，文本注释的编写方法略有变化，详情请参考:[example/example_proto/p2p_validate_by_comment/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate_by_comment/demo.proto)
+>  - 3.插件模式会自动选择最适配的参数校验规则。
 
 ### 2.1.文本注释
 在Protobuf文件中可以为每个字段编写符合`protobuf-to-pydantic`要求的注释，以便`protobuf-to-pydantic`在解析Protobuf文件时能够获得到参数的校验信息，比如下面这个例子
@@ -282,7 +369,6 @@ message UserMessage {
 
 > Note:
 >   - 1.目前只支持单行注释且注释必须是一个完整的Json数据(不能换行)。
->   - 2.不支持多行注释。
 
 这样一来，`protobuf-to-pydantic`通过Message生成的`Pydantic Model`对象中的每个字段都拥有对应的信息，如下代码:
 ```python
@@ -311,75 +397,11 @@ print(
 #   'user_name': FieldInfo(default='', description='user name', min_length=1, max_length=10, extra={'example': 'so1n'})
 # }
 ```
-可以看出，输出的字段中都携带着对应的信息，这些数据与Protobuf文件的注释是一致的。
-除此之外，这段代码与上一节不同的是`msg_to_pydantic_model`函数多了一个名为`parse_msg_desc_method`的关键字参数且它的值为`demo_pb2`模块,
-该参数会使`protobuf-to-pydantic`能够通过`demo_pb2`模块的`.pyi`文件中的的注释来获取Message对象中每个字段的附加信息。
-
-> 注：该功能需要在通过Protobuf文件生成对应的`Python`代码时使用[mypy-protobuf](https://github.com/nipunn1313/mypy-protobuf)插件，且指定的pyi文件输出路径与生成的`Python`代码路径相同时才能生效。
-> 在执行前请通过`python -m pip install protobuf-to-pydantic[mypy-protobuf]`命令安装`protobuf-to-pydantic`
-
-除了通过`.pyi`文件获取注释外，`protobuf-to-pydantic`还支持通过Message对象所属的Protobuf文件的注释来获取每个字段的注释信息。
-使用这个功能很简单，只需要把`parse_msg_desc_method`的值设置为Message对象生成时指定的根目录路径即可。
-
-> 在使用该方法时，请确保通过`python -m pip install protobuf-to-pydantic[lark]`安装`protobuf-to-pydantic`，同时也要确保Protobuf文件存在于项目中。
-
-比如`protobuf-to-pydantic`示例代码的项目结构如下:
-```bash
-./protobuf_to_pydantic/
-├── example/
-│ ├── python_example_proto_code/
-│ └── example_proto/
-├── protobuf_to_pydantic/
-└── /
-```
-其中Protobuf文件存放在`example/example_proto`文件夹中，然后在`example`目录下运行如下命令生成Protobuf对应的`Python`代码文件:
-```bash
-cd example
-
-python -m grpc_tools.protoc
-  --python_out=./python_example_proto_code \
-  --grpc_python_out=./python_example_proto_code \
-  -I. \
-# or
-protoc
-  --python_out=./python_example_proto_code \
-  --grpc_python_out=./python_example_proto_code \
-  -I. \
-```
-那么此时`parse_msg_desc_method`需要填写的路径是`./protobuf_to_pydantic/example`。
-比如下面的示例代码：
-```python
-# pydantic Version v1
-from typing import Type
-from protobuf_to_pydantic import msg_to_pydantic_model
-from pydantic import BaseModel
-
-# import protobuf gen python obj
-from example.proto_3_20_pydanticv1.example.example_proto.demo import demo_pb2
+在执行代码后通过输出结果可以看到输出的字段中都携带着对应的信息，这些数据与Protobuf文件的注释是一致的。
 
-UserModel: Type[BaseModel] = msg_to_pydantic_model(
-    demo_pb2.UserMessage, parse_msg_desc_method="./protobuf_to_pydantic/example"
-)
-print(
-    {
-        k: v.field_info
-        for k, v in UserModel.__fields__.items()
-    }
-)
-# output
-# {
-#   'uid': FieldInfo(default=PydanticUndefined, title='UID', description='user union id', extra={'example': '10086'}),
-#   'age': FieldInfo(default=0, title='use age', ge=0, extra={'example': 18}),
-#   'height': FieldInfo(default=0.0, ge=0, le=2, extra={}),
-#   'sex': FieldInfo(default=0, extra={}),
-#   'is_adult': FieldInfo(default=False, extra={}),
-#   'user_name': FieldInfo(default='', description='user name', min_length=1, max_length=10, extra={'example': 'so1n'})
-# }
-```
-可以看到，这份代码的唯一区别就是`parse_msg_desc_method`的值不同，但是通过输出结果可以看出字段携带的信息与通过模块获取的结果一样。
 ### 2.2.PGV(protoc-gen-validate)
 目前Protobuf生态中常用的参数校验项目是[protoc-gen-validate](https://github.com/envoyproxy/protoc-gen-validate)，
-它由于支持多种语言且只要编写一次`PGV`规则就能使生成的`Message`对象虽然编程语言不同的，但都支持相同的校验规则，已然成为Protobuf中的通用标准。
+在使用的过程中，只要编写一次`PGV`规则就能生成不同编程语言，但拥有相同校验规则的`Message`对象，已然成为Protobuf中的通用标准。
 
 > 目前`protobuf-to-pydantic`只支持[protoc-gen-validate](https://github.com/envoyproxy/protoc-gen-validate)小于1.0.0版本的规则
 
@@ -416,7 +438,10 @@ print(
 
 > Note:
 >  - 1.`PGV`的使用方法见:[protoc-gen-validate doc](https://github.com/bufbuild/protoc-gen-validate/blob/v0.10.2-SNAPSHOT.17/README.md)
->  - 2.使用前请通过`pip install protoc_gen_validate`安装`PGV`或者把[validate.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/common/validate.proto)下载到项目的Protobuf目录中，才能在Protobuf文件中编写pgv规则。
+>  - 2.可以通过以下三种方法引入validate
+>    - 2.1.使用前请通过`pip install protoc_gen_validate`安装`PGV`
+>    - 2.2.把[validate.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/common/validate.proto)下载到项目的Protobuf目录中。
+>    - 2.3.通过[buf-cli](https://github.com/so1n/protobuf_to_pydantic/blob/master/buf-plugin/README_ZH.md)安装validate
 
 
 ### 2.3.P2P
@@ -509,7 +534,7 @@ print(
 ### 2.4.`P2P`与文本注释的其它参数支持
 `protobuf-to-pydantic`的文本注释规则和`P2P`规则支持`FieldInfo`中的大部分参数，具体见[Pydantic Field文档](https://docs.pydantic.dev/latest/usage/fields/)。
 
-> `Pydantic V2`新增的参数将会在2.1版本中支持，目前`P2P`的规则命名仍是基于`Pydantic V1`编写的，但是支持自动映射为`Pydantic V2`的命名。
+> `Pydantic V2`新增的参数将会在下一个版本提供支持，目前`P2P`的规则命名仍是基于`Pydantic V1`编写的，但是支持自动映射为`Pydantic V2`的命名。
 
 其它部分含义有变动和新增的参数说明如下:
 
@@ -724,7 +749,7 @@ class UserPayMessage(BaseModel):
     exp: float = FieldInfo()
 ```
 #### 2.5.5.自定义模板
-目前`protobuf-to-pydantic`只支持几种简单模板，如果有更多的模板需求，可以通过继承`DescTemplate`类来对模板进行拓展。
+目前`protobuf-to-pydantic`只支持几种简单模板，如果有更多的模板需求，可以通过继承`Template`类来对模板进行拓展。
 
 比如有一个奇葩的需求，要求字段的默认值为Message对象生成`Pydantic Model`对象时的时间戳，不过使用的时间戳有长度为10位和13位两个版本, 于是需要编写如下Protobuf文件来支持定义时间戳的长度：
 ```protobuf
@@ -739,34 +764,36 @@ message TimestampTest{
 }
 ```
 在这个文件中使用了自定义的`p2p@timestamp|{x}`的语法，其中`x`只有10和13两个值，接下来就可以根据这个模板行为编写代码了，代码如下:
+
 ```python
 import time
-from protobuf_to_pydantic.gen_model import DescTemplate
+from protobuf_to_pydantic.gen_model import Template
+
 
-class CustomDescTemplate(DescTemplate):
-    def template_timestamp(self, length_str: str) -> int:
-        timestamp: float = time.time()
-        if length_str == "10":
-            return int(timestamp)
-        elif length_str == "13":
-            return int(timestamp * 100)
-        else:
-            raise KeyError(f"timestamp template not support value:{length_str}")
+class CustomTemplate(Template):
+  def template_timestamp(self, length_str: str) -> int:
+    timestamp: float = time.time()
+    if length_str == "10":
+      return int(timestamp)
+    elif length_str == "13":
+      return int(timestamp * 100)
+    else:
+      raise KeyError(f"timestamp template not support value:{length_str}")
 
 
-from .demo_pb2 import TimestampTest # fake code
+from .demo_pb2 import TimestampTest  # fake code
 from protobuf_to_pydantic import msg_to_pydantic_model
 
 msg_to_pydantic_model(
-    TimestampTest,
-    desc_template=CustomDescTemplate   # <-- 使用自定义的模板类
+  TimestampTest,
+  template=CustomTemplate  # <-- 使用自定义的模板类
 )
 ```
-这段代码先是创建了一个继承于`DescTemplate`的`CustomDescTemplate`的类，
-由于`DescTemplate`会根据模板的命名转发到对应的`template_{template name}`方法，所以这个类定义了`template_timestamp`的方法来实现`p2p@timestamp`模板功能。
+这段代码先是创建了一个继承于`Template`的`CustomTemplate`的类，
+在执行的过程中，发现参数校验规则是以`p2p@`开头时就会把参数发到`Template`类对应的`template_{template name}`方法，所以`CustomTemplate`定义了`template_timestamp`的方法来实现`p2p@timestamp`模板功能。
 此外，在这个方法中接收的`length_str`变量则是`p2p@timestamp|10`中的10或者是`p2p@timestamp|13`中的13。
 
-接着通过`msg_to_pydantic_model`函数加载`CustomDescTemplate`，那么会生成如下代码(假设在时间戳为1600000000时生成的代码)：
+在创建完`CustomTemplate`后，通过`msg_to_pydantic_model`函数加载`CustomTemplate`，那么会生成如下代码(假设在时间戳为1600000000时生成的代码)：
 ```python
 from pydantic import BaseModel
 from pydantic.fields import FieldInfo
@@ -775,6 +802,9 @@ class TimestampTest(BaseModel):
     timestamp_10: int = FieldInfo(default=1600000000)
     timestamp_13: int = FieldInfo(default=1600000000000)
 ```
+
+> Note: 插件模式下可以通过配置文件声明要加载的模板类。
+
 ## 3.代码格式化
 通过`protobuf-to-pydantic`直接生成的代码不是完美的，但是可以通过不同的格式化工具来间接的生成符合`Python`规范的代码。
 目前, `protobuf-to-pydantic`支持`autoflake`, `black`和`isort`等格式化工具。如果在当前的`Python`环境中安装了对应的格式化工具，那么`protobuf-to-pydantic`会调用工具对生成的代码进行格式化再输出到文件中。
@@ -841,9 +871,11 @@ protobuf文件: [p2p_validate/demo.proto](https://github.com/so1n/protobuf_to_py
 
 生成的`Pydantic Model`(Pydantic V2): [proto_pydanticv2/demo_gen_code_by_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/demo_gen_code_by_p2p.py)
 ### 4.5.Protoc插件
-protobuf文件: [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/demo/demo.proto)，[validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/validate/demo.proto)，[p2p_validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate/demo.proto)
-
-> Note: Protoc插件只支持P2P和PGV校验规则
+protobuf文件:
+ - [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/demo/demo.proto)
+ - [validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/validate/demo.proto)
+ - [p2p_validate/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate/demo.proto)
+ - [p2p_validate_by_comment/demo.proto](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/example_proto/p2p_validate_by_comment/demo.proto)
 
 通过`demo/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example_proto/demo/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py)
 
@@ -851,8 +883,12 @@ protobuf文件: [demo/demo.proto](https://github.com/so1n/protobuf_to_pydantic/b
 
 通过`validate/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py)
 
-通过`validate/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py)
+通过`validate/demo.proto`生成的`Pydantic Model`(Pydantic V2):[example_proto/validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py)
 
 通过`p2p_validate/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py)
 
-通过`p2p_validate/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py)
+通过`p2p_validate/demo.proto`生成的`Pydantic Model`(Pydantic V2):[example_proto/p2p_validate/demo_p2p.py](https://github.com/so1n/protobuf_to_pydantic/blob/master/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py)
+
+通过`p2p_validate_by_comment/demo.proto`生成的`Pydantic Model`(Pydantic V1):[example/example_proto/p2p_validate_by_comment](https://github.com/so1n/protobuf_to_pydantic/tree/master/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment)
+
+通过`p2p_validate_by_comment/demo.proto`生成的`Pydantic Model`(Pydantic V2):[example/example_proto/p2p_validate_by_comment](https://github.com/so1n/protobuf_to_pydantic/tree/master/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment)
diff --git a/buf-plugin/README.md b/buf-plugin/README.md
index ab4cdb2..25e6f37 100644
--- a/buf-plugin/README.md
+++ b/buf-plugin/README.md
@@ -145,6 +145,8 @@ Regardless of which method is used to generate `Pydantic` code, the final projec
 └── pyproject.toml
 ```
 ### 1.4.Generating Pydantic Code with Remote Plugins
+> Note: Since the BUF plugin created by the developer cannot be used publicly, the remote plug-in cannot be used normally(See: [issue](https://github.com/bufbuild/plugins/issues/589#issuecomment-1799085322))。If necessary, please refer to the custom plugins in the next section to create your own plugins。
+
 In addition to executing local plugin to generate `Pydantic` code, can also use remote plugin.
 
 First, need to change the `buf.gen.yaml` file to the following content:
diff --git a/buf-plugin/README_ZH.md b/buf-plugin/README_ZH.md
index cc495b9..29c1fa9 100644
--- a/buf-plugin/README_ZH.md
+++ b/buf-plugin/README_ZH.md
@@ -141,6 +141,8 @@ plugins:
 └── pyproject.toml
 ```
 ### 1.4.使用远程插件生成Pydantic代码
+> Note: 由于开发者自己创建的buf插件是无法公开使用的，所以远程插件无法正常使用(具体见：[issue](https://github.com/bufbuild/plugins/issues/589#issuecomment-1799085322))。如有需要，请参考下一节的自定义插件自己创建插件。
+
 除了执行本地插件生成Pydantic代码外，还可以使用远程插件，首先需要更改`buf.gen.yaml`文件为如下内容:
 ```yaml
 version: v1
@@ -166,7 +168,7 @@ plugins:
 
 
 
-## 2.Custom Plugins
+## 2.自定义插件
 > Note: 请确保你已经阅读了 [buf custom plugins dev doc](https://buf.build/docs/bsr/remote-plugins/custom-plugins)
 
 `protobuf-to-pydantic`的标准`buf-plugin`可以满足大多数功能。如果您有自定义需求，您应该创建属于自己的自定义插件。
diff --git a/example/example_proto/demo/demo.proto b/example/example_proto/demo/demo.proto
index 61ac08b..b874849 100644
--- a/example/example_proto/demo/demo.proto
+++ b/example/example_proto/demo/demo.proto
@@ -125,3 +125,19 @@ message Invoice3 {
   int32 quantity = 3;
   repeated InvoiceItem2 items = 4;
 }
+
+// Test Message references
+// from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+message RootMessage {
+  string field1 = 1;
+  AnOtherMessage field2 = 2;
+}
+
+message AnOtherMessage {
+  string field1 = 1;
+  SubMessage field2 = 2;
+
+  message SubMessage {
+    string text = 1;
+  }
+}
diff --git a/example/example_proto/demo/single_config.proto b/example/example_proto/demo/single_config.proto
new file mode 100644
index 0000000..bc53d70
--- /dev/null
+++ b/example/example_proto/demo/single_config.proto
@@ -0,0 +1,17 @@
+syntax = "proto3";
+package single_config;
+
+
+// user info
+message UserMessage {
+  // aha: {"required": true, "example": "10086", "title": "UID", "description": "user union id"}
+  string uid=1;
+  // aha: {"example": 18, "title": "use age", "ge": 0}
+  int32 age=2;
+  // aha: {"ge": 0, "le": 2.5}
+  float height=3;
+  bool is_adult=7;
+  // aha: {"description": "user name"}
+  // aha: {"default": "", "min_length": 1, "max_length": "10", "example": "so1n"}
+  string user_name=8;
+}
diff --git a/example/gen_p2p_code.py b/example/gen_p2p_code.py
index 20ee136..e9dab8a 100644
--- a/example/gen_p2p_code.py
+++ b/example/gen_p2p_code.py
@@ -9,7 +9,7 @@
 from pydantic import confloat, conint
 from pydantic.fields import FieldInfo
 
-from protobuf_to_pydantic import _pydantic_adapter, desc_template, msg_to_pydantic_model, pydantic_model_to_py_file
+from protobuf_to_pydantic import _pydantic_adapter, msg_to_pydantic_model, pydantic_model_to_py_file, template
 
 # use pydantic v1 method, pydantic will print warning, ignore!~
 warnings.filterwarnings("ignore")
@@ -42,7 +42,7 @@ def customer_any() -> Any:
 now_path: pathlib.Path = pathlib.Path(__file__).absolute()
 
 
-class CustomDescTemplate(desc_template.DescTemplate):
+class CustomCommentTemplate(template.Template):
     def template_timestamp(self, length_str: str) -> int:
         timestamp: float = 1600000000
         if length_str == "10":
@@ -65,7 +65,7 @@ def gen_code() -> None:
                     "conint": conint,
                     "customer_any": customer_any,
                 },
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
diff --git a/example/gen_text_comment_code.py b/example/gen_text_comment_code.py
index 8757857..c647e53 100644
--- a/example/gen_text_comment_code.py
+++ b/example/gen_text_comment_code.py
@@ -9,10 +9,10 @@
 from google.protobuf.message import Message
 
 from protobuf_to_pydantic import _pydantic_adapter, msg_to_pydantic_model, pydantic_model_to_py_file
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.template import Template
 
 
-class CustomDescTemplate(DescTemplate):
+class CustomCommentTemplate(Template):
     def template_timestamp(self, length_str: str) -> int:
         timestamp: float = 1600000000
         if length_str == "10":
@@ -59,7 +59,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=module,
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -72,7 +72,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=str(now_path.parent.parent),
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -85,7 +85,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=module,
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -97,7 +97,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=str(now_path.parent.parent),
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
diff --git a/example/p2p_validate_by_comment_gen_code.py b/example/p2p_validate_by_comment_gen_code.py
index 7457dc2..c33dd98 100644
--- a/example/p2p_validate_by_comment_gen_code.py
+++ b/example/p2p_validate_by_comment_gen_code.py
@@ -12,10 +12,10 @@
 from pydantic.fields import FieldInfo
 
 from protobuf_to_pydantic import _pydantic_adapter, msg_to_pydantic_model, pydantic_model_to_py_file
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.template import Template
 
 
-class CustomDescTemplate(DescTemplate):
+class CustomCommentTemplate(Template):
     def template_timestamp(self, length_str: str) -> int:
         timestamp: float = 1600000000
         if length_str == "10":
@@ -77,7 +77,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=module,
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -92,7 +92,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=str(now_path.parent.parent),
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -105,7 +105,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=module,
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
@@ -119,7 +119,7 @@ def gen_code() -> None:
                 model,
                 parse_msg_desc_method=str(now_path.parent.parent),
                 local_dict=local_dict,
-                desc_template=CustomDescTemplate,
+                template=CustomCommentTemplate,
             )
             for model in message_class_list
         ],
diff --git a/example/plugin_config.py b/example/plugin_config.py
index 95340e7..05bc375 100644
--- a/example/plugin_config.py
+++ b/example/plugin_config.py
@@ -1,13 +1,16 @@
 import logging
 import time
-from typing import List, Type
+from typing import Dict, List, Type
 from uuid import uuid4
 
 from google.protobuf.any_pb2 import Any  # type: ignore
 from pydantic import confloat, conint
 from pydantic.fields import FieldInfo
 
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.plugin.config import SubConfigModel
+from protobuf_to_pydantic.template import Template
+
+from . import single_config_pkg_plugin_config
 
 logging.basicConfig(format="[%(asctime)s %(levelname)s] %(message)s", datefmt="%y-%m-%d %H:%M:%S", level=logging.INFO)
 
@@ -20,7 +23,7 @@ def customer_any() -> Any:
     return Any  # type: ignore
 
 
-class CustomDescTemplate(DescTemplate):
+class CustomCommentTemplate(Template):
     def template_timestamp(self, length_str: str) -> int:
         timestamp: float = 1600000000
         if length_str == "10":
@@ -44,5 +47,6 @@ def exp_time() -> float:
     "uuid4": uuid4,
 }
 comment_prefix = "p2p"
-desc_template: Type[DescTemplate] = CustomDescTemplate
+template: Type[Template] = CustomCommentTemplate
 ignore_pkg_list: List[str] = ["validate", "p2p_validate"]
+pkg_config: Dict[str, SubConfigModel] = {"single_config": SubConfigModel(module=single_config_pkg_plugin_config)}
diff --git a/example/proto_3_20_pydanticv1/demo_gen_code.py b/example/proto_3_20_pydanticv1/demo_gen_code.py
index d138d6c..3993aed 100644
--- a/example/proto_3_20_pydanticv1/demo_gen_code.py
+++ b/example/proto_3_20_pydanticv1/demo_gen_code.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -17,6 +17,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -130,3 +138,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv1/demo_gen_code_by_p2p.py b/example/proto_3_20_pydanticv1/demo_gen_code_by_p2p.py
index f3976a7..9510a01 100644
--- a/example/proto_3_20_pydanticv1/demo_gen_code_by_p2p.py
+++ b/example/proto_3_20_pydanticv1/demo_gen_code_by_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -42,7 +42,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
diff --git a/example/proto_3_20_pydanticv1/demo_gen_code_by_pgv.py b/example/proto_3_20_pydanticv1/demo_gen_code_by_pgv.py
index 436deff..f9779fd 100644
--- a/example/proto_3_20_pydanticv1/demo_gen_code_by_pgv.py
+++ b/example/proto_3_20_pydanticv1/demo_gen_code_by_pgv.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -39,7 +39,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
diff --git a/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py b/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
index ec70c6c..1255a3e 100644
--- a/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
+++ b/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", ge=0.0, example=18)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -132,3 +140,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_pyi.py b/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_pyi.py
index ec70c6c..1255a3e 100644
--- a/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_pyi.py
+++ b/example/proto_3_20_pydanticv1/demo_gen_code_by_text_comment_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", ge=0.0, example=18)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -132,3 +140,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/common/single_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/common/single_p2p.py
index c85d5c4..4b4763d 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/common/single_p2p.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/common/single_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 from enum import IntEnum
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_p2p.py
index a3ba387..ddee6e4 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_p2p.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -142,3 +142,21 @@ class InvoiceItem2(BaseModel):
     quantity: int = Field(default=0)
     items: typing.List["InvoiceItem2"] = Field(default_factory=list)
     invoice: Invoice3 = Field()
+
+
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
+class RootMessage(BaseModel):
+    """
+        Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.py b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.py
index 348bcde..9a0b2e3 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.py
@@ -26,7 +26,7 @@
   syntax='proto3',
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3'
+  serialized_pb=b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\"C\n\x0bRootMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12$\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x14.user.AnOtherMessage\"m\n\x0e\x41nOtherMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12/\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x1f.user.AnOtherMessage.SubMessage\x1a\x1a\n\nSubMessage\x12\x0c\n\x04text\x18\x01 \x01(\t*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_field__mask__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,example_dot_example__proto_dot_common_dot_single__pb2.DESCRIPTOR,])
 
@@ -50,8 +50,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2306,
-  serialized_end=2335,
+  serialized_start=2486,
+  serialized_end=2515,
 )
 _sym_db.RegisterEnumDescriptor(_SEXTYPE)
 
@@ -948,6 +948,115 @@
   serialized_end=2304,
 )
 
+
+_ROOTMESSAGE = _descriptor.Descriptor(
+  name='RootMessage',
+  full_name='user.RootMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field1', full_name='user.RootMessage.field1', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='field2', full_name='user.RootMessage.field2', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2306,
+  serialized_end=2373,
+)
+
+
+_ANOTHERMESSAGE_SUBMESSAGE = _descriptor.Descriptor(
+  name='SubMessage',
+  full_name='user.AnOtherMessage.SubMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='text', full_name='user.AnOtherMessage.SubMessage.text', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2458,
+  serialized_end=2484,
+)
+
+_ANOTHERMESSAGE = _descriptor.Descriptor(
+  name='AnOtherMessage',
+  full_name='user.AnOtherMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field1', full_name='user.AnOtherMessage.field1', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='field2', full_name='user.AnOtherMessage.field2', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_ANOTHERMESSAGE_SUBMESSAGE, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2375,
+  serialized_end=2484,
+)
+
 _USERMESSAGE.fields_by_name['sex'].enum_type = _SEXTYPE
 _USERMESSAGE.fields_by_name['demo'].enum_type = example_dot_example__proto_dot_common_dot_single__pb2._DEMOENUM
 _USERMESSAGE.fields_by_name['demo_message'].message_type = example_dot_example__proto_dot_common_dot_single__pb2._DEMOMESSAGE
@@ -999,6 +1108,9 @@
 _INVOICEITEM2.fields_by_name['items'].message_type = _INVOICEITEM2
 _INVOICEITEM2.fields_by_name['invoice'].message_type = _INVOICE3
 _INVOICE3.fields_by_name['items'].message_type = _INVOICEITEM2
+_ROOTMESSAGE.fields_by_name['field2'].message_type = _ANOTHERMESSAGE
+_ANOTHERMESSAGE_SUBMESSAGE.containing_type = _ANOTHERMESSAGE
+_ANOTHERMESSAGE.fields_by_name['field2'].message_type = _ANOTHERMESSAGE_SUBMESSAGE
 DESCRIPTOR.message_types_by_name['UserMessage'] = _USERMESSAGE
 DESCRIPTOR.message_types_by_name['OtherMessage'] = _OTHERMESSAGE
 DESCRIPTOR.message_types_by_name['MapMessage'] = _MAPMESSAGE
@@ -1010,6 +1122,8 @@
 DESCRIPTOR.message_types_by_name['OptionalMessage'] = _OPTIONALMESSAGE
 DESCRIPTOR.message_types_by_name['InvoiceItem2'] = _INVOICEITEM2
 DESCRIPTOR.message_types_by_name['Invoice3'] = _INVOICE3
+DESCRIPTOR.message_types_by_name['RootMessage'] = _ROOTMESSAGE
+DESCRIPTOR.message_types_by_name['AnOtherMessage'] = _ANOTHERMESSAGE
 DESCRIPTOR.enum_types_by_name['SexType'] = _SEXTYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -1138,6 +1252,28 @@
   })
 _sym_db.RegisterMessage(Invoice3)
 
+RootMessage = _reflection.GeneratedProtocolMessageType('RootMessage', (_message.Message,), {
+  'DESCRIPTOR' : _ROOTMESSAGE,
+  '__module__' : 'example.example_proto.demo.demo_pb2'
+  # @@protoc_insertion_point(class_scope:user.RootMessage)
+  })
+_sym_db.RegisterMessage(RootMessage)
+
+AnOtherMessage = _reflection.GeneratedProtocolMessageType('AnOtherMessage', (_message.Message,), {
+
+  'SubMessage' : _reflection.GeneratedProtocolMessageType('SubMessage', (_message.Message,), {
+    'DESCRIPTOR' : _ANOTHERMESSAGE_SUBMESSAGE,
+    '__module__' : 'example.example_proto.demo.demo_pb2'
+    # @@protoc_insertion_point(class_scope:user.AnOtherMessage.SubMessage)
+    })
+  ,
+  'DESCRIPTOR' : _ANOTHERMESSAGE,
+  '__module__' : 'example.example_proto.demo.demo_pb2'
+  # @@protoc_insertion_point(class_scope:user.AnOtherMessage)
+  })
+_sym_db.RegisterMessage(AnOtherMessage)
+_sym_db.RegisterMessage(AnOtherMessage.SubMessage)
+
 
 _MAPMESSAGE_USERMAPENTRY._options = None
 _MAPMESSAGE_USERFLAGENTRY._options = None
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.pyi b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.pyi
index 1cb718c..6efd2fa 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.pyi
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/demo_pb2.pyi
@@ -438,3 +438,48 @@ class Invoice3(google.protobuf.message.Message):
         ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["amount",b"amount","items",b"items","name",b"name","quantity",b"quantity"]) -> None: ...
 global___Invoice3 = Invoice3
+
+class RootMessage(google.protobuf.message.Message):
+    """Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___RootMessage = RootMessage
+
+class AnOtherMessage(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    class SubMessage(google.protobuf.message.Message):
+        DESCRIPTOR: google.protobuf.descriptor.Descriptor
+        TEXT_FIELD_NUMBER: builtins.int
+        text: typing.Text
+        def __init__(self,
+            *,
+            text: typing.Text = ...,
+            ) -> None: ...
+        def ClearField(self, field_name: typing_extensions.Literal["text",b"text"]) -> None: ...
+
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage.SubMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage.SubMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___AnOtherMessage = AnOtherMessage
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_p2p.py
new file mode 100644
index 0000000..9856c98
--- /dev/null
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_p2p.py
@@ -0,0 +1,18 @@
+# This is an automatically generated file, please do not change
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
+# Protobuf Version: 3.20.3
+# Pydantic Version: 1.10.7
+from google.protobuf.message import Message  # type: ignore
+from pydantic import BaseModel, Field
+
+
+class UserMessage(BaseModel):
+    """
+    user info
+    """
+
+    uid: str = Field(example="10086", title="UID", description="user union id")
+    age: int = Field(default=0, example=18, title="use age", ge=0.0)
+    height: float = Field(default=0.0, ge=0.0, le=2.5)
+    is_adult: bool = Field(default=False)
+    user_name: str = Field(default="", example="so1n", description="user name", min_length=1, max_length=10)
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.py b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.py
new file mode 100644
index 0000000..4a6707e
--- /dev/null
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: example/example_proto/demo/single_config.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='example/example_proto/demo/single_config.proto',
+  package='single_config',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n.example/example_proto/demo/single_config.proto\x12\rsingle_config\"\\\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\tb\x06proto3'
+)
+
+
+
+
+_USERMESSAGE = _descriptor.Descriptor(
+  name='UserMessage',
+  full_name='single_config.UserMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='uid', full_name='single_config.UserMessage.uid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='age', full_name='single_config.UserMessage.age', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='height', full_name='single_config.UserMessage.height', index=2,
+      number=3, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='is_adult', full_name='single_config.UserMessage.is_adult', index=3,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_name', full_name='single_config.UserMessage.user_name', index=4,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=65,
+  serialized_end=157,
+)
+
+DESCRIPTOR.message_types_by_name['UserMessage'] = _USERMESSAGE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+UserMessage = _reflection.GeneratedProtocolMessageType('UserMessage', (_message.Message,), {
+  'DESCRIPTOR' : _USERMESSAGE,
+  '__module__' : 'example.example_proto.demo.single_config_pb2'
+  # @@protoc_insertion_point(class_scope:single_config.UserMessage)
+  })
+_sym_db.RegisterMessage(UserMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.pyi b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.pyi
new file mode 100644
index 0000000..72cf391
--- /dev/null
+++ b/example/proto_3_20_pydanticv1/example/example_proto/demo/single_config_pb2.pyi
@@ -0,0 +1,45 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import typing
+import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class UserMessage(google.protobuf.message.Message):
+    """user info"""
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    UID_FIELD_NUMBER: builtins.int
+    AGE_FIELD_NUMBER: builtins.int
+    HEIGHT_FIELD_NUMBER: builtins.int
+    IS_ADULT_FIELD_NUMBER: builtins.int
+    USER_NAME_FIELD_NUMBER: builtins.int
+    uid: typing.Text
+    """aha: {"required": true, "example": "10086", "title": "UID", "description": "user union id"}"""
+
+    age: builtins.int
+    """aha: {"example": 18, "title": "use age", "ge": 0}"""
+
+    height: builtins.float
+    """aha: {"ge": 0, "le": 2.5}"""
+
+    is_adult: builtins.bool
+    user_name: typing.Text
+    """aha: {"description": "user name"}
+    aha: {"default": "", "min_length": 1, "max_length": "10", "example": "so1n"}
+    """
+
+    def __init__(self,
+        *,
+        uid: typing.Text = ...,
+        age: builtins.int = ...,
+        height: builtins.float = ...,
+        is_adult: builtins.bool = ...,
+        user_name: typing.Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: typing_extensions.Literal["age",b"age","height",b"height","is_adult",b"is_adult","uid",b"uid","user_name",b"user_name"]) -> None: ...
+global___UserMessage = UserMessage
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
index d7bc702..c7632e4 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -45,7 +45,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
index 42d32e6..c0492ab 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -45,7 +45,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
index a8b2dcd..0b56371 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
@@ -427,7 +427,7 @@ class UserPayMessage(BaseModel):
 
         exp_timestamp_gt_now_validator = validator("exp", allow_reuse=True)(timestamp_gt_now_validator)
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -435,7 +435,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
index a8b2dcd..0b56371 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
@@ -427,7 +427,7 @@ class UserPayMessage(BaseModel):
 
         exp_timestamp_gt_now_validator = validator("exp", allow_reuse=True)(timestamp_gt_now_validator)
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -435,7 +435,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
diff --git a/example/proto_3_20_pydanticv1/example/example_proto/validate/demo_p2p.py b/example/proto_3_20_pydanticv1/example/example_proto/validate/demo_p2p.py
index 9133b94..c9dfd25 100644
--- a/example/proto_3_20_pydanticv1/example/example_proto/validate/demo_p2p.py
+++ b/example/proto_3_20_pydanticv1/example/example_proto/validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 1.10.7
 import typing
@@ -44,7 +44,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_3_20_pydanticv2/demo_gen_code.py b/example/proto_3_20_pydanticv2/demo_gen_code.py
index 91ec87e..c3f9f97 100644
--- a/example/proto_3_20_pydanticv2/demo_gen_code.py
+++ b/example/proto_3_20_pydanticv2/demo_gen_code.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -17,6 +17,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -129,3 +137,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv2/demo_gen_code_by_p2p.py b/example/proto_3_20_pydanticv2/demo_gen_code_by_p2p.py
index 78c1670..a793ca6 100644
--- a/example/proto_3_20_pydanticv2/demo_gen_code_by_p2p.py
+++ b/example/proto_3_20_pydanticv2/demo_gen_code_by_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -44,7 +44,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
diff --git a/example/proto_3_20_pydanticv2/demo_gen_code_by_pgv.py b/example/proto_3_20_pydanticv2/demo_gen_code_by_pgv.py
index ee1fd2a..61f41f6 100644
--- a/example/proto_3_20_pydanticv2/demo_gen_code_by_pgv.py
+++ b/example/proto_3_20_pydanticv2/demo_gen_code_by_pgv.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
diff --git a/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py b/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
index dde1d4c..ba105b6 100644
--- a/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
+++ b/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", example=18, ge=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -131,3 +139,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_pyi.py b/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_pyi.py
index dde1d4c..ba105b6 100644
--- a/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_pyi.py
+++ b/example/proto_3_20_pydanticv2/demo_gen_code_by_text_comment_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", example=18, ge=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -131,3 +139,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/common/single_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/common/single_p2p.py
index fbaa791..fbf9564 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/common/single_p2p.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/common/single_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 from enum import IntEnum
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_p2p.py
index 0dfff3b..f70afcd 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_p2p.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -140,3 +140,21 @@ class InvoiceItem2(BaseModel):
     quantity: int = Field(default=0)
     items: typing.List["InvoiceItem2"] = Field(default_factory=list)
     invoice: Invoice3 = Field()
+
+
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
+class RootMessage(BaseModel):
+    """
+        Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.py b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.py
index 5cf0ee9..53c7240 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.py
@@ -26,7 +26,7 @@
   syntax='proto3',
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3'
+  serialized_pb=b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\"C\n\x0bRootMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12$\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x14.user.AnOtherMessage\"m\n\x0e\x41nOtherMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12/\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x1f.user.AnOtherMessage.SubMessage\x1a\x1a\n\nSubMessage\x12\x0c\n\x04text\x18\x01 \x01(\t*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_field__mask__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,example_dot_example__proto_dot_common_dot_single__pb2.DESCRIPTOR,])
 
@@ -50,8 +50,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2306,
-  serialized_end=2335,
+  serialized_start=2486,
+  serialized_end=2515,
 )
 _sym_db.RegisterEnumDescriptor(_SEXTYPE)
 
@@ -948,6 +948,115 @@
   serialized_end=2304,
 )
 
+
+_ROOTMESSAGE = _descriptor.Descriptor(
+  name='RootMessage',
+  full_name='user.RootMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field1', full_name='user.RootMessage.field1', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='field2', full_name='user.RootMessage.field2', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2306,
+  serialized_end=2373,
+)
+
+
+_ANOTHERMESSAGE_SUBMESSAGE = _descriptor.Descriptor(
+  name='SubMessage',
+  full_name='user.AnOtherMessage.SubMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='text', full_name='user.AnOtherMessage.SubMessage.text', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2458,
+  serialized_end=2484,
+)
+
+_ANOTHERMESSAGE = _descriptor.Descriptor(
+  name='AnOtherMessage',
+  full_name='user.AnOtherMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field1', full_name='user.AnOtherMessage.field1', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='field2', full_name='user.AnOtherMessage.field2', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_ANOTHERMESSAGE_SUBMESSAGE, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2375,
+  serialized_end=2484,
+)
+
 _USERMESSAGE.fields_by_name['sex'].enum_type = _SEXTYPE
 _USERMESSAGE.fields_by_name['demo'].enum_type = example_dot_example__proto_dot_common_dot_single__pb2._DEMOENUM
 _USERMESSAGE.fields_by_name['demo_message'].message_type = example_dot_example__proto_dot_common_dot_single__pb2._DEMOMESSAGE
@@ -999,6 +1108,9 @@
 _INVOICEITEM2.fields_by_name['items'].message_type = _INVOICEITEM2
 _INVOICEITEM2.fields_by_name['invoice'].message_type = _INVOICE3
 _INVOICE3.fields_by_name['items'].message_type = _INVOICEITEM2
+_ROOTMESSAGE.fields_by_name['field2'].message_type = _ANOTHERMESSAGE
+_ANOTHERMESSAGE_SUBMESSAGE.containing_type = _ANOTHERMESSAGE
+_ANOTHERMESSAGE.fields_by_name['field2'].message_type = _ANOTHERMESSAGE_SUBMESSAGE
 DESCRIPTOR.message_types_by_name['UserMessage'] = _USERMESSAGE
 DESCRIPTOR.message_types_by_name['OtherMessage'] = _OTHERMESSAGE
 DESCRIPTOR.message_types_by_name['MapMessage'] = _MAPMESSAGE
@@ -1010,6 +1122,8 @@
 DESCRIPTOR.message_types_by_name['OptionalMessage'] = _OPTIONALMESSAGE
 DESCRIPTOR.message_types_by_name['InvoiceItem2'] = _INVOICEITEM2
 DESCRIPTOR.message_types_by_name['Invoice3'] = _INVOICE3
+DESCRIPTOR.message_types_by_name['RootMessage'] = _ROOTMESSAGE
+DESCRIPTOR.message_types_by_name['AnOtherMessage'] = _ANOTHERMESSAGE
 DESCRIPTOR.enum_types_by_name['SexType'] = _SEXTYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -1138,6 +1252,28 @@
   })
 _sym_db.RegisterMessage(Invoice3)
 
+RootMessage = _reflection.GeneratedProtocolMessageType('RootMessage', (_message.Message,), {
+  'DESCRIPTOR' : _ROOTMESSAGE,
+  '__module__' : 'example.example_proto.demo.demo_pb2'
+  # @@protoc_insertion_point(class_scope:user.RootMessage)
+  })
+_sym_db.RegisterMessage(RootMessage)
+
+AnOtherMessage = _reflection.GeneratedProtocolMessageType('AnOtherMessage', (_message.Message,), {
+
+  'SubMessage' : _reflection.GeneratedProtocolMessageType('SubMessage', (_message.Message,), {
+    'DESCRIPTOR' : _ANOTHERMESSAGE_SUBMESSAGE,
+    '__module__' : 'example.example_proto.demo.demo_pb2'
+    # @@protoc_insertion_point(class_scope:user.AnOtherMessage.SubMessage)
+    })
+  ,
+  'DESCRIPTOR' : _ANOTHERMESSAGE,
+  '__module__' : 'example.example_proto.demo.demo_pb2'
+  # @@protoc_insertion_point(class_scope:user.AnOtherMessage)
+  })
+_sym_db.RegisterMessage(AnOtherMessage)
+_sym_db.RegisterMessage(AnOtherMessage.SubMessage)
+
 
 _MAPMESSAGE_USERMAPENTRY._options = None
 _MAPMESSAGE_USERFLAGENTRY._options = None
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.pyi b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.pyi
index 1cb718c..6efd2fa 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.pyi
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/demo_pb2.pyi
@@ -438,3 +438,48 @@ class Invoice3(google.protobuf.message.Message):
         ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["amount",b"amount","items",b"items","name",b"name","quantity",b"quantity"]) -> None: ...
 global___Invoice3 = Invoice3
+
+class RootMessage(google.protobuf.message.Message):
+    """Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___RootMessage = RootMessage
+
+class AnOtherMessage(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    class SubMessage(google.protobuf.message.Message):
+        DESCRIPTOR: google.protobuf.descriptor.Descriptor
+        TEXT_FIELD_NUMBER: builtins.int
+        text: typing.Text
+        def __init__(self,
+            *,
+            text: typing.Text = ...,
+            ) -> None: ...
+        def ClearField(self, field_name: typing_extensions.Literal["text",b"text"]) -> None: ...
+
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage.SubMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage.SubMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___AnOtherMessage = AnOtherMessage
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_p2p.py
new file mode 100644
index 0000000..6b56931
--- /dev/null
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_p2p.py
@@ -0,0 +1,18 @@
+# This is an automatically generated file, please do not change
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
+# Protobuf Version: 3.20.3
+# Pydantic Version: 2.5.3
+from google.protobuf.message import Message  # type: ignore
+from pydantic import BaseModel, Field
+
+
+class UserMessage(BaseModel):
+    """
+    user info
+    """
+
+    uid: str = Field(title="UID", description="user union id", example="10086")
+    age: int = Field(default=0, title="use age", ge=0, example=18)
+    height: float = Field(default=0.0, ge=0.0, le=2.5)
+    is_adult: bool = Field(default=False)
+    user_name: str = Field(default="", description="user name", min_length=1, max_length=10, example="so1n")
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.py b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.py
new file mode 100644
index 0000000..4a6707e
--- /dev/null
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: example/example_proto/demo/single_config.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='example/example_proto/demo/single_config.proto',
+  package='single_config',
+  syntax='proto3',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n.example/example_proto/demo/single_config.proto\x12\rsingle_config\"\\\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\tb\x06proto3'
+)
+
+
+
+
+_USERMESSAGE = _descriptor.Descriptor(
+  name='UserMessage',
+  full_name='single_config.UserMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='uid', full_name='single_config.UserMessage.uid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='age', full_name='single_config.UserMessage.age', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='height', full_name='single_config.UserMessage.height', index=2,
+      number=3, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='is_adult', full_name='single_config.UserMessage.is_adult', index=3,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_name', full_name='single_config.UserMessage.user_name', index=4,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=65,
+  serialized_end=157,
+)
+
+DESCRIPTOR.message_types_by_name['UserMessage'] = _USERMESSAGE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+UserMessage = _reflection.GeneratedProtocolMessageType('UserMessage', (_message.Message,), {
+  'DESCRIPTOR' : _USERMESSAGE,
+  '__module__' : 'example.example_proto.demo.single_config_pb2'
+  # @@protoc_insertion_point(class_scope:single_config.UserMessage)
+  })
+_sym_db.RegisterMessage(UserMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.pyi b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.pyi
new file mode 100644
index 0000000..72cf391
--- /dev/null
+++ b/example/proto_3_20_pydanticv2/example/example_proto/demo/single_config_pb2.pyi
@@ -0,0 +1,45 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import typing
+import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class UserMessage(google.protobuf.message.Message):
+    """user info"""
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    UID_FIELD_NUMBER: builtins.int
+    AGE_FIELD_NUMBER: builtins.int
+    HEIGHT_FIELD_NUMBER: builtins.int
+    IS_ADULT_FIELD_NUMBER: builtins.int
+    USER_NAME_FIELD_NUMBER: builtins.int
+    uid: typing.Text
+    """aha: {"required": true, "example": "10086", "title": "UID", "description": "user union id"}"""
+
+    age: builtins.int
+    """aha: {"example": 18, "title": "use age", "ge": 0}"""
+
+    height: builtins.float
+    """aha: {"ge": 0, "le": 2.5}"""
+
+    is_adult: builtins.bool
+    user_name: typing.Text
+    """aha: {"description": "user name"}
+    aha: {"default": "", "min_length": 1, "max_length": "10", "example": "so1n"}
+    """
+
+    def __init__(self,
+        *,
+        uid: typing.Text = ...,
+        age: builtins.int = ...,
+        height: builtins.float = ...,
+        is_adult: builtins.bool = ...,
+        user_name: typing.Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: typing_extensions.Literal["age",b"age","height",b"height","is_adult",b"is_adult","uid",b"uid","user_name",b"user_name"]) -> None: ...
+global___UserMessage = UserMessage
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
index f0a8e0c..f96fcd5 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -49,7 +49,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
index 68796df..5114ff6 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -49,7 +49,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
@@ -509,7 +509,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
index a297a48..faa6c5d 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -43,7 +43,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
@@ -478,7 +478,7 @@ class UserPayMessage(BaseModel):
             timestamp_gt_now_validator
         )
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -486,7 +486,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
@@ -532,7 +532,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
index a297a48..faa6c5d 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -43,7 +43,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
@@ -478,7 +478,7 @@ class UserPayMessage(BaseModel):
             timestamp_gt_now_validator
         )
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -486,7 +486,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
@@ -532,7 +532,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_3_20_pydanticv2/example/example_proto/validate/demo_p2p.py b/example/proto_3_20_pydanticv2/example/example_proto/validate/demo_p2p.py
index c1adc2c..d8353a4 100644
--- a/example/proto_3_20_pydanticv2/example/example_proto/validate/demo_p2p.py
+++ b/example/proto_3_20_pydanticv2/example/example_proto/validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 3.20.3
 # Pydantic Version: 2.5.3
 import typing
@@ -47,7 +47,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_pydanticv1/demo_gen_code.py b/example/proto_pydanticv1/demo_gen_code.py
index 45307ba..8ee014e 100644
--- a/example/proto_pydanticv1/demo_gen_code.py
+++ b/example/proto_pydanticv1/demo_gen_code.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -17,6 +17,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -130,3 +138,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv1/demo_gen_code_by_p2p.py b/example/proto_pydanticv1/demo_gen_code_by_p2p.py
index 42d2c89..f3c8dbd 100644
--- a/example/proto_pydanticv1/demo_gen_code_by_p2p.py
+++ b/example/proto_pydanticv1/demo_gen_code_by_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -42,7 +42,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
diff --git a/example/proto_pydanticv1/demo_gen_code_by_pgv.py b/example/proto_pydanticv1/demo_gen_code_by_pgv.py
index 1b19d40..00ecd04 100644
--- a/example/proto_pydanticv1/demo_gen_code_by_pgv.py
+++ b/example/proto_pydanticv1/demo_gen_code_by_pgv.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -39,7 +39,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
diff --git a/example/proto_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py b/example/proto_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
index 9754e5a..aa895f2 100644
--- a/example/proto_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
+++ b/example/proto_pydanticv1/demo_gen_code_by_text_comment_protobuf_field.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", ge=0.0, example=18)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -132,3 +140,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv1/demo_gen_code_by_text_comment_pyi.py b/example/proto_pydanticv1/demo_gen_code_by_text_comment_pyi.py
index 9754e5a..aa895f2 100644
--- a/example/proto_pydanticv1/demo_gen_code_by_text_comment_pyi.py
+++ b/example/proto_pydanticv1/demo_gen_code_by_text_comment_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", ge=0.0, example=18)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -132,3 +140,8 @@ class Config:
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv1/example/example_proto/common/single_p2p.py b/example/proto_pydanticv1/example/example_proto/common/single_p2p.py
index 80cd407..618e1d5 100644
--- a/example/proto_pydanticv1/example/example_proto/common/single_p2p.py
+++ b/example/proto_pydanticv1/example/example_proto/common/single_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 from enum import IntEnum
diff --git a/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py b/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py
index 372cbfa..6fea5e4 100644
--- a/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py
+++ b/example/proto_pydanticv1/example/example_proto/demo/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -142,3 +142,21 @@ class InvoiceItem2(BaseModel):
     quantity: int = Field(default=0)
     items: typing.List["InvoiceItem2"] = Field(default_factory=list)
     invoice: Invoice3 = Field()
+
+
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
+class RootMessage(BaseModel):
+    """
+        Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.py b/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.py
index e4df9a0..76fda0e 100644
--- a/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.py
+++ b/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.py
@@ -19,7 +19,7 @@
 from example.proto_pydanticv1.example.example_proto.common import single_pb2 as example_dot_example__proto_dot_common_dot_single__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\"C\n\x0bRootMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12$\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x14.user.AnOtherMessage\"m\n\x0e\x41nOtherMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12/\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x1f.user.AnOtherMessage.SubMessage\x1a\x1a\n\nSubMessage\x12\x0c\n\x04text\x18\x01 \x01(\t*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
 _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'example.example_proto.demo.demo_pb2', globals())
@@ -36,8 +36,8 @@
   _NESTEDMESSAGE_USERMAPENTRY._serialized_options = b'8\001'
   _OPTIONALMESSAGE_INTMAPENTRY._options = None
   _OPTIONALMESSAGE_INTMAPENTRY._serialized_options = b'8\001'
-  _SEXTYPE._serialized_start=2306
-  _SEXTYPE._serialized_end=2335
+  _SEXTYPE._serialized_start=2486
+  _SEXTYPE._serialized_end=2515
   _USERMESSAGE._serialized_start=249
   _USERMESSAGE._serialized_end=444
   _OTHERMESSAGE._serialized_start=447
@@ -74,4 +74,10 @@
   _INVOICEITEM2._serialized_end=2209
   _INVOICE3._serialized_start=2211
   _INVOICE3._serialized_end=2304
+  _ROOTMESSAGE._serialized_start=2306
+  _ROOTMESSAGE._serialized_end=2373
+  _ANOTHERMESSAGE._serialized_start=2375
+  _ANOTHERMESSAGE._serialized_end=2484
+  _ANOTHERMESSAGE_SUBMESSAGE._serialized_start=2458
+  _ANOTHERMESSAGE_SUBMESSAGE._serialized_end=2484
 # @@protoc_insertion_point(module_scope)
diff --git a/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.pyi b/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.pyi
index 1cb718c..6efd2fa 100644
--- a/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.pyi
+++ b/example/proto_pydanticv1/example/example_proto/demo/demo_pb2.pyi
@@ -438,3 +438,48 @@ class Invoice3(google.protobuf.message.Message):
         ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["amount",b"amount","items",b"items","name",b"name","quantity",b"quantity"]) -> None: ...
 global___Invoice3 = Invoice3
+
+class RootMessage(google.protobuf.message.Message):
+    """Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___RootMessage = RootMessage
+
+class AnOtherMessage(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    class SubMessage(google.protobuf.message.Message):
+        DESCRIPTOR: google.protobuf.descriptor.Descriptor
+        TEXT_FIELD_NUMBER: builtins.int
+        text: typing.Text
+        def __init__(self,
+            *,
+            text: typing.Text = ...,
+            ) -> None: ...
+        def ClearField(self, field_name: typing_extensions.Literal["text",b"text"]) -> None: ...
+
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage.SubMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage.SubMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___AnOtherMessage = AnOtherMessage
diff --git a/example/proto_pydanticv1/example/example_proto/demo/single_config_p2p.py b/example/proto_pydanticv1/example/example_proto/demo/single_config_p2p.py
new file mode 100644
index 0000000..8c6891b
--- /dev/null
+++ b/example/proto_pydanticv1/example/example_proto/demo/single_config_p2p.py
@@ -0,0 +1,18 @@
+# This is an automatically generated file, please do not change
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
+# Protobuf Version: 4.24.4
+# Pydantic Version: 1.10.7
+from google.protobuf.message import Message  # type: ignore
+from pydantic import BaseModel, Field
+
+
+class UserMessage(BaseModel):
+    """
+    user info
+    """
+
+    uid: str = Field(example="10086", title="UID", description="user union id")
+    age: int = Field(default=0, example=18, title="use age", ge=0.0)
+    height: float = Field(default=0.0, ge=0.0, le=2.5)
+    is_adult: bool = Field(default=False)
+    user_name: str = Field(default="", example="so1n", description="user name", min_length=1, max_length=10)
diff --git a/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.py b/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.py
new file mode 100644
index 0000000..2df52f3
--- /dev/null
+++ b/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: example/example_proto/demo/single_config.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.example/example_proto/demo/single_config.proto\x12\rsingle_config\"\\\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\tb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'example.example_proto.demo.single_config_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _USERMESSAGE._serialized_start=65
+  _USERMESSAGE._serialized_end=157
+# @@protoc_insertion_point(module_scope)
diff --git a/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.pyi b/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.pyi
new file mode 100644
index 0000000..72cf391
--- /dev/null
+++ b/example/proto_pydanticv1/example/example_proto/demo/single_config_pb2.pyi
@@ -0,0 +1,45 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import typing
+import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class UserMessage(google.protobuf.message.Message):
+    """user info"""
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    UID_FIELD_NUMBER: builtins.int
+    AGE_FIELD_NUMBER: builtins.int
+    HEIGHT_FIELD_NUMBER: builtins.int
+    IS_ADULT_FIELD_NUMBER: builtins.int
+    USER_NAME_FIELD_NUMBER: builtins.int
+    uid: typing.Text
+    """aha: {"required": true, "example": "10086", "title": "UID", "description": "user union id"}"""
+
+    age: builtins.int
+    """aha: {"example": 18, "title": "use age", "ge": 0}"""
+
+    height: builtins.float
+    """aha: {"ge": 0, "le": 2.5}"""
+
+    is_adult: builtins.bool
+    user_name: typing.Text
+    """aha: {"description": "user name"}
+    aha: {"default": "", "min_length": 1, "max_length": "10", "example": "so1n"}
+    """
+
+    def __init__(self,
+        *,
+        uid: typing.Text = ...,
+        age: builtins.int = ...,
+        height: builtins.float = ...,
+        is_adult: builtins.bool = ...,
+        user_name: typing.Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: typing_extensions.Literal["age",b"age","height",b"height","is_adult",b"is_adult","uid",b"uid","user_name",b"user_name"]) -> None: ...
+global___UserMessage = UserMessage
diff --git a/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py b/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
index 5d1a765..055a4c6 100644
--- a/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
+++ b/example/proto_pydanticv1/example/example_proto/p2p_validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -45,7 +45,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
index 0b0f968..596c902 100644
--- a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
+++ b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -45,7 +45,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
index 16981f6..291720d 100644
--- a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
+++ b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
@@ -427,7 +427,7 @@ class UserPayMessage(BaseModel):
 
         exp_timestamp_gt_now_validator = validator("exp", allow_reuse=True)(timestamp_gt_now_validator)
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -435,7 +435,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
diff --git a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
index 16981f6..291720d 100644
--- a/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
+++ b/example/proto_pydanticv1/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, Field, root_validator, validator
 from pydantic.networks import AnyUrl, EmailStr, IPvAnyAddress
@@ -427,7 +427,7 @@ class UserPayMessage(BaseModel):
 
         exp_timestamp_gt_now_validator = validator("exp", allow_reuse=True)(timestamp_gt_now_validator)
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -435,7 +435,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
diff --git a/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py b/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py
index 0758e69..fa6f094 100644
--- a/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py
+++ b/example/proto_pydanticv1/example/example_proto/validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 1.10.7
 import typing
@@ -44,7 +44,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_pydanticv2/demo_gen_code.py b/example/proto_pydanticv2/demo_gen_code.py
index b856fa8..bd48bce 100644
--- a/example/proto_pydanticv2/demo_gen_code.py
+++ b/example/proto_pydanticv2/demo_gen_code.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -17,6 +17,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -129,3 +137,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv2/demo_gen_code_by_p2p.py b/example/proto_pydanticv2/demo_gen_code_by_p2p.py
index e311906..92b7fe0 100644
--- a/example/proto_pydanticv2/demo_gen_code_by_p2p.py
+++ b/example/proto_pydanticv2/demo_gen_code_by_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -44,7 +44,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
diff --git a/example/proto_pydanticv2/demo_gen_code_by_pgv.py b/example/proto_pydanticv2/demo_gen_code_by_pgv.py
index 48d2568..64e5c68 100644
--- a/example/proto_pydanticv2/demo_gen_code_by_pgv.py
+++ b/example/proto_pydanticv2/demo_gen_code_by_pgv.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -41,7 +41,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
diff --git a/example/proto_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py b/example/proto_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
index 45154b7..acd1356 100644
--- a/example/proto_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
+++ b/example/proto_pydanticv2/demo_gen_code_by_text_comment_protobuf_field.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", example=18, ge=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -131,3 +139,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv2/demo_gen_code_by_text_comment_pyi.py b/example/proto_pydanticv2/demo_gen_code_by_text_comment_pyi.py
index 45154b7..acd1356 100644
--- a/example/proto_pydanticv2/demo_gen_code_by_text_comment_pyi.py
+++ b/example/proto_pydanticv2/demo_gen_code_by_text_comment_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -20,6 +20,14 @@ class AfterReferMessage(BaseModel):
     age: int = Field(default=0, title="use age", example=18, ge=0)
 
 
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
 class EmptyMessage(BaseModel):
     pass
 
@@ -131,3 +139,8 @@ class OtherMessage(BaseModel):
     metadata: typing.Dict[str, typing.Any] = Field(default_factory=dict)
     double_value: DoubleValue = Field(default_factory=DoubleValue)
     field_mask: typing.Optional[FieldMask] = Field(default_factory=FieldMask)
+
+
+class RootMessage(BaseModel):
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv2/example/example_proto/common/single_p2p.py b/example/proto_pydanticv2/example/example_proto/common/single_p2p.py
index 02ec71c..32ba63e 100644
--- a/example/proto_pydanticv2/example/example_proto/common/single_p2p.py
+++ b/example/proto_pydanticv2/example/example_proto/common/single_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 from enum import IntEnum
diff --git a/example/proto_pydanticv2/example/example_proto/demo/demo_p2p.py b/example/proto_pydanticv2/example/example_proto/demo/demo_p2p.py
index 26eb37f..e4f200c 100644
--- a/example/proto_pydanticv2/example/example_proto/demo/demo_p2p.py
+++ b/example/proto_pydanticv2/example/example_proto/demo/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -140,3 +140,21 @@ class InvoiceItem2(BaseModel):
     quantity: int = Field(default=0)
     items: typing.List["InvoiceItem2"] = Field(default_factory=list)
     invoice: Invoice3 = Field()
+
+
+class AnOtherMessage(BaseModel):
+    class SubMessage(BaseModel):
+        text: str = Field(default="")
+
+    field1: str = Field(default="")
+    field2: SubMessage = Field()
+
+
+class RootMessage(BaseModel):
+    """
+        Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+
+    field1: str = Field(default="")
+    field2: AnOtherMessage = Field()
diff --git a/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.py b/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.py
index 210242d..364406c 100644
--- a/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.py
+++ b/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.py
@@ -19,7 +19,7 @@
 from example.proto_pydanticv2.example.example_proto.common import single_pb2 as example_dot_example__proto_dot_common_dot_single__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%example/example_proto/demo/demo.proto\x12\x04user\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a google/protobuf/field_mask.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a)example/example_proto/common/single.proto\"\xc3\x01\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x1a\n\x03sex\x18\x04 \x01(\x0e\x32\r.user.SexType\x12\x1e\n\x04\x64\x65mo\x18\x06 \x01(\x0e\x32\x10.single.DemoEnum\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\t\x12)\n\x0c\x64\x65mo_message\x18\t \x01(\x0b\x32\x13.single.DemoMessage\"\xb1\x01\n\x0cOtherMessage\x12)\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x32\n\x0c\x64ouble_value\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x33\n\nfield_mask\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\r\n\x0b_field_mask\"\xe4\x01\n\nMapMessage\x12/\n\x08user_map\x18\x01 \x03(\x0b\x32\x1d.user.MapMessage.UserMapEntry\x12\x31\n\tuser_flag\x18\x02 \x03(\x0b\x32\x1e.user.MapMessage.UserFlagEntry\x1a\x41\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x05value\x18\x02 \x01(\x0b\x32\x11.user.UserMessage:\x02\x38\x01\x1a/\n\rUserFlagEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08:\x02\x38\x01\"[\n\x0fRepeatedMessage\x12\x10\n\x08str_list\x18\x01 \x03(\t\x12\x10\n\x08int_list\x18\x02 \x03(\x05\x12$\n\tuser_list\x18\x03 \x03(\x0b\x32\x11.user.UserMessage\"\x99\x05\n\rNestedMessage\x12;\n\ruser_list_map\x18\x01 \x03(\x0b\x32$.user.NestedMessage.UserListMapEntry\x12\x32\n\x08user_map\x18\x02 \x03(\x0b\x32 .user.NestedMessage.UserMapEntry\x12\x34\n\x08user_pay\x18\x03 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12\x35\n\x0cinclude_enum\x18\x04 \x01(\x0e\x32\x1f.user.NestedMessage.IncludeEnum\x12?\n\x13not_enable_user_pay\x18\x05 \x01(\x0b\x32\".user.NestedMessage.UserPayMessage\x12%\n\x05\x65mpty\x18\x06 \x01(\x0b\x32\x16.google.protobuf.Empty\x12,\n\x0b\x61\x66ter_refer\x18\x07 \x01(\x0b\x32\x17.user.AfterReferMessage\x1a\\\n\x0eUserPayMessage\x12\x13\n\x0b\x62\x61nk_number\x18\x01 \x01(\t\x12\'\n\x03\x65xp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04uuid\x18\x03 \x01(\t\x1aI\n\x10UserListMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.user.RepeatedMessage:\x02\x38\x01\x1a@\n\x0cUserMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.user.MapMessage:\x02\x38\x01\")\n\x0bIncludeEnum\x12\x08\n\x04zero\x10\x00\x12\x07\n\x03one\x10\x01\x12\x07\n\x03two\x10\x02\"-\n\x11\x41\x66terReferMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\"_\n\x0bInvoiceItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12 \n\x05items\x18\x04 \x03(\x0b\x32\x11.user.InvoiceItem\"\x0e\n\x0c\x45mptyMessage\"\xa9\x02\n\x0fOptionalMessage\x12\x0b\n\x01x\x18\x01 \x01(\tH\x00\x12\x0b\n\x01y\x18\x02 \x01(\x05H\x00\x12\x11\n\x04name\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03\x61ge\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12$\n\x04item\x18\x05 \x01(\x0b\x32\x11.user.InvoiceItemH\x03\x88\x01\x01\x12\x10\n\x08str_list\x18\x06 \x03(\t\x12\x32\n\x07int_map\x18\x07 \x03(\x0b\x32!.user.OptionalMessage.IntMapEntry\x12\x1d\n\x15\x64\x65\x66\x61ult_template_test\x18\x08 \x01(\x02\x1a-\n\x0bIntMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x03\n\x01\x61\x42\x07\n\x05_nameB\x06\n\x04_ageB\x07\n\x05_item\"\x82\x01\n\x0cInvoiceItem2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\x12\x1f\n\x07invoice\x18\x05 \x01(\x0b\x32\x0e.user.Invoice3\"]\n\x08Invoice3\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x05\x12\x10\n\x08quantity\x18\x03 \x01(\x05\x12!\n\x05items\x18\x04 \x03(\x0b\x32\x12.user.InvoiceItem2\"C\n\x0bRootMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12$\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x14.user.AnOtherMessage\"m\n\x0e\x41nOtherMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12/\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x1f.user.AnOtherMessage.SubMessage\x1a\x1a\n\nSubMessage\x12\x0c\n\x04text\x18\x01 \x01(\t*\x1d\n\x07SexType\x12\x07\n\x03man\x10\x00\x12\t\n\x05women\x10\x01\x62\x06proto3')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
 _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'example.example_proto.demo.demo_pb2', globals())
@@ -36,8 +36,8 @@
   _NESTEDMESSAGE_USERMAPENTRY._serialized_options = b'8\001'
   _OPTIONALMESSAGE_INTMAPENTRY._options = None
   _OPTIONALMESSAGE_INTMAPENTRY._serialized_options = b'8\001'
-  _SEXTYPE._serialized_start=2306
-  _SEXTYPE._serialized_end=2335
+  _SEXTYPE._serialized_start=2486
+  _SEXTYPE._serialized_end=2515
   _USERMESSAGE._serialized_start=249
   _USERMESSAGE._serialized_end=444
   _OTHERMESSAGE._serialized_start=447
@@ -74,4 +74,10 @@
   _INVOICEITEM2._serialized_end=2209
   _INVOICE3._serialized_start=2211
   _INVOICE3._serialized_end=2304
+  _ROOTMESSAGE._serialized_start=2306
+  _ROOTMESSAGE._serialized_end=2373
+  _ANOTHERMESSAGE._serialized_start=2375
+  _ANOTHERMESSAGE._serialized_end=2484
+  _ANOTHERMESSAGE_SUBMESSAGE._serialized_start=2458
+  _ANOTHERMESSAGE_SUBMESSAGE._serialized_end=2484
 # @@protoc_insertion_point(module_scope)
diff --git a/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.pyi b/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.pyi
index 1cb718c..6efd2fa 100644
--- a/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.pyi
+++ b/example/proto_pydanticv2/example/example_proto/demo/demo_pb2.pyi
@@ -438,3 +438,48 @@ class Invoice3(google.protobuf.message.Message):
         ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["amount",b"amount","items",b"items","name",b"name","quantity",b"quantity"]) -> None: ...
 global___Invoice3 = Invoice3
+
+class RootMessage(google.protobuf.message.Message):
+    """Test Message references
+    from: https://github.com/so1n/protobuf_to_pydantic/issues/64
+    """
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___RootMessage = RootMessage
+
+class AnOtherMessage(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    class SubMessage(google.protobuf.message.Message):
+        DESCRIPTOR: google.protobuf.descriptor.Descriptor
+        TEXT_FIELD_NUMBER: builtins.int
+        text: typing.Text
+        def __init__(self,
+            *,
+            text: typing.Text = ...,
+            ) -> None: ...
+        def ClearField(self, field_name: typing_extensions.Literal["text",b"text"]) -> None: ...
+
+    FIELD1_FIELD_NUMBER: builtins.int
+    FIELD2_FIELD_NUMBER: builtins.int
+    field1: typing.Text
+    @property
+    def field2(self) -> global___AnOtherMessage.SubMessage: ...
+    def __init__(self,
+        *,
+        field1: typing.Text = ...,
+        field2: typing.Optional[global___AnOtherMessage.SubMessage] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["field2",b"field2"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["field1",b"field1","field2",b"field2"]) -> None: ...
+global___AnOtherMessage = AnOtherMessage
diff --git a/example/proto_pydanticv2/example/example_proto/demo/single_config_p2p.py b/example/proto_pydanticv2/example/example_proto/demo/single_config_p2p.py
new file mode 100644
index 0000000..01458c3
--- /dev/null
+++ b/example/proto_pydanticv2/example/example_proto/demo/single_config_p2p.py
@@ -0,0 +1,18 @@
+# This is an automatically generated file, please do not change
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
+# Protobuf Version: 4.24.4
+# Pydantic Version: 2.5.3
+from google.protobuf.message import Message  # type: ignore
+from pydantic import BaseModel, Field
+
+
+class UserMessage(BaseModel):
+    """
+    user info
+    """
+
+    uid: str = Field(title="UID", description="user union id", example="10086")
+    age: int = Field(default=0, title="use age", ge=0, example=18)
+    height: float = Field(default=0.0, ge=0.0, le=2.5)
+    is_adult: bool = Field(default=False)
+    user_name: str = Field(default="", description="user name", min_length=1, max_length=10, example="so1n")
diff --git a/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.py b/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.py
new file mode 100644
index 0000000..2df52f3
--- /dev/null
+++ b/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: example/example_proto/demo/single_config.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.example/example_proto/demo/single_config.proto\x12\rsingle_config\"\\\n\x0bUserMessage\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12\x0b\n\x03\x61ge\x18\x02 \x01(\x05\x12\x0e\n\x06height\x18\x03 \x01(\x02\x12\x10\n\x08is_adult\x18\x07 \x01(\x08\x12\x11\n\tuser_name\x18\x08 \x01(\tb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'example.example_proto.demo.single_config_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _USERMESSAGE._serialized_start=65
+  _USERMESSAGE._serialized_end=157
+# @@protoc_insertion_point(module_scope)
diff --git a/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.pyi b/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.pyi
new file mode 100644
index 0000000..72cf391
--- /dev/null
+++ b/example/proto_pydanticv2/example/example_proto/demo/single_config_pb2.pyi
@@ -0,0 +1,45 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import typing
+import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class UserMessage(google.protobuf.message.Message):
+    """user info"""
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    UID_FIELD_NUMBER: builtins.int
+    AGE_FIELD_NUMBER: builtins.int
+    HEIGHT_FIELD_NUMBER: builtins.int
+    IS_ADULT_FIELD_NUMBER: builtins.int
+    USER_NAME_FIELD_NUMBER: builtins.int
+    uid: typing.Text
+    """aha: {"required": true, "example": "10086", "title": "UID", "description": "user union id"}"""
+
+    age: builtins.int
+    """aha: {"example": 18, "title": "use age", "ge": 0}"""
+
+    height: builtins.float
+    """aha: {"ge": 0, "le": 2.5}"""
+
+    is_adult: builtins.bool
+    user_name: typing.Text
+    """aha: {"description": "user name"}
+    aha: {"default": "", "min_length": 1, "max_length": "10", "example": "so1n"}
+    """
+
+    def __init__(self,
+        *,
+        uid: typing.Text = ...,
+        age: builtins.int = ...,
+        height: builtins.float = ...,
+        is_adult: builtins.bool = ...,
+        user_name: typing.Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: typing_extensions.Literal["age",b"age","height",b"height","is_adult",b"is_adult","uid",b"uid","user_name",b"user_name"]) -> None: ...
+global___UserMessage = UserMessage
diff --git a/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py b/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
index e74cebd..df61b21 100644
--- a/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
+++ b/example/proto_pydanticv2/example/example_proto/p2p_validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -49,7 +49,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
index e082279..0732958 100644
--- a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
+++ b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -49,7 +49,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
@@ -509,7 +509,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
index 3137a28..90abd92 100644
--- a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
+++ b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_protobuf.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -43,7 +43,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
@@ -478,7 +478,7 @@ class UserPayMessage(BaseModel):
             timestamp_gt_now_validator
         )
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -486,7 +486,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
@@ -532,7 +532,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
index 3137a28..90abd92 100644
--- a/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
+++ b/example/proto_pydanticv2/example/example_proto/p2p_validate_by_comment/demo_pb2_by_pyi.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -43,7 +43,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
 from pydantic.functional_validators import BeforeValidator
@@ -478,7 +478,7 @@ class UserPayMessage(BaseModel):
             timestamp_gt_now_validator
         )
 
-    class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
+    class NotEnableUserPayMessageWithSkipRule(BaseModel):
         bank_number: str = Field(default="")
         exp: datetime = Field(default_factory=datetime.now)
         uuid: str = Field(default="")
@@ -486,7 +486,7 @@ class NotEnableUserPayMessageOnlyUseSkipRule(BaseModel):
     string_in_map_test: typing.Dict[str, StringTest] = Field(default_factory=dict)
     map_in_map_test: typing.Dict[str, MapTest] = Field(default_factory=dict)
     user_pay: UserPayMessage = Field()
-    not_enable_user_pay: NotEnableUserPayMessageOnlyUseSkipRule = Field()
+    not_enable_user_pay: NotEnableUserPayMessageWithSkipRule = Field()
     empty: typing.Any = Field()
     after_refer: AfterReferMessage = Field()
 
@@ -532,7 +532,7 @@ class RepeatedTest(BaseModel):
     items_string_test: typing.List[
         typing_extensions.Annotated[str, MinLen(min_length=1), MaxLen(max_length=5)]
     ] = Field(default_factory=list, min_length=1, max_length=5)
-    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1), Lt(lt=5)]] = Field(
+    items_double_test: typing.List[typing_extensions.Annotated[float, Gt(gt=1.0), Lt(lt=5.0)]] = Field(
         default_factory=list, min_length=1, max_length=5
     )
     items_int32_test: typing.List[typing_extensions.Annotated[int, Gt(gt=1), Lt(lt=5)]] = Field(
diff --git a/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py b/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py
index da9c02f..f96f401 100644
--- a/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py
+++ b/example/proto_pydanticv2/example/example_proto/validate/demo_p2p.py
@@ -1,5 +1,5 @@
 # This is an automatically generated file, please do not change
-# gen by protobuf_to_pydantic[v0.2.6](https://github.com/so1n/protobuf_to_pydantic)
+# gen by protobuf_to_pydantic[v0.2.7](https://github.com/so1n/protobuf_to_pydantic)
 # Protobuf Version: 4.24.4
 # Pydantic Version: 2.5.3
 import typing
@@ -47,7 +47,7 @@
     timestamp_lt_validator,
     timestamp_within_validator,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.types import HostNameStr, UriRefStr
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import HostNameStr, UriRefStr
 from protobuf_to_pydantic.util import Timedelta
 
 
diff --git a/example/single_config_pkg_plugin_config.py b/example/single_config_pkg_plugin_config.py
new file mode 100644
index 0000000..b3fce06
--- /dev/null
+++ b/example/single_config_pkg_plugin_config.py
@@ -0,0 +1,1 @@
+comment_prefix = "aha"
diff --git a/images/protobuf-to-pydantic_index.drawio b/images/protobuf-to-pydantic_index.drawio
index a5f0e0e..2153bc2 100644
--- a/images/protobuf-to-pydantic_index.drawio
+++ b/images/protobuf-to-pydantic_index.drawio
@@ -1,10 +1,10 @@
-<mxfile host="app.diagrams.net" modified="2023-09-11T16:54:13.885Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" etag="TxFQta7zMoVEJE8rnqrp" version="21.7.4" type="device">
-  <diagram name="第 1 页" id="R0D0qZDv4VENwMdXRK7D">
-    <mxGraphModel dx="842" dy="424" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" version="24.7.14">
+  <diagram name="第 1 页" id="I_vEnn5mo4LWlLxei6Jp">
+    <mxGraphModel dx="1693" dy="1051" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
       <root>
         <mxCell id="0" />
         <mxCell id="1" parent="0" />
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-5" target="RtlmW2mn4jqAsx0V-4f3-6" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-3" target="R1Sj7afmYKt7WFE0D8gf-6">
           <mxGeometry relative="1" as="geometry">
             <Array as="points">
               <mxPoint x="360" y="206" />
@@ -12,7 +12,7 @@
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="RtlmW2mn4jqAsx0V-4f3-26" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="R1Sj7afmYKt7WFE0D8gf-24">
           <mxGeometry relative="1" as="geometry">
             <Array as="points">
               <mxPoint x="800" y="183" />
@@ -21,163 +21,148 @@
             <mxPoint x="305" y="183" as="sourcePoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-5" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-3" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" vertex="1" parent="1">
           <mxGeometry y="127.64" width="304.98" height="123.36" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-6" target="RtlmW2mn4jqAsx0V-4f3-14" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-6" target="R1Sj7afmYKt7WFE0D8gf-16">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-6" target="RtlmW2mn4jqAsx0V-4f3-19" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-6" target="R1Sj7afmYKt7WFE0D8gf-18">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-6" value="Protoc" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="400" y="300" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.996;exitY=0.569;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-7" target="RtlmW2mn4jqAsx0V-4f3-42" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-6" target="R1Sj7afmYKt7WFE0D8gf-22">
           <mxGeometry relative="1" as="geometry">
+            <mxPoint x="430" y="910" as="targetPoint" />
             <Array as="points">
-              <mxPoint x="301" y="360" />
-              <mxPoint x="340" y="360" />
-              <mxPoint x="340" y="740" />
+              <mxPoint x="419" y="360" />
+              <mxPoint x="419" y="900" />
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="KdBb6stnHXvAtuBUdLKM-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.001;exitY=0.364;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-6" value="Protoc" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+          <mxGeometry x="400" y="300" width="120" height="60" as="geometry" />
+        </mxCell>
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.001;exitY=0.364;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1">
           <mxGeometry relative="1" as="geometry">
             <mxPoint x="400" y="331" as="targetPoint" />
             <mxPoint x="302.9025999999999" y="330.37932" as="sourcePoint" />
             <Array as="points" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-7" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-9" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" vertex="1" parent="1">
           <mxGeometry y="270" width="302.6" height="163.13" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-8" target="RtlmW2mn4jqAsx0V-4f3-6" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-12" target="R1Sj7afmYKt7WFE0D8gf-6">
           <mxGeometry relative="1" as="geometry">
             <Array as="points">
-              <mxPoint x="360" y="475" />
+              <mxPoint x="360" y="550" />
               <mxPoint x="360" y="330" />
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.998;exitY=0.31;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitPerimeter=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-8" target="RtlmW2mn4jqAsx0V-4f3-42" edge="1">
-          <mxGeometry relative="1" as="geometry">
-            <Array as="points">
-              <mxPoint x="298" y="509" />
-              <mxPoint x="340" y="508" />
-              <mxPoint x="340" y="740" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-8" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAAj0AAAFTCAIAAABd5SrhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdd1wU194w8N+ZmWUbS3GXsvQmIE0ERLFh7N2oiSYmJsb0mxuT3LzmpnjNE1O9Kd605z6mamKMmth7r1EBFQsISpVelrbsLttmzvsHiIAgu8susHq+n/wRl9k5Zc6c35w5Z2bRkIThNdVVQBAEQRD2gOrrDBAEQRCEGUjcIgiCIOwJiVsEQRCEPSFxiyAIgrAnTF9ngCDuAzx6+BjBzBhegCvilTa9/J22Evd1lgjCbpG4RRC2hQS8F153ejIANd/cMKgROesIoifIGWRLVOC891dM96Kb/4Uxa1DXledfTTmy5+iVKn3f5q0NOuzxT96YJKWwNn3NG1+fUTUPBZB4+EtfPBsvRFzVgY//uSmX7eNc2i3PEaLH/BHU67/+Ub0th1WRiiSIniHzW7aH2ab6qqqqqmpFg57n6hfzwPxXV745P9IR9XXG2tEqlTp++NAo8a1sCaOGDOJrGxp0fZqte4C3nGYQlKZofs8mQYsgrICMt3qB8ux3b67PMgIA0JKAkY8++9jIgMnPLch5+6d0db+Z5mAq8q/RgyMSosQp51QYQBA+ZJBAk5NdERHr2td5s2+aJowBaLp/XacQhP0i463exTYWnvxpzf5ijnJJSI6T9KOuDAkq8rI0gkEJ0SIEAPywIVEiTWZepaAf5dE+1Sk5DsDFCZGTjSCsou14ixo8btx7UfjAoWvaiPBJng7K8pvfHSzQR0Q/Hytzx+qU1CvfXm7Qtv02LYobHDwr3G2gq0AIxrq6+gvZBVsuV1fecTOEcZRNGxY0zt/ZS8xzoMCg01VUKU5dzt2Rp9ZZuiUwoiHRgVNC3cIHCB1prlGpzMwr+vN8acEdN7ZoiduDSSET/J3d+aCqrz19MXtTo99/5vi7KG689nvOzbZDHpNL1APG0quZihl+Mi8/DwqUbffMc4seP2Ni0uBAT2cBaBsq8q+e3b/nyFWF4XaZI5744vWx+MSP63UjF4wJdlTlHl3/wwHDqCWPT4qUcRXpO39Ye6SwXQU4eMROnDl+WGSAhzMfdA2VBddSDu09lF7ZcXqNchGV7c/UxEcnRInOpRhCY6McmzIulAkfo+COCu0+n7ey6xo5btbUEdFBni5iHsUZtcqqwszUwzsPXKzQW7olOLhFjZ0yNjE6xEsqYgxqRcn1i0f37j1bpOk4dqUHRE2eO3tUdIBMBJrKnNT9G3fWPPDesvFOxVvfe297CWdJiSzQoMQcBkZCOSFQ9JvxNUHYL1ru5dOkUQMAAPIMDHzAnXESQWFOeYZeHBfskeDr6sbWnrihdPD0HDZQShcVX1bdOvN4LvMeTFoaNcBTwFUrlGUacJa6RgV6jfXmruTU1bbpFJDQ4+8Lhs71FbvwsFqtq9eyHE/gMcA5ZqDXQG3VqUo9tmBL/oDH5w7/W6TU15GHddoaHTg5S4K8PccF8vNyqsqNbVIXey59OGG2j0jCYFVjk4pxjA338uUMUndHgabmQEZtQ+umJpfIVMg1YlxyqERXcObgFcXt7yNh8MixEc5cSerB9OrWj/lB0/6xfElyqLtIX1NSVKHETl7BYTEjksKMWWk36lvCG+U2ePKIAKHECRWfT7mu9YwakjA4IniAMetcShEvOG5IQgSdefxaHXcroYGz/9/bT4wKcXfiY41SZeS7unkFRA4fMQjdOH+99lYtUbKYCSNDHOsu/pFGjxwexSs6dkk8buEDntk7N1cFT4+Xa/NOH86sxebkEwAASeIWL39taoTcWcBp6uuUah12cJHJAwYlJgWqLqYUqLAFW4rC5i57+4kx4V6uQqypq1MjRzcv/7CEEbGSm2nt1rogl6FL3n5lUribowOnrlGoHeSRSUlerNrV34uvzDpxIlvZulOTS2QhJ968JEaoNe47ZaglcYsgeuyO+S1ElWdlrc/Q4Qz1AJ/EycLGnUdzr7AoFbt898CAhEDH9RXNIwQUFB+90Junq8z/ZPf1dBUHALTYbdHMuAe9Q/8eV/16SutAArmHByU7IYOi8JMdWRdUHAAA5RCeEP9u0oCYIb4Dr2Zlc2ZvOTAhZq4nz1BX+v2Ba0cq9SwA39lzyYzYyTK/Z+NL/n66tbehwuPCk50Q11i+ZueVgwojBuTiHfL65CBxx/tfppfIFmi/qUseDBXpC/d9+9UfGXVGAKBdouYtXTo5dO7iKVdW7ihqE/eYyjO/bz3egJkKl/A3kiUlh9btyjKiS1zwqkWhMYO9t+Td5AAAaP+pT80IFnKKtN//u/Z4fiMHtGPg2EUvPp4QPOvJqZfe21rQJr4DEorh2vlrTYkRsZEhdZHOTRkXs5BkHEIW5hNJk6YNl1LG4oPfrt54pc4IAEBJgmcs/ceDYYMmjQ06/vutJYqmb0kHTl8yLVBorPhrw3e/ny5QsgAO7kMfefn5ZJ9xC6eeWb65ddUjEzJl/nAZhWtSf/3yp5PFGgy0U9is55+dLOpJzVsEs9iAAdFkMpkgrOPOW+5YpTVgAMB6pQ6wTt+IWz7kABwFDi29GOU8KlTC4KYjp1u6eABg1dUbTpdUY8ovVB7YZsduzkIKcPGNm61bAqfPvnDhlV9O/H17fiFnwZYMoyzffj7nf/dfPVipb+6qdA0Va89VqjHy8JV5tfa1lOMQPxEFxovnMg4qjBgAANeX5n6Xoe7YiZhTIuuj/BMTvRlcc3rTn81dJwCw9RnbNp+qwYxP4jC/tqljTqNSYwDgGlUaDjQqNQcAWK1SYaDEjo4t21J+8fFyGlTnN/14LL+RAwBgVQVH121OVQMtj0/waV8i5MBjNBkXrzUJw8dMjnTTZZ2/1sRz4LcPW2bkk5K6SSnElaYea90SuMa8vV+9+/Y/l3+xr5gzf0skoBVp+/fuXPd/P58oaLmM0Felbd52QYMpWUSER2vqlFdkpIzCuqvbfzlZ3HwDkVVe3/HbiaqOyyPMqnkL0FTiUAc3ChQ5hps9DIAEQQCAuesJb197U0IPCQJOlV/T7lw01CiLOXBzErsjyL31YZ1Kh0HoHSgPuZJ7Q3frRgmrr6rrOHNh8paGa1evX7sje3p1kxKDiM9zRAAtDyHxXUUAXFN+taHNHRpcXqlUYWfHtl82p0TWx0jdpBRwZUUlbYdAYCy5Wc6BVOYuo6HQtF7vdrdMS2VSCtiy/MKmtmVvKswvY5MGSt2kHfZJMzRoMs5f08XHR7s0XdyXoQEXhrY4n7ihvgHDAPngxICj2/NbJ5+MjYqKxvY7NXlLrM459mfOHUXW19c2YhCKHG+PoSknZycKsKKouO2KTa6qoFCNA8QWlshUTJDov0/zpQgAkNiJcqa46+fU/95qaDJvNwRBdM7SWxcI0QgAiUePiApue/uMFvsgQIBoCqDlc1x2/eaFIc6J8tBVS3zzK+oLa1Q3FQ03SmtuNBjbdwimbwkAwIichwRJg5wchHRLPKVEA5xQ2+gK0JwTwB2/z3LG9h+YUyIbQDSFEFDyxIcW+bfNGeMppwBhmrbgqp9iGAoBGA0dimo0GAEQxTAd9okoCrDm6oGtB2rcofL8VQ2GAVSH0YkZ+eQqzx25OumZ2JAH3/5sdFFeQXFZSWnxzfzrWfnVTe2PhulbAgAwTgFRsYP83JwETEvukHPYHSszaZoCwKzR2H5CiWU7HkMb1DxyoLzcaLdbWcJGAA7ryJNbBGElPbvlTolio/xj7/y8/SmKG0s+38I+PCJkQoBTsJ8wxK9lo/L83G+P5F1tswzM5C2RZ1jM8vE+vrxOMtWjmzGmlchWKLfI5AmRfZU6AABgzfUjm67fyk8XG5mWT1xzas0q/Yy5M0bH+PlHyQKihgIAYF3V5V1rf97VZl2E6VvS7sOXLF08yovfyeL8nh13a9a8IVs1/TkVAAACsSsz/RGnfyQ5ftzIPvanof+8JIUg7FfP4hZbufr788dNeKGCtrb8193l62kHT6nEb4AkQO42JszNOyj0TaRbuqu4Bpu3JXL2f3m8jw+lPnnk0s/ZDbW3rqlpj/Bv5gd7tksZsxwAoI5jC5rqvOQml8gmDBe/f+U/Z/v/7SST86krS9nyTcpWnsTN28fby8c3OHpY0mDP2HkvLalf8eXJOmzelsh93OLFo+R05bl1azafKajXt4QqKmjBB+9Md2+XMstyAIhmmA7LSugONz7NLZF5MKhrjduO6p+MFfhE8vy3GnLIFBdB9Jilk84YsxgAqI7x4O5fYvXlVTUp2YWbjqW9tjU3n0ViX89Yvtlbuvh5hPFAX5T7XUZ9bdsbQXdehWNdjQaAEga58dr8EcndnTq+ZsmiElkGCUUCBFinu72uH7McxoAYxopvVeCMRg4DMLyOc1Q8BgBzxk7uvXbLonxiQ2NVYVb6mUM7f/3ivVU7iowgGpQQcceCzu62RE4RcSEOYMjcueFEXmvQ6hzXUN/AAZL5+bZNhnIPCOiYrC1qvlPk+W2CsBJLO2lOU6HEQDkGy9p1ikjk+kBs4MxIqfT2WeowMMRn/CCv8PYdhr6mvtCAEWKEtwOKiVsiAY9GAJyR7fBUqMhZ7NKhQJzqUpGGBSZuWOQEafO1N3L2Dnk2Uqjr8CSNGSXqIcY7KlJGYUNZUUVr32tUVCk4oLz829/6RE4DR0ycPHHMIFcLUmcV1TUc0F6BAcK2MVvoH+RFA66pUlhwE8z0fCJJYMKokSOHhbi0P5qleSVaQJRQyDd7S76ADwg4nc7Q7tghkbuHc4f64cozMqs5xI+etWiUd/MrP2insFkLx8j0HY67LWq+PcYRSQC4Rq6ePLxFENZgcdxS/pXTaETCcaPCEiQtO0E8x3FjYl9OHvRIoOD2KAjRYbHRL0+KfX20j1/rtATiBccEJPAR1qpKWmetTN0S19Q0NmIQ+PnP9Gi9DYTEbv4vDh0AHbsG7vqF7ONKTDl5vfTYhLVPJn/71MQf5wXoims63hMyvUQ9QUsCxix5fqovhevPn7h4+3larigtrdSIpCMXPBwjbbmFifheIx59YcmjC2fFuHZcRWIKrvj8+TIWHIcueCo5oLlItGPA2CfmJ4qBLU1LK7FgvGVGPvnBE5YseebF5xaM9m6Nm5Q4YNzEaDHCqrLyNs/9mrYlri8pUWPEj5448XYkRiK/BxbNCL8jo8b8fZvOVnPIbdji979everjDz/95rM3Jugzs7Qdr1dsUPPtOTtRNAKjCitJ3CIIa7B4fgvnX7i60SfxMe/A5U/6VNaqGzjGbYDYlYfYxvKfTpfdfgkFbjqeWjRlZoBvWMxXIYPq1AY9RnwB34VPIWy4nFZwlTV7S31x/sYizxf8pY/Nf2BseX2RhhNKnMPd6ezLlVWuvn4dMqqp+PaP1NIRAycEOHs4CVF93aGj2RuVvl92nIU3uURmc0p67pMoPQCiBU4uEj6NsLbo4PebL7Vdos0W7ftp56Blc0Inv/LJqOqyikZOIJXLnfmIrTm/cXNKoyVdXss+Hxw47IkVCfOV9WokdpEIaIQ1OVvX7b9p0ZoDk/OJa87uPjY2cILX8KdXJixsqFPpMcWXuDgJGATqa3v2ZxnM3lJ/be+OjPhF0eFzln+elJtb1sgKBvgHB/BzD19UeI7xbp9RrLyw9uPPy+fNHhUT6CZ1g8qck+s27agZuzLZ0hJZysWZogAalBxZUUgQVtGDdRmG+j+2nc6PDZkZLgsd4OwObH1D3V/5JdsvluQ0tTvXVUXX3vyjYW6C73BvJw+JiEbYoNOVlNaeuZy7LafdDzuYuiWn3r/7TF38wFlhsmBPNzk2VCtq9hzI2Vrr8cHgTnLKqhRbDiq2tC22n18n25lcIvMgWujiLgTAmDNo6opzrqYe3XskvaLj4g9d/u7P3r05YcakpJhAr0AZ6JRVOWmXTh3Yf7qg0dLZfG3ers/eLZ44c/ywqEAPFxfQKUsyMlIO7TmUbvnPf5maT6zOWP/xxwVTp46NC/OTSd1oxBm1yvIb2ReO7tyXVs5ZsCVXcfyblQ1T50waFukfHO3OaWqKs458t21facIb4zvJKVuXsfeHjL1tPmEiO7vrZ4uab8NRhBCAVofJcIsgrAINSRheU13V19nobbyAmJ9n+Yqqspduyish3cl9g4l55otXxwgLN6/4YHd5by3tC5jqsmEuA+XaN/+jPkleUEgQPXZf/rQCLUwKl4kRbqpTk/dz30cYWUJSpAhhbUW5JW9JtlTRmabDtUDLBZ9+NGDvR66/PyvwIGsLCaIH7otXfdLysH9P9WldGMbj8yU8BIaG3ZeqtHf9ImHX6JCH3nlxdOtSQ57IScynQVd4+NCV3nxCj2vQrfyYy5wunBHNC5DSzg3ovjjrCMJm7oszCNE8V0fBrYXs2KjXFRVV7j93Y18leQr0XoZ4YmdX15brFYyNuvqyjPRjO7YcK7DGz2qZw1hv2PSbYVMvp0oQ96j7dH6LIAiCsFP35fwWQRAEYbdI3CIIgiDsCYlbBEEQhD0hcYsgCIKwJyRuEQRBEPbk9jp4udzXKnssLy+2yn4IgiAI4k5kvEUQBEHYExK3CIIgCHtC4hZBEARhT0jcIgiCIOwJiVsEQRCEPSFxiyAIgrAnJG4RBEEQ9oTELYIgCMKe3Be/v0Xct2g/4TfPCTzaXJ7dPKJ8/QhLfniNIOzXfRS3kED2+MzBM9yp4quX3j9Z3dDX+SF6AeJRHm60T5u41SRCqOvtCYLo//pj3EIOLuNi3d2h8fT58mLrXRjTnl6T5QIBgpBI77C/qlNZq+2Z6G1CP968p/ixHoAASnZqvtzP3bWdcFVNz6xQZ5AjThD3hP4Yt4DvMi5xYBSU37xgzXcdshVlB8pk09yp0szS66QLs1cI+SbzH5/DyBjQ64Hn0Nf5IQiit/XLuGUbWKv49c+jv/Z1NgjLISE1apFgxmCKNnDpm3SZ/oLHkshNP4K435D1hIT9oHx4yTEUV2nc8lnTbyfZJtzXGSIIog/00niLcZRNGxY0zt/ZS8xzoMCg01VUKU5dzt2Rp9a1bOIwYfb4lwPaxlH5P/8+/fa/uPq1v57ZVt/cVSHPuKRvR7vqsy+8mO7wyMiA4XKxBBkVitq/0m9svtGovf01FD46+eM4cdv9qq6lLT5UZeiQRcp50WMjH3LV7d3+1ylp6OMxHiESBuua8m4W/3E2P72xYxdJS9weTAqZ4O/szgdVfe3pi9mbGv3+M8ffRXHjtd9zbprbo1KB895fMV2uPPrZ/6T4zJs3bkiAVIg11Tevntq1dV9m7R23NR3cosZOGZsYHeIlFTEGtaLk+sWje/eeLdK0JsxEPPHF62PxiR/X60YuGBPsqMo9uv6HA4ZRSx6fFCnjKtJ3/rD2SKGu7T55btHjZ0xMGhzo6SwAbUNF/tWz+/ccuaroWFN9COPKVN2ezYYybffbEgRxj6LlXj5NGjUASCTOVtmjSqXs8AkSevx9wdC5vmIXHlardfValuMJPAY4xwz0GqitOlWpxwAAlE+gd4SI0xpYrREYHkUBp9boNQZW2/yfXnM5syynpaNFjnLf6f5CTgO+sX5BmvqrZQ1VRn6AfMDgEK9BxurT5bpbPT1ylnsnDkA6A6s1sHpMO9DIUF22PV/dcSIfCQbH+EUIOSU94MEIcXVpzTWFFjm5hHu7jQkRFd+oLG7TfSOx59KHE2b7iCQMVjU2qRjH2HAvX84gdXcUaGoOZNSavVgRuUaMSw6V6Bt54VNGyWtuZNworkOywODQ6GEJ7uWpF9p21EgUNnfZ20+MCfdyFWJNXZ0aObp5+YcljIiV3Ey7UqVv3opyGzx5RIBQ4oSKz6dc13pGDUkYHBE8wJh1LqWIFxw3JCGCzjx+re5WNfCDpv1j+ZLkUHeRvqakqEKJnbyCw2JGJIUZs9Ju1PeT6UDcwF6+xCmNLf+UxTjE+aLG64aUXNzFhQI1wOHhkTyJxrjzmKGKDM8I4p7QC+Mt5B4elOyEDIrCT3ZkXVBxAACUQ3hC/LtJA2KG+A68mpXNAYDh5P6jJ5u/IAn44MnIKKj85qeLZ+7aYzp4OtbsO/FJYXPkQ+5hsR9P9opMDE++nnZI1dxL4byUv55KacmJd8KIr0e63DWzvEip5vP1KalqDADIweWROcMWeHotiruZcqruVl6o8LjwZCfENZav2XnloMKIAbl4h7w+OUjc08kWxzDvyjX/WnWpngMAJAya9fqbs4KHz5t8OH1T7q3U6cDpS6YFCo0Vf2347vfTBUoWwMF96CMvP5/sM27h1DPLN+ferjPEVJ75fevxBsxUuIS/kSwpObRuV5YRXeKCVy0KjRnsvSXvJgcAQPtNXfJgqEhfuO/br/7IqDMCAO0SNW/p0smhcxdPubJyR5HZ6zr5w1/6+m/xvC7+aji/5uWvUnRd/LVLLPSTCEoQRN/pjfktN2chBbj4xs101a3ej9NnX7jwyi8n/r49v7AnK91rS3fd1N+6jMZVN3L2V2Pk4BrnRVu8y9yrOWnqll1iff2Oi9VNgDy8B8hbYxLlOMRPRIHx4rmMgwojBgDA9aW532Woe34VUHBs++X6lhrBTfkHD1zWYkoWFu7eeqCQgFak7d+7c93//XyiQNncjeur0jZvu6DBlCwiou0ztoA5jUqNAYBrVGk40KjUHABgtUqFgRI7OrZsS/knJnozuOb0pj+bgxYAsPUZ2zafqsGMT+IwPwuaCdY2VFd1qbpBS0Y/BEFYpDfmt+pUOgxC70B5yJXcG7pb3RWrr6rT93DPBqVG0bb7w5qSeg67Uy5iHgKjJR0jNpTW6dp+UdfY1IDBQ+DgiABaJtf4riIArim/2tBmS1xeqVRhZ0dLytFKXVmhbJu6vramEYNMLLk9ksPqnGN/5tzxTX19bSMGocjR9DHf7Q0ZqZuUAq6sqMTYdgNjyc1yDqQydxkNZl9e6C+tf+eSmd8hCILoXi/ELVx2/eaFIc6J8tBVS3zzK+oLa1Q3FQ03SmtuNBh7+FQxx3WITTg/89p3Zai+zOK1BLjjK4AwxhgAtX3JAqIpAMAdc89yRughrkPqGGMOOqQOAMA4BUTFDvJzcxIwVPOfkHOYxOK7lIimEAJKnvjQIv+2ZWA85RQgTNNk2SlBEP1Gb4y3cGPJ51vYh0eETAhwCvYThvg1f8yW5+d+eyTvqsaKN4xwZVHR3iLr7a8/ot2HL1m6eJQXv5Mw1aPrAMotMnlC5J2fkyklgiD6k15aB6+tLf91d/l62sFTKvEbIAmQu40Jc/MOCn0T6ZbuKq6xs6mO5jEZYjqMQmiqV1a5jFu8eJScrjy3bs3mMwX1+pZQRQUt+OCd6e492bXh4vev/OdskzVyCQAOsY8tfzSyy3UZGRs/+PVKT+8TEwRxP+rV92VgVl9eVVNeVZOSXbgtM/ST+QODfD1j+cVH7OtpHKyr0QCIhEFuPFTduioEyd2dHG3+8gbkFBEX4gCGKzs3nMhTWSveY5bDGCiGoVsn8XoMCVw85Z5dxq1SIXnRBUEQFumFuOUwMMTdj8eVFpVnq2/3ifqa+kIDDuYxQh6CDmvLcMvTOFT/7No41aUizXyZOG5Y5ITKq4drjBiQs3fIs5FCHQa+jRPnC/iAgNPpDO3qDIncPZwtri6jokrBgaeXvy/vVNbtQRByGpg0LEisKzp/KqvO3HCmO/ftc+cszRBBEESXbD/hjuiw2OiXJ8W+PtrHr3VKBvGCYwIS+AhrVSV3zG9hrVZhwEC5xPvz++WCAO76hezjSkw5eb302IS1TyZ/+9TEH+cF6IprrHWPrWu4vqREjRE/euLEgNYRCxL5PbBoRrjle+WK0tJKjUg6csHDMdKWSxnE9xrx6AtLHl04K8a1x+tNCIIgrMb24y3cdDy1aMrMAN+wmK9CBtWpDXqM+AK+C59C2HA5reDqndP+RsWha+rRcY4PzBiX1GRoXpbOKYs++uNGjrkLDxjPl5+ISrj1NBfFOFAA4tDYHwJuPSOlLVu94dplM5ceYE3Ft3+klo4YOCHA2cNJiOrrDh3N3qj0/bKTVQ1Wpr+2d0dG/KLo8DnLP0/KzS1rZAUD/IMD+LmHLyo8x3hbuFe2aN9POwctmxM6+ZVPRlWXVTRyAqlc7sxHbM35jZtT7njLVR+hgxyWPstrHVcyQgQA8knCFWMBAADj8z9qduf2Ve4IgugdvTG/pSq69uYfDXMTfId7O3lIRDTCBp2upLT2zOXcbTmqzkIGm3km9RNDxKORsgAxv3lYwRkZS/KKKLGI79LhKWSG53JrX5iyaLcArEqx5aBiS9u9+vlZtCczcRXHv1nZMHXOpGGR/sHR7pympjjryHfb9pUmvDG+B7vV5e/+7N2bE2ZMSooJ9AqUgU5ZlZN26dSB/acLGvvPjwPTSCxBkvaDcFqAJAIAAMDAv49+34Ag7ltoSMLwmuoqAJDLfa2yx3Jr/maWPeEFxPw8y1dUlb10U15JPxmg3PeYYPHmN4ReCvK7kQRx7yDXp1ZCC5PCZWKENXVqBQla/QwaIPjwfxyaF5wUHlP+82jHh8sJgrAjJG5ZiJaH/Xuqj+utqRYeny/hITA07L5UZV+r+u8HiEFyz5abxXpxx5ePEARhX0jcshCiea6OAmlLF4iNel1RUeX+czf2VZJL+X7EmKee+7y6r3NBEIQ1kbhlIWNJxpKvMvo6FwRBEPedfvl8FEEQBEF0gcQtgiAIwp6QuEUQBEHYExK3CIIgCHtC4hZBEARhT6y/nnBUjMONOpl191lVXGbdHRIEQRB2ioy3CIIgCHtC4hZBEARhT0jcIgiCIOwJiVsEQRCEPSFxiyAIgrAnJG4RBEEQ9oTELYIgCMKe3FtxCyGfUH68W19ng7hHUW68caG0mPx+F0H0qXvmd0yQ7xDh0rnC0R5w6L/6C9XkJ4cJ62N8BCte5ONK/eZt6rUX2aa+zg9B3J9ouZdPk0YNABKJs1X2OECsrtGKrLKrVmpl493+TFNjH3X+z8P8gY5QmpYxtioAACAASURBVK3beU6fo7Ju+laAxJHzli1f+viMOElJemalvq/zQ1gAI+QhZwYG8BITBKOcubOZrOpeuUC699rnvVciopX9j7cQlfSI8wfJNF2v/++PqvXXOaMtU2MGP7f6lVHt7hRxisP/XrbhOnv3L9LBSckhrnwEAaNHBP9x5ZJpuWQGPblq2Xjnsh0rV2wpsvSHlJEwaMTEwTJcmrYntcxuf43Z4pq3Iq5c98kXuh/CRf96WjR8jOOXGD+/QV/Xu6HLRkfTsvbZn/VyifpD+7QhoR9v3lP8WA9AACU7NV/u5/q0J7H7+S3XIeLlY2hGrV+9unGtjYMWAICxqVHZoGz5T63jTO202PyzJ3Jqm3QNhafO5PVySxYGj5w5Z/bMRC+7PtqW1rzVKbI1y1arU9UoYIzjq7FUb8922eZo9mX7tI3eLlG/aZ/WhpDvWMGrr/OHuINBD/2jWHY+3qKZBbP4MoRTt6v/LO+NGjVm/vr2q7/eSj1k/ofLp5i2DASrMrd8/OoW2+XsXmdxzduCvqzpox0OGxbyJs4WbLisuW63o9hW91777OUS9av2aTVISI1aJJgxmKINXPomXaa/4LGk/rAsya6vwIEXxJ8qB9yg23COtf+uoxO4n1zeEHcoP9t0RAmMnD81qK+zQhA2QvnwkmMortK45bOm306yTf2lO7Lv8ZZPKM+NAvV1/SVdp38XxT//+d+GC0q2r3hvR3H7wEYHzPtw+Qx507lv3liTdnthmINb1NgpYxOjQ7ykIsagVpRcv3h0796zRRrLDhgdvOCTt6Z4tLk6wOrTq1/7sfOb7Yxb7LS5M0dE+Q8QsI1l2Sl7Nu5uwJ3fb+g2n0gy+tUvn4ppe3wT//b9L7f/xeZufvuD/VVtaoXnFj1+xsSkwYGezgLQNlTkXz27f8+RqwqDRUUH5D7lXx8sCDac/eqtg5LZD02OC/EQI21dSVbaga270kp1reWiwxeuenOCa9W+D9/6I//2DR0qaMEH70x3r9m/6q0NOZbd5zG5RIxr5LhZU0dEB3m6iHkUZ9QqqwozUw/vPHCxosv5fJ3hVDaeOYyOC6Wp3B5dNnWfunlH0+SaN719UoHz3l8xXa48+tn/pPjMmzduSIBUiDXVN6+e2rV1X2Ztx8NDD4iaPHf2qOgAmQg0lTmp+zfurHngvWXjnYq3vvfe9hLzKouJeOKL18fiEz+u141cMCbYUZV7dP0PBwyjljw+KVLGVaTv/GHtkcJbHYCtSmQTprTPPs4nxpWpuj2bDWVaGydkHruOW8jLnaYBSsvZzsMWaK6lXVYPG+GdMNR7V3G7wEX5xsV5UFh1NS2jNWghUdic11+bHiRCmNUqa2tUDi4eAxOnD4yNDfl21a9XGy0JXay2UakUNJ9FlIOjWNDlAJeSjnr+7WfiXCjA+sbqWq04dMLz/3Q9mHVnqqblk9NrGpRKBgAAOYgchQwYNI2a22cvq9bjNvvmB017bdm8MDEYGiqKc0tB4ukTlTw/Kj72jy9W7y7son5NgSSJTyyNdC/JvHw2T+gZFhWWMO2FiGDpx1/sK7IwIJrI5BIhSdwTb788UkYDp22sq67nKL6jq9egUXPCY0N/e3/1kfIuullcXM6ywHh70AywFi9XMy11M49my567r3nT22fzLmXJL7wc4VSYceFsrsQ3ImbgyIdfDfdZ88Ga8/W3U0cuQ596629JMhqwvrG6Wi0IHPvUMumpnJ7dXxJGJcenpO7bXz9u2vDpz7w6MK/oypEdpbFTpyY++mJt4Tt/5BltVyKbMO+M66N8sgX6n3Kh/8132nXcArEAEIC669Fr07XUK6qkEV5DE3x3FN9scy3vGz/Ek8aqK6nXWsMWHTh9ybRAobHirw3f/X66QMkCOLgPfeTl55N9xi2cemb55lzzDx9buGPlP3a0pOk5bcX7Dwd2saUgctbDcS6IrTyz7ut1Z0qbMNBOYTOfWzxe2PF0Ny2fWJ2y5rUUAABAAyYuW7UoHKevff2b850vXKH9pi55MFSkL9z37Vd/ZNQZAYB2iZq3dOnk0LmLp1xZucPixYzgEOJT99+3v72ixAAAtGz4C28+Oyx01vykc5+ftOFSPNNLhKRJ04ZLKWPxwW9Xb7xSZwQAoCTBM5b+48GwQZPGBh3/vasDr27CGIAvQD24225a6uYdzRYm1Lzp7bOZY5h35Zp/rbpUzwEAEgbNev3NWcHD500+nL6ptZKYkCnzh8soXJP665c/nSzWYKCdwmY9/+zkHj0cg5jKM79vPd6AmQqX8DeSJSWH1u3KMqJLXPCqRaExg7235N3kbFUiWzD3jDMhn/zhL339t3heFwkazq95+asUsy9A2X4YtMDe57dQc59+l95Pey3tSiOmPBMSfNsUlfaJj5dTuPFKSlbr8BcJaEXa/r071/3fzycKlM0HS1+VtnnbBQ2mZBERHjatKto/KsIZYVXa5nV/lTbHYVZ5fedvf9UJOsQtW+ST8k9M9GZwzelNfzafQgDA1mds23yqBjM+icP8LC87wqV/HcpQ3jpErCJ12/EiFvFDo0MFFu+0e2aUiJK6SSnElaYea90SuMa8vV+9+/Y/l3+xr7jriN0ywkHQg5GE5al3xyY1X3Bs++X6ljzhpvyDBy5rMSULC3dvrU/KKzJSRmHd1e2/nCzW3GrJO347UUX3ZMCFOY1KjQGAa1RpONCo1BwAYLVKhYESOzpa3EK7L5EtmH/GdZ9PrG2orupSdYO2v0xOWYF9j7dMoM1OvaQcMcYjIdF/e2FBczdPeccPkVNYeTk16/b1B1bnHPsz547v6+trGzEIRY62fbsP7eTihIAtK7jZ9j4yV11YqMYBjm23tEU+GamblAKurKik3QW8seRmOQdSmbuMhkILO1BsVFTWtv0uV11eacQBjMRZjMBm87xmlAg31DdgGCAfnBhwdHt+6wShsVFRcden3a3DdqnboubVlRXKtl/U19Y0YpCJJbdbHeXk7EQBVhQVq9tsyVUVFKpxgNiSRLvXg1PThBLZgtlnnAn51F9a/84lW2a6H7nn4xboslMvN4we454wNGBLQR4LAJR3whAvGjekn8/uOGxmnAKiYgf5uTkJmJbncpBzmKQXFn4imkIIwGjsMCpn2U6H6VbOZ3PqlDzxoUX+bc8jxlNOAcI03YNrT67jwhL25qnffsuhG3LUlu+0W2aUiKs8d+TqpGdiQx58+7PRRXkFxWUlpcU3869n5Vc32X6Rqg1Tt0HNcx3Wn2CMOQBAqE3To2kKALNGY/vUu2jJfc2UEtmA2WdcH+Wzv7LvuGXSNaM+O+1S/eix7nEJQVvzcoxAe8fHe1G4/lLq9XaT6bT78CVLF4/y4nfSEvrTInub5ZNyi0yeEHnn51bubzhF5vGjmdbdZxdMKxGuObVmlX7G3BmjY/z8o2QBUUMBALCu6vKutT/vylba9vZKL6beizVPmKKXzrh7kH3HLb0RMADf4e7XHPobaRfrx4yXxQ8N3JKTw3nFxXlRXN2ltHZhC7mPW7x4lJyuPLduzeYzBfX6lhDQshrbdmUwkw3zabj4/Sv/OXsvvSzW5BLpylK2fJOylSdx8/bx9vLxDY4eljTYM3beS0vqV3zZ5fIRvkPzGBn3sJ+xLPX+imU5AEQzTPuzkqbpPspQ/2XdM84h9rHlj0Z2uS4jY+MHv165V97SaNdxC9fUchhoDzeKhrs9QGPISU2ve2CcNCEheHOeOn6IF83VXUzLabsMGzlFxIU4gOHKzg0n8vrgZamY5TAGxDAdTu6OZ7tt8tmcOsUwNDJxEGtVRqMRABimfWNEDMMDAJY1WpAji0qEDY1VhVlVhVnpZw7tPzn3reWz/QYlRIhP/dVFRcvdKApAUWudV7WZm3o/xTXUN3Agkfn5itHN1tEi5R4QQH7/5TZbnHFI4OIp9+wybpXesTLZjtl13IKCQqMG0wMG8oIpQ/ZdA1daeu3YCQNiBgeeUg/xprnai6m57Z8e4gv4gIDT6QztWhESuXs4d3W8McuyGBBN9fwddayyXolBKg/wE0BN6wUY5ebv3+FstyifLY+jdrle26ioUnDg6eXvyzuVdfuSDDkNTBoWJNYVnT+VdcdVP3IMm/74Q0leUHb2j3X7b/Sgc+UUVQoWu7sEBkrRjarWnk4aFOyMMKuorL1z193WvOklQpLA+MFefENlZmpum0dh9KV5JVrwFwiFfIBOf16AYuIHUhTGNwrZrpejd1dLFqTe7dHsW1x5Rmb1TF+P6FmLRhX8eLpU2/xEx8IxMj0Gh86/Y7221E9YsX2aTnfu2+fOWZ5nu9I/276p1Nn6lCagPQUPht89chjz0i7UcpQsasSYSB+Kq0k/n9u+r8H1JSVqjPjREycGtF6XIJHfA4tmhHe5V1xTpWAxcopKGuzaw5sgbOHVzHoOSRLnL0ryal76TksGzliY7N5+tGFJPrG6rlaHgQ6MiXLp/HhzRWlppUYkHbng4Rhpy6UM4nuNePSFJY8unBXj2km/TPmMf2xeYoivT8iweY9P9O5JO8INl1OztMAET39qepgzDQDAuAyavXh6MANNWSmXO5ni6bbmzSgRP3jCkiXPvPjcgtHerTVKiQPGTYwWI6wqK+9ihkkULpjiCVyT/lh21x1M97VkdurdH80+Zszft+lsNYfchi1+/+vVqz7+8NNvPntjgj4zq8t12FZsS/2ENdun3UGuD7z53U+//PTzzx8+HGSjgZF9j7ewSr/hJJs8mZ4xX3Rwlfpi13eKjfmpFxQTJ/mMGWNksOLC+fyODUN/be+OjPhF0eFzln+elJtb1sgKBvgHB/BzD19UeI7x7jz5xgsHT02PHOc+eumnwzQq7a3nMEr2fPb5/nIOwCH+qY8WD741cqccHCkAUeILn8UYbuX/3Pfv/nbNCAC6zF2bL8Q8m+A56pn3h85XKDTI2U1qSD+W0TRuWNuhvyX51GeePF2ROEk+4u9fxKvVzTNinOLY1x9uLWgZpLJF+37aOWjZnNDJr3wyqrqsopETSOVyZz5ia85v3JzSyatCEF/QujCkzf9aBNf99evGmLeeiIuc+8/VU+pr1UgywFlIg1Fxfv2GM51dd3Zb86aXCNec3X1sbOAEr+FPr0xY2FCn0mOKL3FxEjAI1Nf27M/q7K0eSMh7dj7fE0Hhyabjd/mxt25ryYLUuz+aJjOjfZoBKy+s/fjz8nmzR8UEukndoDLn5LpNO2rGrkzu4gtWbEu2KZHZrNg++xYd5LD0WV7rnRxGiABAPkm4YiwAAGB8/kfN7tx2X0Gi0MggGgHW5x4/XmCjmrbvuAWAM/aoNkU7LfQWrnoZL/9Ok1LfxYbG/PMXqyZO8XTgcZUXU+8IWwBcxfFvVjZMnTNpWKR/cLQ7p6kpzjry3bZ9pQlvjO8ydU3mb59+1fDw7DFRflKJU8uaVNZR0HKNhXgiJ2enDnecHUROt26XYErYegBwzZnvP1KXzJ01MtpfKpVC2fUjP2zcXT9h5bie51N3489P/1e7cPaYKB8XJwFCAMDpBO0mznX5uz979+aEGZOSYgK9AmWgU1blpF06dWD/6YLGzrpDtuDY9r8iFibJoSxl+5GCHq5MYCtP/e97VeNmTR01OFgudYWmusKL6Sf37DmZo+y8L+6u5s0oEVZnrP/444KpU8fGhfnJpG404oxaZfmN7AtHd+5L6+QlT7Qz7+nnJI96I0Np06o9xrtNdXdfS2anbtLRNJE57dMsbF3G3h8y9rb5hInsOn9WbEs2K5GZrNg++xaNxBIkaT8EpgVI0vzoOgb+HdXJC44YyEeAVZcOn1XYKvyiIQnDa6qrAEAu97XKHoPdKm/Uyayyq1ZVxWV3+SvPjb/8Vccp7ghr2BOnmjYe1qZ3Fb0IogcoF96c8YJ5o/nBYjBU6T74T+P+6r7Ok51gYp754tUxwsLNKz7Y3dULH/slOmDyS/OHOHYddbEq/ff/HrD0ufx7Dh3y6IdvTXWHqkP/fuv367Z6Bam9j7cAAAzVuvc+5q4tED+XyDwwSazP06Wn95NhNnFPYQIFL0/mCzHOO6f5ZFPTlbvcISTaYmQJSZEihJsqymvtrINHIo+QsDCXu8SthjIx1b8e8exDlOegQVIKG/OPH8+x4Xuz74W4BQCcyrDpx/q9+xymjnBgbPygKHHf4pTGgweNJ89oz5Rh0k/dBR3y0Dsvjm6dFuGJnMR8GnSFhw9d6cFPC/QJ47Vflj79S/fbEQAAyCVskA+Fmy4fPVVhyzPkHolbzRrL9Jv/vFeerCP6H2Ne00d5fZ0Je4B4YmdXV9eW115jo66+LCP92I4txwps+9s1RN9CorCIQBrXpRw532DT0cO9ML9FEARB3D/ugWclCIIgiPsIiVsEQRCEPSFxiyAIgrAnJG4RBEEQ9oTELYIgCMKekLhFEARB2BMStwiCIAh7QuIWQRAEYU9I3CIIgiDsCYlbBEEQhD0hcYsgCIKwJyRuEQRBEPaExC2CIAjCntxbcQshn1B+vFtfZ4O4R1FuvHGhtLjr3xAkCKIX3DO/v4V8hwiXzhWO9oBD/9VfqCY/HUlYH+MjWPEiH1fqN29Tr73INvV1fgji/kTLvXyaNGoAkEicrbLHAWJ1jVZklV21Uisb7/Znmhr7qPN/HuYPdITSbN3Oc/qc/vcD6kgcOW/Z8qWPz4iTlKRnVpJft7RHGCEPOTMwgJeYIBjlzJ3NZFX3ygUSaZ+EHbH/8Raikh5x/iCZpuv1//1Rtf46Z7Rlaszg51a/MqrdnSJOcfjfyzZcZ+/+RTo4KTnElY8gYPSI4D+uXDItl8ygJ1ctG+9ctmPlii1Flv7uNRIGjZg4WIZL0/akltntz8tbXPNWxJXrPvlC90O46F9Pi4aPcfwS4+c36Ot6N3TZ6Gha1j6JVv2hfdqQ0I837yl+rAcggJKdmi/3c522PQd3ZvQkXmw4JXNCoMOKIuOlE4ZTVzhrXwfZ/fyW6xDx8jE0o9avXt241sZBCwDA2NSobFC2/KfWcaZ2Wmz+2RM5tU26hsJTZ/J6uSULg0fOnDN7ZqKXXR9tS2ve6hTZmmWr1alqFDDG8dVYqrdnu2xzNPuyfd4b+k37tDaEfMcKXn2dP8QdDHq4S7FE4fyX3hRMG0F7OkJDFadkQR7Om/a88G8P0iIrnyV2Pt6imQWz+DKEU7er/yzvjYZizPz17Vd/vZV6yPwPl08xbRkIVmVu+fjVLbbL2b3O4pq3BX1Z00c7HDYs5E2cLdhwWXPdbkexrUj77KF+1T6tBgmpUYsEMwZTtIFL36TL9Bc8ltRFCBLQ0x/n+fCh8ox23Z/GSi0AQp6J/CcfY3wn8KdkNW29bsUO2q6vwIEXxJ8qB9yg23COtf+uoxP4bpc3RF8qP9t0RAmMnD81qK+zQhA2QvnwkmMortK45bOm306yTV13Rw6hvBhX4Cr0GzcaK7UAAIBxRYp203GOo6jBw2ieNfNl3+Mtn1CeGwXq6/pLuk7/Lop//vO/DReUbF/x3o7i9oGNDpj34fIZ8qZz37yxJu32wjAHt6ixU8YmRod4SUWMQa0ouX7x6N69Z4s0lsUPOnjBJ29N8WhzdYDVp1e/9mPn0weMW+y0uTNHRPkPELCNZdkpezbubsCd32/oNp9IMvrVL5+KaXt8E//2/S+3/8Xmbn77g/1VbWqF5xY9fsbEpMGBns4C0DZU5F89u3/PkasKg0VFB+Q+5V8fLAg2nP3qrYOS2Q9NjgvxECNtXUlW2oGtu9JKda3losMXrnpzgmvVvg/f+iP/9i0qKmjBB+9Md6/Zv+qtDTmW3bkyuUSMa+S4WVNHRAd5uoh5FGfUKqsKM1MP7zxwsaLLO/M6w6lsPHMYHRdKU7k9umzqPnXzjqbJNW96+6QC572/YrpcefSz/0nxmTdv3JAAqRBrqm9ePbVr677M2o6Hhx4QNXnu7FHRATIRaCpzUvdv3FnzwHvLxjsVb33vve0l5lUWE/HEF6+PxSd+XK8buWBMsKMq9+j6Hw4YRi15fFKkjKtI3/nD2iOF7ToAE85i/sBHlr8x1YuqPPzpit+ztbe/GvTwO2/N8EEVRz7/n9+z7tJPW4Mp7dPMmrc2jCtTdXs2G8q03WwocUd8BKpctrR92ynOZjXjKaEMSRDUWq067TpuIS93mgYoLWc7D1uguZZ2WT1shHfCUO9dxe0CF+UbF+dBYdXVtIzWoIVEYXNef216kAhhVqusrVE5uHgMTJw+MDY25NtVv15ttKTSWW2jUilo7hcoB0exoMsBLiUd9fzbz8S5UID1jdW1WnHohOf/6Xow685UTcsnp9c0KJUMAAByEDkKGTBoGjW32xSr1uM2++YHTXtt2bwwMRgaKopzS0Hi6ROVPD8qPvaPL1bvLuyifk2BJIlPLI10L8m8fDZP6BkWFZYw7YWIYOnHX+wrsjAgmsjkEiFJ3BNvvzxSRgOnbayrrucovqOr16BRc8JjQ397f/WR8i66WVxczrLAeHvQDLAWTzyblrqZR7Nlz93XvOnts3mXsuQXXo5wKsy4cDZX4hsRM3Dkw6+G+6z5YM35+tupI5ehT731tyQZDVjfWF2tFgSOfWqZ9FROz6Y4hFHJ8Smp+/bXj5s2fPozrw7MK7pyZEdp7NSpiY++WFv4zh95LZVh4lmsy9m27mD0G1N9Hnh8VurKzXnNx48JmLposg/NVRxeuy3bxkHLvDPOpJq3PrZA/1MumBIcaRoBgPHOc9oABgxCGigE1rt7ZNdxC8QCQADqrhtY07XUK6qkEV5DE3x3FN9scy3vGz/Ek8aqK6nXWsMWHTh9ybRAobHirw3f/X66QMkCOLgPfeTl55N9xi2cemb55lzzr23Ywh0r/7GjJU3PaSvefziwiy0FkbMejnNBbOWZdV+vO1PahIF2Cpv53OLxwo6nu2n5xOqUNa+lAAAAGjBx2apF4Th97evfnO984QrtN3XJg6EifeG+b7/6I6POCAC0S9S8pUsnh85dPOXKyh0WL2YEhxCfuv++/e0VJQYAoGXDX3jz2WGhs+Ynnfv8pA2X4pleIiRNmjZcShmLD367euOVOiMAACUJnrH0Hw+GDZo0Nuj4710deHUTxgB8AerB3XbTUjfvaLYwoeZNb5/NHMO8K9f8a9Wleg4AkDBo1utvzgoePm/y4fRNrZXEhEyZP1xG4ZrUX7/86WSxBgPtFDbr+Wcn9+jhGMRUnvl96/EGzFS4hL+RLCk5tG5XlhFd4oJXLQqNGey9Je8mB2DOWazL3fHzgei3pvlMfnxa6kfbCw3AeE96Yoo/jy0/8MtWWw+1zD3jTKh5/vCXvv5bfFe34wzn17z8VYrZF6CsSUGr19n3/BZq7tPv0sK019KuNGLKMyHBt01RaZ/4eDmFG6+kZLUOf5GAVqTt37tz3f/9fKJA2Xyw9FVpm7dd0GBKFhHhYdOqov2jIpwRVqVtXvdXafMpwyqv7/ztrzpBh7hli3xS/omJ3gyuOb3pz+ZTCADY+oxtm0/VYMYncZif5WVHuPSvQxnKW4eIVaRuO17EIn5odKjA4p12z4wSUVI3KYW40tRjrVsC15i396t33/7n8i/2FXcdsVtGOAh6MJKwPPXu2KTmC45tv1zfkifclH/wwGUtpmRh4e6t9Ul5RUbKKKy7uv2Xk8WaWy15x28nquieDLgwp1GpMQBwjSoNBxqVmgMArFapMFBiR8eW9M06O/S5u9buLTYyflOfmOTD0PIJi2YGO7BlR9Ztvd7dXbGeMv+M677msbahuqpL1Q3aXpsrlyUJ3vpc/NbTjNRWnaZ9j7dMoM1OvaQcMcYjIdF/e2FBc0OmvOOHyCmsvJyadfv6A6tzjv2Zc8f39fW1jRiEIkfbvt2HdnJxQsCWFdxse8Zw1YWFahzg2HZLW+STkbpJKeDKikraXcAbS26WcyCVuctoKLSwA8VGRWVt2+9y1eWVRhzASJzFCGx2UWtGiXBDfQOGAfLBiQFHt+e3ToEYGxUVd33a3Tpsl7otal5dWaFs+0V9bU0jBplYcrvVUU7OThRgRVGxus2WXFVBoRoHiC1JtHu3m7yZZ4c+f9favYPfnBU8df50xE4ZyGfL9v+8/Yato5YFZ5wJNa+/tP6dSzbOtykQChzCSIUAMUwA32ibHN3zcQt02amXG0aPcU8YGrClII8FAMo7YYgXjRvSz2d3HDYzTgFRsYP83JwETMtzOcg5TNILT+ggmkIIwGjsMCpn2U6H6VbOZ3PqlDzxoUX+bc8jxlNOAcI03YPLJq7jwhL25qnffsuhG3LUlu+0W2aUiKs8d+TqpGdiQx58+7PRRXkFxWUlpcU3869n5Vc32X6Rqg1Tt0HNcx3Wn2CMOQBAqE3To2kKALNGY/vUu2jJtmDO2aEv3PPTvsHLZ0XNnQPAlu5Zt+NGDyZzTWb2GWdKzfcTGGcd1WeKaLhmyLbVFYB9xy2Trhn12WmX6kePdY9LCNqal2ME2js+3ovC9ZdSr7ebTKfdhy9ZuniUF7+TltCfFtnbLJ+UW2TyhMg7P7dyf8MpMo8fzbTuPrtgWolwzak1q/Qz5s4YHePnHyULiBoKAIB1VZd3rf15V7bStrdXejH1Xqz5PmP+2WEoTj1fMt0/iEFs2fmzBb0RtW7ppTOu16my9T9nt/w/bZMU7Dtu6Y2AAfgOd7/m0N9Iu1g/Zrwsfmjglpwczisuzovi6i6ltQtbyH3c4sWj5HTluXVrNp8pqNe3NPKW1di2K4OZbJhPw8XvX/nP2XvpZbEml0hXlrLlm5StPImbt4+3l49vcPSwpMGesfNeWlK/4ssul4/wHZrHyLiH/YxlqfdXLMsBIJph2p+VNG2bHqwdC84OynPcY9MCaYNKhcW+kx8fl/rvQ+W9FTese8Y5xD62/NHILtdlZGz84Ncr98p7J+16XQauqeUwgIcbdfdTwpCTml7HDCDpYgAAIABJREFUUdKEhGCG8oof4kVzdRfTctou2UROEXEhDmDI3LnhRF5rc+89mOUwBmCYDiXpeLbbJp/NqSOG6dHUucWMRiMAMEz7iyjEMDwAYFmjBR23RSXChsaqwqz0M4d2/vrFe6t2FBlBNCghousJQ7kbRQEoajt/VZvZWTYz9X6Ka6hv4ADJ/HzbZp1yDwiwfVHMPzto+fgn5w0SsmWHv/7mYAkrCH/wyYlevRBgbXHGIYGLp9yzy/9c71iZbFUsiwGAuTNs8oCHAFhgrXn9Zd/jrYJCowbTAwbygilD9l1aqSEnLb127IQBMYMDT6mHeNNc7cXU3PZPGvAFfEDA6XSGdtWLRO4ezl0db8yyLAZEUz1/Rx2rrFdikMoD/ARQ03oBRrn5+3c42y3KZ8vjqF2u1zYqqhQceHr5+/JOZd2+JENOA5OGBYl1RedPZd1x1Y8cw6Y//lCSF5Sd/WPd/hs9eDE6p6hSsNjdJTBQim5U3doPJQ0KdkaYVVR28rRitzVveomQJDB+sBffUJmZmtvmURh9aV6JFvwFQiEfoNOfF6CY+IEUhfGNQrbr5ejd1ZIFqXd7NPsWV56RWT3T1yN61qJRBT+eLtU2P9GxcIxMj8Gh8+9YrS2ZeXbQXhOWPBgm5CoO/rYr6wZaf3zoG+ND5z456eqn+0p79KZTK7ZP0+nOffvcOcvz3EONVViHwTGE9mLY4jaV5xtOixBoqjiLnn/tSv9s+6ZSZ+tTmoD2FDwYfvfIYcxLu1DLUbKoEWMifSiuJv18bvt2ietLStQY8aMnTgxovS5BIr8HFs0I73KvuKZKwWLkFJU02LWH12hs4dXMeg5JEucvSvJqXvpOSwbOWJjs3n60YUk+sbquVoeBDoyJcun8eHNFaWmlRiQdueDhGGnLpQzie4149IUljy6cFePayTlM+Yx/bF5iiK9PyLB5j0/07kk7wg2XU7O0wARPf2p6mDMNAMC4DJq9eHowA01ZKZc7meLptubNKBE/eMKSJc+8+NyC0d6tNUqJA8ZNjBYjrCor72KGSRQumOIJXJP+WHbXJ2T3tWR26t0fzT5mzN+36Ww1h9yGLX7/69WrPv7w028+e2OCPjOry3XYVmtL5p0djPeUJ+eECnDl8V+3XtcCNGVvW3+8GvNDZi+Z5NOzC3prtk87ob9huFIHlKfDIwsYdz4AACDkkcifn0xRHHc5zbqvPLfv8RZW6TecZJMn0zPmiw6uUl/s+k6xMT/1gmLiJJ8xY4wMVlw4n9+xFvXX9u7IiF8UHT5n+edJublljaxggH9wAD/38EWF5xjvzpNvvHDw1PTIce6jl346TKPS3noOo2TPZ5/vL+cAHOKf+mjx4FtDZ8rBkQIQJb7wWYzhVv7Pff/ub9eMAKDL3LX5QsyzCZ6jnnl/6HyFQoOc3aSG9GMZTeOGtR17W5JPfebJ0xWJk+Qj/v5FvFrdfPuEUxz7+sOtBS2DVLZo3087By2bEzr5lU9GVZdVNHICqVzuzEdszfmNm1M6uVRCfEHr1Heb/7UIrvvr140xbz0RFzn3n6un1NeqkWSAs5AGo+L8+g1nOrvu7LbmTS8Rrjm7+9jYwAlew59embCwoU6lxxRf4uIkYBCor+3Zn9XZWz2QkPfsfL4ngsKTTcfv8mNv3daSBal3fzRNZkb7NANWXlj78efl82aPigl0k7pBZc7JdZt21IxdmdzFF6zXlsw4OxjfyYsfDHHgqo//cuvVGLjp2p8bTg9eOjpk5uJpVz/ZWWxxV2vF9tm36CCHpc/yWseqjBABgHyScMVYAADA+PyPmt25AACgZff+ZvB5luczUrAsASsUGByRzAlRgEuO6PbfsG6B7DtuAeCMPapN0U4LvYWrXsbLv9Ok1HexoTH//MWqiVM8HXhc5cXUO8IWAFdx/JuVDVPnTBoW6R8c7c5paoqzjny3bV9pwhvju0xdk/nbp181PDx7TJSfVOLUsiaVdRS0XGMhnsjJ2anDLV8HkdOt2yWYErYeAFxz5vuP1CVzZ42M9pdKpVB2/cgPG3fXT1g5ruf51N3489P/1S6cPSbKx8VJgBAAcDpBu4lzXf7uz969OWHGpKSYQK9AGeiUVTlpl04d2H+6oLGz7pAtOLb9r4iFSXIoS9l+pKCHM9ls5an/fa9q3KypowYHy6Wu0FRXeDH95J49J3OUnffF3dW8GSXC6oz1H39cMHXq2LgwP5nUjUacUassv5F94ejOfWmdvOSJduY9/ZzkUW9kKG1atcd4t6nu7mvJ7NRNOpomMqd9moWty9j7Q8beNp8wkV3nz4ptydSzg+c39emZwQ5Ycfy3LZm3X1uI1Vf/WH82aunIoFmLp13+ZOdNS19FZsX22bdoJJYgSfshMC1AkuZH1zHw2zQQdZbu21XsmEm82EGUTE4hHa66Ybx0Qn/yMqezchxGQxKG11RXAYBc7muVPQa7Vd6ok1llV62qisvu8leeG3/5q45T3BHWsCdONW08rE3vKnoRRA9QLrw54wXzRvODxWCo0n3wn8b91X2dJzvBxDzzxatjhIWbV3ywu6sXPvZLdMDkl+YPcew66mJV+u//PWDpc/mERex9vAUAYKjWvfcxd22B+LlE5oFJYn2eLj29nwyziXsKEyh4eTJfiHHeOc0nm5qu3OUOIdEWI0tIihQh3FRRXmtnHTwSeYSEhbncJW41lImp/vWI573vXohbAMCpDJt+rN+7z2HqCAfGxg+KEvctTmk8eNB48oz2TBkm/dRd0CEPvfPi6NZpEZ7IScynQVd4+NCV3nyu1xqM135Z+vQv3W9H9KZ7JG41ayzTb/7zXnmyjuh/jHlNH+X1dSbsAeKJnV1dXVtee42NuvqyjPRjO7YcK7Dtb9cQ94l7Km4RBNEfGLPWvb5kXV/ngrhn9csnQAiCIAiiCyRuEQRBEPaExC2CIAjCnpC4RRAEQdgTErcIgiAIe2L99YSnr+gB7vZ6C4IgCIKwGBlvEQRBEPaExC2CIAjCnpC4RRAEQdgTErcIgiAIe0LiFkEQBGFPSNwiCIIg7AmJWwRBEIQ9IXGLIAiCsCe99Dsm/uOdPhtP063/5rid3zWsLeqdxAmCIIh7Ry/FLZ6I8nFrG7fg/7d333FR3In/+N/vmdnCLiy9LEVAEFAQERHFYNdootGouZiYmDOmmHLmzOVncsnlcp8kJjl/l8RLe6QXz8RYE0uipqhRbIAFAUUFpYPA0llgy8z7+wcW2iqslF19PR/5Iy67M++Zfe+85l1mxkXWN2sGAICbSh/lVs72moTthBBCeNmyFc4L3PpmtQAAcLPB+BYAANgT5BYAANgT5BYAANiTPhrf6iZ5wKQlT8yL9SLlaZs/+nxPgbG/CwQAADbCJttbQvjk2XFaFc+rtLGzp4TZZrYCAEB/sMnckirLKkyMEEKYqeJipdTf5QEAAJthk20ZqeSX997QjRriQXRZyamlyC0AALjMJnOLEKk+N/X33P4uBQAA2Byb7CcEAACwALkFAAD2BLkFAAD2BLkFAAD2xEbnZVCngbHRfkpKWN2FYxnFBtbfBQIAANtgm7lFnYbPfWxRtJyIhVtfOZLe38UBAACbYZv9hPLQiBAZJcx0bt+BIly+BQAAV9hkbvGB4aEOlLDG9L0pVegiBACAq2wxtzjviEFuHJGqU/840YDYAgCAVvpofCtwkmblRJ4nhBDq6nLt91KnsAg/jkilB/afMfRF4QAAwH70UW7J1FygT0tuEUIIudaYlSI0PFggppx9+/PF3i8ZAADYlT7KrZztNQnbu/ZWPjB8kANpTtt3pAJ9hAAA0A4dHje6sqKcEKLVBvTIEktLC3tkOQAAAB3Z4rwMAAAAS5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT5BbAABgT/ro+VsA18UPcPjwcaV3q1Op/N11z+0Wr/WQUQC49fRpblGlx4N3DZvpxRVmpL2+v6K2L9cNNo/KOG9P3r9VbjWpKO2/8gCAberT3OJ9fKdplUpKQiP9wg9WpIg3ukAqd5kU4+VF6g8cLS3s/LScT7zz9uWDOu0OlZJ/+e3NM+Y2C1RoxsWGTAt1C3ZWyESTrqrqaFbuD5lVVTjnt46DvzDhdtnQQZy7IxUbpbIL4tHdxiM5zPJXL5U3PfqKPvOG6wYA3Kz6NLfEiyW/lHjc6cUVnyo+2yMHJoXLpPhBUaQ0/5ilpywzo8FQ09gut3i1SpB1eCt19PnL3JjJrjwhUqO+uY6X+/j43OXjnRh8+l8/5eXjSNpdzsMVTyySeckIM7P6WsY7cQHDuIChwuBNTd/8IZmvvwAAgI76NLdYs27Npj1r+nKVRErZvSdld+tX5DHjRr00XNN48cKW3FbHTqqcMDF6siunv3jh/V/OpdSIjPBegSHPTAsdGhTxdIzu78ca0OjqBuoszF0g8xJY/u+GtT+ZdUZCZTRsmnLBHXzEHMXYM017L/Z3EQHALt1q8wmFiFFxL8RoaGX+29vPnTZc/QN19JkSKCPmqrU7zyTXiIwQQsTy/OxVh3TNhA8N9/HHSEu3uAyXRaiIMdv47Y9mnZEQQpiJnf25eUcWIzJ++HDuVqt6ANBD+qC9RSPGjn8rVt36MNVwOnXRb+Wmdm/knBc+cNs9roYdWw4muYc9GO0d6iQwQ9P5/MKNhy+cqGeX3yefMnvy0qDWy9O+8JcZV/8l1Xyz5tCPNYy0xwfFxL40ylVeV7xq66ljjW3ewLs6eoliY2VFen3r11l1cVWR5BmiUXtzpMC6rkK5Z9SE6RPih4b6uqsEk15XdPb4nh07Dhc0ti8h7xY1be7sxKFBHirSWJadsmvdtsqJry6frCn84dVXtxS1bu7JPIdOnjk1YViwj7OSNNdevJBxeNfPuzN07fdp//H0pqKJlZ4W23wRjOVmM2kIdfPiOCKhAQsA3dcX/YQmo6mm0dCSM5wgd5Jfu+VCvSNjXhogz8kv21cqCwrwGjI44p/+Tm+vP3lI33IEbDVkRXlHB0Egkr7RdPWILRkNnRwQOe2QmH+O9XRqLPtka/qB+vaZYS7IfOzjzE5KI+MVhBCT2NwxB7uAqsLnPPfsjIEqysTmuqrKBrmL96D4GYNiYkI/Wrkmo1UxqMvIh198KsGDJ8xYX1GhVwZPeHi5e1J2JztLMfDOZ5fPC1cTU+3Fwpxi4uTjHzX+3qgRMRvfXfVTnqHjB/rDufWNL63v5HW5glBCjM3Mqv0JANAHucXOJx98OLnl/6lf3JgPbnO51tupLNK98Z1vk1P0jBBC5S73zRk138d3YWx+clK1SAghpv279uxvea9T0Io/R0aRsg+/On7omo0h6uD76EQfD441GvnBUUF1WYVHdKYuHDnpgIFevhxrKNZdsKZxwAfPWHxnsIP54sG1n31/ILdOJETuNfK+pUvG+09acMehlzfkXC61EDr93tEeHKtMWfPeV/sLGxnhNeGzljw2TdVhmQPuWHx3mMqYt/Oj9zdmVpsJIbxL1LxnnpkWNnfR9PTXthZ0u6SK0U9/8NSIjjNVWpiOfrr0/eSeiUOeixzKcYxdOCdhngsAWMUWBxlyMrJTLzWtCDPWbD1e0USot5+b9kZGmDheRgkhVOXqMTF28Av3j/vncGfl9T7Euwx4OMaJExt2nSjXW7FSquR1qbt2bFv9ydf7cutaDtTG8tQNPx5rZJzHkCFXr7HlfCMjPThmyNjyv/2FLR2IYt3Zrd/tK+fbbTUXGB/vJ7DKA+s3tYQWIUSsyfxxQ1IlE/zjRw2w4itlzbUV5RZV1FrX1uyER6JirC8RS037MtDcAgDr2N79MpipuNrQ+qBmqG+qZcRbKXekhFh7tGP6ghWfFnOEKBzUgyPCHon3ik0cvrDiwOdFFqdjU4XbA3cMjlaw/KMZm8qsGoph+uy9m7I7vGysqapnxEHlqL6SSZzGWcMRpiso1LfaRKk8N0/PgtStPyy4e7pzRCopaFtyc1F+qUTcPbw8eJLX3cIa0779R1o3P9N9DqHyhXN4pVna+72pELPgAcBKtpdbhLW/sQ9jjBFCb/DWCcxoMhNCmk21R1KO18gT3xzhOCna87ui0sZO3y7T3D1jxFwvri7/1H+OVDffwIoFTVBUzOABnhqlwLVsAnUOd2q/MTzPEcJEs7ltMoti++40ynOUEk4bf8/CwNYHf8FHyxHKeN4Wm9CEyANkf35c7i9jZzc07zqPxhYAWM0Gc6sPiDn5lTWxji5uGh+utJOBK149dfrIhwLkzWU5K3fmF1k/EsN7jV78zKJEX0UnmXtDk+k4z8jxUyI7vm6bg0a8t+yBJxWhalb4a/Oa/RjZAoAbcWvmFmFGs4ERKvCKjn+jDolT4p8YqDRX5v9n27lTNzAfgXpNWrQoUcuXHVn96YZDuTXGS1HFDZy/4h8zvNq8VxQlQigvCG0Tjuf5ThdtOv75X/97uMn6srUhj3ng5fsjLc7LyFy3Yk260dqFc27C/KcUkc6kLKn5y21iE9paAHBDbvLckg0YvHKcJ1d+/tXfiqtbHzAFTqCESR1uNkTlseNH/jVCRWqL3+twjVc3Uc2Q2FA5MaVvW7vvfMO1lyTV1tRKxMljQICa5tddfi/nFRSkbtdUY6LEGOEEgb+B4b72JVW6+Gh9LOZWsYPVXbTUiZ/9lDLWg1SlNn+xQexw+QEAQHfZeW6xS1cBcRYOrJJBUrg6+am8hiiKD14dpKJaXzd3Ssy1+oo2vXWyIaNHLh/mxDdc/Liza7y6S6FUEEokg6HtjHuq8vJ2bldgqTTzVMVdAd5DZy1MzP3yQHEzI7wm/K4F4zyMjMhbv9OsK9dJxMc3MECWlHW1EUQ1gxJGDVQbCo4mZVV3t+CGIx89fqSbn+kC6sBPe1J5m5bUpRs+/9ZcjcuMAaAH2OYgflex5madiRHOZUSgotMtEStK9+sk4qBdPDV4sKrlLYJvyOBlcRqeGY9mlbV6lgofHBv74kgXhybdN1vTfuuBgyyrKSrSM6oYOnVq0JUWC1UNmLhwZkSHN5sv7Fx/uEKinqMWvf7BqpVvvfGfD99+forxVFb7OehSQWpqsZm63zb/T9Hul047qMJ3zP1PLL5/waxoV5uZqCfnxj+unBJE9WcMX3xtqrCZcgGAnev99pbgs/ShqLjLozScIOcIUYfFfBF0KRhYc8mqtadPWjdWb9b9dlo/NtZx4sxJCU2mlunzUl3BmxvPZbcsXqrb8vuZyLsHRw8c8lZQWJ3eZJYr3BQcJWJhZsYX2carocA5Jka6ayiRZM7z5kyc125FzLh3Z9I3xd1ryBhP79iaOWLh0Ig5L7+TkJNTUi8q3QJDghQ5vx/X+Yzza7eGumPfvPVO6bzZidHBnu6epCx7/+r1WysnvDa+3VLFgp1fbRu8fE7YtL/+O7Gi5GK9pHTXap0VVKw8um5Dsq10xXFaIX4QpYzIA+WPvyZv91fWYFrzlvECZmgAQLf1fm5RTq1SuLSbXSDIXC6vmXHCDRRCPHUo5d+mIfdHegSpFS2NGsncZoGGitzXvq+bHjdwUrBrgJOSMxmLinQH089vza7vdAY816psVzGismI8Sbr4x4ev1d4x5/ZRkYEhQ72kxsrCrN2f/bizOO75yZ1tTHXmji8yd7R6RYjsrAPUcOGnt/+VP2Xm7QnRwb7BHsRQV56dmpb0y64DufW21hdHiVxF26cWIYxQATcqBgBr0OFxoysrygkhWm1Ajyyx1NKTsKD7hOhH3102ziFvwysrfiq1tUjqaUKIesPzDr46PDcSAK7Fzudl3NwEj7iESBVlTRdLb50HLlM35Rv/J2+ZcJK3t+6FPe0vQweAWxxyy4bwoff848mxV6YaylQatYInhrzff0u3kZu89wEqUK3PpW5lo/oGb5ICADch5JYNoTK1s6ura8uhmjGzoaYk88TerZv35trOY7V6kfm8fu4Sa25fDAC3FIxvAQCAPbHv67cAAOBWg9wCAAB7gtwCAAB7gtwCAAB7gtwCAAB70vPz4BOj5eeqPXp2meWFJT27QAAAsFNobwEAgD1BbgEAgD1BbgEAgD1BbgEAgD1BbgEAgD1BbgEAgD1BbgEAgD25uXKLUv8wxQjP/i4G3KQ4T9mkMF6NZ4IB9Kub5vlbNGC4wzNzHcZ6k98+Nh6rYP1dHrgJCf7KV55UsDLjhh/13xwXm/q7PAC3Jl7r69/UqCeEODk598gS3dT6ymZVjyzqCn1d/bX+zHMT7nf+758UgxxJ8RnDtiPG7IaeXX8PoOrIectffubBmbFORSdOlRn7uzxgBUapt1YYFCSLj1MmOkuHT4kNPXeChBoC0EX2396iXMJ9zivG83yN8eMvG749K5l7c23CsMdX/TWxTU+RpPv9/1++9qx47Q/yIQnjQ10VlASNHROyMT2ta6UUBv955fLJziVbX3tlc4FkZZmpw8AxU4d5sOLUn1NKrF1Iv7N6z/cgqdTw73cNX0So/vmIavQ4x/cYW7LWWN1D0WVdDbmGLnzv8pFPf/xknKyzP5lOfPb0B4eb2yxQPWDUtBkTRkQEeGpkor6qJPvkwV07952t6atv4OaoyVfJvYSxt8tiIjgPDSUGpiswp+0zJaVLOGe5HrvPLdfh6pfH8YLe+O6q+g2lvd89aG6qr6sVLx09BYWjStG1z4kXDu/LjpoUyF9MOnS+7460hBBCHEJuu2tOBEsp3mnPv3Zr93yP051pXL6KvbNcPWqc47LTNf93QuqRatfzNeT63zszNdbW1bXLLZnKSSV0GMOjriMXPb8k0UdOmLmptqZecPIMHjE1OCZ+2Np3PvytyNQTBb6um6Mmt1BFKJY8LvNXEsnIKssl6ki1ETLfCGHob82fbRUbMdJxLXaeW7wwf5bCg7KULfpNfRBahJhPrXlp2ZrLaw+9942Xp3dtGghrOLX5rWWbe69kNzur93xvMJY0vblVvnaBbOps5dqTjWd74hjaHzXElPb135a1foE6Rd73wtKpAU0Xdu46aWj1umvCwsWJPrLG8zu++uzHtHIDo3L3yJmPPD47Yuj8P0/NfGtHqb3nSN9S8jMelPkrSNmh5tWbzGXNhFDqE6/48wNCwBTF9KymH84iuK7BvucTygYq7tASVmtYe0S8KX82jKD22qjSw02764igVdwxsL+L0lOoQ8isZU9NDSAluz95b3N2q1N+6haXOFRFjGe2fLL+RLmBEUKYsTLzx883ZRiIPCg+XmvfB5I+Jw+TRbsS6aJx3TpzWUtnLGMXk5vX/yFJHDdsFN9p3y1cZt/tLf8wmSdH9GeNaYZO/64aseSdp0Yri7a88urWwrbBxgfNe+PlmdqmIx8+/2nq1Ylhcs+oCdMnxA8N9XVXCSa9rujs8T07dhwusLLZzofM//eL071b/aiZ/sCqZ7/sfPBC8Iy5c+5dY6IC3ZRifcmZ5J/X/VTLOu+Eum45qdPYZe89HN36+41/6vP/Xf2XmLPhpRW7ylvtFZnn0MkzpyYMC/ZxVpLm2osXMg7v+nl3hs7KLiDqNf2fK+aHmA6//+KvTrPvmRYb6q2mzdVFWam//LA9tdhwZbv4iAUr/z7FtXznGy9uvHC1g4wbOH/FP2Z4Ve5a+eLabOv6zbq8RYJr5KRZd4wZOtDHRS3jJHNzXXneqZTft/1y/KLFsQaDKekMu2sUHxvGczlWnzZ1uYZwwfNef2WGtm7P2/+X7D9v3qThQe4OrLEiPyNp+w87T1Vd3kFWfO+XyP2nLF06O1SmO/zFqu8y6tpUO95b62E2NhVlZFW1fp3VZp8tlaIDPbw9OFJs1S7g3aKmzZ2dODTIQ0Uay7JTdq3bVjnx1eWTNYU/vPrqliLJFmpyL3DyogpKGnLE4rbfc+EZsXEy5+BBnSipwjmrRXadW9TXi+cJKS4VO48t0ng69aR+1Bi/uJF+2wvbBBcXEBvrzbGGjNTMK6FFVeFznnt2xkAVZWJzXVVlg9zFe1D8jEExMaEfrVyTUW9NNRKb6+vqlC1HJU7uqFZaPC/l3BOXvPRorAtHmLG+oqpZHTZlyQuuv2Z1XGvXyikZG2vr6gRCCKFylaODQEyN9Y1XfyWi3shaLVsx8M5nl88LVxNT7cXCnGLi5OMfNf7eqBExG99d9VOehf3bFdQp/qFnIr2KTp08fN7BJzwqPO7OJ4aEuL/17s6C3j2MdHmLqFPsQy8tvc2DJ1JzfXVFjcQpHF19ByfOiYgJ++71Vbst9YCxwlJRJIKfNy8Q0eqh9K7XkJbCeox/YukQTV7mscM5TgFDogfd9qdlEf6frvj0aI1V3/slglfikmX3RTrWpq1Z9UVKZfvTBPPp/z3/5P86fIoQhUJOCTE2G6w6xlKXkQ+/+FSCB0+Ysb6iQq8MnvDwcvek7LaDa7ZSk3sSz1NCiLnjL8BETIw48ISjBH0tltl1bhG1klBC9E0Wv+Cm0ynpDQljfEfGBWwtzG91Lh8wYrgPzxrSU05fiS0+eMbiO4MdzBcPrv3s+wO5dSIhcq+R9y1dMt5/0oI7Dr28Iaf7J/1i3tbX/rb10jp97nzl9T8FW3inMnLWn2JdqFh2aPUHqw8VNzHCa8LvenzRZIf2I+RdKyfTJ3/6bDIhhBDqNnX5yoUR7MQ3z314tPNZavyAOxbfHaYy5u386P2NmdVmQgjvEjXvmWemhc1dND39ta1WT2Yk8lD/6o9f+ii95QSe9xj9xN8fGxU2696EI+/s76mpeJ3o+hZR94Q7R7tz5sJfP1q1Lr3aTAghnFPIzGf+dnf44NsnDPzje0tfvL6JMUIUSnoDnWRdryEtHMP9yj7958q0GokQQh0Gznru77NCRs+b9vuJ9VZ875dQp4QFC+PcONLUJBs0fmrDwf3HC/Vd+G54/5jhPhzTn83gtZxHAAASgElEQVQqsKZBLIROv3e0B8cqU9a899X+wkZGeE34rCWPTWtzGU2/12TF6Kc/eGqEpY4709FPl76fbCNxeMuw725p2nJMv8YvrPl0ano943zi4gJabSrvP2KElmP16clZVyb6UiWvS921Y9vqT77el1vX8jM0lqdu+PFYI+M8hgzx7tVdxQdGDXGmrCF1w+qDxS05LNad3fbdwWplu9zqjXJygfHxfgKrPLB+U8tPnRAi1mT+uCGpkgn+8aMGWL/tlBUf/C3zSq+TqEv58Y8CkSrChoYprV7o9XVjizh3T3eOSsUpe6+8k0j153e8/6+XXnj53Z2Flo9zl87yKenLG2jk7t1ysuZSmVjThV9/OdnMOI/wCK8bqZ+8TOAoIdRBGzVm2v1P/evNZbcHXXe6Juc98d6p/tRc9MevJxqtWCnnGxnpwTFDxpb/7S9svFznt363r5y3eof2Rk1mzbUV5RZV1Dbf4NmXR4LyxXfULz4iuNv30bgv2Xd7qwuaz6Sk1Y0Z5x0XH7glL7flMM/5jRiu5VjdyZSsq+dJTJ+9d1N2h88ba6rqGXFQOfbu3X14jYuGErEkN7/1FTNSRV6engU5tn5nb5RTcPd054hUUlDU5iTWXJRfKhF3Dy8PnuRZ2eBiZl1ZVevPShWlZWYWJDg5qymx3FK+Qd3YIlZbU8uIm3ZYfNCeLReuDBCa63UXr3m1e//Ql11sM/RkrKqsZ8RD7XQj9ZPV7HvvL4c4wsk13oNGz7l/1rCo+U/PK/zn2qxmSx+hqvC5T84f7GAu2vnNz7lWXWvGaZw1HGG6gjZtO6k8N0/PgtTWLLF3arIx7dt/pFlXnC6gNHi44O5ASLQQpDD33npuLjd9bhHDmZSTtWPHecWNDNqce14khHB+ccN9eVZ74uiZ9s17QRMUFTN4gKdGKXAtxwHqHO7UB6fTlOcoJcRsbtffIoqddsD0cDlb1s5p4+9ZGNj69y74aDlCGc/fwImg1H5iiZif9N132Xxttt76hV5XN7ZIKjuyO+P2R2NC737p7bEF53MLS4qKC/MvnM26UNFke5NUpXYzQBhjEiGE0hurpKLJIBJCDBW5x7d/WOvw2ot3aG+bEP1jVkrn97JSBE57+pk7AuUNmWs++THb2k4ynucIYaLZ3LaGWKjzXdKbNbl3MJa1x3hKxZPTpjMWzxKgHfvOrS6drRvPpKbVjJ3gFRs38Ifz2WbC+40Y4cuxmrSUs20G03mv0YufWZToq+jkCGBLx69eKyfnGTl+SmTH13v4KmlJd+qPPad6dpkWdG2LWGXSpyuNM+fOHBs9IDDKIyhqJCGEMEP5ye3ffL39TN2tNjxuzM/Iqp3u6+wX4MmldDIcJGjHLfnbPYMdDXk/ffTJ7tJevT+NdfqoJveQhjPGr89c+n++X0tiP+w7t4xmwghRyK99rmk8l3q8ZtxkjxEjgzdnZ0u+sbG+nFSdltomtqjXpEWLErV82ZHVn244lFtjvPR7vTQbu/e2oZt6sZym45//9b+Hb6abxXZ5iwwlyZs/TP5B5uTp5+/n6x8QMnRUwjCfmHlPL6555T2L00cU8pY2MrPN46HVJEOzgREiV3RyasS5j3z4uQdjXMwlez7576ZzXZm9YZEoSoRQXmh3cw6ev9Gjd8/WZHnMAy/fH2lxXkbmuhVr0nFnpr5l17nFKqskRnhvT44n17qAxpSdcqJ64iT3uLiQDef1I4b78lL18dTs1pNQqWZIbKicmNK3rd13vgdvltpVTJQYI1QQ2v1k2/+Ge6ecLWvnBIHvl9m3ZrOZECIIbSsjFQQZIUQUzVaUyKotYqb68rys8rysE4d+27V/7osvzx4wOG6IOumghR2t9eQ4QnRVki01x7tBiFrw0n1Dubztq748VNtqEy3ueaoZuuC5RxI8ScXhr1Z9m157Y1VFqq2plYiTx4AANc2/0qrlvIKCrB+r642aTJUuPlofi7lV3GHGbxeIIiOECB0XKiMySohIxFutld89dp1bJDfP3Mh4t0GyEM505prBlXqiasIUt+hhwUn64X68VHU8JafttRMKpYJQIhkMpjYVhqq8vJ0t1UsmiiIjlOe4Gx4BE+tq6hhx1wYNUJLKKyeKnGdgYLvfsFXlbNk11OJ8bbOuXCcRH9/AAFlS1tVTR6oZlDBqoNpQcDQpq0ObgzqGz3jwngRfUnJ44+pd524gQyVduU5kXi7Bwe70XPmV45f7wBBnykRdWSfXX153z3d9i6hT8IhhvgpT2amUnJqrazIWny9qJoFKBwcFIZ0+XoATRgziOMbO5YmWu8p6bi9Z4Xrfu9RgUmj9fJxjwlSHU6+2nHivsDAXyszlFytbF5eqBs159olJfkLN8dWdXePVwfW2XSrNPFVxV4D30FkLE3O/PFDc3HLtx4JxHkZG5FZtkVU1+XoMRz56/Eg3P3M99eXMwIhjKO8riIWtqk9ABK+ipLFcsupq0VuHzQ1Tdov+jDG5ifA+yrsjrp0c5vOpx6okziNqzLhIf06qPHE0p+2xhtUUFekZVQydOjXoyvkTVQ2YuHBmhMWlsspyncioJiphmOsNdm2IeRmnaiTqFH/vwgTflqnvvNOgmQvGe7U957WmnExfXWVghA+OjnLp/PuWClJTi83U/bb5f4p2v3QqQxW+Y+5/YvH9C2ZFu3ZyXOb8Jz8wLz40wD901LwHp/rdSD1itSdTspqJEDLj4RnhzjwhhAgug2cvmhEikKas5JOdDDBdd893Y4sUIVMWL370ycfnj/W7skc5ddCkqUPVlDWUlFoY31JFKKf7EKnJuPeM5UNMD+6l7rvu9y4VHDlSaCbqkfMfuX2Qc8uFvUrv2PmP3hnEk4aTh060OnjKB0xbunRmiLLh1PpVHydd7MKg1vW33Xxh5/rDFRL1HLXo9Q9WrXzrjf98+PbzU4ynsizNLO+VmtwvjOdM6dWE85HfN1/warnigFLveMW94zlOkk6m9u5TLeyffbe3WINx7X5x/DR+5r2qX1fqj1vu0TZfSDmmm3q7/7hxZoHpjh290L5eGE/v2Jo5YuHQiDkvv5OQk1NSLyrdAkOCFDm/H9f5jPPrfPX1x35NmhE5yWvsM/8Z1djQfPl6kaKf335nV6lEiHzEw28uGna5M4CTO3KEqOKfeDvadLn8Rz7/13enzYQQw6ntG45FPxbnk/jo6yPv1ekaqbOnu+nE3symSaNa9yZYU07jqf0HLsbfrh3zl3dH6PUtI2KSbu8Hb/yQe6mRKhbs/Grb4OVzwqb99d+JFSUX6yWlu1brrKBi5dF1G5I7OfmjCuWV0Y9W/2sVVn1wzbroFx+KjZz7wqrpNVV66uTm7MATs+7ot2sPdXZ+fN093/UtYpWHf9o7IXiK7+hHXotbUFvdYGScwslFoxQo0Z/+eVdWZ3f1oA6yx+5V+FCSt7/pj2s87O26e6kbNaT7rvu9S4W/fLUh/Ln7Bg9/4O/D5tVXN4gOLi4OAiXGkn1ffZ/SKrE5v5FjIxwpkxTBM/6/d2a0W5FUd+iTVza0e6BMF2oIqzv2zVvvlM6bnRgd7OnuScqy969ev7Vywmvjrd0iK2py/2gWd3xn8n9M5n+bcnkc0+kYcaQeGsoRVrTbsOucrRTTVtn9cyMrckXHYYoYP9m4UHLulKnY0lRSqbbZPSFxkLPAs/Kk7zdndOh8Yg15x44Vio4urh4+/gF+Xhpam31g4+frMl1umzBE05RzcHfHzxBTxakTeZKLt5ebi7PaQalUKBUKpbwpe/++M3WMECHwtjljg1VKRcvrAkcJpbys5Z8KhVJBS1J/OV7W8pNrKkw7lic6ebq7ubhoHFh1dtKGTzfm+k+8baCy/uy+vVmXRhOsKadYeSatkLlrvT1cNWoHpVKhUMrNeYdbv1OsPpecmtsk17h4ePtqPTVygy43I2nLN19uTq/urAeW1VboPcLD/dTGoiMb1+0t6DhAT9Wh4ydFuUlFybuOXe9m4UxfcDT5XINc4+zi6ubmKDPWFGYe3PbVl5vTqix88jp7vjtbZCrPSM6sICqNRuPi4qJxVCt5c33ZhbQ/Nn6+9kBJx9jinWWPPun0UDBnLml6+WtD0TVC5bp7qes1hLoOmTQ+zMmQe+jXdN3V8lPXqEnjwtTWfu9ibU5K8tkGwUnj7OrmplFI9WXnj+/Z9Nk3O8+26de7tHaO8vKrZbv6HylO/uVkRbsZ+tetIYQQwprLs48n7d65bfu2bbv2HEzPr5G8ht8+Jlhel7VvX8e5nL1Qk/uLSSceT5NMCurkQt09OBUhFRfEAz8YNv0h3eiVzDc/OjxudGVFOSFEqw3okSWGeJadq/bokUVdUV5Yco2/yjwVLy9znO5FWaO4L6lp3e/NJ2p6dv0AhBDCucjmTFbOG6sIURNTuWHFf+t3VfR3mW46QvSj7y4b55C34ZUVP+HhKNAp+x7famGqMLz6Vt27R8x6JT/xdvXc4L687Q7cQoRg5dJpihAHdv6I/qm3EFq9QPCIS4hUUdZ8sdRSUxvAvse3rpAaTOu/rNmxU37HGLlwy10oCn1EqjP/+qt5/6HmQyUMB9UewYfe848nx16ZCitTadQKnhjyfv8tHfeqBUtuktxqUV9i3LAJVwBCbzGfb3rzfH8X4uZCZWpnV1fXSzfIZmZDTUnmib1bN+/NtZ2HZYHNualyCwDsizlr9XOLV/d3KcDO3AzjWwAAcOtAbgEAgD1BbgEAgD1BbgEAgD1BbgEAgD3p+fmEB9KNhFzr9hYAAABWQ3sLAADsCXILAADsCXILAADsCXILAADsCXILAADsCXILAADsCXILAADsCXILAADsSR89xyRwsubtyTx/5d+StO2z2m8K+mblAABw8+ij3JKpOH/P1rlFXGR9s2YAALip9FFu5WyvSdhOCCGEly1b4bzArW9WCwAANxuMbwEAgD1BbgEAgD1BbgEAgD3po/GtbpIHTFryxLxYL1Ketvmjz/cUGPu7QAAAYCNssr0lhE+eHadV8bxKGzt7SphtZisAAPQHm8wtqbKswsQIIYSZKi5WSv1dHgAAsBk22ZaRSn557w3dqCEeRJeVnFqK3AIAgMtsMrcIkepzU3/P7e9SAACAzbHJfkIAAAALkFsAAGBPkFsAAGBPkFsAAGBPbHReBnUaGBvtp6SE1V04llFsYP1dIAAAsA22mVvUafjcxxZFy4lYuPWVI+n9XRwAALAZttlPKA+NCJFRwkzn9h0owuVbAABwhU3mFh8YHupACWtM35tShS5CAAC4yhZzi/OOGOTGEak69Y8TDYgtAABopY/GtwInaVZO5HlCCKGuLtd+L3UKi/DjiFR6YP8ZQ18UDgAA7Ecf5ZZMzQX6tOQWIYSQa41ZKULDgwViytm3P1/s/ZIBAIBd6aPcytlek7C9a2/lA8MHOZDmtH1HKtBHCAAA7dDhcaMrK8oJIVptQI8ssbS0sEeWAwAA0JEtzssAAACwBLkFAAD2BLkFAAD2BLkFAAD2BLkFAAD25Oo8eMwDBAAA24f2FgAA2BPkFgAA2BPkFgAA2BPkFgAA2BPkFgAA2BPkFgAA2BPkFgAA2BPkFgAA2JO2z9+i3KzHnR/yY3XVYkaGYeM+Y5Gpn8oFAADQmXbPjaSOLvwALSFaIWqIYtbopr+9oz/R1D8lAwAA6IjX+vo3Neov/5NlHGz8YkfTz2dZwBB5iLcQUG/8+QLDc4cBAMBGdDK+xURWcqbpy2RRotTPm+P7vlAAAAAWWJyXIQiEEKJvYlLfFQYAAOA6LOUWddNwlJCaOnQSAgCADbGQW5S6OVHKWE2dhPYWAADYDku5xbk7EUJYVT2aWwAAYEMsjm/xHCGMmNHaAgAAW2IhtyQx9awkcdyokXIPTCgEAACbIVh4nR3dXLdSUC8ardk+WqqoY2ZCCJN2fln7+YW+LB4AAEAblnKLEEJkSs5RRniO8/EkhBDCqKu8b0oFAADQOUu5RYfNcnp2BF+Vrn/u++ZTVcyE+RkAAGADLOQWx48ewvNEStrdlFbZtyUCAACwzOJ8QkoJIQRXHQMAgE2xkFtMqmoghFAXR9qnxQEAALgmS7nFKusZo9RVQ/FkSQAAsB2WUolV1zJGiKuGQ4MLAABsh8XWVJOBMUIc1WhvAQCADek8leRu8lkxPEdIZbUk9nGJAAAALGs7D55yMx91XhRM3d04NU/EKsOaQyLuUAgAALaj3fVbVOPG+7uzhmrzwUzDtz81Havpn2IBAAB0ig6PG11ZUd7fxQAAAOgSzLoAAAB7gtwCAAB7gtwCAAB7gtwCAAB7gtwCAAB7gtwCAAB7gtwCAAB78v8AxEMiOt97YfgAAAAASUVORK5CYII=;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-12" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" vertex="1" parent="1">
           <mxGeometry y="454" width="297.49" height="176" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-14" target="RtlmW2mn4jqAsx0V-4f3-27" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-16" target="R1Sj7afmYKt7WFE0D8gf-26">
           <mxGeometry relative="1" as="geometry">
             <Array as="points">
-              <mxPoint x="810" y="330" />
-              <mxPoint x="810" y="410" />
+              <mxPoint x="820" y="330" />
+              <mxPoint x="820" y="410" />
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-14" target="RtlmW2mn4jqAsx0V-4f3-32" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-16" target="R1Sj7afmYKt7WFE0D8gf-24">
+          <mxGeometry relative="1" as="geometry" />
+        </mxCell>
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-16" target="R1Sj7afmYKt7WFE0D8gf-28">
           <mxGeometry relative="1" as="geometry">
             <Array as="points">
-              <mxPoint x="790" y="360" />
-              <mxPoint x="790" y="517" />
+              <mxPoint x="800" y="330" />
+              <mxPoint x="800" y="517" />
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-14" target="RtlmW2mn4jqAsx0V-4f3-26" edge="1">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-14" value="&lt;h1 style=&quot;font-size: 19px;&quot;&gt;demo/xxx_pb2.py&lt;/h1&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;class DemoMessage(object):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;pass&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-16" value="&lt;h1 style=&quot;font-size: 19px;&quot;&gt;demo/xxx_pb2.py&lt;/h1&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;class DemoMessage(object):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;pass&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
           <mxGeometry x="590" y="270" width="190" height="120" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-19" target="RtlmW2mn4jqAsx0V-4f3-21" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-18" target="R1Sj7afmYKt7WFE0D8gf-20">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-19" value="plugin:mypy-protobuf" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-18" value="plugin:mypy-protobuf" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="439" y="410" width="84" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-21" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-20">
           <mxGeometry relative="1" as="geometry">
             <mxPoint x="840" y="410" as="targetPoint" />
+            <Array as="points">
+              <mxPoint x="820" y="440" />
+              <mxPoint x="820" y="411" />
+            </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-21" value="&lt;h1 style=&quot;font-size: 19px;&quot;&gt;demo/xxx_pb2.pyi&lt;/h1&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;class DemoMessage(object):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;pass&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
-          <mxGeometry x="590" y="380" width="190" height="120" as="geometry" />
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-20" value="&lt;h1 style=&quot;font-size: 19px;&quot;&gt;demo/xxx_pb2.pyi&lt;/h1&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;class DemoMessage(object):&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;pass&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
+          <mxGeometry x="585" y="380" width="190" height="120" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.001;entryY=0.689;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-23" target="RtlmW2mn4jqAsx0V-4f3-48" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.001;entryY=0.689;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-22" target="R1Sj7afmYKt7WFE0D8gf-36">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-23" value="plugin:P2p" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="433" y="870" width="84" height="60" as="geometry" />
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-22" value="plugin:P2p" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+          <mxGeometry x="439" y="870" width="84" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-26" target="RtlmW2mn4jqAsx0V-4f3-47" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-24" target="R1Sj7afmYKt7WFE0D8gf-35">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-26" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-24" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="840" y="270" width="170" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-27" target="RtlmW2mn4jqAsx0V-4f3-47" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-26" target="R1Sj7afmYKt7WFE0D8gf-35">
           <mxGeometry relative="1" as="geometry">
             <mxPoint x="1299.4679999999998" y="409.34899999999993" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-27" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-26" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="840" y="380" width="170" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-32" target="RtlmW2mn4jqAsx0V-4f3-47" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-28" target="R1Sj7afmYKt7WFE0D8gf-35">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-32" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-28" value="p2p:msg_to_pydantic_model" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="840" y="487" width="170" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-36" value="Use Message and protobuf file comment" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-29" value="Use Message and protobuf file comment" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="1005" y="270" width="240" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-37" value="Use Message and pyi file comment" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-30" value="Use Message and pyi file comment" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="1010" y="370" width="210" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-39" value="Use Message and and Message Option Info" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-31" value="Use Message and and Message Option Info" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="1005" y="480" width="260" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-42" target="RtlmW2mn4jqAsx0V-4f3-23" edge="1">
-          <mxGeometry relative="1" as="geometry">
-            <Array as="points">
-              <mxPoint x="454" y="770" />
-            </Array>
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-42" value="Protoc" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
-          <mxGeometry x="400" y="710" width="120" height="60" as="geometry" />
-        </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-47" target="RtlmW2mn4jqAsx0V-4f3-59" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-35" target="R1Sj7afmYKt7WFE0D8gf-41">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-47" value="Runtime: DemoMessage(BaseModel)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-35" value="Runtime: DemoMessage(BaseModel)" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="1220" y="380" width="200" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-48" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-36" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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;" vertex="1" parent="1">
           <mxGeometry x="597" y="716" width="532" height="267" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-52" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-37" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="515" y="300" width="70" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-53" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-38" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="518" y="410" width="70" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-55" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-39" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="515" y="870" width="70" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.328;entryY=0.002;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="RtlmW2mn4jqAsx0V-4f3-59" target="RtlmW2mn4jqAsx0V-4f3-48" edge="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.328;entryY=0.002;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="R1Sj7afmYKt7WFE0D8gf-41" target="R1Sj7afmYKt7WFE0D8gf-36">
           <mxGeometry relative="1" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-59" value="p2p:pydantic_model_to_py_code" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-41" value="p2p:pydantic_model_to_py_code" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
           <mxGeometry x="840" y="610" width="190" height="60" as="geometry" />
         </mxCell>
-        <mxCell id="RtlmW2mn4jqAsx0V-4f3-63" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1">
+        <mxCell id="R1Sj7afmYKt7WFE0D8gf-42" value="gen code" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
           <mxGeometry x="762" y="610" width="70" height="30" as="geometry" />
         </mxCell>
       </root>
diff --git a/images/protobuf-to-pydantic_index.png b/images/protobuf-to-pydantic_index.png
index 4856f94..578ed6e 100644
Binary files a/images/protobuf-to-pydantic_index.png and b/images/protobuf-to-pydantic_index.png differ
diff --git a/protobuf_to_pydantic/constant.py b/protobuf_to_pydantic/constant.py
index eb90a01..e8500c0 100644
--- a/protobuf_to_pydantic/constant.py
+++ b/protobuf_to_pydantic/constant.py
@@ -58,3 +58,21 @@
     FieldDescriptor.TYPE_SINT32: int,
     FieldDescriptor.TYPE_SINT64: int,
 }
+protobuf_common_type_dict: Dict[Any, str] = {
+    FieldDescriptor.TYPE_DOUBLE: "double",
+    FieldDescriptor.TYPE_FLOAT: "float",
+    FieldDescriptor.TYPE_INT64: "int64",
+    FieldDescriptor.TYPE_UINT64: "uint64",
+    FieldDescriptor.TYPE_INT32: "int32",
+    FieldDescriptor.TYPE_FIXED64: "fixed64",
+    FieldDescriptor.TYPE_FIXED32: "fixed32",
+    FieldDescriptor.TYPE_BOOL: "bool",
+    FieldDescriptor.TYPE_STRING: "string",
+    FieldDescriptor.TYPE_BYTES: "bytes",
+    FieldDescriptor.TYPE_UINT32: "uint32",
+    FieldDescriptor.TYPE_ENUM: "enum",
+    FieldDescriptor.TYPE_SFIXED32: "sfixed32",
+    FieldDescriptor.TYPE_SFIXED64: "sfixed64",
+    FieldDescriptor.TYPE_SINT32: "sint32",
+    FieldDescriptor.TYPE_SINT64: "sint64",
+}
diff --git a/protobuf_to_pydantic/customer_validator/rule.py b/protobuf_to_pydantic/customer_validator/rule.py
index 60d7779..6b69dd8 100644
--- a/protobuf_to_pydantic/customer_validator/rule.py
+++ b/protobuf_to_pydantic/customer_validator/rule.py
@@ -3,7 +3,7 @@
 
 from protobuf_to_pydantic.grpc_types import AnyMessage
 
-from protobuf_to_pydantic.types import OneOfTypedDict  # isort:skip
+from protobuf_to_pydantic.field_info_rule.types import OneOfTypedDict  # isort:skip
 
 
 def to_datetime(value: Any) -> Any:
diff --git a/protobuf_to_pydantic/customer_validator/v1.py b/protobuf_to_pydantic/customer_validator/v1.py
index c327d50..fed8b4d 100644
--- a/protobuf_to_pydantic/customer_validator/v1.py
+++ b/protobuf_to_pydantic/customer_validator/v1.py
@@ -5,7 +5,7 @@
 
 from . import rule
 
-from protobuf_to_pydantic.types import OneOfTypedDict  # isort:skip
+from protobuf_to_pydantic.field_info_rule.types import OneOfTypedDict  # isort:skip
 
 
 ################
diff --git a/protobuf_to_pydantic/customer_validator/v2.py b/protobuf_to_pydantic/customer_validator/v2.py
index c4dece2..630445a 100644
--- a/protobuf_to_pydantic/customer_validator/v2.py
+++ b/protobuf_to_pydantic/customer_validator/v2.py
@@ -8,7 +8,7 @@
 
 from . import rule
 
-from protobuf_to_pydantic.types import OneOfTypedDict  # isort:skip
+from protobuf_to_pydantic.field_info_rule.types import OneOfTypedDict  # isort:skip
 
 
 ################
diff --git a/protobuf_to_pydantic/field_info_rule/__init__.py b/protobuf_to_pydantic/field_info_rule/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/protobuf_to_pydantic/field_param.py b/protobuf_to_pydantic/field_info_rule/field_info_param.py
similarity index 51%
rename from protobuf_to_pydantic/field_param.py
rename to protobuf_to_pydantic/field_info_rule/field_info_param.py
index 3c977cd..5f2f4ce 100644
--- a/protobuf_to_pydantic/field_param.py
+++ b/protobuf_to_pydantic/field_info_rule/field_info_param.py
@@ -2,49 +2,55 @@
 import warnings
 from dataclasses import MISSING
 from types import ModuleType
-from typing import Any, Callable, Dict, Optional, Set, Type, Union
+from typing import Any, Callable, Dict, List, Optional, Set, Type, Union
 
 from pydantic import BaseModel, Field
 from pydantic.fields import FieldInfo
 from typing_extensions import Literal, get_args, get_origin
 
 from protobuf_to_pydantic import _pydantic_adapter, constant
-from protobuf_to_pydantic.types import JsonAndDict
+from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict, JsonAndDict
 from protobuf_to_pydantic.util import check_dict_one_of
 
 # You can decide whether to generate the 'Field' parameter by modifying the 'field_param_set'
 field_param_set = set(inspect.signature(Field).parameters.keys())
 
+support_con_type_module_name: List[str] = [
+    "pydantic.types",
+    "protobuf_to_pydantic.customer_con_type.v1",
+    "protobuf_to_pydantic.customer_con_type.v2",
+]
 
-def field_param_dict_migration_v2_handler(field_param_dict: Dict[str, Any], is_warnings: bool = True) -> None:
+
+def field_info_param_dict_migration_v2_handler(field_info_param_dict: Dict[str, Any], is_warnings: bool = True) -> None:
     json_schema_extra = {}
-    for k in list(field_param_dict.keys()):
+    for k in list(field_info_param_dict.keys()):
         new_k = constant.pydantic_field_v1_migration_v2_dict.get(k, k)
         if new_k != k:
             if new_k is None:
                 if is_warnings:
                     warnings.warn(
-                        f"field param `{k}` is deprecated, "
+                        f"field info param `{k}` is deprecated, "
                         f"https://docs.pydantic.dev/latest/migration/#changes-to-pydanticfield"
                     )
-                field_param_dict.pop(k)
+                field_info_param_dict.pop(k)
             else:
                 if is_warnings:
                     warnings.warn(
-                        f"field param `{k}` is deprecated, please use `{new_k}` instead,"
+                        f"field info param `{k}` is deprecated, please use `{new_k}` instead,"
                         f" https://docs.pydantic.dev/latest/migration/#changes-to-pydanticfield"
                     )
-                value = field_param_dict.pop(k)
+                value = field_info_param_dict.pop(k)
                 if value:
-                    field_param_dict[new_k] = value
+                    field_info_param_dict[new_k] = value
         else:
             if k not in field_param_set:
-                json_schema_extra[k] = field_param_dict.pop(k)
-    field_param_dict["json_schema_extra"] = json_schema_extra
+                json_schema_extra[k] = field_info_param_dict.pop(k)
+    field_info_param_dict["json_schema_extra"] = json_schema_extra
 
 
-def field_param_dict_handle(
-    field_param_dict: dict,
+def field_info_param_dict_handle(
+    field_info_param_dict: dict,
     default: Any,
     default_factory: Optional[_pydantic_adapter.NoArgAnyCallable],
     field_type: Optional[type] = None,
@@ -53,7 +59,7 @@ def field_param_dict_handle(
     """
     Convert the field_param_dict data to Pydantic Field parameters
 
-    :param field_param_dict:
+    :param field_info_param_dict:
     :param default: Pydantic Field default value
     :param default_factory: Pydantic Field default_factory value
     :param field_type: Pydantic Field type value
@@ -65,72 +71,81 @@ def field_param_dict_handle(
     :return:
     """
     # default_template support
-    if field_param_dict.get("default", None) is None and field_param_dict.get("default_template", None) is not None:
-        field_param_dict["default"] = field_param_dict["default_template"]
-    field_param_dict.pop("default_template", None)
+    if (
+        field_info_param_dict.get("default", None) is None
+        and field_info_param_dict.get("default_template", None) is not None
+    ):
+        field_info_param_dict["default"] = field_info_param_dict["default_template"]
+    field_info_param_dict.pop("default_template", None)
 
     # Handle complex relationships with different defaults
-    check_dict_one_of(field_param_dict, ["required", "default", "default_factory"])
-    if field_param_dict.get("default_factory", None) is not None:
-        field_param_dict.pop("default", "")
-    elif field_param_dict.get("default", None) is None:
+    check_dict_one_of(field_info_param_dict, ["required", "default", "default_factory"])
+    if field_info_param_dict.get("default_factory", None) is not None:
+        field_info_param_dict.pop("default", "")
+    elif field_info_param_dict.get("default", None) is None:
         if default_factory:
-            field_param_dict["default_factory"] = default_factory
-            field_param_dict.pop("default", "")
+            field_info_param_dict["default_factory"] = default_factory
+            field_info_param_dict.pop("default", "")
         else:
-            field_param_dict["default"] = default
-            field_param_dict.pop("default_factory", None)
-
-    if field_param_dict.get("required", None) is True:
-        field_param_dict.pop("default", "")
-        field_param_dict.pop("default_factory", "")
-    field_param_dict.pop("required", None)
+            field_info_param_dict["default"] = default
+            field_info_param_dict.pop("default_factory", None)
 
-    _const = field_param_dict.pop("const", MISSING)
+    # const handler
+    _const = field_info_param_dict.pop("const", MISSING)
     # PGV&P2P const handler
     if _const.__class__ != MISSING.__class__:
         if _pydantic_adapter.is_v1:
-            field_param_dict["default"] = _const
-            field_param_dict["const"] = True
+            field_info_param_dict["default"] = _const
+            field_info_param_dict["const"] = True
         else:
             # pydantic v2 not support const, only support Literal
-            field_param_dict["type_"] = Literal.__getitem__(_const)
+            field_info_param_dict["type_"] = Literal.__getitem__(_const)
+
+    # required handler
+    if field_info_param_dict.get("required", None) is True:
+        _pop_default = field_info_param_dict.pop("default", "")
+        _pop_default_factory = field_info_param_dict.pop("default_factory", "")
+        if _pop_default or _pop_default_factory:
+            warnings.warn(
+                "if required is True,"
+                " `default`, `default_factory`, `default_template` and `const` param values should not be set"
+            )
+
+    field_info_param_dict.pop("required", None)
 
-    if not _pydantic_adapter.is_v1 and field_param_dict.get("unique_items", None) is not None:
+    # unique handler
+    if not _pydantic_adapter.is_v1 and field_info_param_dict.get("unique_items", None) is not None:
         # In pydantic v2, not support unique_items
         # only use the Set type instead of this feature
         if not field_type or get_origin(field_type) != list:
             raise RuntimeError(f"unique_items only support type List (protobuf type: repeated) not {field_type}")
-        field_param_dict["type_"] = Set.__getitem__(get_args(field_type))  # type: ignore[index]
-        if field_param_dict["default_factory"]:
-            field_param_dict["default_factory"] = set
-
-    # example handle
-    check_dict_one_of(field_param_dict, ["example", "example_factory"])
-    if field_param_dict.get("example", MISSING).__class__ == MISSING.__class__:
-        field_param_dict.pop("example", None)
-    example_factory = field_param_dict.pop("example_factory", None)
+        # change type: list -> set
+        field_info_param_dict["type_"] = Set.__getitem__(get_args(field_type))  # type: ignore[misc]
+        if field_info_param_dict["default_factory"]:
+            field_info_param_dict["default_factory"] = set
+
+    # example handler
+    check_dict_one_of(field_info_param_dict, ["example", "example_factory"])
+    if field_info_param_dict.get("example", MISSING).__class__ == MISSING.__class__:
+        field_info_param_dict.pop("example", None)
+    example_factory = field_info_param_dict.pop("example_factory", None)
     if example_factory:
-        field_param_dict["example"] = example_factory
+        field_info_param_dict["example"] = example_factory
 
-    # extra handle
-    extra = field_param_dict.pop("extra", None)
+    # extra handler
+    extra = field_info_param_dict.pop("extra", None)
     if extra:
-        field_param_dict.update(extra)
+        field_info_param_dict.update(extra)
 
-    # type handle
-    field_type = field_param_dict.get("type_")
-    sub_field_param_dict: Optional[dict] = field_param_dict.pop("sub", None)
+    # type handler
+    field_type = field_info_param_dict.get("type_")
+    sub_field_param_dict: Optional[dict] = field_info_param_dict.pop("sub", None)
     field_type_model: Optional[ModuleType] = inspect.getmodule(field_type)
-    if not field_type:
-        return
-
     if (
         field_type
         and not inspect.isclass(field_type)
         and field_type_model
-        and field_type_model.__name__
-        in ("pydantic.types", "protobuf_to_pydantic.customer_con_type.v1", "protobuf_to_pydantic.customer_con_type.v2")
+        and field_type_model.__name__ in support_con_type_module_name
     ):
         # support https://pydantic-docs.helpmanual.io/usage/types/#constrained-types
         # Parameters needed to extract `constrained-types`
@@ -140,19 +155,19 @@ def field_param_dict_handle(
             # In pydantic v2
             # If it is the first layer, all parameters need to be passed to Field, not Type
             for key in inspect.signature(field_type).parameters.keys():
-                if key in field_param_dict:
-                    type_param_dict[key] = field_param_dict.pop(key)
+                if key in field_info_param_dict:
+                    type_param_dict[key] = field_info_param_dict.pop(key)
         if sub_field_param_dict and "type_" in sub_field_param_dict:
             # If a nested type is found, use the same treatment
-            field_param_dict_handle(
+            field_info_param_dict_handle(
                 sub_field_param_dict, default, default_factory, nested_call_count=nested_call_count + 1
             )
-            field_param_dict["type_"] = field_type(sub_field_param_dict["type_"], **type_param_dict)
+            field_info_param_dict["type_"] = field_type(sub_field_param_dict["type_"], **type_param_dict)
         else:
-            field_param_dict["type_"] = field_type(**type_param_dict)
+            field_info_param_dict["type_"] = field_type(**type_param_dict)
 
 
-class FieldParamModel(BaseModel):
+class FieldInfoParamModel(BaseModel):
     field: Optional[Type[FieldInfo]] = Field(None)
     enable: bool = Field(True)
     required: bool = Field(False)
@@ -177,7 +192,12 @@ class FieldParamModel(BaseModel):
     multiple_of: Optional[int] = Field(None)
     regex: Optional[str] = Field(None)
     extra: JsonAndDict = Field(default_factory=dict)
+    json_schema_extra: JsonAndDict = Field(default_factory=dict)
+    skip: bool = Field(False)
     type_: Any = Field(None, alias="type")
     validator: Optional[Dict[str, Any]] = Field(None)
-    sub: Optional["FieldParamModel"] = Field(None)
+    sub: Optional["FieldInfoParamModel"] = Field(None)
     map_type: Optional[dict] = Field(None)
+
+    def to_dict(self) -> FieldInfoTypedDict:
+        return self.dict()  # type: ignore
diff --git a/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/__init__.py b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/base.py b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/base.py
new file mode 100644
index 0000000..e0273ff
--- /dev/null
+++ b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/base.py
@@ -0,0 +1,222 @@
+import inspect
+import logging
+from typing import Any, Callable, Dict, List, Optional, Set, Tuple
+
+from google.protobuf.descriptor import FieldDescriptor
+
+from protobuf_to_pydantic import _pydantic_adapter
+from protobuf_to_pydantic.constant import protobuf_common_type_dict
+from protobuf_to_pydantic.customer_con_type import (
+    conbytes,
+    confloat,
+    conint,
+    conlist,
+    constr,
+    contimedelta,
+    contimestamp,
+)
+from protobuf_to_pydantic.customer_validator import validate_validator_dict
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.types import rule_name_pydantic_type_dict
+from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict
+
+logger: logging.Logger = logging.getLogger(__name__)
+
+pgv_column_to_pydantic_dict: Dict[str, str] = {
+    "min_len": "min_length",
+    "min_bytes": "min_length",
+    "max_len": "max_length",
+    "max_bytes": "max_length",
+    "pattern": "regex",
+    "unique": "unique_items",
+    "gte": "ge",
+    "lte": "le",
+    "len_bytes": "len",
+    "miss_default": "required",
+}
+
+special_type_rule_name_set = {
+    "lt",
+    "le",
+    "gt",
+    "ge",
+    "const",
+    "in",
+    "not_in",
+    "lt_now",
+    "gt_now",
+    "within",
+    "min_pairs",
+    "max_pairs",
+}
+
+
+def get_con_type_func_from_type_name(type_name: str) -> Optional[Callable]:
+    if type_name == "string":
+        return constr
+    elif "double" in type_name or "float" in type_name:
+        return confloat
+    elif "int" in type_name:
+        return conint
+    elif type_name == "duration":
+        return contimedelta
+    elif type_name == "timestamp":
+        return contimestamp
+    elif type_name == "bytes":
+        return conbytes
+    else:
+        return None
+
+
+class BaseProtobufOptionToFieldInfo(object):
+    @property
+    def rule_dict(self) -> FieldInfoTypedDict:
+        raise NotImplementedError
+
+    def sub_value_handler(self, rule_value: Any) -> Dict[str, Any]:
+        raise NotImplementedError
+
+    def sub_type_name_handler(self, rule_value: Any) -> str:
+        raise NotImplementedError
+
+    def rule_value_to_field_value_handler(self, field_type_name: str, rule_name: str, rule_value: Any) -> Any:
+        raise NotImplementedError
+
+    def value_type_conversion_handler(self, field_type_name: str, rule_name: str, rule_value: Any) -> Tuple[bool, Any]:
+        return False, rule_value
+
+    def _core_handler(
+        self,
+        rule_dict: Dict[str, Any],
+        *,
+        field_name: str,
+        field_type: int,
+        type_name: str,
+        full_name: str,
+    ) -> FieldInfoTypedDict:
+        """
+        Adapt some Field verification information to convert it into verification information that is compatible with
+         Protobuf's special type of pydantic
+        """
+        field_info_type_dict: FieldInfoTypedDict = {"extra": {}, "skip": False}
+        for rule_name, rule_value in rule_dict.items():
+            if rule_name in type_not_support_dict.get(field_type, type_not_support_dict["Any"]):
+                # Exclude unsupported fields
+                if field_type in protobuf_common_type_dict:
+                    rule_name = f"{protobuf_common_type_dict[field_type]}.{rule_name}"
+                elif field_type == 1:
+                    rule_name = f"Message.{rule_name}"
+
+                msg: str = f"{__name__} not support `{rule_name}` rule."
+                if full_name:
+                    msg = msg + f"(field:{full_name})"
+                logger.warning(msg)
+                continue
+            is_change, new_rule_value = self.value_type_conversion_handler(type_name, rule_name, rule_value)
+            if is_change:
+                rule_value = new_rule_value
+
+            if rule_name in pgv_column_to_pydantic_dict:
+                # Field Conversion
+                rule_name = pgv_column_to_pydantic_dict[rule_name]
+
+            if type_name in ("duration", "any", "timestamp", "map") and rule_name in special_type_rule_name_set:
+                # The verification of these parameters is handed over to the validator,
+                # see protobuf_to_pydantic/customer_validator for details
+
+                # Types of priority treatment for special cases
+                if "validator" not in field_info_type_dict:
+                    field_info_type_dict["validator"] = {}
+
+                _rule_name: str = f"{type_name}_{rule_name}"
+                validator_name = f"{field_name}_{_rule_name}_validator"
+
+                field_info_type_dict["extra"][_rule_name] = self.rule_value_to_field_value_handler(
+                    type_name, rule_name, rule_value
+                )
+                field_info_type_dict["validator"][validator_name] = _pydantic_adapter.field_validator(
+                    field_name, allow_reuse=True
+                )(validate_validator_dict[f"{_rule_name}_validator"])
+                continue
+            elif rule_name in ("in", "not_in", "len", "prefix", "suffix", "contains", "not_contains"):
+                # The verification of these parameters is handed over to the validator,
+                # see protobuf_to_pydantic/customer_validator for details
+
+                # Compatible with PGV attributes that are not supported by pydantic
+                if "validator" not in field_info_type_dict:
+                    field_info_type_dict["validator"] = {}
+                validator_name = f"{field_name}_{rule_name}_validator"
+                # dict key not use python keyword
+                _rule_name = rule_name + "_" if rule_name in ("in",) else rule_name
+                field_info_type_dict["extra"][_rule_name] = self.rule_value_to_field_value_handler(
+                    type_name, rule_name, rule_value
+                )
+                field_info_type_dict["validator"][validator_name] = _pydantic_adapter.field_validator(
+                    field_name, allow_reuse=True
+                )(validate_validator_dict[f"{rule_name}_validator"])
+                continue
+            elif rule_name in rule_name_pydantic_type_dict:
+                # Support some built-in type judgments of PGV
+                field_info_type_dict["type"] = rule_name_pydantic_type_dict[rule_name]
+                continue
+            elif rule_name in ("keys", "values"):
+                # Parse the field data of the key and value in the map
+                type_name = self.sub_type_name_handler(rule_value)
+                # Nested types are supported via like constr
+
+                con_type = get_con_type_func_from_type_name(type_name)
+                if not con_type:
+                    # TODO nested message
+                    logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
+                    continue
+                if "map_type" not in field_info_type_dict:
+                    field_info_type_dict["map_type"] = {}
+                con_type_param_dict: dict = {}
+                # Generate information corresponding to the nested type
+                sub_dict = self._core_handler(
+                    self.sub_value_handler(rule_value),
+                    field_name=field_name,
+                    field_type=field_type,
+                    type_name=type_name,
+                    full_name=full_name,
+                )
+                for _key in inspect.signature(con_type).parameters.keys():
+                    param_value = sub_dict.get(_key, None)  # type: ignore
+                    if param_value is not None:
+                        con_type_param_dict[_key] = param_value
+                    elif "extra" in sub_dict:
+                        if sub_dict["extra"].get(_key, None) is not None:
+                            con_type_param_dict[_key] = sub_dict["extra"][_key]
+
+                field_info_type_dict["map_type"][rule_name] = con_type(**con_type_param_dict)
+            elif rule_name == "items":
+                # Process array data
+                type_name = self.sub_type_name_handler(rule_value)
+                # Nested types are supported via like constr
+                con_type = get_con_type_func_from_type_name(type_name)
+                if not con_type:
+                    # TODO nested message
+                    logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
+                    field_info_type_dict["type"] = List
+                    continue
+                sub_dict = self._core_handler(
+                    self.sub_value_handler(rule_value),
+                    field_name=field_name,
+                    field_type=field_type,
+                    type_name=type_name,
+                    full_name=full_name,
+                )
+                if "type" not in sub_dict:
+                    sub_dict["type"] = con_type
+
+                field_info_type_dict["type"] = conlist
+                field_info_type_dict["sub"] = sub_dict
+
+            field_info_type_dict[rule_name] = rule_value  # type: ignore
+        return field_info_type_dict
+
+
+type_not_support_dict: Dict[Any, Set[str]] = {
+    FieldDescriptor.TYPE_BYTES: {"pattern"},
+    FieldDescriptor.TYPE_STRING: {"min_bytes", "max_bytes", "well_known_regex", "strict"},
+    "Any": {"ignore_empty", "defined_only", "no_sparse"},
+}
diff --git a/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/comment.py b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/comment.py
new file mode 100644
index 0000000..01f0e3f
--- /dev/null
+++ b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/comment.py
@@ -0,0 +1,111 @@
+from datetime import timedelta
+from typing import Any, Dict, Optional, Tuple, Union
+
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.base import (
+    BaseProtobufOptionToFieldInfo,
+    special_type_rule_name_set,
+)
+from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict
+from protobuf_to_pydantic.grpc_types import FieldDescriptor, FieldDescriptorProto, Timestamp
+
+
+class ProtobufOptionToFieldInfoWithCommentDict(BaseProtobufOptionToFieldInfo):
+    """Parse the data of option and store it in dict.
+    Since array and map are supported, the complexity is relatively high
+
+    The field names used by validator need to be prefixed with type_name, such as timestamp_gt,
+    while the built-in validation of Pydantic V2 does not require type_name prefix, such as gt
+    """
+
+    def __init__(
+        self,
+        rule_dict: Dict[str, Any],
+        field: Union[FieldDescriptor, FieldDescriptorProto],
+        type_name: str,
+        full_name: str,
+    ):
+        self._rule_dict = self._core_handler(
+            rule_dict=rule_dict,
+            field_name=field.name,
+            field_type=field.type,
+            type_name=type_name,
+            full_name=full_name,
+        )
+
+    @property
+    def rule_dict(self) -> FieldInfoTypedDict:
+        return self._rule_dict
+
+    @staticmethod
+    def _duration_handler(_value: Any) -> Optional[timedelta]:
+        if isinstance(_value, timedelta):
+            return _value
+        elif not isinstance(_value, dict):
+            return _value
+        seconds = _value.get("seconds", 0)
+        nanos = _value.get("nanos", 0)
+        if nanos:
+            nanos = nanos / 1000
+        if not seconds and not nanos:
+            return None
+        return timedelta(seconds=seconds, microseconds=nanos)
+
+    def sub_value_handler(self, rule_value: Any) -> Dict[str, Any]:
+        sub_type_name = self.sub_type_name_handler(rule_value)
+        return rule_value[sub_type_name]
+
+    def sub_type_name_handler(self, rule_value: Any) -> str:
+        sub_type_name = list(rule_value.keys())[0]
+        return sub_type_name
+
+    def rule_value_to_field_value_handler(self, field_type_name: str, rule_name: str, rule_value: Any) -> Any:
+        if isinstance(rule_value, list):
+            return [self.rule_value_to_field_value_handler(field_type_name, rule_name, i) for i in rule_value]
+        elif field_type_name == "duration":
+            return self._duration_handler(rule_value)
+        elif field_type_name == "timestamp":
+            if rule_name in ("const", "gt", "lt", "ge", "le") and isinstance(rule_value, dict):
+                return Timestamp(**rule_value)
+            elif rule_name in ("within",):
+                return self._duration_handler(rule_value)
+        return rule_value
+
+    def value_type_conversion_handler(self, field_type_name: str, rule_name: str, rule_value: Any) -> Tuple[bool, Any]:
+        if field_type_name in ("double", "float") and isinstance(rule_value, (float, int)):
+            return True, float(rule_value)
+        elif field_type_name == "bytes" and isinstance(rule_value, str):
+            return True, rule_value.encode("utf-8")
+        elif isinstance(rule_value, list):
+            new_value = []
+            is_change: bool = False
+            for i in rule_value:
+                _is_change, i = self.value_type_conversion_handler(field_type_name, rule_name, i)
+                new_value.append(i)
+                if _is_change:
+                    is_change = _is_change
+            if is_change:
+                return is_change, new_value
+            return is_change, rule_value
+        elif rule_name not in special_type_rule_name_set:
+            if field_type_name == "duration" and isinstance(rule_value, dict):
+                new_column_value = self._duration_handler(rule_value)
+                if new_column_value:
+                    return True, new_column_value
+                return False, rule_value
+            elif field_type_name == "timestamp" and isinstance(rule_value, dict):
+                if "seconds" in rule_value or "nanos" in rule_value:
+                    return True, Timestamp(**rule_value)
+                else:
+                    return False, rule_value
+        return False, rule_value
+
+
+def gen_field_rule_info_dict_from_field_comment_dict(  # noqa: C901
+    rule_dict: Dict[str, Any],
+    field: Union[FieldDescriptor, FieldDescriptorProto],
+    type_name: str,
+    full_name: str,
+) -> FieldInfoTypedDict:
+    return ProtobufOptionToFieldInfoWithCommentDict(
+        rule_dict=rule_dict, field=field, type_name=type_name, full_name=full_name
+    ).rule_dict
diff --git a/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/desc.py b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/desc.py
new file mode 100644
index 0000000..30bd6c9
--- /dev/null
+++ b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/desc.py
@@ -0,0 +1,134 @@
+import logging
+from typing import Any, Dict, List, Optional, Union
+
+from google.protobuf.descriptor import Descriptor, FieldDescriptor
+from google.protobuf.descriptor_pb2 import FieldDescriptorProto
+from google.protobuf.message import Message
+
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.base import BaseProtobufOptionToFieldInfo
+from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict
+from protobuf_to_pydantic.util import replace_protobuf_type_to_python_type
+
+logger: logging.Logger = logging.getLogger(__name__)
+
+
+def _has_raw_message_field(field_name: str, message: Message) -> bool:
+    """Check if the field is valid in Message(or field is set in Message)"""
+    if field_name.startswith("_"):
+        return False
+    if getattr(Message, field_name, None):
+        return False
+    try:
+        if not message.HasField(field_name):
+            return False
+    except ValueError:
+        if not getattr(message, field_name, None) or field_name[0].lower() != field_name[0]:
+            return False
+    return True
+
+
+class ProtobufOptionToFieldInfoWithFieldDesc(BaseProtobufOptionToFieldInfo):
+    """Parse the data of option and store it in dict.
+    Since array and map are supported, the complexity is relatively high
+
+    The field names used by validator need to be prefixed with type_name, such as timestamp_gt,
+    while the built-in validation of Pydantic V2 does not require type_name prefix, such as gt
+    """
+
+    def __init__(
+        self,
+        field_descriptor: Union[Descriptor, FieldDescriptor],
+        field: Union[FieldDescriptor, FieldDescriptorProto],
+        type_name: str,
+        full_name: str,
+    ):
+        self._rule_dict = self._core_handler(
+            self.get_rule_dict(self.get_rule_name_list(field_descriptor), field_descriptor),
+            field_name=field.name,
+            field_type=field.type,
+            type_name=type_name,
+            full_name=full_name,
+        )
+
+    def get_rule_name_list(self, rule_descriptor: Union[Descriptor, FieldDescriptor]) -> List[str]:
+        if hasattr(rule_descriptor, "ListFields"):
+            _rule_name_list = [rule_field[0].name for rule_field in rule_descriptor.ListFields()]  # type: ignore
+        else:
+            _rule_name_list = [
+                rule_name
+                for rule_name in rule_descriptor.__dir__()
+                if _has_raw_message_field(rule_name, rule_descriptor)  # type: ignore
+            ]
+        return _rule_name_list
+
+    def get_rule_dict(
+        self, rule_name_list: List[str], _field_descriptor: Union[Descriptor, FieldDescriptor]
+    ) -> Dict[str, Any]:
+        return {_rule_name: getattr(_field_descriptor, _rule_name) for _rule_name in rule_name_list}
+
+    @property
+    def rule_dict(self) -> FieldInfoTypedDict:
+        return self._rule_dict
+
+    def sub_value_handler(self, rule_value: Any) -> Dict[str, Any]:
+        sub_type_name = self.sub_type_name_handler(rule_value)
+        _descriptor = getattr(rule_value, sub_type_name)
+        return self.get_rule_dict(self.get_rule_name_list(_descriptor), _descriptor)
+
+    def sub_type_name_handler(self, rule_value: Any) -> str:
+        sub_type_name = rule_value.ListFields()[0][0].full_name.split(".")[-1]
+        return sub_type_name
+
+    def rule_value_to_field_value_handler(self, field_type_name: str, rule_name: str, rule_value: Any) -> Any:
+        return replace_protobuf_type_to_python_type(rule_value)
+
+
+def gen_field_info_dict_from_field_desc(
+    type_name: str,
+    full_name: str,
+    field: Union[FieldDescriptor, FieldDescriptorProto],
+    protobuf_pkg: str = "",
+) -> FieldInfoTypedDict:
+    """Parse the information for each filed
+
+    :param type_name: field type name
+    :param full_name: field fullname
+    :param field:     message field
+    :param protobuf_pkg: protobuf rule pkg name
+    """
+    field_info_dict: FieldInfoTypedDict = {"extra": {}, "skip": False, "required": False}
+
+    if isinstance(field, FieldDescriptor):
+        field_list = field.GetOptions().ListFields()
+    elif isinstance(field, FieldDescriptorProto):
+        field_list = field.options.ListFields()
+    else:
+        raise RuntimeError(f"Not support type:{field.type}")
+
+    for option_descriptor, option_value in field_list:
+        # filter unwanted Option
+        if protobuf_pkg:
+            if not option_descriptor.full_name.endswith(f"{protobuf_pkg}.rules"):
+                continue
+        elif not option_descriptor.full_name.endswith("validate.rules"):
+            continue
+
+        rule_message: Any = option_value.message
+        if rule_message:
+            if getattr(rule_message, "skip", None):
+                field_info_dict["skip"] = True
+            if getattr(rule_message, "required", None):
+                field_info_dict["required"] = True
+        type_value: Optional[Descriptor] = getattr(option_value, type_name, None)
+        if not type_value:
+            continue
+        if not type_value.ListFields():  # type: ignore
+            type_value = getattr(option_value, "message", None)
+            if not type_value or not type_value.ListFields():  # type: ignore
+                logger.warning(f"{__name__} Can not found {full_name}'s {type_name} from {option_value}")
+
+        field_info_dict.update(
+            ProtobufOptionToFieldInfoWithFieldDesc(type_value, field, type_name, full_name).rule_dict  # type: ignore
+        )
+
+    return field_info_dict
diff --git a/protobuf_to_pydantic/get_desc/from_pb_option/types.py b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/types.py
similarity index 98%
rename from protobuf_to_pydantic/get_desc/from_pb_option/types.py
rename to protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/types.py
index 9efd6dc..e64270f 100644
--- a/protobuf_to_pydantic/get_desc/from_pb_option/types.py
+++ b/protobuf_to_pydantic/field_info_rule/protobuf_option_to_field_info/types.py
@@ -122,7 +122,7 @@ def _validate(
         )
 
 
-column_pydantic_type_dict: Dict[str, Any] = {
+rule_name_pydantic_type_dict: Dict[str, Any] = {
     "email": EmailStr,
     "hostname": HostNameStr,
     "ip": IPvAnyAddress,
diff --git a/protobuf_to_pydantic/types.py b/protobuf_to_pydantic/field_info_rule/types.py
similarity index 94%
rename from protobuf_to_pydantic/types.py
rename to protobuf_to_pydantic/field_info_rule/types.py
index dbe580b..18a617a 100644
--- a/protobuf_to_pydantic/types.py
+++ b/protobuf_to_pydantic/field_info_rule/types.py
@@ -22,6 +22,7 @@ class OneOfTypedDict(TypedDict):
 
 class FieldInfoTypedDict(TypedDict):
     extra: dict
+    json_schema_extra: NotRequired[dict]
     skip: NotRequired[bool]
     enable: NotRequired[bool]
     required: NotRequired[bool]
@@ -50,12 +51,13 @@ class FieldInfoTypedDict(TypedDict):
     unique_items: NotRequired[Optional[bool]]
     multiple_of: NotRequired[Optional[int]]
     regex: NotRequired[Optional[str]]
+    type_: NotRequired[Any]
 
 
-class DescFromOptionTypedDict(TypedDict):
+class MessageOptionTypedDict(TypedDict):
     message: Dict[str, FieldInfoTypedDict]
     one_of: Dict[str, OneOfTypedDict]
-    nested: Dict[str, "DescFromOptionTypedDict"]
+    nested: Dict[str, "MessageOptionTypedDict"]
     metadata: Dict[str, Any]
 
 
diff --git a/protobuf_to_pydantic/gen_model.py b/protobuf_to_pydantic/gen_model.py
index a3a1871..95c9c8e 100644
--- a/protobuf_to_pydantic/gen_model.py
+++ b/protobuf_to_pydantic/gen_model.py
@@ -12,26 +12,32 @@
 from typing_extensions import Annotated, get_origin
 
 from protobuf_to_pydantic import _pydantic_adapter, constant
+from protobuf_to_pydantic.constant import protobuf_common_type_dict
 from protobuf_to_pydantic.customer_validator import check_one_of
-from protobuf_to_pydantic.desc_template import DescTemplate
 from protobuf_to_pydantic.exceptions import WaitingToCompleteException
-from protobuf_to_pydantic.field_param import (
-    FieldParamModel,
-    field_param_dict_handle,
-    field_param_dict_migration_v2_handler,
+from protobuf_to_pydantic.field_info_rule.field_info_param import (
+    FieldInfoParamModel,
+    field_info_param_dict_handle,
+    field_info_param_dict_migration_v2_handler,
 )
-from protobuf_to_pydantic.get_desc import (
-    get_desc_from_p2p,
-    get_desc_from_pgv,
-    get_desc_from_proto_file,
-    get_desc_from_pyi_file,
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.comment import (
+    gen_field_rule_info_dict_from_field_comment_dict,
 )
-from protobuf_to_pydantic.get_desc.from_pb_option.base import field_comment_handler, protobuf_common_type_dict
-from protobuf_to_pydantic.grpc_types import AnyMessage, Descriptor, FieldDescriptor, Message
+from protobuf_to_pydantic.get_message_option import (
+    get_message_option_dict_from_message_with_p2p,
+    get_message_option_dict_from_message_with_pgv,
+    get_message_option_dict_from_proto_file,
+    get_message_option_dict_from_pyi_file,
+)
+from protobuf_to_pydantic.grpc_types import AnyMessage, Descriptor, FieldDescriptor, FieldMask, Message
+from protobuf_to_pydantic.template import Template
 from protobuf_to_pydantic.util import create_pydantic_model
 
 if TYPE_CHECKING:
-    from protobuf_to_pydantic.types import DescFromOptionTypedDict, FieldInfoTypedDict, UseOneOfTypedDict
+    from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict, MessageOptionTypedDict, UseOneOfTypedDict
+
+SKIP_RULE_MESSAGE_SUFFIX = "WithSkipRule"
+ALLOW_ARBITRARY_TYPE = (AnyMessage, FieldMask)
 
 
 def replace_file_name_to_class_name(filename: str) -> str:
@@ -115,13 +121,13 @@ def __init__(
         pydantic_base: Optional[Type["BaseModel"]] = None,
         pydantic_module: Optional[str] = None,
         local_dict: Optional[Dict[str, Any]] = None,
-        desc_template: Optional[Type[DescTemplate]] = None,
+        template: Optional[Type[Template]] = None,
         message_type_dict_by_type_name: Optional[Dict[str, Any]] = None,
         message_default_factory_dict_by_type_name: Optional[Dict[str, Any]] = None,
         create_model_cache: Optional[CREATE_MODEL_CACHE_T] = None,
     ):
         proto_file_name = msg.DESCRIPTOR.file.name  # type: ignore
-        message_field_dict: Dict[str, "DescFromOptionTypedDict"] = {}
+        global_message_option_dict: Dict[str, "MessageOptionTypedDict"] = {}
 
         if proto_file_name.endswith("empty.proto") or parse_msg_desc_method == "ignore":
             pass
@@ -130,7 +136,9 @@ def __init__(
             file_str: str = parse_msg_desc_method
             if not file_str.endswith("/"):
                 file_str += "/"
-            message_field_dict = get_desc_from_proto_file(file_str + proto_file_name, comment_prefix)
+            global_message_option_dict = get_message_option_dict_from_proto_file(
+                file_str + proto_file_name, comment_prefix
+            )
         elif inspect.ismodule(parse_msg_desc_method):
             # get field dict from pyi file
             if getattr(parse_msg_desc_method, msg.__name__, None) is not msg:  # type: ignore
@@ -138,10 +146,10 @@ def __init__(
             pyi_file_name = parse_msg_desc_method.__file__ + "i"  # type: ignore
             if not Path(pyi_file_name).exists():
                 raise RuntimeError(f"Can not found {msg} pyi file")
-            message_field_dict = get_desc_from_pyi_file(pyi_file_name, comment_prefix)
+            global_message_option_dict = get_message_option_dict_from_pyi_file(pyi_file_name, comment_prefix)
         elif parse_msg_desc_method == "PGV":
             # get field dict from pgv
-            message_field_dict = get_desc_from_pgv(message=msg)  # type: ignore
+            global_message_option_dict = get_message_option_dict_from_message_with_pgv(message=msg)  # type: ignore
         elif parse_msg_desc_method is not None:
             raise ValueError(
                 f"parse_msg_desc_method param must be exist path, `ignore` or `PGV`,"
@@ -149,16 +157,16 @@ def __init__(
             )
         else:
             # get field dict from p2p
-            message_field_dict = get_desc_from_p2p(message=msg)  # type: ignore
+            global_message_option_dict = get_message_option_dict_from_message_with_p2p(message=msg)  # type: ignore
 
-        self._parse_msg_desc_method: Optional[str] = parse_msg_desc_method
-        self._field_doc_dict: Dict[str, DescFromOptionTypedDict] = message_field_dict
+        self._parse_msg_desc_method = parse_msg_desc_method
+        self._message_option_dict = global_message_option_dict
         self._default_field = default_field
         self._comment_prefix = comment_prefix
         self._creat_cache: CREATE_MODEL_CACHE_T = create_model_cache or _create_model_cache
         self._pydantic_base: Type["BaseModel"] = pydantic_base or BaseModel
         self._pydantic_module: str = pydantic_module or __name__
-        self._desc_template: DescTemplate = (desc_template or DescTemplate)(local_dict or {}, self._comment_prefix)
+        self._comment_template: Template = (template or Template)(local_dict or {}, self._comment_prefix)
         self._message_type_dict_by_type_name: Dict[str, Any] = (
             message_type_dict_by_type_name or constant.message_name_type_dict
         )
@@ -193,29 +201,31 @@ def _get_field_info_dict_by_full_name(self, full_name: str) -> Optional["FieldIn
         else:
             # TODO Maybe fix the problem that multiple packages have the same message
             message_name, *key_list = split_full_name[1:]  # ignore package name
-        if message_name not in self._field_doc_dict:
+        if message_name not in self._message_option_dict:
             return None
-        desc_dict: "DescFromOptionTypedDict" = self._field_doc_dict[message_name]
-        if desc_dict["metadata"].get("ignore", False):
+        message_option_dict: "MessageOptionTypedDict" = self._message_option_dict[message_name]
+        if message_option_dict["metadata"].get("ignore", False):
             return None
 
         for key in key_list:
-            if key in desc_dict["message"]:
-                return desc_dict["message"][key]
-            elif key in desc_dict["nested"]:
-                desc_dict = desc_dict["nested"][key]
-                if desc_dict["metadata"].get("ignored", False):
+            if key in message_option_dict["message"]:
+                return message_option_dict["message"][key]
+            elif key in message_option_dict["nested"]:
+                message_option_dict = message_option_dict["nested"][key]
+                if message_option_dict["metadata"].get("ignored", False):
                     return None
             else:
                 return None
         return None
 
     def _one_of_handle(self, descriptor: Descriptor) -> Tuple[Dict[str, "UseOneOfTypedDict"], Dict[str, Any]]:
-        desc_dict: "DescFromOptionTypedDict" = self._field_doc_dict.get(descriptor.name, {})  # type: ignore
-        ignore_parse_rule = desc_dict.get("metadata", {}).get("ignored", False)
+        message_option_dict: "MessageOptionTypedDict" = self._message_option_dict.get(
+            descriptor.name, {"message": {}, "one_of": {}, "nested": {}, "metadata": {}}
+        )
+        ignore_parse_rule = message_option_dict.get("metadata", {}).get("ignored", False)
         one_of_desc_dict = {}
         if not ignore_parse_rule:
-            one_of_desc_dict = desc_dict.get("one_of", {})
+            one_of_desc_dict = message_option_dict.get("one_of", {})
 
         one_of_dict: Dict[str, "UseOneOfTypedDict"] = {}
         optional_dict: Dict[str, Any] = {}
@@ -238,25 +248,25 @@ def _one_of_handle(self, descriptor: Descriptor) -> Tuple[Dict[str, "UseOneOfTyp
                 optional_dict[field.full_name] = {"is_proto3_optional": True}
 
         for one_of in descriptor.oneofs:
-            column_name: str = one_of.full_name
-            if column_name in optional_id_set:
+            field_full_name: str = one_of.full_name
+            if field_full_name in optional_id_set:
                 continue
 
-            if column_name not in one_of_dict:
-                one_of_dict[column_name] = {"required": False, "fields": set()}
+            if field_full_name not in one_of_dict:
+                one_of_dict[field_full_name] = {"required": False, "fields": set()}
             # pyi file not include pkg info
-            for found_column_name in [column_name, ".".join(column_name.split(".")[1:])]:
+            for found_column_name in [field_full_name, ".".join(field_full_name.split(".")[1:])]:
                 if found_column_name not in one_of_desc_dict:
                     continue
                 # only PGV or P2P support
-                one_of_dict[column_name]["required"] = one_of_desc_dict[found_column_name].get("required", False)
+                one_of_dict[field_full_name]["required"] = one_of_desc_dict[found_column_name].get("required", False)
                 optional_fields = one_of_desc_dict[found_column_name].get("optional_fields", set())
                 if optional_fields:
                     for field_name in optional_fields:
                         optional_dict[descriptor.full_name + "." + field_name] = {"is_proto3_optional": True}
 
             for _field in one_of.fields:
-                one_of_dict[column_name]["fields"].add(_field.name)
+                one_of_dict[field_full_name]["fields"].add(_field.name)
         return one_of_dict, optional_dict
 
     def _get_pydantic_base(self, config_dict: Dict[str, Any]) -> Type[BaseModel]:
@@ -267,7 +277,7 @@ def _get_pydantic_base(self, config_dict: Dict[str, Any]) -> Type[BaseModel]:
             else:
                 from pydantic import ConfigDict
 
-                _config_dict = {"model_config": ConfigDict(**config_dict)}  # type: ignore[misc]
+                _config_dict = {"model_config": ConfigDict(**config_dict)}  # type: ignore[typeddict-item]
 
             # Changing the configuration of Config by inheritance
             pydantic_base: Type[BaseModel] = type(  # type: ignore
@@ -285,20 +295,12 @@ def get_nested_message_dict_by_message(self, descriptor: Descriptor) -> Dict[str
                 continue
             nested_type: Any = self._parse_msg_to_pydantic_model(descriptor=message)
             nested_message_dict[message.full_name] = nested_type
-            # Facilitate the analysis of `gen code`
-            setattr(nested_type, "_is_nested", True)
-            # It is used to determine whether the field is used for these messages
-            setattr(nested_type, "_is_use", False)
         # enum support
         for enum_type in descriptor.enum_types:
             class_dict: dict = {v.name: v.number for v in enum_type.values}
             class_dict["__doc__"] = ""
             nested_type = IntEnum(enum_type.name, class_dict)  # type: ignore
             nested_message_dict[enum_type.full_name] = nested_type
-            # Facilitate the analysis of `gen code`
-            setattr(nested_type, "_is_nested", True)
-            # It is used to determine whether the field is used for these messages
-            setattr(nested_type, "_is_use", False)
         return nested_message_dict
 
     ####################
@@ -333,32 +335,32 @@ def _protobuf_field_type_is_type_message_handler(self, field_dataclass: FieldDat
             field_dataclass.field_default_factory = dict
         elif protobuf_field.message_type.file.name.startswith("google/protobuf/"):
             module_name = protobuf_field.message_type.file.name.split(".")[0].replace("/", ".") + "_pb2"
-            message_name = protobuf_field.message_type.name
-            type_factory = getattr(importlib.import_module(module_name), message_name)
+            type_factory = getattr(importlib.import_module(module_name), protobuf_field.message_type.name)
             field_dataclass.field_type = type_factory
             field_dataclass.field_default_factory = type_factory
         else:
             # support google.protobuf.Message
-            field_doc_dict: Union[FieldInfoTypedDict, dict] = (
+            field_info_dict: Union[FieldInfoTypedDict, dict] = (
                 self._get_field_info_dict_by_full_name(field_dataclass.protobuf_field.full_name) or {}
             )
-            skip_validate_rule = field_doc_dict.get("skip", False)
+            skip_validate_rule = field_info_dict.get("skip", False)
             full_name = protobuf_field.message_type.full_name
-            if protobuf_field.message_type.full_name in field_dataclass.nested_message_dict:
-                if skip_validate_rule:
+            if full_name in field_dataclass.nested_message_dict:
+                _cache_full_name = full_name + SKIP_RULE_MESSAGE_SUFFIX if skip_validate_rule else full_name
+                if _cache_full_name not in field_dataclass.nested_message_dict:
                     # found and gen new message, finally, register to nested_message_dict
                     nested_message = [i for i in field_dataclass.descriptor.nested_types if i.full_name == full_name][0]
                     nested_type: Any = self._parse_msg_to_pydantic_model(
                         descriptor=nested_message,
-                        class_name=protobuf_field.message_type.name + "OnlyUseSkipRule",
+                        class_name=protobuf_field.message_type.name + SKIP_RULE_MESSAGE_SUFFIX,
                         skip_validate_rule=skip_validate_rule,
                     )
-                    field_dataclass.nested_message_dict[full_name + "OnlyUseSkipRule"] = nested_type
-                    setattr(nested_type, "_is_nested", True)
-                    field_dataclass.field_type = nested_type
+                    field_dataclass.nested_message_dict[_cache_full_name] = nested_type
+                    field_dataclass.field_type = field_dataclass.nested_message_dict[_cache_full_name]
                 else:
                     field_dataclass.field_type = field_dataclass.nested_message_dict[full_name]
-                setattr(field_dataclass.field_type, "_is_use", True)
+                # Facilitate the analysis of `gen code`
+                setattr(field_dataclass.field_type, "_is_nested", True)
             else:
                 # Python Protobuf does not solve the namespace problem of modules,
                 # so there is no uniform cross-module reference
@@ -380,7 +382,6 @@ def _protobuf_field_type_is_type_message_handler(self, field_dataclass: FieldDat
                 else:
                     # if self-referencing, need use Python type hints postponed annotations
                     field_dataclass.field_type = f'"{_class_name}"'
-                    use_class_name = _class_name if not skip_validate_rule else _class_name + "OnlyUseSkipRule"
                     if (
                         skip_validate_rule
                         or protobuf_field.message_type.full_name != field_dataclass.descriptor.full_name
@@ -388,7 +389,7 @@ def _protobuf_field_type_is_type_message_handler(self, field_dataclass: FieldDat
                         try:
                             field_dataclass.field_type = self._parse_msg_to_pydantic_model(
                                 descriptor=protobuf_field.message_type,
-                                class_name=use_class_name,
+                                class_name=_class_name if not skip_validate_rule else _class_name + "OnlyUseSkipRule",
                                 skip_validate_rule=skip_validate_rule,
                             )
                         except WaitingToCompleteException:
@@ -401,7 +402,8 @@ def _protobuf_field_type_is_type_enum_handler(self, field_dataclass: FieldDataCl
         field_dataclass.field_type_name = "enum"
         if protobuf_field.enum_type.full_name in field_dataclass.nested_message_dict:
             field_dataclass.field_type = field_dataclass.nested_message_dict[protobuf_field.enum_type.full_name]
-            setattr(field_dataclass.field_type, "_is_use", True)
+            # Facilitate the analysis of `gen code`
+            setattr(field_dataclass.field_type, "_is_nested", True)
         else:
             enum_class_dict = {v.name: v.number for v in protobuf_field.enum_type.values}
             _class_name = protobuf_field.enum_type.name
@@ -428,75 +430,76 @@ def _protobuf_field_lable_is_label_repeated_handler(self, field_dataclass: Field
                 field_dataclass.field_default = _pydantic_adapter.PydanticUndefined
 
     def _gen_field_info(self, field_dataclass: FieldDataClass, skip_validate_rule: bool) -> Optional[FieldInfo]:
-        field = self._default_field
-        field_doc_dict = self._get_field_info_dict_by_full_name(field_dataclass.protobuf_field.full_name)
+        field_class = self._default_field
+        field_info_dict = self._get_field_info_dict_by_full_name(field_dataclass.protobuf_field.full_name)
 
-        if field_doc_dict is not None and not skip_validate_rule:
+        if field_info_dict is not None and not skip_validate_rule:
             if self._parse_msg_desc_method != "PGV":
                 # pgv method not support template var
-                field_doc_dict = self._desc_template.handle_template_var(field_doc_dict)
+                field_info_dict = self._comment_template.handle_template_var(field_info_dict)
             if not (self._parse_msg_desc_method is None or self._parse_msg_desc_method == "PGV"):
                 # comment rule need handler
-                field_doc_dict = field_comment_handler(
-                    field_doc_dict,  # type:ignore[arg-type]
+                field_info_dict = gen_field_rule_info_dict_from_field_comment_dict(
+                    field_info_dict,  # type:ignore[arg-type]
                     field=field_dataclass.protobuf_field,
                     type_name=field_dataclass.field_type_name,
                     full_name=field_dataclass.protobuf_field.full_name,
                 )
-            field_param_dict: dict = FieldParamModel(**field_doc_dict).dict()  # type: ignore
+
+            raw_validator_dict = field_info_dict.get("validator", {})
+            field_info_dict: FieldInfoTypedDict = FieldInfoParamModel(**field_info_dict).dict()  # type: ignore
+            field_info_dict.pop("skip")
             # Nested types do not include the `enable`, `field` and `validator`  attributes
-            if not field_param_dict.pop("enable"):
+            if not field_info_dict.pop("enable"):
                 return None
-            _field = field_param_dict.pop("field")
+            _field = field_info_dict.pop("field")
             if _field:
-                field = _field
-            validator_dict = field_param_dict.pop("validator")
+                field_class = _field
+            validator_dict = field_info_dict.pop("validator")
             if validator_dict:
-                if _pydantic_adapter.is_v1:
-                    field_dataclass.validators.update(validator_dict)
-                else:
-                    # In Pydantic v2:
-                    #     field_doc_dict["validatos"] = {
-                    #       'not_in_test_any_not_in_validator': PydanticDescriptorProxy(
-                    #             wrapped=<classmethod object at 0x7f28943c8128>,
-                    #             decorator_info=FieldValidatorDecoratorInfo(fields=('not_in_test',),
-                    #             mode='after', check_fields=None),
-                    #             shim=None
-                    #        )
-                    #     }
-                    #  But validator_dict output:
-                    #   {
-                    #       'not_in_test_any_not_in_validator': {
-                    #           'wrapped': <classmethod object at 0x7f28943c8128>,
-                    #           'decorator_info': {
-                    #               'fields': ('not_in_test',),
-                    #               'mode': 'after',
-                    #               'check_fields': None
-                    #            },
-                    #           'shim': None
-                    #       }
-                    #   }
-                    field_dataclass.validators.update(field_doc_dict["validator"])  # type: ignore[index]
+                # In Pydantic v2:
+                #     field_doc_dict["validatos"] = {
+                #       'not_in_test_any_not_in_validator': PydanticDescriptorProxy(
+                #             wrapped=<classmethod object at 0x7f28943c8128>,
+                #             decorator_info=FieldValidatorDecoratorInfo(fields=('not_in_test',),
+                #             mode='after', check_fields=None),
+                #             shim=None
+                #        )
+                #     }
+                #  But validator_dict output:
+                #   {
+                #       'not_in_test_any_not_in_validator': {
+                #           'wrapped': <classmethod object at 0x7f28943c8128>,
+                #           'decorator_info': {
+                #               'fields': ('not_in_test',),
+                #               'mode': 'after',
+                #               'check_fields': None
+                #            },
+                #           'shim': None
+                #       }
+                #   }
+                field_dataclass.validators.update(raw_validator_dict)
 
             # Unified field parameter handling
-            field_param_dict_handle(
-                field_param_dict,
+            field_info_param_dict_handle(
+                field_info_dict,  # type: ignore[arg-type]
                 field_dataclass.field_default,
                 field_dataclass.field_default_factory,
                 field_dataclass.field_type,
             )
 
             # Type will change in the unified processing logic
-            field_type = field_param_dict.pop("type_", field_dataclass.field_type)
-            map_type_dict = field_param_dict.pop("map_type", {})
+            field_type = field_info_dict.pop("type_", field_dataclass.field_type)
+            map_type_dict = field_info_dict.pop("map_type", {})
             if field_type:
                 field_dataclass.field_type = field_type
             elif map_type_dict and field_dataclass.field_type._name == "Dict":
                 new_args_list: List = list(field_dataclass.field_type.__args__)
                 for index, k_v_column in enumerate(["keys", "values"]):
-                    raw_k_v_type = new_args_list[index]
                     if k_v_column not in map_type_dict:
                         continue
+
+                    raw_k_v_type = new_args_list[index]
                     new_k_v_type = map_type_dict[k_v_column]
 
                     if (
@@ -507,13 +510,19 @@ def _gen_field_info(self, field_dataclass: FieldDataClass, skip_validate_rule: b
                         new_args_list[index] = new_k_v_type
                 field_dataclass.field_type = Dict[tuple(new_args_list)]  # type: ignore
         else:
-            field_param_dict = {
+            field_info_dict = {
                 "default": field_dataclass.field_default,
                 "default_factory": field_dataclass.field_default_factory,
+                "extra": {},
             }
         if not _pydantic_adapter.is_v1:
-            field_param_dict_migration_v2_handler(field_param_dict)
-        return field(**field_param_dict)  # type: ignore
+            field_info_param_dict_migration_v2_handler(field_info_dict)  # type: ignore[arg-type]
+
+        for remove_key in ("extra", "json_schema_extra"):
+            if not field_info_dict.get(remove_key, True):  # type: ignore[misc]
+                field_info_dict.pop(remove_key)  # type: ignore[misc]
+
+        return field_class(**field_info_dict)  # type: ignore
 
     def _parse_msg_to_pydantic_model(
         self, *, descriptor: Descriptor, class_name: str = "", skip_validate_rule: bool = False
@@ -559,14 +568,15 @@ def _parse_msg_to_pydantic_model(
             field_info = self._gen_field_info(field_dataclass, skip_validate_rule)
             if not field_info:
                 continue
-            if optional_dict.get(protobuf_field.full_name, {}).get("is_proto3_optional", False):
-                field_dataclass.field_type = Optional[field_dataclass.field_type]
-                if field_dataclass.field_default is _pydantic_adapter.PydanticUndefined:
-                    field_dataclass.field_default = None
 
+            is_proto3_optional = optional_dict.get(protobuf_field.full_name, {}).get("is_proto3_optional", False)
+            if is_proto3_optional:
+                field_dataclass.field_type = Optional[field_dataclass.field_type]
+                if field_info.default is _pydantic_adapter.PydanticUndefined and field_info.default_factory is None:
+                    field_info.default = None
             annotation_dict[field_dataclass.field_name] = (field_dataclass.field_type, field_info)
 
-            if field_dataclass.field_type in (AnyMessage,) and not _pydantic_adapter.get_model_config_value(
+            if field_dataclass.field_type in ALLOW_ARBITRARY_TYPE and not _pydantic_adapter.get_model_config_value(
                 self._pydantic_base, "arbitrary_types_allowed"
             ):
                 pydantic_model_config_dict["arbitrary_types_allowed"] = True
@@ -602,7 +612,7 @@ def _parse_msg_to_pydantic_model(
             one_of_dict=one_of_dict,
             base_model=self._pydantic_base,
             # Facilitate the analysis of `gen code`
-            nested_message_dict={k: v for k, v in nested_message_dict.items() if getattr(v, "_is_use", False)},
+            nested_message_dict={k: v for k, v in nested_message_dict.items() if getattr(v, "_is_nested", False)},
             validators=validators,
         )
         setattr(pydantic_model, "_one_of_dict", one_of_dict)
@@ -618,7 +628,7 @@ def msg_to_pydantic_model(
     local_dict: Optional[Dict[str, Any]] = None,
     pydantic_base: Optional[Type["BaseModel"]] = None,
     pydantic_module: Optional[str] = None,
-    desc_template: Optional[Type[DescTemplate]] = None,
+    template: Optional[Type[Template]] = None,
     message_type_dict_by_type_name: Optional[Dict[str, Any]] = None,
     message_default_factory_dict_by_type_name: Optional[Dict[str, Any]] = None,
     create_model_cache: Optional[CREATE_MODEL_CACHE_T] = None,
@@ -642,7 +652,7 @@ def msg_to_pydantic_model(
     :param local_dict: The variables corresponding to the p2p@local template
     :param pydantic_base: custom pydantic.BaseModel
     :param pydantic_module: custom create model's module name
-    :param desc_template: DescTemplate object, which can extend and modify template adaptation rules through inheritance
+    :param template: DescTemplate object, which can extend and modify template adaptation rules through inheritance
     :param message_type_dict_by_type_name: Define the Python type mapping corresponding to each Protobuf Type
     :param message_default_factory_dict_by_type_name: Define the default_factory corresponding to each Protobuf Type
     :param create_model_cache: Cache the generated model
@@ -655,7 +665,7 @@ def msg_to_pydantic_model(
         local_dict=local_dict,
         pydantic_module=pydantic_module,
         pydantic_base=pydantic_base,
-        desc_template=desc_template,
+        template=template,
         message_type_dict_by_type_name=message_type_dict_by_type_name,
         message_default_factory_dict_by_type_name=message_default_factory_dict_by_type_name,
         create_model_cache=create_model_cache,
diff --git a/protobuf_to_pydantic/get_desc/__init__.py b/protobuf_to_pydantic/get_desc/__init__.py
deleted file mode 100644
index b776887..0000000
--- a/protobuf_to_pydantic/get_desc/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from .from_pb_option import get_desc_from_p2p, get_desc_from_pgv
-from .from_proto_file import get_desc_from_proto_file
-from .from_pyi_file import get_desc_from_pyi_file
diff --git a/protobuf_to_pydantic/get_desc/from_pb_option/__init__.py b/protobuf_to_pydantic/get_desc/from_pb_option/__init__.py
deleted file mode 100644
index 7795d0b..0000000
--- a/protobuf_to_pydantic/get_desc/from_pb_option/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .from_p2p import get_desc_from_p2p
-from .from_pgv import get_desc_from_pgv
-
-__all__ = ["get_desc_from_pgv", "get_desc_from_p2p"]
diff --git a/protobuf_to_pydantic/get_desc/from_pb_option/base.py b/protobuf_to_pydantic/get_desc/from_pb_option/base.py
deleted file mode 100644
index 7840ccb..0000000
--- a/protobuf_to_pydantic/get_desc/from_pb_option/base.py
+++ /dev/null
@@ -1,625 +0,0 @@
-import inspect
-import logging
-from datetime import datetime, timedelta
-from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union
-
-from protobuf_to_pydantic import _pydantic_adapter
-from protobuf_to_pydantic.customer_con_type import (
-    conbytes,
-    confloat,
-    conint,
-    conlist,
-    constr,
-    contimedelta,
-    contimestamp,
-)
-from protobuf_to_pydantic.customer_validator import validate_validator_dict
-from protobuf_to_pydantic.grpc_types import Descriptor, FieldDescriptor, FieldDescriptorProto, Message, Timestamp
-from protobuf_to_pydantic.types import DescFromOptionTypedDict, FieldInfoTypedDict, OneOfTypedDict
-from protobuf_to_pydantic.util import replace_protobuf_type_to_python_type
-
-from .types import column_pydantic_type_dict
-
-_logger: logging.Logger = logging.getLogger(__name__)
-
-protobuf_common_type_dict: Dict[Any, str] = {
-    FieldDescriptor.TYPE_DOUBLE: "double",
-    FieldDescriptor.TYPE_FLOAT: "float",
-    FieldDescriptor.TYPE_INT64: "int64",
-    FieldDescriptor.TYPE_UINT64: "uint64",
-    FieldDescriptor.TYPE_INT32: "int32",
-    FieldDescriptor.TYPE_FIXED64: "fixed64",
-    FieldDescriptor.TYPE_FIXED32: "fixed32",
-    FieldDescriptor.TYPE_BOOL: "bool",
-    FieldDescriptor.TYPE_STRING: "string",
-    FieldDescriptor.TYPE_BYTES: "bytes",
-    FieldDescriptor.TYPE_UINT32: "uint32",
-    FieldDescriptor.TYPE_ENUM: "enum",
-    FieldDescriptor.TYPE_SFIXED32: "sfixed32",
-    FieldDescriptor.TYPE_SFIXED64: "sfixed64",
-    FieldDescriptor.TYPE_SINT32: "sint32",
-    FieldDescriptor.TYPE_SINT64: "sint64",
-}
-
-type_not_support_dict: Dict[Any, Set[str]] = {
-    FieldDescriptor.TYPE_BYTES: {"pattern"},
-    FieldDescriptor.TYPE_STRING: {"min_bytes", "max_bytes", "well_known_regex", "strict"},
-    "Any": {"ignore_empty", "defined_only", "no_sparse"},
-}
-
-pgv_column_to_pydantic_dict: Dict[str, str] = {
-    "min_len": "min_length",
-    "min_bytes": "min_length",
-    "max_len": "max_length",
-    "max_bytes": "max_length",
-    "pattern": "regex",
-    "unique": "unique_items",
-    "gte": "ge",
-    "lte": "le",
-    "len_bytes": "len",
-    "miss_default": "required",
-}
-
-
-def _has_raw_message_field(column: str, message: Message) -> bool:
-    """Determine whether the field held by the Message is a field defined by Protobuf"""
-    if column.startswith("_"):
-        return False
-    if getattr(Message, column, None):
-        return False
-    try:
-        if not message.HasField(column):
-            return False
-    except ValueError:
-        if not getattr(message, column, None) or column[0].lower() != column[0]:
-            return False
-    return True
-
-
-def get_type_hints_from_type_name(type_name: str) -> Optional[Type]:
-    if type_name == "string":
-        return str
-    elif "double" in type_name or "float" in type_name:
-        return float
-    elif "int" in type_name:
-        return int
-    elif type_name == "duration":
-        return timedelta
-    elif type_name == "timestamp":
-        return datetime
-    elif type_name == "bytes":
-        return bytes
-    else:
-        return None
-
-
-def get_con_type_func_from_type_name(type_name: str) -> Optional[Callable]:
-    if type_name == "string":
-        return constr
-    elif "double" in type_name or "float" in type_name:
-        return confloat
-    elif "int" in type_name:
-        return conint
-    elif type_name == "duration":
-        return contimedelta
-    elif type_name == "timestamp":
-        return contimestamp
-    elif type_name == "bytes":
-        return conbytes
-    else:
-        return None
-
-
-def field_dict_handler(
-    field_dict: Dict[str, Any],
-    *,
-    field_name: str,
-    field_type: int,
-    type_name: str,
-    full_name: str,
-    sub_value_handler: Callable[[Any], Dict[str, Any]],
-    sub_type_name_handler: Callable[[Any], str],
-    rule_value_to_field_value_handler: Callable[[str, str, Any], str],
-    value_type_conversion_handler: Optional[Callable[[str, str, Any], Tuple[bool, Any]]] = None,
-) -> FieldInfoTypedDict:
-    """
-    Adapt some Field verification information to convert it into verification information that is compatible with
-     Protobuf's special type of pydantic
-    """
-    field_info_type_dict: FieldInfoTypedDict = {"extra": {}, "skip": False}
-    for column, column_value in field_dict.items():
-        if column in type_not_support_dict.get(field_type, type_not_support_dict["Any"]):
-            # Exclude unsupported fields
-            rule_name = column
-            if field_type in protobuf_common_type_dict:
-                rule_name = f"{protobuf_common_type_dict[field_type]}.{rule_name}"
-            elif field_type == 1:
-                rule_name = f"Message.{rule_name}"
-
-            msg: str = f"{__name__} not support `{rule_name}` rule."
-            if full_name:
-                msg = msg + f"(field:{full_name})"
-            _logger.warning(msg)
-            continue
-        if value_type_conversion_handler:
-            is_change, new_column_value = value_type_conversion_handler(type_name, column, column_value)
-            if is_change:
-                column_value = new_column_value
-        if column in pgv_column_to_pydantic_dict:
-            # Field Conversion
-            column = pgv_column_to_pydantic_dict[column]
-
-        if type_name in ("duration", "any", "timestamp", "map") and column in (
-            "lt",
-            "le",
-            "gt",
-            "ge",
-            "const",
-            "in",
-            "not_in",
-            "lt_now",
-            "gt_now",
-            "within",
-            "min_pairs",
-            "max_pairs",
-        ):
-            # The verification of these parameters is handed over to the validator,
-            # see protobuf_to_pydantic/customer_validator for details
-
-            # Types of priority treatment for special cases
-            if "validator" not in field_info_type_dict:
-                field_info_type_dict["validator"] = {}
-
-            _column: str = f"{type_name}_{column}"
-            field_info_type_dict["extra"][_column] = rule_value_to_field_value_handler(type_name, column, column_value)
-            field_info_type_dict["validator"][f"{field_name}_{_column}_validator"] = _pydantic_adapter.field_validator(
-                field_name, allow_reuse=True
-            )(validate_validator_dict[f"{_column}_validator"])
-            continue
-        elif column in ("in", "not_in", "len", "prefix", "suffix", "contains", "not_contains"):
-            # The verification of these parameters is handed over to the validator,
-            # see protobuf_to_pydantic/customer_validator for details
-
-            # Compatible with PGV attributes that are not supported by pydantic
-            if "validator" not in field_info_type_dict:
-                field_info_type_dict["validator"] = {}
-            _column = column + "_" if column in ("in",) else column
-            field_info_type_dict["extra"][_column] = rule_value_to_field_value_handler(type_name, column, column_value)
-            field_info_type_dict["validator"][f"{field_name}_{column}_validator"] = _pydantic_adapter.field_validator(
-                field_name, allow_reuse=True
-            )(validate_validator_dict[f"{column}_validator"])
-            continue
-        elif column in column_pydantic_type_dict:
-            # Support some built-in type judgments of PGV
-            field_info_type_dict["type"] = column_pydantic_type_dict[column]
-            continue
-        elif column in ("keys", "values"):
-            # Parse the field data of the key and value in the map
-            type_name = sub_type_name_handler(column_value)
-            # Nested types are supported via like constr
-
-            # Generate information corresponding to the nested type
-            sub_dict = field_dict_handler(
-                sub_value_handler(column_value),
-                field_name=field_name,
-                field_type=field_type,
-                type_name=type_name,
-                full_name=full_name,
-                sub_value_handler=sub_value_handler,
-                sub_type_name_handler=sub_type_name_handler,
-                rule_value_to_field_value_handler=rule_value_to_field_value_handler,
-            )
-            con_type = get_con_type_func_from_type_name(type_name)
-            if not con_type:
-                # TODO nested message
-                _logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
-                continue
-            if "map_type" not in field_info_type_dict:
-                field_info_type_dict["map_type"] = {}
-            con_type_param_dict: dict = {}
-            for _key in inspect.signature(con_type).parameters.keys():
-                param_value = sub_dict.get(_key, None)  # type: ignore
-                if param_value is not None:
-                    con_type_param_dict[_key] = param_value
-                elif "extra" in sub_dict:
-                    if sub_dict["extra"].get(_key, None) is not None:
-                        con_type_param_dict[_key] = sub_dict["extra"][_key]
-
-            field_info_type_dict["map_type"][column] = con_type(**con_type_param_dict)
-            # if _pydantic_adapter.is_v1:
-            #     con_type = get_con_type_func_from_type_name(type_name)
-            #     if not con_type:
-            #         # TODO nested message
-            #         _logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
-            #         continue
-            #     if "map_type" not in field_info_type_dict:
-            #         field_info_type_dict["map_type"] = {}
-            #     con_type_param_dict: dict = {}
-            #     for _key in inspect.signature(con_type).parameters.keys():
-            #         param_value = sub_dict.get(_key, None)  # type: ignore
-            #         if param_value is not None:
-            #             con_type_param_dict[_key] = param_value
-            #         elif "extra" in sub_dict:
-            #             if sub_dict["extra"].get(_key, None) is not None:
-            #                 con_type_param_dict[_key] = sub_dict["extra"][_key]
-            #
-            #     field_info_type_dict["map_type"][column] = con_type(**con_type_param_dict)
-            # else:
-            #     _type = get_type_hints_from_type_name(type_name)
-            #     if not _type:
-            #         # TODO nested message
-            #         _logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
-            #         continue
-            #     if "map_type" not in field_info_type_dict:
-            #         field_info_type_dict["map_type"] = {}
-            #
-            #     from pydantic import Field
-            #
-            #     with_validator_param_field = Field(**sub_dict)
-            #     if not with_validator_param_field.metadata:
-            #         field_info_type_dict["map_type"][column] = _type
-            #     else:
-            #         field_info_type_dict["map_type"][column] = Annotated.__class_getitem__(
-            #             (_type, *with_validator_param_field.metadata)
-            #         )
-            # TODO extra handler
-            #
-            # con_type_param_dict: dict = {}
-            # for _key in inspect.signature(con_type).parameters.keys():
-            #     param_value = sub_dict.get(_key, None)  # type: ignore
-            #     if param_value is not None:
-            #         con_type_param_dict[_key] = param_value
-            #     elif "extra" in sub_dict:
-            #         if sub_dict["extra"].get(_key, None) is not None:
-            #             con_type_param_dict[_key] = sub_dict["extra"][_key]
-            #
-            # field_info_type_dict["map_type"][column] = con_type(**con_type_param_dict)
-        elif column == "items":
-            # Process array data
-            type_name = sub_type_name_handler(column_value)
-            # Nested types are supported via like constr
-            # TODO pydantic v2
-            con_type = get_con_type_func_from_type_name(type_name)
-            # if _pydantic_adapter.is_v1:
-            #     con_type = get_con_type_func_from_type_name(type_name)
-            # else:
-            #     con_type = get_type_hints_from_type_name(type_name)
-            if not con_type:
-                # TODO nested message
-                _logger.warning(f"{__name__} not support sub type `{type_name}`, please reset {full_name}")
-                field_info_type_dict["type"] = List
-                continue
-            # sub_dict = {"extra": {}, "type": con_type, "skip": False}
-            sub_dict = field_dict_handler(
-                sub_value_handler(column_value),
-                field_name=field_name,
-                field_type=field_type,
-                type_name=type_name,
-                full_name=full_name,
-                sub_value_handler=sub_value_handler,
-                sub_type_name_handler=sub_type_name_handler,
-                rule_value_to_field_value_handler=rule_value_to_field_value_handler,
-            )
-            if "type" not in sub_dict:
-                sub_dict["type"] = con_type
-
-            field_info_type_dict["type"] = conlist
-            field_info_type_dict["sub"] = sub_dict
-
-        field_info_type_dict[column] = column_value  # type: ignore
-    return field_info_type_dict
-
-
-def field_comment_handler(  # noqa: C901
-    field_dict: Dict[str, Any],
-    field: Union[FieldDescriptor, FieldDescriptorProto],
-    type_name: str,
-    full_name: str,
-) -> FieldInfoTypedDict:
-    """Parse the data of option and store it in dict.
-    Since array and map are supported, the complexity is relatively high
-
-    The field names used by validator need to be prefixed with type_name, such as timestamp_gt,
-    while the built-in validation of Pydantic V2 does not require type_name prefix, such as gt
-    """
-
-    def _duration_handler(_value: Any) -> Optional[timedelta]:
-        if isinstance(_value, timedelta):
-            return _value
-        elif not isinstance(_value, dict):
-            return _value
-        seconds = _value.get("seconds", 0)
-        nanos = _value.get("nanos", 0)
-        if nanos:
-            nanos = nanos / 1000
-        if not seconds and not nanos:
-            return None
-        return timedelta(seconds=seconds, microseconds=nanos)
-
-    def sub_value_handler(column_value: Any) -> Dict[str, Any]:
-        sub_type_name = sub_type_name_handler(column_value)
-        return column_value[sub_type_name]
-
-    def sub_type_name_handler(column_value: Any) -> str:
-        sub_type_name = list(column_value.keys())[0]
-        return sub_type_name
-
-    def value_type_conversion_handler(column_type_name: str, column_name: str, column_value: Any) -> Tuple[bool, Any]:
-        if type_name in ("double", "float") and isinstance(column_value, (float, int)):
-            return True, float(column_value)
-        elif type_name == "bytes" and isinstance(column_value, str):
-            return True, column_value.encode("utf-8")
-        elif isinstance(column_value, list):
-            new_value = []
-            is_change: bool = False
-            for i in column_value:
-                _is_change, i = value_type_conversion_handler(column_type_name, column_name, i)
-                new_value.append(i)
-                if _is_change:
-                    is_change = _is_change
-            if is_change:
-                return is_change, new_value
-            return is_change, column_value
-        elif column_name not in (
-            "lt",
-            "le",
-            "gt",
-            "ge",
-            "const",
-            "in",
-            "not_in",
-            "lt_now",
-            "gt_now",
-            "within",
-            "min_pairs",
-            "max_pairs",
-        ):
-            if type_name == "duration" and isinstance(column_value, dict):
-                new_column_value = _duration_handler(column_value)
-                if new_column_value:
-                    return True, new_column_value
-                return False, column_value
-            elif type_name == "timestamp" and isinstance(column_value, dict):
-                if "seconds" in column_value or "nanos" in column_value:
-                    return True, Timestamp(**column_value)
-                else:
-                    return False, column_value
-        return False, column_value
-
-    def rule_value_to_field_value_handler(column_type_name: str, column_name: str, column_value: Any) -> Any:
-        if isinstance(column_value, list):
-            return [rule_value_to_field_value_handler(column_type_name, column_name, i) for i in column_value]
-        elif column_type_name == "duration":
-            return _duration_handler(column_value)
-        elif column_type_name == "timestamp":
-            if column_name in ("const", "gt", "lt", "ge", "le") and isinstance(column_value, dict):
-                return Timestamp(**column_value)
-            elif column_name in ("within",):
-                return _duration_handler(column_value)
-        return column_value
-
-    return field_dict_handler(
-        field_dict,
-        field_name=field.name,
-        field_type=field.type,
-        type_name=type_name,
-        full_name=full_name,
-        sub_value_handler=sub_value_handler,
-        sub_type_name_handler=sub_type_name_handler,
-        rule_value_to_field_value_handler=rule_value_to_field_value_handler,
-        value_type_conversion_handler=value_type_conversion_handler,
-    )
-
-
-def option_descriptor_to_desc_dict(
-    option_descriptor: Union[Descriptor, FieldDescriptor],
-    field: Union[FieldDescriptor, FieldDescriptorProto],
-    type_name: str,
-    full_name: str,
-) -> FieldInfoTypedDict:
-    """Parse the data of option and store it in dict.
-    Since array and map are supported, the complexity is relatively high
-
-    The field names used by validator need to be prefixed with type_name, such as timestamp_gt,
-    while the built-in validation of Pydantic V2 does not require type_name prefix, such as gt
-    """
-
-    def get_column_list(column_descriptor: Union[Descriptor, FieldDescriptor]) -> List[str]:
-        if hasattr(column_descriptor, "ListFields"):
-            column_list = [column[0].name for column in column_descriptor.ListFields()]  # type: ignore
-        else:
-            column_list = [
-                column
-                for column in column_descriptor.__dir__()
-                if _has_raw_message_field(column, column_descriptor)  # type: ignore
-            ]
-        return column_list
-
-    def get_field_dict(column_list: List[str], field_descriptor: Union[Descriptor, FieldDescriptor]) -> Dict[str, Any]:
-        field_dict = {}
-        for column in column_list:
-            value = getattr(field_descriptor, column)
-            field_dict[column] = value
-        return field_dict
-
-    def sub_value_handler(column_value: Any) -> Dict[str, Any]:
-        sub_type_name = sub_type_name_handler(column_value)
-        _descriptor = getattr(column_value, sub_type_name)
-        return get_field_dict(get_column_list(_descriptor), _descriptor)
-
-    def sub_type_name_handler(column_value: Any) -> str:
-        sub_type_name = column_value.ListFields()[0][0].full_name.split(".")[-1]
-        return sub_type_name
-
-    def rule_value_to_field_value_handler(column_type_name: str, column_name: str, column_value: Any) -> Any:
-        return replace_protobuf_type_to_python_type(column_value)
-
-    # print(get_column_list(option_descriptor), file=sys.stderr)
-    # print(get_field_dict(get_column_list(option_descriptor), option_descriptor), file=sys.stderr)
-    return field_dict_handler(
-        get_field_dict(get_column_list(option_descriptor), option_descriptor),
-        field_name=field.name,
-        field_type=field.type,
-        type_name=type_name,
-        full_name=full_name,
-        sub_value_handler=sub_value_handler,
-        sub_type_name_handler=sub_type_name_handler,
-        rule_value_to_field_value_handler=rule_value_to_field_value_handler,
-    )
-
-
-def field_option_handle(
-    type_name: str,
-    full_name: str,
-    field: Union[FieldDescriptor, FieldDescriptorProto],
-    protobuf_pkg: str = "",
-) -> FieldInfoTypedDict:
-    """Parse the information for each filed"""
-    field_dict: FieldInfoTypedDict = {"extra": {}, "skip": False}
-    required: bool = False
-    skip: bool = False
-    if isinstance(field, FieldDescriptor):
-        field_list = field.GetOptions().ListFields()
-    elif isinstance(field, FieldDescriptorProto):
-        field_list = field.options.ListFields()
-    else:
-        raise RuntimeError(f"Not support type:{field.type}")
-    for option_descriptor, option_value in field_list:
-        # filter unwanted Option
-        if protobuf_pkg:
-            if not option_descriptor.full_name.endswith(f"{protobuf_pkg}.rules"):
-                continue
-        elif not option_descriptor.full_name.endswith("validate.rules"):
-            continue
-
-        rule_message: Any = option_value.message
-        if rule_message:
-            if getattr(rule_message, "skip", None):
-                skip = True
-            if getattr(rule_message, "required", None):
-                required = True
-        type_value: Optional[Descriptor] = getattr(option_value, type_name, None)
-        if not type_value:
-            continue
-        if not type_value.ListFields():  # type: ignore
-            type_value = getattr(option_value, "message", None)
-            if not type_value or not type_value.ListFields():  # type: ignore
-                _logger.warning(f"{__name__} Can not found {full_name}'s {type_name} from {option_value}")
-
-        field_dict.update(
-            option_descriptor_to_desc_dict(type_value, field, type_name, full_name)  # type:ignore
-        )
-
-    if required:
-        field_dict["required"] = required
-    if skip:
-        field_dict["skip"] = skip
-    return field_dict
-
-
-_global_desc_dict: Dict[str, Dict[str, DescFromOptionTypedDict]] = {}
-
-
-class ParseFromPbOption(object):
-    protobuf_pkg: str  # Extend the package name of protobuf
-
-    def __init__(self, message: Type[Message]):
-        self.message = message
-        self._msg_desc_dict: Dict[str, DescFromOptionTypedDict] = {}
-        if self.protobuf_pkg not in _global_desc_dict:
-            _global_desc_dict[self.protobuf_pkg] = self._msg_desc_dict
-        else:
-            self._msg_desc_dict = _global_desc_dict[self.protobuf_pkg]
-
-    def parse(self) -> Dict[str, DescFromOptionTypedDict]:
-        descriptor: Descriptor = self.message.DESCRIPTOR
-        if descriptor.name in self._msg_desc_dict:
-            return self._msg_desc_dict
-
-        self._msg_desc_dict[descriptor.name] = self.get_desc_from_options(descriptor)
-        return self._msg_desc_dict
-
-    def get_desc_from_options(self, descriptor: Descriptor) -> DescFromOptionTypedDict:  # noqa:C901
-        """Extract the information of each field through the Options of Protobuf Message"""
-        if descriptor.name in self._msg_desc_dict:
-            return self._msg_desc_dict[descriptor.name]
-        message_field_dict: DescFromOptionTypedDict = {"message": {}, "one_of": {}, "nested": {}, "metadata": {}}
-
-        # Options for processing Messages
-        for option_descriptor, option_value in descriptor.GetOptions().ListFields():
-            # If parsing is disabled, Options will not continue to be parsed, and empty information will be set
-            if (option_descriptor.full_name == f"{self.protobuf_pkg}.disabled" and option_value) or (
-                option_descriptor.full_name == f"{self.protobuf_pkg}.ignored" and option_value
-            ):
-                return message_field_dict
-        # Handle one_ofs of Message
-        one_of_dict: Dict[str, OneOfTypedDict] = {}
-        for one_of in descriptor.oneofs:
-            required: bool = False
-            optional_fields: Set[str] = set()
-            for one_of_descriptor, one_ov_value in one_of.GetOptions().ListFields():
-                if one_of_descriptor.full_name == f"{self.protobuf_pkg}.required":
-                    required = True
-                    # if one_of.full_name in self._msg_desc_dict:
-                    #     continue
-                    # Support one of is required
-                elif one_of_descriptor.full_name == f"{self.protobuf_pkg}.oneof_extend":
-                    # Support one of is optional
-                    for one_of_extend_field_descriptor, result in one_ov_value.ListFields():
-                        for one_of_optional_name in result:
-                            optional_fields.add(one_of_optional_name)
-
-            if required or optional_fields:
-                one_of_dict[one_of.full_name] = {
-                    "required": required,
-                    "optional_fields": optional_fields,
-                    # optional cannot get the value of the current one of,
-                    # so it needs to be processed in subsequent processing
-                    "fields": set(),
-                }
-        if one_of_dict:
-            message_field_dict["one_of"] = one_of_dict
-        # Process all fields of Message
-        for field in descriptor.fields:
-            type_name: str = ""
-            if field.type == FieldDescriptor.TYPE_MESSAGE:
-                # Convert some types of Protobuf
-                message_type_name: str = field.message_type.name
-                if message_type_name in ("Duration", "Any", "Timestamp", "Struct"):
-                    type_name = message_type_name.lower()
-                elif message_type_name.endswith("Entry"):
-                    type_name = "map"
-                elif message_type_name == "Empty":
-                    continue
-                else:
-                    type_name = "message"
-            if field.label == FieldDescriptor.LABEL_REPEATED and not (
-                field.message_type and field.message_type.name.endswith("Entry")
-            ):
-                # Support Protobuf.RepeatedXXX
-                type_name = "repeated"
-            if not type_name:
-                # Support Protobuf common type
-                type_name = protobuf_common_type_dict.get(field.type, "")
-                if not type_name:
-                    _logger.warning(
-                        f"{__name__} not support protobuf type id:{field.type} from field name{field.full_name}"
-                    )
-                    continue
-            field_dict: FieldInfoTypedDict = field_option_handle(type_name, field.full_name, field, self.protobuf_pkg)
-            if field_dict["skip"]:
-                # If skip is True, the corresponding validation rule is not applied
-                continue
-            message_field_dict["message"][field.name] = field_dict
-            if type_name == "message":
-                message_field_dict["nested"][field.message_type.name] = self.get_desc_from_options(field.message_type)
-            elif type_name == "map":
-                for sub_field in field.message_type.fields:
-                    if not sub_field.message_type:
-                        continue
-                    # keys and values
-                    message_field_dict["nested"][sub_field.message_type.name] = self.get_desc_from_options(
-                        sub_field.message_type
-                    )
-        self._msg_desc_dict[descriptor.name] = message_field_dict
-        return message_field_dict
diff --git a/protobuf_to_pydantic/get_desc/from_pb_option/from_p2p.py b/protobuf_to_pydantic/get_desc/from_pb_option/from_p2p.py
deleted file mode 100644
index 6399b75..0000000
--- a/protobuf_to_pydantic/get_desc/from_pb_option/from_p2p.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import Dict, Type
-
-from protobuf_to_pydantic.grpc_types import Message
-
-from .base import DescFromOptionTypedDict, ParseFromPbOption
-
-
-class _ParseFromPbOption(ParseFromPbOption):
-    protobuf_pkg = "p2p_validate"
-
-
-def get_desc_from_p2p(message: Type[Message]) -> Dict[str, DescFromOptionTypedDict]:
-    """Parse data through Message and return info dict
-    Note: The returned dict includes the data of one of
-    """
-    return _ParseFromPbOption(message).parse()
diff --git a/protobuf_to_pydantic/get_desc/utils.py b/protobuf_to_pydantic/get_desc/utils.py
deleted file mode 100644
index 042a917..0000000
--- a/protobuf_to_pydantic/get_desc/utils.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from protobuf_to_pydantic.types import DescFromOptionTypedDict
-
-
-def one_of_message_dict_handler(
-    raw_message_dict: dict, desc_from_option_dict: "DescFromOptionTypedDict", full_name_prefix: str
-) -> None:
-    for key, value in raw_message_dict.items():
-        if key == "ignored":
-            desc_from_option_dict["metadata"]["ignored"] = value
-        elif key.startswith("oneof"):
-            # Special support for OneOf
-            field_full_name = f"{full_name_prefix}.{key.split(':')[1]}"
-            if field_full_name not in desc_from_option_dict["one_of"]:
-                desc_from_option_dict["one_of"][field_full_name] = {}  # type: ignore
-            if "required" in value:
-                desc_from_option_dict["one_of"][field_full_name]["required"] = value["required"]
-            if "optional" in value.get("oneof_extend", {}):
-                desc_from_option_dict["one_of"][field_full_name]["optional_fields"] = set(
-                    value["oneof_extend"].pop("optional", [])
-                )
diff --git a/protobuf_to_pydantic/get_message_option/__init__.py b/protobuf_to_pydantic/get_message_option/__init__.py
new file mode 100644
index 0000000..478df9c
--- /dev/null
+++ b/protobuf_to_pydantic/get_message_option/__init__.py
@@ -0,0 +1,6 @@
+from .from_message_option import (
+    get_message_option_dict_from_message_with_p2p,
+    get_message_option_dict_from_message_with_pgv,
+)
+from .from_proto_file import get_message_option_dict_from_proto_file
+from .from_pyi_file import get_message_option_dict_from_pyi_file
diff --git a/protobuf_to_pydantic/get_message_option/from_message_option/__init__.py b/protobuf_to_pydantic/get_message_option/from_message_option/__init__.py
new file mode 100644
index 0000000..3fc64fe
--- /dev/null
+++ b/protobuf_to_pydantic/get_message_option/from_message_option/__init__.py
@@ -0,0 +1,4 @@
+from .from_p2p import get_message_option_dict_from_message_with_p2p
+from .from_pgv import get_message_option_dict_from_message_with_pgv
+
+__all__ = ["get_message_option_dict_from_message_with_pgv", "get_message_option_dict_from_message_with_p2p"]
diff --git a/protobuf_to_pydantic/get_message_option/from_message_option/base.py b/protobuf_to_pydantic/get_message_option/from_message_option/base.py
new file mode 100644
index 0000000..2ecacfb
--- /dev/null
+++ b/protobuf_to_pydantic/get_message_option/from_message_option/base.py
@@ -0,0 +1,118 @@
+import logging
+from typing import Dict, Set, Type
+
+from protobuf_to_pydantic.constant import protobuf_common_type_dict
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.desc import gen_field_info_dict_from_field_desc
+from protobuf_to_pydantic.field_info_rule.types import MessageOptionTypedDict, OneOfTypedDict
+from protobuf_to_pydantic.grpc_types import Descriptor, FieldDescriptor, Message
+
+_logger: logging.Logger = logging.getLogger(__name__)
+
+_global_message_option_dict: Dict[str, Dict[str, MessageOptionTypedDict]] = {}
+
+
+class ParseFromPbOption(object):
+    protobuf_pkg: str  # Extend the package name of protobuf
+
+    def __init__(self, message: Type[Message]):
+        self.message = message
+        self._message_option_dict: Dict[str, MessageOptionTypedDict] = {}
+        if self.protobuf_pkg not in _global_message_option_dict:
+            _global_message_option_dict[self.protobuf_pkg] = self._message_option_dict
+        else:
+            self._message_option_dict = _global_message_option_dict[self.protobuf_pkg]
+
+    def parse(self) -> Dict[str, MessageOptionTypedDict]:
+        descriptor: Descriptor = self.message.DESCRIPTOR
+        if descriptor.name in self._message_option_dict:
+            return self._message_option_dict
+
+        self._message_option_dict[descriptor.name] = self.get_message_option_dict_from_desc(descriptor)
+        return self._message_option_dict
+
+    def get_message_option_dict_from_desc(self, descriptor: Descriptor) -> MessageOptionTypedDict:  # noqa:C901
+        """Extract the information of each field through the Options of Protobuf Message"""
+        if descriptor.name in self._message_option_dict:
+            return self._message_option_dict[descriptor.name]
+        message_option_dict: MessageOptionTypedDict = {"message": {}, "one_of": {}, "nested": {}, "metadata": {}}
+
+        # Options for processing Messages
+        for option_descriptor, option_value in descriptor.GetOptions().ListFields():
+            # If parsing is disabled, Options will not continue to be parsed, and empty information will be set
+            if (option_descriptor.full_name == f"{self.protobuf_pkg}.disabled" and option_value) or (
+                option_descriptor.full_name == f"{self.protobuf_pkg}.ignored" and option_value
+            ):
+                return message_option_dict
+        # Handle one_ofs of Message
+        one_of_dict: Dict[str, OneOfTypedDict] = {}
+        for one_of in descriptor.oneofs:
+            required: bool = False
+            optional_fields: Set[str] = set()
+            for one_of_descriptor, one_ov_value in one_of.GetOptions().ListFields():
+                if one_of_descriptor.full_name == f"{self.protobuf_pkg}.required":
+                    required = True
+                    # if one_of.full_name in self._msg_desc_dict:
+                    #     continue
+                    # Support one of is required
+                elif one_of_descriptor.full_name == f"{self.protobuf_pkg}.oneof_extend":
+                    # Support one of is optional
+                    for one_of_extend_field_descriptor, result in one_ov_value.ListFields():
+                        for one_of_optional_name in result:
+                            optional_fields.add(one_of_optional_name)
+
+            if required or optional_fields:
+                one_of_dict[one_of.full_name] = {
+                    "required": required,
+                    "optional_fields": optional_fields,
+                    # optional cannot get the value of the current one of,
+                    # so it needs to be processed in subsequent processing
+                    "fields": set(),
+                }
+        if one_of_dict:
+            message_option_dict["one_of"] = one_of_dict
+        # Process all fields of Message
+        for field in descriptor.fields:
+            type_name: str = ""
+            if field.type == FieldDescriptor.TYPE_MESSAGE:
+                # Convert some types of Protobuf
+                message_type_name: str = field.message_type.name
+                if message_type_name in ("Duration", "Any", "Timestamp", "Struct"):
+                    type_name = message_type_name.lower()
+                elif message_type_name.endswith("Entry"):
+                    type_name = "map"
+                elif message_type_name == "Empty":
+                    continue
+                else:
+                    type_name = "message"
+            if field.label == FieldDescriptor.LABEL_REPEATED and not (
+                field.message_type and field.message_type.name.endswith("Entry")
+            ):
+                # Support Protobuf.RepeatedXXX
+                type_name = "repeated"
+            if not type_name:
+                # Support Protobuf common type
+                type_name = protobuf_common_type_dict.get(field.type, "")
+                if not type_name:
+                    _logger.warning(
+                        f"{__name__} not support protobuf type id:{field.type} from field name{field.full_name}"
+                    )
+                    continue
+            field_info_dict = gen_field_info_dict_from_field_desc(type_name, field.full_name, field, self.protobuf_pkg)
+            if field_info_dict["skip"]:
+                # If skip is True, the corresponding validation rule is not applied
+                continue
+            message_option_dict["message"][field.name] = field_info_dict
+            if type_name == "message":
+                message_option_dict["nested"][field.message_type.name] = self.get_message_option_dict_from_desc(
+                    field.message_type
+                )
+            elif type_name == "map":
+                for sub_field in field.message_type.fields:
+                    if not sub_field.message_type:
+                        continue
+                    # keys and values
+                    message_option_dict["nested"][sub_field.message_type.name] = self.get_message_option_dict_from_desc(
+                        sub_field.message_type
+                    )
+        self._message_option_dict[descriptor.name] = message_option_dict
+        return message_option_dict
diff --git a/protobuf_to_pydantic/get_message_option/from_message_option/from_p2p.py b/protobuf_to_pydantic/get_message_option/from_message_option/from_p2p.py
new file mode 100644
index 0000000..0e8852b
--- /dev/null
+++ b/protobuf_to_pydantic/get_message_option/from_message_option/from_p2p.py
@@ -0,0 +1,13 @@
+from typing import Dict, Type
+
+from protobuf_to_pydantic.grpc_types import Message
+
+from .base import MessageOptionTypedDict, ParseFromPbOption
+
+
+class _ParseFromPbOption(ParseFromPbOption):
+    protobuf_pkg = "p2p_validate"
+
+
+def get_message_option_dict_from_message_with_p2p(message: Type[Message]) -> Dict[str, MessageOptionTypedDict]:
+    return _ParseFromPbOption(message).parse()
diff --git a/protobuf_to_pydantic/get_desc/from_pb_option/from_pgv.py b/protobuf_to_pydantic/get_message_option/from_message_option/from_pgv.py
similarity index 54%
rename from protobuf_to_pydantic/get_desc/from_pb_option/from_pgv.py
rename to protobuf_to_pydantic/get_message_option/from_message_option/from_pgv.py
index 0d5e3b5..684f742 100644
--- a/protobuf_to_pydantic/get_desc/from_pb_option/from_pgv.py
+++ b/protobuf_to_pydantic/get_message_option/from_message_option/from_pgv.py
@@ -2,12 +2,12 @@
 
 from protobuf_to_pydantic.grpc_types import Message
 
-from .base import DescFromOptionTypedDict, ParseFromPbOption
+from .base import MessageOptionTypedDict, ParseFromPbOption
 
 
 class _ParseFromPbOption(ParseFromPbOption):
     protobuf_pkg = "validate"
 
 
-def get_desc_from_pgv(message: Type[Message]) -> Dict[str, DescFromOptionTypedDict]:
+def get_message_option_dict_from_message_with_pgv(message: Type[Message]) -> Dict[str, MessageOptionTypedDict]:
     return _ParseFromPbOption(message).parse()
diff --git a/protobuf_to_pydantic/get_desc/from_proto_file.py b/protobuf_to_pydantic/get_message_option/from_proto_file.py
similarity index 67%
rename from protobuf_to_pydantic/get_desc/from_proto_file.py
rename to protobuf_to_pydantic/get_message_option/from_proto_file.py
index f4ece4a..d04ab6f 100644
--- a/protobuf_to_pydantic/get_desc/from_proto_file.py
+++ b/protobuf_to_pydantic/get_message_option/from_proto_file.py
@@ -1,54 +1,54 @@
 from typing import TYPE_CHECKING, Dict, Optional
 
-from protobuf_to_pydantic.util import gen_dict_from_desc_str
+from protobuf_to_pydantic.util import get_dict_from_comment
 
-from .utils import one_of_message_dict_handler
+from .utils import rule_dict_handler
 
 if TYPE_CHECKING:
     from protobuf_to_pydantic.contrib.proto_parser import Message, ProtoFile
-    from protobuf_to_pydantic.types import DescFromOptionTypedDict
+    from protobuf_to_pydantic.field_info_rule.types import MessageOptionTypedDict
 
-_filename_desc_dict: Dict[str, Dict[str, "DescFromOptionTypedDict"]] = {}
+_filename_desc_dict: Dict[str, Dict[str, "MessageOptionTypedDict"]] = {}
 
 
-def _parse_message_result_dict(
+def _protobuf_msg_handler(
     protobuf_msg: "Message",
-    parse_result: "ProtoFile",
-    container: Dict[str, "DescFromOptionTypedDict"],
+    proto_file: "ProtoFile",
+    container: Dict[str, "MessageOptionTypedDict"],
     comment_prefix: str,
-    msg_cache: Dict[str, "DescFromOptionTypedDict"],
+    msg_cache: Dict[str, "MessageOptionTypedDict"],
 ) -> None:
     message_name: str = protobuf_msg.name
     if message_name in msg_cache:
         return
-    new_container: "DescFromOptionTypedDict" = {"message": {}, "one_of": {}, "nested": {}, "metadata": {}}
+    new_container: "MessageOptionTypedDict" = {"message": {}, "one_of": {}, "nested": {}, "metadata": {}}
     container[message_name] = new_container
     msg_cache[message_name] = new_container
 
     if protobuf_msg.comment:
-        message_dict = gen_dict_from_desc_str(  # type: ignore[assignment]
+        message_dict = get_dict_from_comment(  # type: ignore[assignment]
             comment_prefix, protobuf_msg.comment.content.replace("//", "")
         )
-        one_of_message_dict_handler(message_dict, new_container, f"{parse_result.package}.{message_name}")
+        rule_dict_handler(message_dict, new_container, f"{proto_file.package}.{message_name}")
 
     for field in protobuf_msg.fields:
-        new_container["message"][field.name] = gen_dict_from_desc_str(  # type: ignore[assignment]
+        new_container["message"][field.name] = get_dict_from_comment(  # type: ignore[assignment]
             comment_prefix, field.comment.content.replace("//", "") if field.comment else ""
         )
         # parse nested message by map
         for sub_type_str in [field.type, field.key_type, field.val_type]:
-            if sub_type_str in parse_result.messages:
-                sub_message = parse_result.messages[sub_type_str]
+            if sub_type_str in proto_file.messages:
+                sub_message = proto_file.messages[sub_type_str]
             elif sub_type_str in protobuf_msg.messages:
                 sub_message = protobuf_msg.messages[sub_type_str]
             else:
                 continue
             if sub_message is protobuf_msg:
                 continue
-            _parse_message_result_dict(sub_message, parse_result, new_container["nested"], comment_prefix, msg_cache)
+            _protobuf_msg_handler(sub_message, proto_file, new_container["nested"], comment_prefix, msg_cache)
 
 
-def get_desc_from_proto_file(filename: str, comment_prefix: str) -> Dict[str, "DescFromOptionTypedDict"]:
+def get_message_option_dict_from_proto_file(filename: str, comment_prefix: str) -> Dict[str, "MessageOptionTypedDict"]:
     """Obtain corresponding information through protobuf file
 
     protobuf file name: demo.proto, message e.g:
@@ -95,14 +95,13 @@ def get_desc_from_proto_file(filename: str, comment_prefix: str) -> Dict[str, "D
     except ImportError:
         raise ImportError("Can not parse protobuf file, please install lark")
 
-    message_field_dict: Dict[str, "DescFromOptionTypedDict"] = {}
+    message_field_dict: Dict[str, "MessageOptionTypedDict"] = {}
     _proto_file: Optional[ProtoFile] = parse_from_file(filename)
     if _proto_file:
         # Currently only used protobuf file message
-        # proto_file: ProtoFile = _proto_file
         for _, protobuf_msg in _proto_file.messages.items():
-            msg_cache: Dict[str, "DescFromOptionTypedDict"] = {}
-            _parse_message_result_dict(protobuf_msg, _proto_file, message_field_dict, comment_prefix, msg_cache)
+            msg_cache: Dict[str, "MessageOptionTypedDict"] = {}
+            _protobuf_msg_handler(protobuf_msg, _proto_file, message_field_dict, comment_prefix, msg_cache)
     # cache data and return
     _filename_desc_dict[filename] = message_field_dict
     return message_field_dict
diff --git a/protobuf_to_pydantic/get_desc/from_pyi_file.py b/protobuf_to_pydantic/get_message_option/from_pyi_file.py
similarity index 63%
rename from protobuf_to_pydantic/get_desc/from_pyi_file.py
rename to protobuf_to_pydantic/get_message_option/from_pyi_file.py
index 61f2dce..968bd4f 100644
--- a/protobuf_to_pydantic/get_desc/from_pyi_file.py
+++ b/protobuf_to_pydantic/get_message_option/from_pyi_file.py
@@ -1,17 +1,17 @@
 import re
 from typing import TYPE_CHECKING, Dict, List, Tuple
 
-from protobuf_to_pydantic.util import gen_dict_from_desc_str
+from protobuf_to_pydantic.util import get_dict_from_comment
 
-from .utils import one_of_message_dict_handler
+from .utils import rule_dict_handler
 
 if TYPE_CHECKING:
-    from protobuf_to_pydantic.types import DescFromOptionTypedDict, FieldInfoTypedDict
+    from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict, MessageOptionTypedDict
 
-_filename_desc_dict: Dict[str, Dict[str, "DescFromOptionTypedDict"]] = {}
+_filename_message_option_dict: Dict[str, Dict[str, "MessageOptionTypedDict"]] = {}
 
 
-def get_desc_from_pyi_file(filename: str, comment_prefix: str) -> Dict[str, "DescFromOptionTypedDict"]:
+def get_message_option_dict_from_pyi_file(filename: str, comment_prefix: str) -> Dict[str, "MessageOptionTypedDict"]:
     """
     For a Protobuf message as follows:
         ```protobuf
@@ -73,9 +73,9 @@ class UserMessage(google.protobuf.message.Message):
         }
     }
     """
-    if filename in _filename_desc_dict:
+    if filename in _filename_message_option_dict:
         # get protobuf message info by cache
-        return _filename_desc_dict[filename]
+        return _filename_message_option_dict[filename]
 
     with open(filename, "r") as f:
         pyi_content: str = f.read()
@@ -84,44 +84,44 @@ class UserMessage(google.protobuf.message.Message):
     _comment_mode: bool = False  # Whether to enable parsing comment mode
     _doc: str = ""
     _field_name: str = ""
-    message_str_stack: List[Tuple[str, int, DescFromOptionTypedDict]] = []
+    message_str_stack: List[Tuple[str, int, MessageOptionTypedDict]] = []
     indent: int = 0
 
-    global_message_field_dict: Dict[str, "DescFromOptionTypedDict"] = {}
+    global_message_option_dict: Dict[str, "MessageOptionTypedDict"] = {}
 
     for index, line in enumerate(line_list):
         if "class" in line:
             if not line.endswith("google.protobuf.message.Message):"):
                 continue
-            match_list = re.findall(r"class (.+)\(google.protobuf.message.Message", line)
-            if not match_list:
+            message_name_match_list = re.findall(r"class (.+)\(google.protobuf.message.Message", line)
+            if not message_name_match_list:
                 continue
-            message_str: str = match_list[0]
+            message_name_str: str = message_name_match_list[0]
             new_indent: int = line.index("class")
-            if message_str_stack and message_str != message_str_stack[-1][0] and new_indent <= indent:
+            if message_str_stack and message_name_str != message_str_stack[-1][0] and new_indent <= indent:
                 # When you encounter the same indentation of different classes,
                 # need to pop off the previous one and insert the current one
                 message_str_stack.pop()
-            message_field_dict: Dict[str, FieldInfoTypedDict] = {}
-            global_message_field_dict[message_str] = {
-                "message": message_field_dict,
+            message_field_option_dict: Dict[str, FieldInfoTypedDict] = {}
+            global_message_option_dict[message_name_str] = {
+                "message": message_field_option_dict,
                 "one_of": {},
                 "nested": {},  # type: ignore
                 "metadata": {},
             }
             if message_str_stack:
                 parent_message_field_dict = message_str_stack[-1][2]
-                parent_message_field_dict["nested"][message_str] = global_message_field_dict[message_str]
+                parent_message_field_dict["nested"][message_name_str] = global_message_option_dict[message_name_str]
 
             indent = new_indent
-            message_str_stack.append((message_str, indent, global_message_field_dict[message_str]))
+            message_str_stack.append((message_name_str, indent, global_message_option_dict[message_name_str]))
         elif indent:
             if line and message_str_stack and line[indent] != " ":
                 # The current class has been scanned, go back to the previous class
                 message_str_stack.pop()
 
         if message_str_stack:
-            message_str, indent, desc_dict = message_str_stack[-1]
+            message_name_str, indent, message_option_dict = message_str_stack[-1]
             line = line.strip()
             if _comment_mode:
                 _doc += "\n" + line
@@ -140,25 +140,11 @@ class UserMessage(google.protobuf.message.Message):
             if (line.endswith('"""') or line == '"""') and _comment_mode:
                 # end add doc
                 _comment_mode = False
-                gen_desc_dict = gen_dict_from_desc_str(comment_prefix, _doc.replace('"""', ""))
+                field_rule_dict = get_dict_from_comment(comment_prefix, _doc.replace('"""', ""))
                 if _field_name:
-                    desc_dict["message"][_field_name] = gen_desc_dict  # type: ignore[assignment]
+                    message_option_dict["message"][_field_name] = field_rule_dict  # type: ignore[assignment]
                 else:
-                    one_of_message_dict_handler(gen_desc_dict, desc_dict, f"{message_str}")
-                    # for key, value in gen_desc_dict.items():
-                    #     if key == "ignore":
-                    #         desc_dict["metadata"]["ignore"] = value
-                    #     elif key.startswith("oneof"):
-                    #         # Special support for OneOf
-                    #         field_full_name = f"{message_str}.{key.split(':')[1]}"
-                    #         if field_full_name not in desc_dict["one_of"]:
-                    #             desc_dict["one_of"][field_full_name] = {}
-                    #         if "required" in value:
-                    #             desc_dict["one_of"][field_full_name]["required"] = value["required"]
-                    #         if "optional" in value.get("oneof_extend", {}):
-                    #             desc_dict["one_of"][field_full_name]["optional_fields"] = (
-                    #                 set(value["oneof_extend"].pop("optional", []))
-                    #             )
-
-    _filename_desc_dict[filename] = global_message_field_dict
-    return global_message_field_dict
+                    rule_dict_handler(field_rule_dict, message_option_dict, f"{message_name_str}")
+
+    _filename_message_option_dict[filename] = global_message_option_dict
+    return global_message_option_dict
diff --git a/protobuf_to_pydantic/get_message_option/utils.py b/protobuf_to_pydantic/get_message_option/utils.py
new file mode 100644
index 0000000..a369adf
--- /dev/null
+++ b/protobuf_to_pydantic/get_message_option/utils.py
@@ -0,0 +1,29 @@
+from typing import TYPE_CHECKING, Any, Dict
+from warnings import warn
+
+if TYPE_CHECKING:
+    from protobuf_to_pydantic.field_info_rule.types import MessageOptionTypedDict
+
+
+def rule_dict_handler(
+    rule_dict: Dict[str, Any], message_option_dict: "MessageOptionTypedDict", field_full_name_prefix: str
+) -> None:
+    """
+    parse message_rule_dict data and save to message_option_dict
+    """
+    for key, value in rule_dict.items():
+        if key == "ignored":
+            message_option_dict["metadata"]["ignored"] = value
+        elif key.startswith("oneof"):
+            # Special support for OneOf
+            field_full_name = f"{field_full_name_prefix}.{key.split(':')[1]}"
+            if field_full_name not in message_option_dict["one_of"]:
+                message_option_dict["one_of"][field_full_name] = {}  # type: ignore
+            if "required" in value:
+                message_option_dict["one_of"][field_full_name]["required"] = value["required"]
+            if "optional" in value.get("oneof_extend", {}):
+                message_option_dict["one_of"][field_full_name]["optional_fields"] = set(
+                    value["oneof_extend"].pop("optional", [])
+                )
+        else:
+            warn(f"Message rule not support key:{key}")
diff --git a/protobuf_to_pydantic/grpc_types.py b/protobuf_to_pydantic/grpc_types.py
index a8d1b8e..c92c6f7 100644
--- a/protobuf_to_pydantic/grpc_types.py
+++ b/protobuf_to_pydantic/grpc_types.py
@@ -174,6 +174,7 @@ def __setitem__(self, *args, **kwargs):  # real signature unknown
     "FieldDescriptor",
     "FieldDescriptorProto",
     "FileDescriptorProto",
+    "FieldMask",
     "Message",
     "Timestamp",
     "MessageToDict",
diff --git a/protobuf_to_pydantic/plugin/code_gen.py b/protobuf_to_pydantic/plugin/code_gen.py
index 5ee3c45..66f7edf 100644
--- a/protobuf_to_pydantic/plugin/code_gen.py
+++ b/protobuf_to_pydantic/plugin/code_gen.py
@@ -25,14 +25,14 @@ class CodeGen(Generic[ConfigT]):
 
     def __init__(self, config_class: Type[ConfigT]) -> None:
         self.config_class: Type[ConfigT] = config_class
-        self.param_dict: dict = {}
 
         with code_generation() as (request, response):
-            self.parse_param(request)
+            self.param_dict = self.gen_param_from_request(request)
             self.gen_config()
             self.generate_pydantic_model(Descriptors(request), response)
 
-    def parse_param(self, request: CodeGeneratorRequest) -> None:
+    @staticmethod
+    def gen_param_from_request(request: CodeGeneratorRequest) -> dict:
         """
         Parse the parameter information passed by the user and store it in the 'param_dict'.
 
@@ -42,16 +42,17 @@ def parse_param(self, request: CodeGeneratorRequest) -> None:
             param_dict result:
                 {"bar1": "foo1", "bar2": "foo2"}
         """
-        if not request.parameter:
-            return
-        try:
-            for one_param_str in request.parameter.split(","):
-                k, v = one_param_str.split("=")
-                self.param_dict[k] = v
-        except Exception as e:
-            logger.exception(e)
-            print(f"parse command-line error:{e}", file=sys.stderr)
-        print(f"Parse command-line arguments:{self.param_dict}", file=sys.stderr)
+        param_dict: dict = {}
+        if request.parameter:
+            try:
+                for one_param_str in request.parameter.split(","):
+                    k, v = one_param_str.split("=")
+                    param_dict[k] = v
+            except Exception as e:
+                logger.exception(e)
+                print(f"parse command-line error:{e}", file=sys.stderr)
+            print(f"Parse command-line arguments:{param_dict}", file=sys.stderr)
+        return param_dict
 
     def _get_config_by_path(self, key: str) -> None:
         """
@@ -147,11 +148,9 @@ def gen_config(self) -> None:
 
     def generate_pydantic_model(self, descriptors: Descriptors, response: CodeGeneratorResponse) -> None:
         for name, fd in descriptors.to_generate.items():
-            if fd.package in self.config.ignore_pkg_list:
+            config = self.config.pkg_config.get(fd.package, self.config)
+            if fd.package in config.ignore_pkg_list:
                 continue
             file = response.file.add()
-            file.name = fd.name[:-6].replace("-", "_").replace(".", "/") + f"{self.config.file_name_suffix}.py"
-            file.content = self.config.file_descriptor_proto_to_code(
-                fd=fd, descriptors=descriptors, config=self.config
-            ).content
-            print(f"Writing protobuf-to-pydantic code to {file.name}", file=sys.stderr)
+            file.name = fd.name[:-6].replace("-", "_").replace(".", "/") + f"{config.file_name_suffix}.py"
+            file.content = config.file_descriptor_proto_to_code(fd=fd, descriptors=descriptors, config=config).content
diff --git a/protobuf_to_pydantic/plugin/config.py b/protobuf_to_pydantic/plugin/config.py
index 86bd369..9095f5f 100644
--- a/protobuf_to_pydantic/plugin/config.py
+++ b/protobuf_to_pydantic/plugin/config.py
@@ -4,8 +4,8 @@
 from pydantic import BaseModel, Field
 
 from protobuf_to_pydantic import _pydantic_adapter
-from protobuf_to_pydantic.desc_template import DescTemplate
 from protobuf_to_pydantic.plugin.field_desc_proto_to_code import FileDescriptorProtoToCode
+from protobuf_to_pydantic.template import Template
 
 ConfigT = TypeVar("ConfigT", bound="ConfigModel")
 
@@ -19,28 +19,20 @@ class ProtobufTypeConfigModel(BaseModel):
     )
 
 
+class SubConfigModel(BaseModel):
+    module: Any
+
+
 class ConfigModel(BaseModel):
-    local_dict: dict = Field(default_factory=dict, description="Dict for local variables")
-    desc_template: Type[DescTemplate] = Field(
-        default=DescTemplate, description="Support more templates by customizing 'Desc Template'"
-    )
-    comment_prefix: str = Field(default="p2p", description="Comment prefix")
-    parse_comment: bool = Field(
-        default=True,
-        description="If true, the annotation is parsed and the validation rule data is extracted from the annotation",
-    )
+    # output code config
     customer_import_set: Set[str] = Field(default_factory=set, description="customer import code set")
-    customer_deque: Deque = Field(default_factory=deque)
-    module_path: str = Field(default="")
+    customer_deque: Deque = Field(default_factory=deque, description="customer file content")
+    code_indent: int = Field(default=4, description="Code indent")
+    module_path: str = Field(default="", description="protobuf project path")
     pyproject_file_path: str = Field(
         default="",
         description="pyproject file path, In general, pyproject.toml of the project can be found automatically",
     )
-    code_indent: int = Field(default=4, description="Code indent")
-    ignore_pkg_list: List[str] = Field(
-        default_factory=lambda: ["validate", "p2p_validate"], description="Ignore the specified pkg file"
-    )
-    base_model_class: Type[BaseModel] = Field(default=BaseModel)
     file_name_suffix: str = Field(
         default="_p2p",
         description=(
@@ -48,7 +40,25 @@ class ConfigModel(BaseModel):
             "For example, if the name of the proto file is `book`, the generated file name is `book_p2p.py`"
         ),
     )
-    file_descriptor_proto_to_code: Type[FileDescriptorProtoToCode] = Field(default=FileDescriptorProtoToCode)
+
+    # gen message config
+    local_dict: dict = Field(default_factory=dict, description="Dict for local variables")
+    template: Type[Template] = Field(default=Template, description="Support more templates by customizing 'Template'")
+    comment_prefix: str = Field(default="p2p", description="Comment prefix")
+    parse_comment: bool = Field(
+        default=True,
+        description="If true, the annotation is parsed and the validation rule data is extracted from the annotation",
+    )
+    ignore_pkg_list: List[str] = Field(
+        default_factory=lambda: ["validate", "p2p_validate"], description="Ignore the specified pkg file"
+    )
+    base_model_class: Type[BaseModel] = Field(default=BaseModel, description="Inherited base pydantic model")
+
+    # other config
+    file_descriptor_proto_to_code: Type[FileDescriptorProtoToCode] = Field(
+        default=FileDescriptorProtoToCode,
+        description="If you have modified the resolution rules, then you can customize FileDescriptorProtoToCode",
+    )
     protobuf_type_config: Dict[str, ProtobufTypeConfigModel] = Field(
         default_factory=dict,
         description="""
@@ -79,8 +89,11 @@ class ConfigModel(BaseModel):
         ```
         """,
     )
-    desc_template_instance: DescTemplate = Field(
-        default_factory=lambda: DescTemplate({}, ""),
+    pkg_config: Dict[str, "ConfigModel"] = Field(
+        default_factory=dict, description="Customize the configuration of different pkgs"
+    )
+    template_instance: Template = Field(
+        default_factory=lambda: Template({}, ""),
         description="This variable does not support configuration and will be overwritten even if configured",
     )
 
@@ -91,11 +104,23 @@ class Config:
     def after_init(cls, values: Any) -> Any:
         if _pydantic_adapter.is_v1:
             # values: Dict[str, Any]
-            values["desc_template_instance"] = values["desc_template"](values["local_dict"], values["comment_prefix"])
+            values["template_instance"] = values["template"](values["local_dict"], values["comment_prefix"])
             return values
         else:
             # values: "ConfigModel"
-            values.desc_template_instance = values.desc_template(values.local_dict, values.comment_prefix)
+            values.template_instance = values.template(values.local_dict, values.comment_prefix)
+        return values
+
+    @_pydantic_adapter.model_validator(mode="before")
+    def before_init(cls, values: Any) -> Any:
+        def _validator(_values: Any) -> dict:
+            if not isinstance(_values, SubConfigModel):
+                raise ValueError("values must be a SubConfigModel")
+            return get_config_by_module(_values.module, ConfigModel).dict()
+
+        if "pkg_config" in values:
+            values["pkg_config"] = {k: _validator(v) for k, v in values.get("pkg_config", {}).items()}
+        return values
 
 
 def get_config_by_module(module: Any, config_class: Type[ConfigT]) -> ConfigT:
diff --git a/protobuf_to_pydantic/plugin/field_desc_proto_to_code.py b/protobuf_to_pydantic/plugin/field_desc_proto_to_code.py
index bf621ac..88deda0 100644
--- a/protobuf_to_pydantic/plugin/field_desc_proto_to_code.py
+++ b/protobuf_to_pydantic/plugin/field_desc_proto_to_code.py
@@ -3,28 +3,31 @@
 import logging
 from datetime import datetime, timedelta
 from pathlib import Path
-from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple
+from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple, Type
 
 from mypy_protobuf.main import PYTHON_RESERVED, Descriptors, SourceCodeLocation
 from pydantic import BaseModel
 from pydantic.fields import FieldInfo
-from typing_extensions import NotRequired, TypedDict
+from typing_extensions import TypedDict
 
 from protobuf_to_pydantic import _pydantic_adapter
-from protobuf_to_pydantic.constant import protobuf_desc_python_type_dict, python_type_default_value_dict
-from protobuf_to_pydantic.desc_template import DescTemplate
+from protobuf_to_pydantic.constant import (
+    protobuf_common_type_dict,
+    protobuf_desc_python_type_dict,
+    python_type_default_value_dict,
+)
 from protobuf_to_pydantic.exceptions import WaitingToCompleteException
-from protobuf_to_pydantic.field_param import (
-    FieldParamModel,
-    field_param_dict_handle,
-    field_param_dict_migration_v2_handler,
+from protobuf_to_pydantic.field_info_rule.field_info_param import (
+    FieldInfoParamModel,
+    field_info_param_dict_handle,
+    field_info_param_dict_migration_v2_handler,
 )
-from protobuf_to_pydantic.gen_code import BaseP2C
-from protobuf_to_pydantic.get_desc.from_pb_option.base import (
-    field_comment_handler,
-    field_option_handle,
-    protobuf_common_type_dict,
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.comment import (
+    gen_field_rule_info_dict_from_field_comment_dict,
 )
+from protobuf_to_pydantic.field_info_rule.protobuf_option_to_field_info.desc import gen_field_info_dict_from_field_desc
+from protobuf_to_pydantic.field_info_rule.types import FieldInfoTypedDict, OneOfTypedDict
+from protobuf_to_pydantic.gen_code import BaseP2C
 from protobuf_to_pydantic.grpc_types import (
     AnyMessage,
     DescriptorProto,
@@ -33,7 +36,7 @@
     FileDescriptorProto,
 )
 from protobuf_to_pydantic.plugin.my_types import ProtobufTypeModel
-from protobuf_to_pydantic.util import camel_to_snake, gen_dict_from_desc_str
+from protobuf_to_pydantic.util import camel_to_snake, get_dict_from_comment
 
 if TYPE_CHECKING:
     from protobuf_to_pydantic.plugin.config import ConfigModel
@@ -49,11 +52,6 @@ class OptionTypedDict(TypedDict):
     is_proto3_optional: bool
 
 
-class OneOfInfoTypedDict(TypedDict):
-    fields: Set[str]
-    required: NotRequired[bool]
-
-
 def remove_comment_last_n(content: str) -> str:
     return_content = ""
     if content.endswith("\n"):
@@ -77,16 +75,16 @@ def __init__(self, fd: FileDescriptorProto, descriptors: Descriptors, config: "C
             pyproject_file_path=config.pyproject_file_path,
         )
         self.config = config
-        self._fd: FileDescriptorProto = fd
-        self._descriptors: Descriptors = descriptors
-        self._desc_template: DescTemplate = config.desc_template_instance
+        self._fd = fd
+        self._descriptors = descriptors
+        self._desc_template = config.template_instance
         self.source_code_info_by_scl = {tuple(location.path): location for location in fd.source_code_info.location}
 
         if config.base_model_class is BaseModel:
             self._import_set.add("from pydantic import BaseModel")
         else:
             self._add_import_code(config.base_model_class.__module__, config.base_model_class.__name__)
-        self._parse_desc_name_dict: Dict[str, str] = {}
+        self._model_cache: Dict[str, str] = {}
         self._parse_field_descriptor()
 
     def _add_other_module_pkg(self, other_fd: FileDescriptorProto, type_str: str) -> None:
@@ -128,7 +126,7 @@ def _comment_handler(self, leading_comments: str, trailing_comments: str) -> Tup
                 (trailing_comments_list, trailing_comments),
             ):
                 for line in comments.split("\n"):
-                    field_dict = gen_dict_from_desc_str(self.config.comment_prefix, line)
+                    field_dict = get_dict_from_comment(self.config.comment_prefix, line)
                     if not field_dict:
                         container.append(line)
                     else:
@@ -231,7 +229,7 @@ def _message_field_handle(
         optional_dict: dict,
         scl_prefix: SourceCodeLocation,
         skip_validate_rule: bool = False,
-    ) -> Optional[Tuple[str, str]]:
+    ) -> Optional[Tuple[str, str, bool]]:
         """generate message's field to Pydantic.FieldInfo code
 
         :param desc: The message to which the field belongs is used to determine whether it is self-referencing
@@ -246,10 +244,13 @@ def _message_field_handle(
             e.g: {"{field name}": {"is_proto3_optional": True}}
         :param skip_validate_rule: If the value is True, the validation information for the field will not be generated
 
-        :return: validator_handle_content, class_field_content
+        :return: validator_handle_content, class_field_content, use_custom_type
         """
-        field_info_dict: dict = {}
+        field_info_default_value = _pydantic_adapter.PydanticUndefined
+        field_info_default_factory_value: Any = None
+        field_type = None
         nested_message_name: Optional[str] = None
+        use_custom_type = False
         raw_validator_dict = {}
         leading_comments = ""
         trailing_comments = ""
@@ -272,26 +273,33 @@ def _message_field_handle(
                     f"typing.Dict[{self._get_protobuf_type_model(key_msg).py_type_str},"
                     f" {self._get_protobuf_type_model(value_msg).py_type_str}]"
                 )
-                field_info_dict["default_factory"] = dict
+                field_info_default_factory_value = dict
                 rule_type_str = "map"
             elif field.type_name.startswith(".google.protobuf"):
                 protobuf_type_model = self._get_protobuf_type_model(field)
                 type_str = protobuf_type_model.py_type_str
                 rule_type_str = protobuf_type_model.rule_type_str
-                field_info_dict["default_factory"] = protobuf_type_model.type_factory
+                field_info_default_factory_value = protobuf_type_model.type_factory
+                use_custom_type = protobuf_type_model.use_custom_type
             else:
                 protobuf_type_model = self._get_protobuf_type_model(field)
                 type_str = protobuf_type_model.py_type_str
                 rule_type_str = protobuf_type_model.rule_type_str
                 nested_message_name = type_str
+                use_custom_type = protobuf_type_model.use_custom_type
 
                 message_fd: FileDescriptorProto = self._descriptors.message_to_fd[field.type_name]
                 self._add_other_module_pkg(message_fd, type_str)
                 root_desc_nested_type_name = {i.name for i in root_desc.nested_type}
+                desc_nested_type_name = {i.name for i in desc.nested_type}
                 if message == desc:
                     # if self-referencing, need use Python type hints postponed annotations
                     type_str = f'"{type_str}"'
-                elif message_fd.name == self._fd.name and message.name not in root_desc_nested_type_name:
+                elif (
+                    message_fd.name == self._fd.name
+                    and message.name not in root_desc_nested_type_name
+                    and message.name not in desc_nested_type_name
+                ):
                     # If the referenced Message is generated later, it needs to be generated in advance
                     scl_prefix = [FileDescriptorProto.MESSAGE_TYPE_FIELD_NUMBER]
                     for index, desc in enumerate(self._fd.message_type):
@@ -307,7 +315,7 @@ def _message_field_handle(
         elif field.type == 14:
             # enum handle
             type_str = field.type_name.split(".")[-1]
-            field_info_dict["default"] = 0
+            field_info_default_value = 0
             rule_type_str = "enum"
             root_desc_enum_name = {i.name for i in root_desc.enum_type}
             if type_str in root_desc_enum_name:
@@ -319,8 +327,9 @@ def _message_field_handle(
             logger.error(f"Not found {field.type} in type_dict")
             return None
         else:
-            field_info_dict["default"] = python_type_default_value_dict[protobuf_desc_python_type_dict[field.type]]
+            field_info_default_value = python_type_default_value_dict[protobuf_desc_python_type_dict[field.type]]
             protobuf_type_model = self._get_protobuf_type_model(field)
+            use_custom_type = protobuf_type_model.use_custom_type
             type_str = protobuf_type_model.py_type_str
             rule_type_str = protobuf_type_model.rule_type_str
 
@@ -328,71 +337,59 @@ def _message_field_handle(
             # repeated support
             self._add_import_code("typing")
             type_str = f"typing.List[{type_str}]"
-            field_info_dict.pop("default", "")
-            field_info_dict["default_factory"] = list
+            field_info_default_value = None
+            field_info_default_factory_value = list
             rule_type_str = "repeated"
 
-        field_option_info_dict: dict = {}
+        field_info_dict: FieldInfoTypedDict = {}  # type: ignore[typeddict-item]
         comment_field_info_dict, leading_comments, trailing_comments = self._comment_handler(
             leading_comments,
             trailing_comments,
         )
-        #
-        # comment_field_info_dict: dict = {}
-        # if self.config.parse_comment:
-        #     leading_comments_list: List[str] = []
-        #     trailing_comments_list: List[str] = []
-        #     for container, comments in (
-        #         (leading_comments_list, leading_comments),
-        #         (trailing_comments_list, trailing_comments),
-        #     ):
-        #         for line in comments.split("\n"):
-        #             field_dict = gen_dict_from_desc_str(self.config.comment_prefix, line)
-        #             if not field_dict:
-        #                 container.append(line)
-        #             else:
-        #                 comment_field_info_dict.update(field_dict)
-        #     leading_comments = "\n".join(leading_comments_list)
-        #     trailing_comments = "\n".join(trailing_comments_list)
-
         if not skip_validate_rule:
-            field_option_info_dict.update(comment_field_info_dict)
-            # TODO support message option
-            # if list(desc.options.ListFields()):
+            field_info_dict.update(comment_field_info_dict)  # type: ignore[typeddict-item]
             if len(field.options.ListFields()) != 0 and rule_type_str:
                 # protobuf option support
-                field_option_info_dict.update(field_option_handle(rule_type_str, field.name, field))  # type: ignore
-                field_option_info_dict = self._desc_template.handle_template_var(field_option_info_dict)
-            elif field_option_info_dict:
-                field_option_info_dict = self._desc_template.handle_template_var(field_option_info_dict)
-                field_option_info_dict = field_comment_handler(  # type: ignore
-                    field_option_info_dict, field, rule_type_str, field.name
+                field_info_dict.update(gen_field_info_dict_from_field_desc(rule_type_str, field.name, field))
+                field_info_dict = self._desc_template.handle_template_var(field_info_dict)
+            elif field_info_dict:
+                field_info_dict = self._desc_template.handle_template_var(field_info_dict)
+                field_info_dict = gen_field_rule_info_dict_from_field_comment_dict(
+                    field_info_dict, field, rule_type_str, field.name  # type: ignore[arg-type]
                 )
 
-        if field_option_info_dict:
-            raw_validator_dict = field_option_info_dict.get("validator", {})
+        if field_info_dict:
+            raw_validator_dict = field_info_dict.get("validator", {})
+
+            field_info_dict = FieldInfoParamModel(**field_info_dict).to_dict()  # type: ignore
 
-            skip = field_option_info_dict.pop("skip", False)
+            skip = field_info_dict.pop("skip", False)
             if nested_message_name:
                 if nested_message_name not in nested_message_config_dict:
                     nested_message_config_dict[nested_message_name] = {}
                 nested_message_config_dict[nested_message_name]["skip"] = skip
-            field_option_info_dict = FieldParamModel(**field_option_info_dict).dict()
-            if not field_option_info_dict.pop("enable", False):
+
+            if not field_info_dict.pop("enable", False):
                 return None
             try:
                 if type_str.startswith("typing"):
                     import typing  # isort:skip
                 field_type = eval(type_str)
             except NameError:
-                field_type = None
-            field_param_dict_handle(
-                field_option_info_dict,
-                field_info_dict.get("default", _pydantic_adapter.PydanticUndefined),
-                field_info_dict.get("default_factory", None),
+                pass
+
+        if (
+            field_info_dict
+            or field_info_default_value is not _pydantic_adapter.PydanticUndefined
+            or field_info_default_factory_value is not None
+            or field_type is not None
+        ):
+            field_info_param_dict_handle(
+                field_info_dict,  # type: ignore[arg-type]
+                field_info_default_value,
+                field_info_default_factory_value,
                 field_type=field_type,
             )
-            field_info_dict = field_option_info_dict
 
         validator_handle_content = ""
         field_info_dict.pop("validator", None)
@@ -445,7 +442,7 @@ def _message_field_handle(
             type_str = f"typing.Dict[{key_type_str}, {value_type_str}]"
 
         # custom field support
-        field_class: Optional[FieldInfo] = field_info_dict.pop("field", None)
+        field_class: Optional[Type[FieldInfo]] = field_info_dict.pop("field", None)
         if field_class:
             field_name: str = self._get_value_code(field_class)
         else:
@@ -454,7 +451,7 @@ def _message_field_handle(
 
         if not _pydantic_adapter.is_v1:
             # pgv or p2p rule no warning required
-            field_param_dict_migration_v2_handler(field_info_dict, is_warnings=False)
+            field_info_param_dict_migration_v2_handler(field_info_dict, is_warnings=False)  # type: ignore[arg-type]
 
         if optional_dict.get(field.name, {}).get("is_proto3_optional", False):
             self._add_import_code("typing")
@@ -468,13 +465,13 @@ def _message_field_handle(
         for key in FieldInfo.__slots__:
             value: Any = field_info_dict.get(key, None)
             if value is getattr(FieldInfo(), key):
-                field_info_dict.pop(key, None)
+                field_info_dict.pop(key, None)  # type: ignore[misc]
 
         if isinstance(field_info_dict.get("json_schema_extra", None), dict):
             # After Pydantic version 2.1, json_schema_extra type may be callable
             for k in list(field_info_dict["json_schema_extra"].keys()):
                 if k not in field_info_dict:
-                    field_info_dict[k] = field_info_dict["json_schema_extra"].pop(k)
+                    field_info_dict[k] = field_info_dict["json_schema_extra"].pop(k)  # type: ignore[literal-required]
             if not field_info_dict.get("json_schema_extra", None):
                 field_info_dict.pop("json_schema_extra")
 
@@ -496,14 +493,13 @@ def _message_field_handle(
         if self.config.parse_comment and leading_comments:
             class_field_content = leading_comments + "\n" + class_field_content
         if self.config.parse_comment and trailing_comments:
-            class_field_content = class_field_content + trailing_comments + "\n"
-        else:
-            class_field_content = class_field_content + "\n"
-        return validator_handle_content, class_field_content
+            class_field_content = class_field_content + trailing_comments
+        class_field_content = class_field_content + "\n"
+        return validator_handle_content, class_field_content, use_custom_type
 
     def _gen_one_of_dict(
         self, desc: DescriptorProto, scl_prefix: SourceCodeLocation, skip_validate_rule: bool
-    ) -> Tuple[Dict[str, OneOfInfoTypedDict], Dict[str, OptionTypedDict]]:
+    ) -> Tuple[Dict[str, OneOfTypedDict], Dict[str, OptionTypedDict]]:
         """
         protobuf content:
             message OneOfOptionalTest {
@@ -559,7 +555,7 @@ def _gen_one_of_dict(
                 {'name': {'is_proto3_optional': True}, 'age': {'is_proto3_optional': True}}
 
         """
-        one_of_dict: Dict[str, OneOfInfoTypedDict] = {}
+        one_of_dict: Dict[str, OneOfTypedDict] = {}
         optional_dict: Dict[str, OptionTypedDict] = {}
         index_field_name_dict: Dict[int, Set[str]] = {}
 
@@ -579,7 +575,7 @@ def _gen_one_of_dict(
             if one_of_item.name.startswith("_") and one_of_item.name[1:] in optional_dict:
                 continue
 
-            option_dict: OneOfInfoTypedDict = {}  # type: ignore[typeddict-item]
+            option_dict: OneOfTypedDict = {}  # type: ignore[typeddict-item]
             for option_descriptor, option_value in one_of_item.options.ListFields():
                 full_name_list = option_descriptor.full_name.split(".")
                 pkg, rule_name = full_name_list[-2], full_name_list[-1]
@@ -598,7 +594,7 @@ def _gen_one_of_dict(
             comment = self.source_code_info_by_scl.get(tuple(scl_prefix + [index]))
             if self.config.parse_comment and comment:
                 for line in comment.leading_comments.split("\n"):
-                    one_of_comment_dict = gen_dict_from_desc_str(self.config.comment_prefix, line)
+                    one_of_comment_dict = get_dict_from_comment(self.config.comment_prefix, line)
                     if not one_of_comment_dict:
                         continue
                     for one_of_comment_rule_name, one_of_comment_option_value in one_of_comment_dict.items():
@@ -625,15 +621,15 @@ def _message(
         indent: int = 0,
         skip_validate_rule: bool = False,
     ) -> str:
-        self._add_import_code("google.protobuf.message", "Message")
         class_name = desc.name if desc.name not in PYTHON_RESERVED else "_r_" + desc.name
-        if class_name in self._parse_desc_name_dict:
-            if not self._parse_desc_name_dict[class_name]:
+        if class_name in self._model_cache:
+            if not self._model_cache[class_name]:
                 raise WaitingToCompleteException(f"The model:{class_name} is being generated")
-            return self._parse_desc_name_dict[class_name]
+            return self._model_cache[class_name]
         else:
-            self._parse_desc_name_dict[class_name] = ""
+            self._model_cache[class_name] = ""
 
+        self._add_import_code("google.protobuf.message", "Message")
         comment_info_dict, desc_content, comment_content = self.add_class_desc(scl_prefix, indent)
         class_name_content = " " * indent + f"class {class_name}({self.config.base_model_class.__name__}):"
         if comment_content:
@@ -659,20 +655,12 @@ def _message(
                 scl_prefix + [DescriptorProto.ONEOF_DECL_FIELD_NUMBER],
                 skip_validate_rule=skip_validate_rule,
             )
-        # for option_descriptor, option_value in field_list:
-        #     # filter unwanted Option
-        #     if protobuf_pkg:
-        #         if not option_descriptor.full_name.endswith(f"{protobuf_pkg}.rules"):
-        #             continue
-        #     elif not option_descriptor.full_name.endswith("validate.rules"):
-        #         continue
+
         for idx, field in enumerate(desc.field):
             if field.name in PYTHON_RESERVED:
                 continue
-            if field.type == 11 and self._get_protobuf_type_model(field).use_custom_type:
-                use_custom_type = True
 
-            _content_tuple: Optional[Tuple[str, str]] = self._message_field_handle(
+            _content_tuple = self._message_field_handle(
                 desc,
                 root_desc,
                 field,
@@ -685,6 +673,8 @@ def _message(
             if _content_tuple:
                 class_validate_handler_content += _content_tuple[0]
                 class_field_content += _content_tuple[1]
+                if _content_tuple[2]:
+                    use_custom_type = True
         if desc.nested_type:
             class_sub_c_str_list.extend(
                 self._message_nested_type_handle(
@@ -750,7 +740,7 @@ def _message(
         )
         if not any([class_head_content, class_field_content]):
             content += " " * (indent + self.code_indent) + "pass\n"
-        self._parse_desc_name_dict[class_name] = content
+        self._model_cache[class_name] = content
         return content
 
     def _get_protobuf_type_model(self, field: FieldDescriptorProto) -> ProtobufTypeModel:
@@ -767,7 +757,6 @@ def _get_type_factory(module_name: str, message_name: str) -> Any:
 
         type_factory: Optional[Any] = None
         use_custom_type = False
-        # TODO use gen_model.py _message_default_factory_dict_by_type_name
         if field.type in protobuf_desc_python_type_dict:
             type_factory = protobuf_desc_python_type_dict[field.type]
             return ProtobufTypeModel(
@@ -796,16 +785,14 @@ def _get_type_factory(module_name: str, message_name: str) -> Any:
                 type_factory = datetime.now
                 self._add_import_code("datetime", "datetime")
             elif _type_str == "Duration":
+                rule_type_str = "duration"
+                type_factory = timedelta
                 if _pydantic_adapter.is_v1:
                     py_type_str = "Timedelta"
-                    rule_type_str = "duration"
-                    type_factory = timedelta
                     self._add_import_code("datetime", "timedelta")
                     self._add_import_code("protobuf_to_pydantic.util", py_type_str)
                 else:
                     py_type_str = "Annotated[timedelta, BeforeValidator(Timedelta.validate)]"
-                    rule_type_str = "duration"
-                    type_factory = timedelta
 
                     self._add_import_code("pydantic", "BeforeValidator")
                     self._add_import_code("typing_extensions", "Annotated")
diff --git a/protobuf_to_pydantic/desc_template/__init__.py b/protobuf_to_pydantic/template/__init__.py
similarity index 79%
rename from protobuf_to_pydantic/desc_template/__init__.py
rename to protobuf_to_pydantic/template/__init__.py
index f6ebc28..e9e97ef 100644
--- a/protobuf_to_pydantic/desc_template/__init__.py
+++ b/protobuf_to_pydantic/template/__init__.py
@@ -1,14 +1,22 @@
 import json
 from importlib import import_module
-from typing import Any, Callable, List, Optional
+from typing import Any, Callable, Dict, List, Optional, TypeVar
 
 from protobuf_to_pydantic.grpc_types import RepeatedCompositeContainer, RepeatedScalarContainer
 
+_T = TypeVar("_T")
 
-class DescTemplate(object):
-    def __init__(self, local_dict: dict, comment_prefix: str) -> None:
-        self._local_dict: dict = local_dict
+
+class Template(object):
+    def __init__(self, local_dict: Dict[str, Any], comment_prefix: str, **kwargs: Any) -> None:
+        """
+        :param local_dict: local template var
+        :param comment_prefix: comment prefix, The comment prefix that needs to be resolved
+        :param kwargs: Extended parameters for custom templates
+        """
+        self._local_dict = local_dict
         self._comment_prefix: str = comment_prefix
+        self._kwargs: Dict[str, Any] = kwargs
         self._support_template_list: List[str] = [i for i in dir(self) if i.startswith("template")]
 
     def template_import_instance(self, module_str: str, var_str: str, json_param: str) -> Any:
@@ -44,9 +52,9 @@ def _template_str_handler(self, template_str: str) -> Any:
         except Exception as e:
             raise ValueError(f"parse {template_str} error: {e}") from e
 
-    def handle_template_var(self, container: Any) -> Any:
+    def handle_template_var(self, container: _T) -> _T:
         if isinstance(container, (list, RepeatedCompositeContainer, RepeatedScalarContainer)):
-            return [self.handle_template_var(i) for i in container]
+            return [self.handle_template_var(i) for i in container]  # type: ignore[return-value]
         elif isinstance(container, dict):
             return {k: self.handle_template_var(v) for k, v in container.items()}
         elif isinstance(container, str) and container.startswith(f"{self._comment_prefix}@"):
diff --git a/protobuf_to_pydantic/util.py b/protobuf_to_pydantic/util.py
index 3a2f455..bed3835 100644
--- a/protobuf_to_pydantic/util.py
+++ b/protobuf_to_pydantic/util.py
@@ -79,10 +79,10 @@ def replace_protobuf_type_to_python_type(value: Any) -> Any:
         return value
 
 
-def gen_dict_from_desc_str(comment_prefix: str, desc: str) -> dict:
-    pait_dict: dict = {}
+def get_dict_from_comment(comment_prefix: str, comment: str) -> dict:
+    _dict: dict = {}
     try:
-        for line in desc.split("\n"):
+        for line in comment.split("\n"):
             if line.startswith("#"):
                 line = line[1:]
             line = line.strip()
@@ -90,22 +90,22 @@ def gen_dict_from_desc_str(comment_prefix: str, desc: str) -> dict:
                 continue
             line = line.replace(f"{comment_prefix}:", "")
             for key, value in json.loads(line.replace("\\\\", "\\")).items():
-                if not pait_dict.get(key):
-                    pait_dict[key] = value
+                if not _dict.get(key):
+                    _dict[key] = value
                 else:
-                    if not isinstance(value, type(pait_dict[key])):
+                    if not isinstance(value, type(_dict[key])):
                         raise TypeError(f"Two different types of values were detected for Key:{key}")
                     elif isinstance(value, list):
-                        pait_dict[key].extend(value)
+                        _dict[key].extend(value)
                     elif isinstance(value, dict):
-                        pait_dict[key].update(value)
+                        _dict[key].update(value)
                     else:
                         raise TypeError(f"A key:{key} that does not support merging has been detected")
-        if "miss_default" in pait_dict:
-            pait_dict["required"] = pait_dict.pop("miss_default")
+        if "miss_default" in _dict:
+            _dict["required"] = _dict.pop("miss_default")
     except Exception as e:
-        logging.warning(f"Can not gen dict by desc:{desc}, error: {e}")
-    return pait_dict  # type: ignore
+        logging.warning(f"Can not gen dict by desc:{comment}, error: {e}")
+    return _dict  # type: ignore
 
 
 def get_pyproject_content(pyproject_file_path: str) -> str:


Test patch:
diff --git a/tests/base/base_p2p_validate.py b/tests/base/base_p2p_validate.py
index 7968d66..92b6935 100644
--- a/tests/base/base_p2p_validate.py
+++ b/tests/base/base_p2p_validate.py
@@ -6,7 +6,7 @@
 import pytest
 from pydantic import ValidationError
 
-from example.gen_p2p_code import CustomDescTemplate, CustomerField, confloat, conint, customer_any
+from example.gen_p2p_code import CustomCommentTemplate, CustomerField, confloat, conint, customer_any
 from protobuf_to_pydantic._pydantic_adapter import is_v1
 from protobuf_to_pydantic.grpc_types import AnyMessage
 
@@ -34,29 +34,29 @@ def test_number_model_in_validator(self) -> None:
 
         for model_class in self.number_model_class_list:
             for i in [1, 2, 3]:
-                self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(in_test=i, miss_default_test=1.0, required_test=1.0)
+                self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(in_test=i, miss_default_test=1.0, required_test=1.0)
             for i in [0, 4]:
                 with pytest.raises(ValidationError):
-                    self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(in_test=i, miss_default_test=1.0, required_test=1.0)
+                    self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(in_test=i, miss_default_test=1.0, required_test=1.0)
 
     def test_number_model_not_in_validator(self) -> None:
         for model_class in self.number_model_class_list:
             for i in [1, 2, 3]:
                 with pytest.raises(ValidationError):
-                    self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(not_in_test=i, miss_default_test=1.0, required_test=1.0)
+                    self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(not_in_test=i, miss_default_test=1.0, required_test=1.0)
             for i in [0, 4]:
-                self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(not_in_test=i, miss_default_test=1.0, required_test=1.0)
+                self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(not_in_test=i, miss_default_test=1.0, required_test=1.0)
 
     def test_number_model_miss_default_validator(self) -> None:
         for model_class in self.number_model_class_list:
             with pytest.raises(ValidationError):
-                self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)()
+                self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)()
 
     def test_number_model_miss_multiple_of_validator(self) -> None:
         for model_class in self.number_model_class_list:
-            self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(miss_default_test=1.0, multiple_of_test=6.0, required_test=1.0)
+            self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(miss_default_test=1.0, multiple_of_test=6.0, required_test=1.0)
             with pytest.raises(ValidationError):
-                self.replace_message_fn(model_class, local_dict=local_dict, desc_template=CustomDescTemplate)(miss_default_test=1.0, multiple_of_test=7.0, required_test=1.0)
+                self.replace_message_fn(model_class, local_dict=local_dict, template=CustomCommentTemplate)(miss_default_test=1.0, multiple_of_test=7.0, required_test=1.0)
 
     def _test_bool(self, model_class: Type) -> None:
         model_class(bool_1_test=True, bool_2_test=False, miss_default_test=True, required_test=True)
diff --git a/tests/test_gen_code_output_by_cli/test_demo_proto/test_simple.py b/tests/test_gen_code_output_by_cli/test_demo_proto/test_simple.py
index 2c1ff92..4db8d01 100644
--- a/tests/test_gen_code_output_by_cli/test_demo_proto/test_simple.py
+++ b/tests/test_gen_code_output_by_cli/test_demo_proto/test_simple.py
@@ -307,7 +307,7 @@ class OptionalMessage(BaseModel):
     y: int = Field(default=0)
     name: typing.Optional[str] = Field(default="")
     age: typing.Optional[int] = Field(default=0)
-    item: typing.Optional[InvoiceItem] = Field()
+    item: typing.Optional[InvoiceItem] = Field(default=None)
     str_list: typing.List[str] = Field(default_factory=list)
     int_map: typing.Dict[str, int] = Field(default_factory=dict)
     default_template_test: float = Field(default=0.0)
diff --git a/tests/test_gen_code_output_by_cli/test_p2p_validate_proto/test_p2p_validate.py b/tests/test_gen_code_output_by_cli/test_p2p_validate_proto/test_p2p_validate.py
index 5f0cc00..04811ce 100644
--- a/tests/test_gen_code_output_by_cli/test_p2p_validate_proto/test_p2p_validate.py
+++ b/tests/test_gen_code_output_by_cli/test_p2p_validate_proto/test_p2p_validate.py
@@ -17,7 +17,7 @@
     else:
         from example.proto_3_20_pydanticv2.example.example_proto.p2p_validate import demo_pb2  # type: ignore[no-redef]
 
-from example.gen_p2p_code import CustomDescTemplate, CustomerField, confloat, conint, customer_any
+from example.gen_p2p_code import CustomCommentTemplate, CustomerField, confloat, conint, customer_any
 from protobuf_to_pydantic import msg_to_pydantic_model, pydantic_model_to_py_code
 from protobuf_to_pydantic.util import format_content
 
@@ -35,7 +35,7 @@ def _model_output(msg: Any) -> str:
             "conint": conint,
             "customer_any": customer_any,
         }
-        return pydantic_model_to_py_code(msg_to_pydantic_model(msg, local_dict=local_dict, desc_template=CustomDescTemplate))
+        return pydantic_model_to_py_code(msg_to_pydantic_model(msg, local_dict=local_dict, template=CustomCommentTemplate))
 
     @staticmethod
     def assert_contains(content: str, other_content: str) -> None: