Coverage for cuda/core/_utils/cuda_utils.pyx: 72.50%

200 statements  

« prev     ^ index     » next       coverage.py v7.17.2, created at 2026-11-05 01:11 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5import functools 

6import multiprocessing 

7import platform 

8import warnings 

9from collections.abc import Sequence 

10from typing import Any, Callable, NamedTuple 

11  

12from cuda.bindings import driver as driver, nvrtc as nvrtc, runtime as runtime 

13  

14# Module-level annotations that reference `driver`, `nvrtc`, and `runtime` so 

15# that stubgen-pyx keeps these imports in the generated `.pyi` (it would 

16# otherwise trim them as unused). These names are not assigned, so they only 

17# affect __annotations__ and have no runtime cost. 

18_keep_driver_in_stub: 'driver.CUresult' 

19_keep_nvrtc_in_stub: 'nvrtc.nvrtcResult' 

20_keep_runtime_in_stub: 'runtime.cudaError_t' 

21  

22from cuda.bindings.nvvm import nvvmError 

23from cuda.bindings.nvjitlink import nvJitLinkError 

24  

25from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, Py_buffer, PyBUF_SIMPLE 

26  

27from cuda.bindings cimport cynvrtc, cynvvm, cynvjitlink 

28from cuda.core._rt cimport ( 

29 register_warning_category, 

30 take_last_error_detail, 

31) 

32  

33from cuda.core._utils.driver_cu_result_explanations import DRIVER_CU_RESULT_EXPLANATIONS 

34from cuda.core._utils.runtime_cuda_error_explanations import RUNTIME_CUDA_ERROR_EXPLANATIONS 

35  

36  

37class CUDAError(Exception): 

38 """Raised when a CUDA driver or runtime call fails. 

39  

40 The message names the CUDA error and, when one is known, explains it. A 

41 secondary failure observed while the error was being raised, such as a 

42 failed restoration of the caller's CUDA context, is attached as a note 

43 (``__notes__``). See the error handling page of the ``cuda.core`` 

44 documentation for the guarantees an exception provides. 

45 """ 

46  

47  

48class CUDAOutOfMemoryError(CUDAError, MemoryError): 

49 """Raised when a CUDA driver or runtime call fails for lack of memory. 

50  

51 ``CUDA_ERROR_OUT_OF_MEMORY`` and ``cudaErrorMemoryAllocation`` raise this 

52 class. It is both a :class:`CUDAError` and a :class:`MemoryError`, so code 

53 that catches :class:`MemoryError` to retry with a smaller request handles 

54 ``cuda.core`` the same way as other array libraries. 

55  

56 .. versionadded:: 1.3.0 

57 """ 

58  

59  

60class CUDAWarning(RuntimeWarning): 

61 """Warning issued when ``cuda.core`` hits a CUDA error it cannot raise. 

62  

63 ``cuda.core`` raises exceptions for failures in ordinary calls. Some failures 

64 happen where no exception can propagate: while a resource is released by the 

65 garbage collector or by a CUDA callback, including the driver calls that 

66 switch and restore the CUDA context around such a release. Those failures 

67 are reported as this warning instead, and the affected resource may have 

68 leaked. 

69  

70 Filter on this category to make such failures fatal in tests:: 

71  

72 warnings.filterwarnings("error", category=cuda.core.CUDAWarning) 

73  

74 Because the report comes from a destructor, an escalated warning cannot be 

75 raised into user code; it is delivered through :func:`sys.unraisablehook` 

76 (which pytest surfaces as ``PytestUnraisableExceptionWarning``). 

77  

78 .. versionadded:: 1.3.0 

79 """ 

80  

81  

82# Route the C++ handle layer's non-propagating reports through this category. 

83register_warning_category(<PyObject*>CUDAWarning) 

84  

85  

86class NVRTCError(CUDAError): 

87 """Raised when an NVRTC call fails; the compiler log is appended when available.""" 

88  

89  

90  

91class ComputeCapability(NamedTuple): 

92 """A named tuple of (major, minor) CUDA compute capability version numbers.""" 

93 major: int 

94 minor: int 

95  

96  

97def cast_to_3_tuple(label: str, cfg: int | tuple[int, ...]) -> tuple[int, int, int]: 

98 cfg_orig = cfg 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-i.idi!IOf

99 if isinstance(cfg, int): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-i.idi!IOf

100 cfg = (cfg,) 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjglgngogpgqgGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0IYd1I2I3I4IUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohph5I6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthvhwhyhzh' BhChEhFhHhIhKhLhNhOhQhRhThUhWhXhe MbNf-i

101 else: 

102 common = "must be an int, or a tuple with up to 3 ints" 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idi!IOf

103 if not isinstance(cfg, tuple): 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idi!IOf

104 raise ValueError(f"{label} {common} (got {type(cfg)})") 2!I

105 if len(cfg) > 3: 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNf.idiOf

106 raise ValueError(f"{label} {common} (got tuple with length {len(cfg)})") 2.i

107 if any(not isinstance(val, int) for val in cfg): 2kgPdmgQdRdSdTdUd^b_b`b{b|b}b~bacbcLfMfSgYdTggcZd0dqhrhuhxhAh' DhGhJhMhPhShVhYhNfdiOf

108 raise ValueError(f"{label} {common} (got {cfg})") 2di

109 if any(val < 1 for val in cfg): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf-iOf

110 plural_s = "" if len(cfg) == 1 else "s" 2Yd-iOf

111 raise ValueError(f"{label} value{plural_s} must be >= 1 (got {cfg_orig})") 2Yd-iOf

112 return cfg + (1,) * (3 - len(cfg)) 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgkgPdlgmgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgv k Bg6eHb7eCg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e'e^b_b`bDgEgFgGgHgIgJgKgLgMgNgOgPg(e{b|b}bQg)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ w x y VdWd=eXdLcMc% KfLbXbLfXIYIZIMf0ISgYd1I2I3I4ITgUgVggcWgXgYgZg0g1g2g3g4g5g6g7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqh5Irh6I7I8I9I1dz 2d3d?e@e[e4dNcOcshthuhvhwhxhyhzhAh' BhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhe MbNf

113  

114  

115cdef int _get_current_device_id() except? -1: 

116 """Return the current thread's bound CUdevice ordinal.""" 

117 cdef cydriver.CUdevice dev 

118 with nogil: 

119 HANDLE_RETURN(cydriver.cuCtxGetDevice(&dev)) 

120 return <int>dev 

121  

122  

123cdef int _raise_nvrtc_error(cynvrtc.nvrtcProgram prog, cynvrtc.nvrtcResult err) except -1: 

124 """Build error message with program log and raise NVRTCError.""" 

125 cdef const char* err_str = cynvrtc.nvrtcGetErrorString(err) 1ca

126 cdef size_t logsize = 0 1ca

127 if prog != NULL: 1ca

128 cynvrtc.nvrtcGetProgramLogSize(prog, &logsize) 1ca

129 cdef bytes log_bytes 

130 cdef str log_str = "" 1ca

131 if logsize > 1 and prog != NULL: 1ca

132 log_bytes = b" " * logsize 1ca

133 if cynvrtc.nvrtcGetProgramLog(prog, <char*>log_bytes) == cynvrtc.nvrtcResult.NVRTC_SUCCESS: 1ca

134 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 1ca

135 err_msg = f"{err}: {err_str.decode()}" if err_str != NULL else f"NVRTC error {err}" 1ca

136 if log_str: 1ca

137 err_msg += f", compilation log:\n\n{log_str}" 1ca

138 raise NVRTCError(err_msg) 1ca

139  

140  

141cdef int _raise_nvvm_error(cynvvm.nvvmProgram prog, cynvvm.nvvmResult err) except -1: 

142 """Raise nvvmError annotated with the program log.""" 

143 cdef size_t logsize = 0 2%b

144 if prog != NULL: 2%b

145 cynvvm.nvvmGetProgramLogSize(prog, &logsize) 2%b

146 cdef bytes log_bytes 

147 cdef str log_str = "" 2%b

148 if logsize > 1 and prog != NULL: 2%b

149 log_bytes = b" " * logsize 2%b

150 if cynvvm.nvvmGetProgramLog(prog, <char*>log_bytes) == cynvvm.nvvmResult.NVVM_SUCCESS: 2%b

151 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 2%b

152 cdef object exc = nvvmError(err) 2%b

153 if log_str: 2%b

154 exc.args = (exc.args[0] + f"\nNVVM program log: {log_str}", *exc.args[1:]) 2%b

155 raise exc 2%b

156  

157  

158cdef int _raise_nvjitlink_error( 

159 cynvjitlink.nvJitLinkHandle handle, cynvjitlink.nvJitLinkResult err) except -1: 

160 """Raise nvJitLinkError annotated with the error log.""" 

161 cdef size_t logsize = 0 2b ]e

162 if handle != NULL: 2b ]e

163 cynvjitlink.nvJitLinkGetErrorLogSize(handle, &logsize) 1b

164 cdef bytes log_bytes 

165 cdef str log_str = "" 2b ]e

166 if logsize > 1 and handle != NULL: 2b ]e

167 log_bytes = b" " * logsize 1b

168 if cynvjitlink.nvJitLinkGetErrorLog(handle, <char*>log_bytes) == \ 1b

169 cynvjitlink.nvJitLinkResult.NVJITLINK_SUCCESS: 1b

170 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 1b

171 cdef object exc = nvJitLinkError(err) 2b ]e

172 if log_str: 2b ]e

173 exc.args = (exc.args[0] + f"\nnvJitLink error log: {log_str}", *exc.args[1:]) 1b

174 raise exc 2b ]e

175  

176  

177_RUNTIME_SUCCESS = runtime.cudaError_t.cudaSuccess 

178cdef object _RUNTIME_OUT_OF_MEMORY = runtime.cudaError_t.cudaErrorMemoryAllocation 

179_NVRTC_SUCCESS = nvrtc.nvrtcResult.NVRTC_SUCCESS 

180  

181  

182cdef inline void _attach_detail(exc, str detail): 

183 # PEP 678 notes keep the detail separable from the message. 

184 exc.add_note(detail) 1dAp

185  

186  

187cdef int _raise_driver_error(cydriver.CUresult error) except -1 nogil: 

188 cdef const char* name 

189 cdef const char* desc 

190 # A context-scoped helper in the handle layer may have recorded why this 

191 # status needs more explanation (e.g. the caller's context was not restored). 

192 cdef const char* detail = take_last_error_detail(error) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

193 name_err = cydriver.cuGetErrorName(error, &name) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

194 if name_err != cydriver.CUresult.CUDA_SUCCESS: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

195 raise CUDAError(f"UNEXPECTED ERROR CODE: {error}") 2hcj

196 desc_err = cydriver.cuGetErrorString(error, &desc) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

197 with gil: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

198 exc_type = ( 

199 CUDAOutOfMemoryError if error == cydriver.CUresult.CUDA_ERROR_OUT_OF_MEMORY 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

200 else CUDAError 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wchcj d p s t Nb/bu Xc:b

201 ) 

202 # TODO: consider lower this to Cython 

203 expl = DRIVER_CU_RESULT_EXPLANATIONS.get(int(error)) 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

204 if expl is not None: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

205 exc = exc_type(f"{name.decode()}: {expl}") 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

206 elif desc_err != cydriver.CUresult.CUDA_SUCCESS: 

207 exc = exc_type(name.decode()) 

208 else: 

209 exc = exc_type(f"{name.decode()}: {desc.decode()}") 

210 if detail != NULL: 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

211 _attach_detail(exc, detail.decode()) 1dAp

212 raise exc 2'b(b)b*b+bf ,bPcQcRcScTcUc-bVc.bC g h q i r Wc5dhcj d A p dcs t Nb/bB u Xc:b

213  

214  

215cdef int _raise_runtime_error(error) except -1: 

216 # `_check_error()` reaches this path only for `runtime.cudaError_t` values. 

217 # Use the enum name directly because Windows hybrid cudart can lag that table. 

218 name = error.name 2#I$IPfj

219 exc_type = CUDAOutOfMemoryError if error == _RUNTIME_OUT_OF_MEMORY else CUDAError 2#I$IPfj

220 expl = RUNTIME_CUDA_ERROR_EXPLANATIONS.get(int(error)) 2#I$IPfj

221 if expl is not None: 2#I$IPfj

222 raise exc_type(f"{name}: {expl}") 2#I$IPfj

223 desc_err, desc = runtime.cudaGetErrorString(error) 2Pfj

224 if desc_err != _RUNTIME_SUCCESS: 2Pfj

225 raise exc_type(f"{name}") 

226 desc = desc.decode() 2Pfj

227 raise exc_type(f"{name}: {desc}") 2Pfj

228  

229  

230cdef int _raise_nvrtc_status_error(error, handle) except -1: 

231 err = f"{error}: {nvrtc.nvrtcGetErrorString(error)[1].decode()}" 2eiMK

232 if handle is not None: 2eiMK

233 _, logsize = nvrtc.nvrtcGetProgramLogSize(handle) 2ei

234 log = b" " * logsize 2ei

235 _ = nvrtc.nvrtcGetProgramLog(handle, log) 2ei

236 err += f", compilation log:\n\n{log.decode('utf-8', errors='backslashreplace')}" 2ei

237 raise NVRTCError(err) 2eiMK

238  

239  

240cdef inline int _check_error(error, handle=None) except?-1: 

241 if isinstance(error, driver.CUresult): 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

242 return _check_driver_error(error) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLs)dMsNsOsPsQsRsSsTsUsVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*s+s,s-s.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|D}D~DaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwEe xEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

243 elif isinstance(error, runtime.cudaError_t): 2^eGiHiIiJiKi'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe

244 return _check_runtime_error(error) 2GiHiIiJiKi

245 elif isinstance(error, nvrtc.nvrtcResult): 2^e'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe

246 return _check_nvrtc_error(error, handle=handle) 2^e'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe

247 else: 

248 raise RuntimeError(f"Unknown error type: {error}") 

249  

250  

251def handle_return(result: tuple[Any, ...], handle: object = None) -> Any: 

252 _check_error(result[0], handle=handle) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

253 cdef int out_len = len(result) 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

254 if out_len == 1: 2^e/i:i;i=i?i@i[iQf]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbnv cnk dnenfngnHbhninjnknlnicmnjcnneconpnkcqnrnlcsnmctnncunvnwnocxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=occ?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r$d.rq /ri :r;r=r%d?r@rr [r'd]r(d^r_r3c`r{r+f|r,f}rgf~rasbscsds-fesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s.f)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuXbDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnv'covpvz qv(crv)csvtvuvb *cvv+cwv,cxv-cyv.czv/cAv:cBv;cCv=cDv?cEv@cFv[cGv]cHv^cIv_cJv`cKv{cLv|cMv}cNv~cOvadPvbdQvcdRvddSvedTvfdUvgdVvhdWvidXvjdYvkdZv0vld1v2v3vmd4vnd5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.v/v:vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxs nxt oxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y?f)y*yyf+y,y-y.y/y:y;y=y?y@yzf[yB ]yAf^yBf_y@f`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznz[fozpzqzrzsztzuzvzwzxzyzzzAzBzydCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z+d3z,d4z-d5z6z7z8zZh.d9z0h/d!z1h:d#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B2h+B,B-B3h.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D;d+DHc=d,D?d-D@d.D[d/D]d:D^d;Dzd=DAd?DBd@D_d[D`d]D{d^D|d_DIc`DJc{DCd|D}d}DDd~D~daEaebEbecEcedEEdeEdefEFdgEGdhEHdiEIdjEeekEfelEgemEhenEieoEjepEkeqElerEmesEJdtEKduELdvEwEe xEc yEnezEoeAEpeBEqeCEreDEseEEteFEueGEveHE4hIEJEKELEMENEOEPEQERESETEUEVEWEweXExeyeYEZE0E1E2E3E4E5E6E7E8E9E!Ea #E5h6hze$E_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h%E.h/h:h;h=h?h@h[h]h^h'E(E)E*E_h`h{hAeBeCeDeEe+EFeGeHeIeJe,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5GMb6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

255 return 2/iD E 6dF G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 7d`eYcv k Hbicjceckclcmcncocl m n o 7 8 9 ! IbJbKbccfi# $ sc{e|e8d9dtc!d}eucvcwc#d~eafbfcfxcgihiyczcAciijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFidfefw x y ffVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$dq i %dr 'd(d3c+f,fgf-f4c5c6c7c8c9c!c#c$c%c)dhfif.fjfd kfA lfLip mf% MiNiLbXbOiPinfofpfqfQiRiSiTiUiViWiXi/v:vBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbYirfs t Zi0i1i2isftfuf3i4ivf5iwfxdxf?fyfzfB AfBf@fCfDfEf[fHce FfMbMd

256 elif out_len == 2: 

257 return result[1] 2^e:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjD ijjjkjE lj6dmjF njojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHj_eIjJjKjLjG MjH NjI OjJ PjK QjL RjM SjN TjO UjP VjQ WjR XjS YjT ZjU 0jV 1jW 2jX 3jY 4jZ 5j0 6j1 7j2 8j3 9j4 !j5 #j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl0l1l2l3l4l5l6l7l8l9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmGbwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m7d4m`e5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=mYc?m@m[m]m^m_m`m{m|m}m~manbncnk dnenfngnHbhninjnknlnmnnneconpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn0n1n2n3n4n5n6n7n8n9n!n#n$nl %nm 'nn (no )n7 *n8 +n9 ,n! -nIb.nJb/nKb:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_opc`oqc{orc|ofi}o~oapbpcpdpepfp# gphpipjpkplpmpnpopppqprpsp$ tpupvpwpscxp{eyp|ezp8dAp9dBpCpDpEpFpGpHptcIp!dJpKp}eLpucMpvcNpwcOp#dPp~eQpafRpbfSpcfTpUpVpWpXpYpZp0p1p2p3p4p5p6p7pxc8pgi9phi!pyc#pzc$p%pAc'pii(p)pji*p+pki,pli-p.pmi/p:pni;poi=ppi?pqi@p[p]p^p_p`p{p|p}p~paqribqcqsidqeqtifqgquihqiqvijqwikqxilqRfyimqnqSfzioqpqAiTfBiqqrqUfCisqDitquqEivqwqFixqyqzqAqBqCqDqdfEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!qef#q$q%q'q(q)q*q+q,qw -qx .qy /q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrffdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrVfQrWfRrXfSrYfTrZfUr0fVr1fWr2fXr3fYr4fZr5f0r6f1r2r3r4r7f5r8f6r7rZc8r0c9r1c!r2c#r9f$r!f%r#f'r$f(r%f)r'f*r(f+r)f,r*f-r.r/ri :r;r=r?r@r[r]r^r_r3c`r{r|r}rgf~rasbscsdsesfsgshsisjsksls4cms5cns6cos7cps8cqs9crs!css#cts$cus%cvswsxsGiyszsAsBsCsDsEsFsGsHsIsJsHiKsLs)dMsNsOsPsQsRsSsTsUsIiVsWsXshfYsifZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*sJi+s,s-sKi.s/sjf:sd ;skf=sA ?slf@s[sLi]sp ^s_s`s{s|s}s~satbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytztAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtmfZt0t1t2t3t*d4t5t6t7t8t9t!t#t$t%t't(t)t*t+t,t-t.t/t:t;t=t?t@t[t]t^t_t/f`t:f{t|t;f}t~t% aubuMiNicudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzuAuBuLbCuDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8vOi9vPi!vnf#vof$vpf%vqf'v(v)vQiRiSiTi*v+v,vUiViWi-vXi.vBc;v;b=vYb?vZb@v0b[v=b]v1b^v2b_vCc`vod{vpd|vqd}v( ~vObaw) bw* cw+ dw, ew- fw. gw/ hw: iw; jwPbkw= lw? mw@ nw[ ow] pw^ qw_ rw` swQbtwDcuw?bvw3bww4bxw5byw@bzw6bAw7bBwEcCwrdDwsdEwtdFw{ GwRbHw| Iw} Jw~ KwabLwbbMwcbNwdbOwebPwfbQwSbRwgbSwhbTwibUwjbVwkbWwlbXwmbYwnbZwTb0wFc1w[b2w8b3w9b4w!b5w]b6w#b7w$b8wGc9wud!wvd#wwd$wob%wUb'wpb(wqb)wrb*wsb+wtb,wub-wvb.wwb/wxb:wVb;wyb=wzb?wAb@wBb[wCb]wDb^wEb_wFb`wWb{wYi|wrf}w~waxbxcxdxexfxgx=fhxixjxkxlxmxnxoxZi0i1ipx2iqxsftfrxsxtxufuxvxwxxxyxzxAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFy3i4iGyvfHyIyJyKy5iLywfMyNyOyPyQyRySyTyUyVyWyXyYyxdZy0y1y2y3y4y5y6y7y8yxf9y!y#y$y%y'y(y)y*yyf+y,y-y.y/y:y;y=y?y@yzf[y]yAf^yBf_y`yCf{yDf|y}y~yazbzczEfdzezfzgzhzizjzkzlzmznzozpzqzrzsztzuzvzwzxzyzzzAzBzCzDzEzFz]fGzHzIzJzKzLzMzNzu OzPzQzRzSzTzUzVzWzXz^fYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[z]z^z_z`z{z|z}z~zaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzBABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_B`B{B|B}B~BaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+DHc,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|D}D~DaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwEe xEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.EFf/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzFAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFagRFbgSFTFUFVFWFXFYFZF0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+Fcg,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGGfYGdgZG0G1G2G3G4G5G6G7G8G9G!Geg#G$G%G'G(G)G*G+G,G-GMd.G/G:Gfg;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzHAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH0H1H2H3H4H5H6H7H8H9H!H#HHf$Hgg%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIeIfIgIhIiIjIkIlI

258 else: 

259 return result[1:] 2^eQfD E 6dF _eG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 7d# $ 'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndyd+d,d-dZh.d0h/d1h:d2h3h;dHc=d?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLdc neoepeqereseteueve4hwexeyea 5h6hze_f`f{f|f}f~f7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hAeBeCeDeEeFeGeHeIeJe

260  

261  

262cpdef object check_or_create_options(type cls, object options, str options_description="", bint keep_none=False): 

263 """ 

264 Create the specified options dataclass from a dictionary of options or None. 

265 """ 

266 if options is None: 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItIhgigjg.K/KPdlg:K;KQdng=K?KRdog@K[KSdpg]K^KTdqg_K`KUdGb{Krgsgtgugvg|K}K~Kwgxgygzg7d`eaLbLcLAgdLeLfLgLYc%IhLiLjLkLlLmLnLoLpLYJ'Iv k qLBg6eHb7erLsLtLicjcecuLkc(IlcmcncvLwLocCgxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvIPLQLDgEgFgRLSLGgHgIgTLJgKgLgMgNg6iOgPgUL*I(eVLWL{b|b}bXLYLZLwIxIQg0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*eccRg7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ !JBI#Jsc$J%J|e'J8d%L9d'L(J)J(L)L*L*J+L+J,Jtc-J!d.J}e/Juc,Lvc-Lwc.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J/L:L;L=L?L@L[L]Lxc^L_L`Lyc{Lzc|LAc}L~LaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMRfrMsM}JtMSfuMvMwMTfxMyMzMUfAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMdfQMRMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,M-Mw .Mx /My :M|h}h!i#i~hai$i%i=ICI?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*N+N,N-N.N/N:N'i;N=N)d?N@Nhfif.fjfd kflf[N]N]IVd^I^N_N`N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrO~JaKsOtOuObKXdcKLcvOMcwOdKxOeKyOfKmfgKhKiKzOjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iKfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8gZd0d9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Ondnfofpfqf|O}O~OaPbPcPdPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfPgPhPiPdcjP|IkP=f}IlPmPs t sftfnPoPpPqPufDI~IaJrPsPbJcJdJeJEItPfJuPvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNbvfwf[P]P^P/bDJ_P`P{P|P}P~PxdaQbQcQdQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fydwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ+d,d-dTQUQVQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRIfNdOdfcKcyRzRARBRCRshDRERFRGRthHRIRJRKRLRMRvhNRORPRQRwhRRSRTRyhURVRWRXRzhYRZR' 0R1RJJKJ2R3R4RBh5R6R7R8RCh9R!R#R$R%R'REh(R)R*R+RFh,R-R.RHh/R:R;R=RIh?R@R[RKh]R^R_R`RLh{R|R}RNh~RaSbScSOhdSeSfSQhgShSiSjSRhkSlSmSThnSoSpSqSUhrSsStSuSWhvSwSxSySXhzSASBSCSDSES;dHc=dHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde c neoepeqereseteueveFSGS%bHSIS:bJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJKYSZS0S1S2S3Swe4S5S6S7SKKxeLJye8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=SFf?S@S[S]S^S_S`S{S|S}S~SaTbTcTdTeTLKfTgThTiTMJjTkTlTmTnToTpTqTrTagbgcgsTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJLTMTNTOTPTQTRTSTTTUTVTWTXTGfdgYTZT0T1T2T3TMb4T5TVJegWJ6T7Tci8TMd9Tfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfggoUpUqU

267 if keep_none: 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItI.K/K:K;K=K?K@K[K]K^K_K`KGb{K|K}K~K7d`eaLbLcLdLYc%IjLkLlLmLnLoLpLYJ'Iv k 6eHb7erLsLtLicjcecuLkc(IlcmcncvLwLocxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvITL6iUL*I(eVLWL{b|b}bXLYLZLwIxI0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*e7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ BIsc$J%J|e'J8d%L9d'L(J)J(L)L*L*J+L+J,Jtc-J!d.J}e/Juc,Lvc-Lwc.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J/L:L;L=L?L@L[L]Lxc^L_L`Lyc{Lzc|LAc}L~LaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMRfrMsM}JtMSfuMvMwMTfxMyMzMUfAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMdfQM-Mw x y |h}h!i#i~hai$i%i=ICI?I[I+N,N-N.N/N:N;N=N)d?N@Nhfif.fd [N]N]IVd^I_N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrOsOtOuOXdLcMcyOmfzO*d% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iLbXbgcZd0d1dz 2d3dnfofpfqf|O}O~OaPbPcPdPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfPgPhPiPjP|I}IlPsftfnPoPpPqPufDI~IaJrPsPbJcJdJeJEItPfJuPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPoJpJqJrJsJtJFIGIHIuJvJwJxJyJzJAJBJCJNbvfwf[P]P^PDJxdaQbQcQ?eEJFJGJ@e[eHJIIIJwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRfcyRzRARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR' JJKJ2R3R4R5R6R7R8R9R!R#R$R%R'R(R)R*R+R,R-R.R/R:R;R=R?R@R[R]R^R_R`R{R|R}R~RaSbScSdSeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSxSySzSASBSES=de c neFSGS%bHS:bYSZS0S3S4S5S6S7SxeLJyea Ff?S@S^S_S`S{SaTbTcTdThTMJjTmTnTpTqTrTagbgcgsTJINJKIOJPJQJRJSJTJUJLTMTNTOTPTQTSTTTUTVTWTXT0TMb4TVJWJMdfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfggoUpUqU

268 return options 2}KdLYJv k rLsLtLicjcecuLkclcmcncvLwLocZJ0J1J2J3J4J5J6J7J8J9Jl m n o 7 8 9 ! 6i7i8iC pcqcrc9iBI$J%J'J8d9d(J)J(L*J+J,J-J!d.J/Jucvcwc#d:J;J=J?J@J[J]J^J_J`J{J|J/L;LxcyczcAcmMoMpMRfsM}JSfvMTfyMUfBMDMFMHMJMLMNMPMQM-M[I;N=N)dhf.fXdLcMc(iBK)i*i1dz 2d3dcPdPgPhPiPjP}IlPufDI~IaJrPsPbJcJdJeJEItPfJuPgJLPhJMPiJNPjJOPkJPPlJQPmJRPnJSPoJpJqJFIGIHIxJyJzJAJBJCJ[P]P^PII4dNcOcyRCRJRMRTR' 4R'R.R[R}RfSmSuSe FfpTqTrTagbgcgsTJIKILTMTNTOTPTQTSTTTUTVTWTXT0TMbVJWJfg!T#T$T%T'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_T`T{T|T}T~TaUbUcUdUeUfUgUhUiUjUkUlUmUnUHfoUpUqU

269 return cls() 2NKOKPK'bQK(bQfRKSKTK)b*b+bUKVKKeWKXKYKZK0K1KD LeMeE 6dF Ne2K3KOePeQeRe4KSeTe5K6KUef ,bVe7KWeXeYe_e8KZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 9K!K#K$K%K'K(K)K*K0e+K,K-K1e2e3e4e5emInIoIpIqIrIsItI.K/K:K;K=K?K@K[K]K^K_K`KGb{K|K~K7d`eaLbLcLYc%IjLkLlLmLnLoLpLYJ'Iv k 6eHb7eicjceckc(IlcmcncocxLyL8e9e!e#e$e6 -bZJ0J1J2J3J4J5J6J7J8J9JzLALBLl m n o 7 8 9 ! IbJbKbCLDLELFLGLHLIL%eJL)I'eKLLL^b_b`bMLNLOLuIvITL6iUL*I(eVLWL{b|b}bXLYLZLwIxI0L.b+I)e1L2L~bacbc3L4L5LyIzI6L*e7i8iAIC pcqcrcg 7L8L9L!L# +e,e#L-e.e/e$L9i:eh ;e$ sc$J%J|e'J8d%L9d'L(J)J)L*L*J+L+J,Jtc-J!d.J}e/J,L-L.L#d~e:Jaf;Jbf=Jcf?J@J[J]J^J_J`J{J|J:L=L?L@L[L]L^L_L`L{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlMnMqMrM}JtMuMwMxMzMAMCMEMGMIMKMMMOMdfw x y |h}h!i#i~hai$i%i=ICI?I+N,N-N.N/N:N)d?N@Nifd [N]N]IVd^I_N{N|N}N~NaObOWdcOdOeOfO_I`I{I=egOhOiOjOkOlOmOnOoOpOqOrOsOtOuOXdLcMcyOmfzO*d% GO(iHOIOJOKOLOMOBKNOOOPOQO)iROSOTOUOVOWOXO*iLbXbgcZd0d1dz 2d3dnfofpfqf|O}O~OaPbPBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbrfePfP|IsftfnPoPpPqPDIEIrJsJtJFIGIHIuJvJwJNbvfwfDJxdaQbQcQ?eEJFJGJ@e[eHJIIIJwQxQyQ]fzQAQBQCQDQ4dEQu FQGQHQIQJQKQLQMQNQOQ^fPQQQRQSQ.d/d:dNcOcWQXQYQZQ0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q+Q,Q-Q.Q/Q:Q;Q=Q?Q@Q[Q]Q^Q_Q`Q{Q|Q}Q~QaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRfczRARBRDRERFRGRHRIRKRLRNRORPRQRRRSRURVRWRXRYRZR' JJKJ2R3R5R6R7R8R9R!R#R$R%R(R)R*R+R,R-R/R:R;R=R?R@R]R^R_R`R{R|R~RaSbScSdSeSgShSiSjSkSlSnSoSpSqSrSsStSvSwSxSySzSASBSES=de c neFSGS%bHS:bYSZS0S3S4S5S6S7SxeLJyea ?S@S^S_S`S{SaTbTcTdThTMJjTmTnTJINJKIOJPJQJRJSJTJUJMb4TMdHfgg

270 elif isinstance(options, cls): 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgPdlgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgeLfLgLYc%IhLiL'Iv k qLBg6eHb7e(ICg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e)I'e^b_b`bPLQLDgEgFgRLSLGgHgIgJgKgLgMgNgOgPg*I(e{b|b}bQg+I)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ !JBI#JRMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,Mw .Mx /My :M|h}h!i#i~hai$i%i=ICI?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*N'ijfkflf]IVd^I^N`NWd_I`I{I=e~JaKbKXdcKLcvOMcwOdKxOeKfKgKhKiKjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% KfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Onddc|IkP=f}ImPs t DI~IaJbJcJdJeJEIfJvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJhJiJjJkJlJmJnJTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNb/bDJ_P`P{P|P}P~PxddQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fyd4d+d,d-dTQUQVQNcOcIfNdOdfcKcshthvhwhyhzh' 0R1RJJKJBhChEhFhHhIhKhLhNhOhQhRhThUhWhXhCSDS;dHcHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde oepeqereseteueveISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJK1S2SweKKLJ8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=S[S]S|S}S~SeTLKfTgTiTMJkTlToTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJRTGfdgYTZT1T2T3TMb5TVJegWJ6T7Tci8TMd9T

271 return options 2KeD LeMeE F NeOePeQeReSeTeUef VeWeXeYeZeG H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 0e1e2e3e4e5ehgigjgPdlgQdngRdogSdpgTdqgUdGbrgsgtgugvgwgxgygzgAgeLfLgLYc%IhLiL'Iv k qLBg6eHb7e(ICg8e9e!e#e$e6 l m n o 7 8 9 ! IbJbKb%e)I'e^b_b`bPLQLDgEgFgRLSLGgHgIgJgKgLgMgNgOgPg*I(e{b|b}bQg+I)e~bacbc*eccRgg # +e,e-e.e/e:eh ;e$ RMSMTMUMVMWMXM,IYM-IZM0M1M2M3M4M5M6M.I7M/I8M:I9M;I!M#M$Mef%M'M(M)M*M+M,Mw .Mx /My :M!i#i$i%i=I?I;M=M?M@M[M]Mff^M_M`M{M|M}M~MaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNZc0c1c2cUNVNWNXNYNZN0N1N2N$dq i 3N4N%d@Ir 'd(d3c5N+f,fgf6N7N8N[I-f9N!N#N$N%N'N(N4c5c6c7c8c9c!c#c$c%c)N*Njfkflf]IVd^I^N`NWd_I`I{I=e~JaKbKXdcKLcvOMcwOdKxOeKfKgKhKiKjK*dkKlKmKnKoKpKqKrKsKtKuKvKwKxKAOBOCODOEOFOyK/f:fbizKAK% KfLbXbUgVggcWgXgYgZg0g1g2g3g4g5g6gCK7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gDKahbhchdhehfhghhhihjhkhlhmhnhohphYO'c1dz ZO(c0O)c2d3db *c1O+c2O,c3O-c4O.c5O/c6O:c7O;c8O=c9O?c!O@c#O[cEK]cFK^c$O_c%O`c'O{c(O|c)O}c*O~c+Oad,Obd-Ocd.Odd/Oed:Ofd;Ogd]ehd=Oid?Ojd@Okd[O]O^Old_O`OGKmd{Onddc|IkP=f}ImPs t DI~IaJbJcJdJeJEIfJvPwPxPyPzPAPBPCPDPEPFPGPHPIPJPKPgJhJiJjJkJlJmJnJTPUPVPWPXPYPZP0P1P2P3P4P5P6P7P8P9PoJ!P#PpJ$P%PqJ'PrJsJtJFIGIHIuJvJwJ(P)P*P+PxJyJzJ,P-P.P/PAJ:P;P=PBJCJ?P@PNb/bDJ_P`P{P|P}P~PxddQeQxffQ?egQhQ?fyfEJFJGJ@e[eHJiQzfB AfBf@fCfDfjQkQlQmQnQEfoQIIpQqQrQsQtQIJuQvQ[fyd4d+d,d-dTQUQVQNcOcIfNdOdfcKcshthvhwhyhzh' 0R1RJJKJBhChEhFhHhIhKhLhNhOhQhRhThUhWhXhCSDS;dHcHK?d@d[d]d^dzdAdBd_d`d{d|dIcJcCd}dDd~daebeceEddeFdGdHdIdeefegeheiejekelemeJdKdLde oepeqereseteueveISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSIKJK1S2SweKKLJ8S9S!S#S$S%S'S(S)S*S+S,Sa zeAeBeCeDeEeFeGe-S.S/S:SHe;SIeJe=S[S]S|S}S~SeTfTgTiTMJkTlToTtTuTvTwTxTyTzTATBTCTDTETJINJFTKIOJPJGTQJRJHTITJTKTSJTJUJRTGfdgYTZT1T2T3TMb5TVJegWJ6T7Tci8TMd9T

272 elif isinstance(options, dict): 2!JBI#J|h}h~haiCI'ibiLKci

273 return cls(**options) 2!JBI#J|h}h~haiCILK

274 else: 

275 raise TypeError( 2'ibici

276 f"The {options_description} must be provided as an object " 2'ibici

277 f"of type {cls.__name__} or as a dict with valid {options_description}. " 2'ibici

278 f"The provided object is '{options}'." 2'ibici

279 ) 

280  

281  

282def _handle_boolean_option(option: bool) -> str: 

283 """ 

284 Convert a boolean option to a string representation. 

285 """ 

286 return "true" if bool(option) else "false" 2'cz (c)cb *c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldGKmdndydNcOczdAdBdDdHdIdJdKdLde aV

287  

288  

289def precondition(checker: Callable[..., None], str what="") -> Callable[..., Any]: 

290 """ 

291 A decorator that adds checks to ensure any preconditions are met. 

292  

293 Args: 

294 checker: The function to call to check whether the preconditions are met. It has 

295 the same signature as the wrapped function with the addition of the keyword argument `what`. 

296 what: A string that is passed in to `checker` to provide context information. 

297  

298 Returns: 

299 Callable: A decorator that creates the wrapping. 

300 """ 

301  

302 def outer(wrapped_function: Callable) -> Callable: 2+i

303 """ 

304 A decorator that actually wraps the function for checking preconditions. 

305 """ 

306  

307 @functools.wraps(wrapped_function) 2+i

308 def inner(*args, **kwargs) -> Any: 

309 """ 

310 Check preconditions and if they are met, call the wrapped function. 

311 """ 

312 checker(*args, **kwargs, what=what) 2+i

313 result = wrapped_function(*args, **kwargs) 2+i

314  

315 return result 2+i

316  

317 return inner 2+i

318  

319 return outer 2+i

320  

321  

322def is_sequence(obj: object) -> bool: 

323 """ 

324 Check if the given object is a sequence (list or tuple). 

325 """ 

326 return isinstance(obj, Sequence) 2Gbw x y VdWd~JaKbKcKLcMcdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzKAK% KfCKDKEKFKHKIcJcCdEdFdGdbVcVdVeVfVgVe IKJKhViVjVXUYUZUKK_f`f{f|f}f~fkVlVmVnVGf

327  

328  

329def is_nested_sequence(obj: object) -> bool: 

330 """ 

331 Check if the given object is a nested sequence (list or tuple with atleast one list or tuple element). 

332 """ 

333 return is_sequence(obj) and any(is_sequence(elem) for elem in obj) 2IcJcXUYUZU

334  

335  

336# Track whether we've already warned about fork method 

337_fork_warning_checked = False 

338  

339  

340def reset_fork_warning() -> None: 

341 """Reset the fork warning check flag for testing purposes. 

342  

343 This function is intended for use in tests to allow multiple test runs 

344 to check the warning behavior. 

345 """ 

346 global _fork_warning_checked 

347 _fork_warning_checked = False 2IfNdOdfcJfKc

348  

349  

350cdef inline tuple _read_fill_ptr(const char* ptr, Py_ssize_t width): 

351 """Extract (value, element_size) from a raw pointer of known width.""" 

352 cdef unsigned int val 

353 if width == 1: 2LIMINIOIPIQIRISITIUIVIWIXJ6 ;bYbZb0b=b1b2b( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb?b3b4b5b@b6b7b{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTb[b8b9b!b]b#b$bobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb

354 val = (<uint8_t*>ptr)[0] 2Yb) * + = ? 3b| } ~ gbhb8bpbqbrbybzb

355 elif width == 2: 

356 val = (<uint16_t*>ptr)[0] 2LINIPIRITIVIZb0b, - . @ [ ] 4b5babbbcbibjbkb9b!bsbtbubAbBbCb

357 elif width == 4: 

358 val = (<uint32_t*>ptr)[0] 2MIOIQISIUIWI6 1b2b( / : ; ^ _ ` 6b7b{ dbebfblbmbnb#b$bobvbwbxbDbEbFb

359 else: 

360 raise ValueError(f"value must be 1, 2, or 4 bytes, got {width}") 2XJ;b=bObPbQb?b@bRbSbTb[b]bUbVbWb

361 return (val, <unsigned int>width) 2LIMINIOIPIQIRISITIUIVIWI6 YbZb0b1b2b( ) * + , - . / : ; = ? @ [ ] ^ _ ` 3b4b5b6b7b{ | } ~ abbbcbdbebfbgbhbibjbkblbmbnb8b9b!b#b$bobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFb

362  

363  

364cpdef tuple _parse_fill_value(value): 

365 """Parse a fill/memset value into (raw_value, element_size). 

366  

367 Parameters 

368 ---------- 

369 value : int or buffer-protocol object 

370 - int: Must be in range [0, 256). Treated as 1-byte fill. 

371 - bytes or buffer-protocol: Must be 1, 2, or 4 bytes. 

372  

373 Returns 

374 ------- 

375 tuple of (int, int) 

376 (raw_value, element_size) where element_size is 1, 2, or 4. 

377  

378 Raises 

379 ------ 

380 OverflowError 

381 If int value is outside [0, 256). 

382 TypeError 

383 If value is not an int and does not support the buffer protocol. 

384 ValueError 

385 If value byte length is not 1, 2, or 4. 

386 """ 

387 cdef uint8_t byte_val 

388 cdef Py_buffer buf 

389  

390 if isinstance(value, int): 2mInIoIpIqIrIsItIrUsULIMItUuUNIOIvUwUPIQIxUyURISIzUAUTIUIBUCUVIWIXJv k icjceckclcmcncoc6 DUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iBc;bYbZb0b=b1b2bCcodpdqd( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7bEcrdsdtd{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bGcudvdwdobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWbMUNUOU' PUQURUSUTUUUVUWU

391 byte_val = value 2mInIoIpIqIrIsItIrUsUtUuUvUwUxUyUzUAUBUCUv k icjceckclcmcncocDUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iCcodpdqdEcrdsdtdGcudvdwdMUNUOU' PUQURUSUTUUUVUWU

392 return (<unsigned int>byte_val, <unsigned int>1) 2mInIoIpIqIrIsItIrUsUtUuUvUwUxUyUzUAUBUCUv k icjceckclcmcncocDUl m n o uIvIEUFUGUHU6iIUwIxIyIzI7i8iAIC pcqcrcJUKU9isc{eLUtcucvcwcxcyczcAc;f(i)i*iCcEcGcMUNUOU' PUQURUSUTUUUVUWU

393  

394 if isinstance(value, bytes): 2LIMINIOIPIQIRISITIUIVIWIXJ6 Bc;bYbZb0b=b1b2b( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc?b3b4b5b@b6b7b{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFc[b8b9b!b]b#b$bobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb

395 return _read_fill_ptr(<const char*><bytes>value, <Py_ssize_t>len(value)) 2LIMINIOIPIQIRISITIUIVIWIXJ;bYbZb0b=b1b2b?b3b4b5b@b6b7b[b8b9b!b]b#b$b

396  

397 if PyObject_GetBuffer(value, &buf, PyBUF_SIMPLE) != 0: 26 Bc( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` QbDc{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbFcobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb

398 raise TypeError( 

399 f"value must be an int or support the buffer protocol, " 

400 f"got {type(value).__name__}" 

401 ) 

402 try: 26 ( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb

403 return _read_fill_ptr(<const char*>buf.buf, buf.len) 26 ( Ob) * + , - . / : ; Pb= ? @ [ ] ^ _ ` Qb{ Rb| } ~ abbbcbdbebfbSbgbhbibjbkblbmbnbTbobUbpbqbrbsbtbubvbwbxbVbybzbAbBbCbDbEbFbWb

404 finally: 

405 PyBuffer_Release(&buf) 

406  

407  

408def check_multiprocessing_start_method() -> None: 

409 """Check if multiprocessing start method is 'fork' and warn if so.""" 

410 global _fork_warning_checked 

411 if _fork_warning_checked: 20U1U,I-I2U3U4U5U6U7U.I/I:I;Iw x y |h}h!i#i~hai$i%i8U9U!U#U$U%U'U(U)U*U+U,i,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$d%d@I'd(d3c4c5c6c7c8c9c!c#c$c%cIfNdOdfcJfKc

412 return 20U1U,I-I2U3U4U5U6U7U.I/I:I;Iw x y |h}h!i#i~hai$i%i8U9U!U#U$U%U'U(U)U*U+U,i,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UVfWfXfYfZf0f1f2f3f4f5f6f7f8fZc0c1c2c9f!f#f$f%f'f(f)f*f$d%d@I'd(d3c4c5c6c7c8c9c!c#c$c%cKc

413 _fork_warning_checked = True 2,iIfNdOdfcJfKc

414  

415 # Common warning message parts 

416 common_message = ( 

417 "CUDA does not support. Forked subprocesses exhibit undefined behavior, " 2,iIfNdOdfcJfKc

418 "including failure to initialize CUDA contexts and devices. Set the start method " 

419 "to 'spawn' before creating processes that use CUDA. " 

420 "Use: multiprocessing.set_start_method('spawn')" 

421 ) 

422  

423 try: 2,iIfNdOdfcJfKc

424 start_method = multiprocessing.get_start_method() 2,iIfNdOdfcJfKc

425 if start_method == "fork": 2,iIfNdOdfcKc

426 message = f"multiprocessing start method is 'fork', which {common_message}" 2NdOdfcKc

427 warnings.warn(message, UserWarning, stacklevel=3) 2NdOdfcKc

428 except RuntimeError: 2Jf

429 # get_start_method() can raise RuntimeError if start method hasn't been set 

430 # In this case, default is 'fork' on Linux, so we should warn 

431 if platform.system() == "Linux": 2Jf

432 message = ( 

433 f"multiprocessing start method is not set and defaults to 'fork' on Linux, " 2Jf

434 f"which {common_message}" 

435 ) 

436 warnings.warn(message, UserWarning, stacklevel=3) 2Jf