From 578082e9e80560ed9f6af7920448fa56d760f704 Mon Sep 17 00:00:00 2001 From: "g.ph" Date: Mon, 22 Aug 2022 19:43:55 +0800 Subject: [PATCH] fix bug Signed-off-by: g.ph --- Py.go | 6 ++- PyClass.go | 16 +++---- PyModule.go | 19 ++++++--- cpy3/PyBytes.go | 4 +- cpy3/PyDict.go | 8 ++-- cpy3/PyErr.go | 7 +-- cpy3/PyModule.go | 15 ++++--- cpy3/PyObject.go | 10 +++-- cpy3/PyType.go | 4 +- cpy3/PyUnicode.go | 11 +++-- cpy3/cfuncs.go | 101 -------------------------------------------- cpy3/cpy3.go | 29 +++++++------ cpy3/importfuncs.go | 11 ++--- go.mod | 6 +-- go.sum | 10 ++++- 15 files changed, 91 insertions(+), 166 deletions(-) delete mode 100644 cpy3/cfuncs.go diff --git a/Py.go b/Py.go index 27adc1c..c06dd44 100644 --- a/Py.go +++ b/Py.go @@ -34,20 +34,22 @@ func IsInitialized() int { } func Finalize() { SystemModuleMap.Range(func(key, value any) bool { - SystemModuleMap.Delete(key) + //SystemModuleMap.Delete(key) m := value.(*PyModule) m.DecRef() return true }) + _UserException.DecRef() cpy3.Py_Finalize() } func FinalizeEx() int { SystemModuleMap.Range(func(key, value any) bool { - SystemModuleMap.Delete(key) + //SystemModuleMap.Delete(key) m := value.(*PyModule) m.DecRef() return true }) + _UserException.DecRef() return cpy3.Py_FinalizeEx() } func SetProgramName(name string) { diff --git a/PyClass.go b/PyClass.go index efa10ba..2b65b21 100644 --- a/PyClass.go +++ b/PyClass.go @@ -143,14 +143,14 @@ var PyClassInstanceMethodForwardCallBack = syscall.NewCallback(func(self uintptr return Py_RETURN_NONE().instance }) -func init() { - PyClassInstanceMethodCallDef = &cpy3.PyMethodDef{ - Ml_name: cpy3.GoStrToCStr("Call"), - Ml_meth: PyClassInstanceMethodForwardCallBack, - Ml_flags: 3, - Ml_doc: cpy3.GoStrToCStr("class call forward"), - } -} +//func init() { +// PyClassInstanceMethodCallDef = &cpy3.PyMethodDef{ +// Ml_name: cpy3.GoStrToCStr("Call"), +// Ml_meth: PyClassInstanceMethodForwardCallBack, +// Ml_flags: 3, +// Ml_doc: cpy3.GoStrToCStr("class call forward"), +// } +//} //func CreateClass(name string, dict map[string]any) *PyClass { // if dict == nil { diff --git a/PyModule.go b/PyModule.go index e9d3a45..e3a333c 100644 --- a/PyModule.go +++ b/PyModule.go @@ -2,6 +2,7 @@ package py3 import ( "fmt" + "github.com/aadog/msvcrt-go" "github.com/aadog/py3-go/cpy3" "reflect" "sync" @@ -17,8 +18,9 @@ const ( var pyModuleInitMap = sync.Map{} type PyModuleGoObj struct { - moduleDef *cpy3.PyModuleDef - CallMap sync.Map + moduleDef *cpy3.PyModuleDef + methodsDef []cpy3.PyMethodDef + CallMap sync.Map } type PyModule struct { PyObject @@ -80,7 +82,9 @@ func PyTypeToGoType(p *PyObject) any { return 0 } + func PyMethodForward(self *PyModule, args *PyTuple, method interface{}) *PyObject { + methodType := reflect.TypeOf(method) methodValue := reflect.ValueOf(method) if methodType.Kind() != reflect.Func { @@ -138,12 +142,12 @@ var PyModuleMethodForwardCallBack = syscall.NewCallback(func(self uintptr, args }) func CreateModule(name string, doc string) *PyModule { - var pyModuleMethodCallDefs = make([]cpy3.PyMethodDef, 0) + pyModuleMethodCallDefs := make([]cpy3.PyMethodDef, 0) methodCallDef := cpy3.PyMethodDef{ - Ml_name: cpy3.GoStrToCStr("Call"), + Ml_name: msvcrt.MallocCString("Call"), Ml_meth: PyModuleMethodForwardCallBack, Ml_flags: 1, - Ml_doc: cpy3.GoStrToCStr("module call forward"), + Ml_doc: msvcrt.MallocCString("module call forward"), } pyModuleMethodCallDefs = append(pyModuleMethodCallDefs, methodCallDef) moduleNullMethodDef := cpy3.PyMethodDef{ @@ -156,12 +160,13 @@ func CreateModule(name string, doc string) *PyModule { module := &PyModule{} module.GoObj = new(PyModuleGoObj) + module.GoObj.methodsDef = pyModuleMethodCallDefs module.GoObj.moduleDef = &cpy3.PyModuleDef{ M_base: cpy3.PyModuleDef_Base{ Ob_base: cpy3.PyObject_HEAD_INIT(0), }, - M_name: cpy3.GoStrToCStr(name), - M_doc: cpy3.GoStrToCStr(doc), + M_name: msvcrt.MallocCString(name), + M_doc: msvcrt.MallocCString(doc), M_size: -1, M_methods: uintptr(unsafe.Pointer(&pyModuleMethodCallDefs[0])), M_slots: 0, diff --git a/cpy3/PyBytes.go b/cpy3/PyBytes.go index f3d7a97..c343378 100644 --- a/cpy3/PyBytes.go +++ b/cpy3/PyBytes.go @@ -1,6 +1,8 @@ package cpy3 +import "github.com/aadog/msvcrt-go" + func PyBytes_FromString(s string) uintptr { - r, _, _ := pyBytes_FromString.Call(GoStrToCStr(s)) + r, _, _ := pyBytes_FromString.Call(msvcrt.StringToCUTF8String(s)) return r } diff --git a/cpy3/PyDict.go b/cpy3/PyDict.go index 2bf7499..39633d8 100644 --- a/cpy3/PyDict.go +++ b/cpy3/PyDict.go @@ -1,12 +1,14 @@ package cpy3 +import "github.com/aadog/msvcrt-go" + func PyDict_SetItem(obj uintptr, key uintptr, val uintptr) int { r, _, _ := pyDict_SetItem.Call(obj, key, val) return int(r) } func PyDict_SetItemString(obj uintptr, key string, val uintptr) int { - r, _, _ := pyDict_SetItemString.Call(obj, GoStrToCStr(key), val) + r, _, _ := pyDict_SetItemString.Call(obj, msvcrt.StringToCUTF8String(key), val) return int(r) } @@ -32,7 +34,7 @@ func PyDict_Keys(obj uintptr) uintptr { return r } func PyDict_GetItemString(obj uintptr, key string) uintptr { - r, _, _ := pyDict_GetItemString.Call(obj, GoStrToCStr(key)) + r, _, _ := pyDict_GetItemString.Call(obj, msvcrt.StringToCUTF8String(key)) return r } @@ -41,6 +43,6 @@ func PyDict_DelItem(obj uintptr, key uintptr) int { return int(r) } func PyDict_DelItemString(obj uintptr, key string) int { - r, _, _ := pyDict_DelItemString.Call(obj, GoStrToCStr(key)) + r, _, _ := pyDict_DelItemString.Call(obj, msvcrt.StringToCUTF8String(key)) return int(r) } diff --git a/cpy3/PyErr.go b/cpy3/PyErr.go index d555948..554c364 100644 --- a/cpy3/PyErr.go +++ b/cpy3/PyErr.go @@ -1,8 +1,9 @@ package cpy3 +import "github.com/aadog/msvcrt-go" -func PyErr_NewException(name string,base uintptr,dict uintptr) uintptr { - r,_,_:=pyErr_NewException.Call(GoStrToCStr(name),base,dict) +func PyErr_NewException(name string, base uintptr, dict uintptr) uintptr { + r, _, _ := pyErr_NewException.Call(msvcrt.StringToCUTF8String(name), base, dict) return r } func PyExc_Exception() uintptr { @@ -14,5 +15,5 @@ func PyExc_ValueError() uintptr { } func PyErr_SetString(tp uintptr, message string) { - pyErr_SetString.Call(tp, GoStrToCStr(message)) + pyErr_SetString.Call(tp, msvcrt.StringToCUTF8String(message)) } diff --git a/cpy3/PyModule.go b/cpy3/PyModule.go index edc740f..486d6d5 100644 --- a/cpy3/PyModule.go +++ b/cpy3/PyModule.go @@ -1,6 +1,9 @@ package cpy3 -import "unsafe" +import ( + "github.com/aadog/msvcrt-go" + "unsafe" +) type PyMethodDef struct { Ml_name uintptr @@ -55,7 +58,7 @@ func PyImport_Import(name uintptr) uintptr { func PyModule_GetName(obj uintptr) string { r, _, _ := pyModule_GetName.Call(obj) - return CStrToGoStr(r) + return msvcrt.CUtf8ToString(r) } func PyModule_GetDict(obj uintptr) uintptr { r, _, _ := pyModule_GetDict.Call(obj) @@ -66,18 +69,18 @@ func PyModule_AddFunctions(obj uintptr, functionsDef uintptr) int { return int(r) } func PyModule_AddIntConstant(obj uintptr, name string, value int64) int { - r, _, _ := pyModule_AddIntConstant.Call(obj, GoStrToCStr(name), uintptr(value)) + r, _, _ := pyModule_AddIntConstant.Call(obj, msvcrt.StringToCUTF8String(name), uintptr(value)) return int(r) } func PyModule_AddStringConstant(obj uintptr, name string, value string) int { - r, _, _ := pyModule_AddStringConstant.Call(obj, GoStrToCStr(name), GoStrToCStr(value)) + r, _, _ := pyModule_AddStringConstant.Call(obj, msvcrt.StringToCUTF8String(name), msvcrt.StringToCUTF8String(value)) return int(r) } func PyModule_AddObject(obj uintptr, name string, value uintptr) int { - r, _, _ := pyModule_AddObject.Call(obj, GoStrToCStr(name), value) + r, _, _ := pyModule_AddObject.Call(obj, msvcrt.StringToCUTF8String(name), value) return int(r) } func PyModule_AddObjectRef(obj uintptr, name string, value uintptr) int { - r, _, _ := pyModule_AddObjectRef.Call(obj, GoStrToCStr(name), value) + r, _, _ := pyModule_AddObjectRef.Call(obj, msvcrt.StringToCUTF8String(name), value) return int(r) } diff --git a/cpy3/PyObject.go b/cpy3/PyObject.go index 6cd8e4b..88bf6e2 100644 --- a/cpy3/PyObject.go +++ b/cpy3/PyObject.go @@ -1,20 +1,22 @@ package cpy3 +import "github.com/aadog/msvcrt-go" + func PyObject_GetAttrString(obj uintptr, attr_name string) uintptr { - r, _, _ := pyObject_GetAttrString.Call(obj, GoStrToCStr(attr_name)) + r, _, _ := pyObject_GetAttrString.Call(obj, msvcrt.StringToCUTF8String(attr_name)) return r } func PyObject_HasAttrString(obj uintptr, attr_name string) int { - r, _, _ := pyObject_HasAttrString.Call(obj, GoStrToCStr(attr_name)) + r, _, _ := pyObject_HasAttrString.Call(obj, msvcrt.StringToCUTF8String(attr_name)) return int(r) } func PyObject_SetAttrString(obj uintptr, attr_name string, v uintptr) int { - r, _, _ := pyObject_SetAttrString.Call(obj, GoStrToCStr(attr_name), v) + r, _, _ := pyObject_SetAttrString.Call(obj, msvcrt.StringToCUTF8String(attr_name), v) return int(r) } func PyObject_DelAttrString(obj uintptr, attr_name string) int { - r, _, _ := pyObject_DelAttrString.Call(obj, GoStrToCStr(attr_name)) + r, _, _ := pyObject_DelAttrString.Call(obj, msvcrt.StringToCUTF8String(attr_name)) return int(r) } diff --git a/cpy3/PyType.go b/cpy3/PyType.go index 9f532b8..3e7d03a 100644 --- a/cpy3/PyType.go +++ b/cpy3/PyType.go @@ -1,8 +1,10 @@ package cpy3 +import "github.com/aadog/msvcrt-go" + func PyType_Name(obj uintptr) string { r, _, _ := pyType_Name.Call(obj) - return CStrToGoStr(r) + return msvcrt.CUtf8ToString(r) } func PyType_GetModule(obj uintptr) uintptr { diff --git a/cpy3/PyUnicode.go b/cpy3/PyUnicode.go index 789ed18..7a8c404 100644 --- a/cpy3/PyUnicode.go +++ b/cpy3/PyUnicode.go @@ -1,9 +1,12 @@ package cpy3 -import "unsafe" +import ( + "github.com/aadog/msvcrt-go" + "unsafe" +) func PyUnicode_DecodeFSDefault(u string) uintptr { - r, _, _ := pyUnicode_DecodeFSDefault.Call(GoStrToCStr(u)) + r, _, _ := pyUnicode_DecodeFSDefault.Call(msvcrt.StringToCUTF8String(u)) return r } func PyUnicode_FromString(u string) uintptr { @@ -13,7 +16,7 @@ func PyUnicode_FromString(u string) uintptr { r, _, _ := pyUnicode_FromString.Call(uintptr(unsafe.Pointer(&b[0]))) return r } - r, _, _ := pyUnicode_FromString.Call(GoStrToCStr(u)) + r, _, _ := pyUnicode_FromString.Call(msvcrt.StringToCUTF8String(u)) return r } func PyUnicode_GetLength(obj uintptr) int64 { @@ -22,5 +25,5 @@ func PyUnicode_GetLength(obj uintptr) int64 { } func PyUnicode_AsUTF8(obj uintptr) string { r, _, _ := pyUnicode_AsUTF8.Call(obj) - return CStrToGoStr(r) + return msvcrt.CUtf8ToString(r) } diff --git a/cpy3/cfuncs.go b/cpy3/cfuncs.go deleted file mode 100644 index bb36a84..0000000 --- a/cpy3/cfuncs.go +++ /dev/null @@ -1,101 +0,0 @@ -package cpy3 - -import ( - "syscall" - "unsafe" -) - -type Pointer = uintptr -type SIZE_T = uintptr - -const sizeOfUintPtr = unsafe.Sizeof(uintptr(0)) - -func uintptrToBytes(u uintptr) []byte { - return (*[sizeOfUintPtr]byte)(unsafe.Pointer(u))[:] -} - -func CStrToGoStr(ustr uintptr) string { - return copyStr(ustr, int(Lstrlen(ustr))) -} - -func CBytesToGoBytes(ustr uintptr, n int) []byte { - return copyBytes(ustr, n) -} - -// 这种跟copyStr3基本一样,只是用go来处理了 -func copyBytes(src uintptr, strLen int) []byte { - if strLen == 0 { - return nil - } - str := make([]byte, strLen) - for i := 0; i < strLen; i++ { - str[i] = *(*byte)(unsafe.Pointer(src + uintptr(i))) - } - return str -} - -// 这种跟copyStr3基本一样,只是用go来处理了 -func copyStr(src uintptr, strLen int) string { - if strLen == 0 { - return "" - } - str := make([]uint8, strLen) - for i := 0; i < strLen; i++ { - str[i] = *(*uint8)(unsafe.Pointer(src + uintptr(i))) - } - return string(str) -} - -// Go的string转换为Lazarus的string -func GoStrToCStr(s string) uintptr { - if s == "" { - return 0 - } - return uintptr(unsafe.Pointer(StringToUTF8Ptr(s))) -} - -// Go的string转换为Lazarus的string -func GoByteToCPtr(b []byte) uintptr { - if len(b) == 0 { - return 0 - } - return uintptr(unsafe.Pointer(&b[0])) -} - -// 字符串到UTF8指针 -func StringToUTF8Ptr(s string) *uint8 { - temp := []byte(s) - utf8StrArr := make([]uint8, len(temp)+1) // +1是因为Lazarus中PChar为0结尾 - copy(utf8StrArr, temp) - return &utf8StrArr[0] -} - -// 字符串到UTF16指针 -func StringToUTF16Ptr(s string) uintptr { - p, _ := syscall.UTF16PtrFromString(s) - return uintptr(unsafe.Pointer(p)) -} - -// UTF16指针到字符串 -func UTF16PtrToString(p uintptr) string { - l := LstrlenW(p) - if l == 0 { - return "" - } - buff := make([]uint16, l) - Memcpy(uintptr(unsafe.Pointer(&buff[0])), p, uintptr(l*2)) - return syscall.UTF16ToString(buff) -} - -func LstrlenW(lpString uintptr) int32 { - r, _, _ := _lstrlenW.Call(lpString) - return int32(r) -} -func Lstrlen(lpString uintptr) int32 { - r, _, _ := _lstrlen.Call(lpString) - return int32(r) -} -func Memcpy(dest, src Pointer, count SIZE_T) Pointer { - r, _, _ := _memcpy.Call(dest, src, count) - return r -} diff --git a/cpy3/cpy3.go b/cpy3/cpy3.go index 2e039a1..79733fa 100644 --- a/cpy3/cpy3.go +++ b/cpy3/cpy3.go @@ -1,6 +1,9 @@ package cpy3 -import "unsafe" +import ( + "github.com/aadog/msvcrt-go" + "unsafe" +) func Py_Initialize() { py_Initialize.Call() @@ -21,9 +24,9 @@ func Py_FinalizeEx() int { } func Py_DecodeLocale(arg string, size uintptr) string { - r, _, _ := py_DecodeLocale.Call(GoStrToCStr(arg), size) + r, _, _ := py_DecodeLocale.Call(msvcrt.StringToCUTF8String(arg), size) defer PyMem_RawFree(r) - return UTF16PtrToString(r) + return msvcrt.CUTF16PtrToString(r) } func PyMem_Free(obj uintptr) { pyMem_Free.Call(obj) @@ -36,7 +39,7 @@ func Py_Main(args []string) int { argc := len(args) argv := make([]uintptr, 0) for _, arg := range args { - argv = append(argv, StringToUTF16Ptr(arg)) + argv = append(argv, msvcrt.StringToCUTF8String(arg)) } r, _, _ := py_BytesMain.Call(uintptr(argc), uintptr(unsafe.Pointer(&argv[0]))) return int(r) @@ -48,36 +51,36 @@ func Py_BytesMain(args []string) int { } func PyRun_AnyFile(fp uintptr, filename string) int { - r, _, _ := pyRun_AnyFile.Call(uintptr(fp), GoStrToCStr(filename)) + r, _, _ := pyRun_AnyFile.Call(uintptr(fp), msvcrt.StringToCUTF8String(filename)) return int(r) } func PyRun_SimpleFile(fp uintptr, filename string) int { - r, _, _ := pyRun_SimpleFile.Call(uintptr(fp), GoStrToCStr(filename)) + r, _, _ := pyRun_SimpleFile.Call(uintptr(fp), msvcrt.StringToCUTF8String(filename)) return int(r) } func PyRun_SimpleString(command string) int { - r, _, _ := pyRun_SimpleString.Call(GoStrToCStr(command)) + r, _, _ := pyRun_SimpleString.Call(msvcrt.StringToCUTF8String(command)) return int(r) } func Py_SetProgramName(name string) { - py_SetProgramName.Call(StringToUTF16Ptr(name)) + py_SetProgramName.Call(msvcrt.StringToCUTF16String(name)) } func Py_GetProgramName() string { r, _, _ := py_GetProgramName.Call() - return UTF16PtrToString(r) + return msvcrt.CUTF16PtrToString(r) } func Py_SetPath(path string) { - py_SetPath.Call(StringToUTF16Ptr(path)) + py_SetPath.Call(msvcrt.StringToCUTF16String(path)) } func Py_SetPythonHome(home string) { - py_SetPythonHome.Call(StringToUTF16Ptr(home)) + py_SetPythonHome.Call(msvcrt.StringToCUTF16String(home)) } func Py_fopen_obj(path uintptr, mode string) uintptr { - r, _, _ := _py_fopen_obj.Call(path, GoStrToCStr(mode)) + r, _, _ := _py_fopen_obj.Call(path, msvcrt.StringToCUTF8String(mode)) return r } @@ -89,6 +92,6 @@ func Py_DecRef(obj uintptr) { } func PyImport_AppendInittab(name string, initfunc uintptr) int { - r, _, _ := pyImport_AppendInittab.Call(GoStrToCStr(name), initfunc) + r, _, _ := pyImport_AppendInittab.Call(msvcrt.StringToCUTF8String(name), initfunc) return int(r) } diff --git a/cpy3/importfuncs.go b/cpy3/importfuncs.go index 66b3308..c5a6b5e 100644 --- a/cpy3/importfuncs.go +++ b/cpy3/importfuncs.go @@ -110,9 +110,9 @@ var ( pyBool_FromLong = libpython3.NewProc("PyBool_FromLong") - pyExc_Exception = libpython3.NewProc("PyExc_Exception") - pyExc_ValueError = libpython3.NewProc("PyExc_ValueError") - pyErr_SetString = libpython3.NewProc("PyErr_SetString") + pyExc_Exception = libpython3.NewProc("PyExc_Exception") + pyExc_ValueError = libpython3.NewProc("PyExc_ValueError") + pyErr_SetString = libpython3.NewProc("PyErr_SetString") pyErr_NewException = libpython3.NewProc("PyErr_NewException") pyInstanceMethod_New = libpython3.NewProc("PyInstanceMethod_New") @@ -125,8 +125,3 @@ var ( _lstrlenW = kernel32dll.NewProc("lstrlenW") _lstrlen = kernel32dll.NewProc("lstrlenA") ) - -var msvcrtdll = syscall.NewLazyDLL("msvcrt.dll") -var ( - _memcpy = msvcrtdll.NewProc("memcpy") -) diff --git a/go.mod b/go.mod index 69ff290..2a982a2 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,6 @@ module github.com/aadog/py3-go go 1.19 -require ( - github.com/aadog/dylib v0.0.0-20210726041103-cf42039dadef -) +require github.com/aadog/dylib v0.0.0-20210726041103-cf42039dadef + +require github.com/aadog/msvcrt-go v0.0.0-20220822112016-492a0c95116a // indirect diff --git a/go.sum b/go.sum index 3ad5ac3..85ed352 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,10 @@ github.com/aadog/dylib v0.0.0-20210726041103-cf42039dadef h1:mGZOvpO7j6BEfP6n0XZR26yJI5JIEOdDob0DIRWCWzg= github.com/aadog/dylib v0.0.0-20210726041103-cf42039dadef/go.mod h1:s1Bk9R0HPteP3SdlPl2hDCeBa62CMsn01myH+/HQJYE= -github.com/aadog/py3-go v0.0.0-20220722183119-ab76c6fd49f7 h1:iJLY1onGTvCk/91bhwRGOrFi6j1EDk8ITCm6jdaMFFg= -github.com/aadog/py3-go v0.0.0-20220722183119-ab76c6fd49f7/go.mod h1:7dr+BHmt134y9ap4HlSrU92rqWCrNvuAm0THs0hyhuU= +github.com/aadog/msvcrt-go v0.0.0-20220822103949-2ae6bd0a8f9a h1:fe+ZByTCw0ZgY5FzOWPtLn+Xry2ih+T12NoVKwU/LlA= +github.com/aadog/msvcrt-go v0.0.0-20220822103949-2ae6bd0a8f9a/go.mod h1:HETwKFf0VX/tk1KIN1TP1BsK/Gahr5QXUUmdEfsIU5c= +github.com/aadog/msvcrt-go v0.0.0-20220822104543-d4bd3cfe3e94 h1:KMKVjIK+WFEhWCLzCMLDUh77VNXR6iYxFQmf+hz61Hw= +github.com/aadog/msvcrt-go v0.0.0-20220822104543-d4bd3cfe3e94/go.mod h1:HETwKFf0VX/tk1KIN1TP1BsK/Gahr5QXUUmdEfsIU5c= +github.com/aadog/msvcrt-go v0.0.0-20220822110527-b41ac413f051 h1:+kIClhSnX52cDq+i7YbQFrHTqsv4xbI/+D8V/3Ree0Q= +github.com/aadog/msvcrt-go v0.0.0-20220822110527-b41ac413f051/go.mod h1:HETwKFf0VX/tk1KIN1TP1BsK/Gahr5QXUUmdEfsIU5c= +github.com/aadog/msvcrt-go v0.0.0-20220822112016-492a0c95116a h1:Abw3+yfycf2dGT4JDUU88yHdk1BSgztnEnwh26ZL2Dk= +github.com/aadog/msvcrt-go v0.0.0-20220822112016-492a0c95116a/go.mod h1:HETwKFf0VX/tk1KIN1TP1BsK/Gahr5QXUUmdEfsIU5c=