plugin-data-source-mssql 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/externalVersion.js +6 -6
  3. package/dist/server/data-source/MssqlExternalDataSource.js +114 -30
  4. package/dist/server/data-source/MssqlIntrospector.js +109 -24
  5. package/package.json +1 -1
  6. package/dist/node_modules/tedious/245.index.js +0 -741
  7. package/dist/node_modules/tedious/LICENSE +0 -21
  8. package/dist/node_modules/tedious/appveyor.yml +0 -67
  9. package/dist/node_modules/tedious/benchmarks/bulk-load/iterable.js +0 -61
  10. package/dist/node_modules/tedious/benchmarks/common.js +0 -287
  11. package/dist/node_modules/tedious/benchmarks/connection/open.js +0 -26
  12. package/dist/node_modules/tedious/benchmarks/package-lock.json +0 -21173
  13. package/dist/node_modules/tedious/benchmarks/package.json +0 -11
  14. package/dist/node_modules/tedious/benchmarks/query/call-tvp.js +0 -105
  15. package/dist/node_modules/tedious/benchmarks/query/insert-varbinary.js +0 -46
  16. package/dist/node_modules/tedious/benchmarks/query/select-many-rows.js +0 -63
  17. package/dist/node_modules/tedious/benchmarks/query/select-nvarchar.js +0 -50
  18. package/dist/node_modules/tedious/benchmarks/query/select-varbinary.js +0 -50
  19. package/dist/node_modules/tedious/benchmarks/request/rpcrequest-payload-tvp.js +0 -45
  20. package/dist/node_modules/tedious/benchmarks/request/rpcrequest-payload-varbinary.js +0 -37
  21. package/dist/node_modules/tedious/benchmarks/token-parser/colmetadata-token.js +0 -27
  22. package/dist/node_modules/tedious/benchmarks/token-parser/done-token.js +0 -28
  23. package/dist/node_modules/tedious/benchmarks/token-parser/simple-tokens.js +0 -363
  24. package/dist/node_modules/tedious/lib/all-headers.d.ts +0 -2
  25. package/dist/node_modules/tedious/lib/all-headers.js +0 -24
  26. package/dist/node_modules/tedious/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +0 -82
  27. package/dist/node_modules/tedious/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +0 -55
  28. package/dist/node_modules/tedious/lib/always-encrypted/cek-entry.d.ts +0 -11
  29. package/dist/node_modules/tedious/lib/always-encrypted/cek-entry.js +0 -42
  30. package/dist/node_modules/tedious/lib/always-encrypted/get-parameter-encryption-metadata.js +0 -90
  31. package/dist/node_modules/tedious/lib/always-encrypted/key-crypto.js +0 -94
  32. package/dist/node_modules/tedious/lib/always-encrypted/keystore-provider-azure-key-vault.d.ts +0 -21
  33. package/dist/node_modules/tedious/lib/always-encrypted/keystore-provider-azure-key-vault.js +0 -247
  34. package/dist/node_modules/tedious/lib/always-encrypted/symmetric-key-cache.js +0 -36
  35. package/dist/node_modules/tedious/lib/always-encrypted/symmetric-key.js +0 -25
  36. package/dist/node_modules/tedious/lib/always-encrypted/types.d.ts +0 -73
  37. package/dist/node_modules/tedious/lib/always-encrypted/types.js +0 -48
  38. package/dist/node_modules/tedious/lib/always-encrypted/utils.js +0 -23
  39. package/dist/node_modules/tedious/lib/bulk-load-payload.d.ts +0 -8
  40. package/dist/node_modules/tedious/lib/bulk-load-payload.js +0 -23
  41. package/dist/node_modules/tedious/lib/bulk-load.d.ts +0 -275
  42. package/dist/node_modules/tedious/lib/bulk-load.js +0 -516
  43. package/dist/node_modules/tedious/lib/collation.d.ts +0 -28
  44. package/dist/node_modules/tedious/lib/collation.js +0 -348
  45. package/dist/node_modules/tedious/lib/connection.d.ts +0 -1310
  46. package/dist/node_modules/tedious/lib/connection.js +0 -2730
  47. package/dist/node_modules/tedious/lib/connector.d.ts +0 -18
  48. package/dist/node_modules/tedious/lib/connector.js +0 -150
  49. package/dist/node_modules/tedious/lib/data-type.d.ts +0 -455
  50. package/dist/node_modules/tedious/lib/data-type.js +0 -428
  51. package/dist/node_modules/tedious/lib/data-types/bigint.d.ts +0 -3
  52. package/dist/node_modules/tedious/lib/data-types/bigint.js +0 -53
  53. package/dist/node_modules/tedious/lib/data-types/binary.d.ts +0 -5
  54. package/dist/node_modules/tedious/lib/data-types/binary.js +0 -67
  55. package/dist/node_modules/tedious/lib/data-types/bit.d.ts +0 -3
  56. package/dist/node_modules/tedious/lib/data-types/bit.js +0 -46
  57. package/dist/node_modules/tedious/lib/data-types/bitn.d.ts +0 -3
  58. package/dist/node_modules/tedious/lib/data-types/bitn.js +0 -29
  59. package/dist/node_modules/tedious/lib/data-types/char.d.ts +0 -5
  60. package/dist/node_modules/tedious/lib/data-types/char.js +0 -86
  61. package/dist/node_modules/tedious/lib/data-types/date.d.ts +0 -3
  62. package/dist/node_modules/tedious/lib/data-types/date.js +0 -72
  63. package/dist/node_modules/tedious/lib/data-types/datetime.d.ts +0 -3
  64. package/dist/node_modules/tedious/lib/data-types/datetime.js +0 -93
  65. package/dist/node_modules/tedious/lib/data-types/datetime2.d.ts +0 -5
  66. package/dist/node_modules/tedious/lib/data-types/datetime2.js +0 -118
  67. package/dist/node_modules/tedious/lib/data-types/datetimen.d.ts +0 -3
  68. package/dist/node_modules/tedious/lib/data-types/datetimen.js +0 -29
  69. package/dist/node_modules/tedious/lib/data-types/datetimeoffset.d.ts +0 -5
  70. package/dist/node_modules/tedious/lib/data-types/datetimeoffset.js +0 -111
  71. package/dist/node_modules/tedious/lib/data-types/decimal.d.ts +0 -6
  72. package/dist/node_modules/tedious/lib/data-types/decimal.js +0 -107
  73. package/dist/node_modules/tedious/lib/data-types/decimaln.d.ts +0 -3
  74. package/dist/node_modules/tedious/lib/data-types/decimaln.js +0 -29
  75. package/dist/node_modules/tedious/lib/data-types/float.d.ts +0 -3
  76. package/dist/node_modules/tedious/lib/data-types/float.js +0 -47
  77. package/dist/node_modules/tedious/lib/data-types/floatn.d.ts +0 -3
  78. package/dist/node_modules/tedious/lib/data-types/floatn.js +0 -29
  79. package/dist/node_modules/tedious/lib/data-types/image.d.ts +0 -3
  80. package/dist/node_modules/tedious/lib/data-types/image.js +0 -56
  81. package/dist/node_modules/tedious/lib/data-types/int.d.ts +0 -3
  82. package/dist/node_modules/tedious/lib/data-types/int.js +0 -53
  83. package/dist/node_modules/tedious/lib/data-types/intn.d.ts +0 -3
  84. package/dist/node_modules/tedious/lib/data-types/intn.js +0 -29
  85. package/dist/node_modules/tedious/lib/data-types/money.d.ts +0 -3
  86. package/dist/node_modules/tedious/lib/data-types/money.js +0 -59
  87. package/dist/node_modules/tedious/lib/data-types/moneyn.d.ts +0 -3
  88. package/dist/node_modules/tedious/lib/data-types/moneyn.js +0 -29
  89. package/dist/node_modules/tedious/lib/data-types/nchar.d.ts +0 -5
  90. package/dist/node_modules/tedious/lib/data-types/nchar.js +0 -100
  91. package/dist/node_modules/tedious/lib/data-types/ntext.d.ts +0 -3
  92. package/dist/node_modules/tedious/lib/data-types/ntext.js +0 -60
  93. package/dist/node_modules/tedious/lib/data-types/null.d.ts +0 -3
  94. package/dist/node_modules/tedious/lib/data-types/null.js +0 -29
  95. package/dist/node_modules/tedious/lib/data-types/numeric.d.ts +0 -6
  96. package/dist/node_modules/tedious/lib/data-types/numeric.js +0 -106
  97. package/dist/node_modules/tedious/lib/data-types/numericn.d.ts +0 -3
  98. package/dist/node_modules/tedious/lib/data-types/numericn.js +0 -29
  99. package/dist/node_modules/tedious/lib/data-types/nvarchar.d.ts +0 -5
  100. package/dist/node_modules/tedious/lib/data-types/nvarchar.js +0 -133
  101. package/dist/node_modules/tedious/lib/data-types/real.d.ts +0 -3
  102. package/dist/node_modules/tedious/lib/data-types/real.js +0 -48
  103. package/dist/node_modules/tedious/lib/data-types/smalldatetime.d.ts +0 -3
  104. package/dist/node_modules/tedious/lib/data-types/smalldatetime.js +0 -83
  105. package/dist/node_modules/tedious/lib/data-types/smallint.d.ts +0 -3
  106. package/dist/node_modules/tedious/lib/data-types/smallint.js +0 -53
  107. package/dist/node_modules/tedious/lib/data-types/smallmoney.d.ts +0 -3
  108. package/dist/node_modules/tedious/lib/data-types/smallmoney.js +0 -51
  109. package/dist/node_modules/tedious/lib/data-types/sql-variant.d.ts +0 -3
  110. package/dist/node_modules/tedious/lib/data-types/sql-variant.js +0 -29
  111. package/dist/node_modules/tedious/lib/data-types/text.d.ts +0 -3
  112. package/dist/node_modules/tedious/lib/data-types/text.js +0 -69
  113. package/dist/node_modules/tedious/lib/data-types/time.d.ts +0 -3
  114. package/dist/node_modules/tedious/lib/data-types/time.js +0 -96
  115. package/dist/node_modules/tedious/lib/data-types/tinyint.d.ts +0 -3
  116. package/dist/node_modules/tedious/lib/data-types/tinyint.js +0 -53
  117. package/dist/node_modules/tedious/lib/data-types/tvp.d.ts +0 -3
  118. package/dist/node_modules/tedious/lib/data-types/tvp.js +0 -117
  119. package/dist/node_modules/tedious/lib/data-types/udt.d.ts +0 -3
  120. package/dist/node_modules/tedious/lib/data-types/udt.js +0 -29
  121. package/dist/node_modules/tedious/lib/data-types/uniqueidentifier.d.ts +0 -3
  122. package/dist/node_modules/tedious/lib/data-types/uniqueidentifier.js +0 -50
  123. package/dist/node_modules/tedious/lib/data-types/varbinary.d.ts +0 -5
  124. package/dist/node_modules/tedious/lib/data-types/varbinary.js +0 -119
  125. package/dist/node_modules/tedious/lib/data-types/varchar.d.ts +0 -5
  126. package/dist/node_modules/tedious/lib/data-types/varchar.js +0 -112
  127. package/dist/node_modules/tedious/lib/data-types/xml.d.ts +0 -3
  128. package/dist/node_modules/tedious/lib/data-types/xml.js +0 -29
  129. package/dist/node_modules/tedious/lib/debug.d.ts +0 -25
  130. package/dist/node_modules/tedious/lib/debug.js +0 -67
  131. package/dist/node_modules/tedious/lib/errors/abort-error.d.ts +0 -4
  132. package/dist/node_modules/tedious/lib/errors/abort-error.js +0 -15
  133. package/dist/node_modules/tedious/lib/errors/timeout-error.d.ts +0 -4
  134. package/dist/node_modules/tedious/lib/errors/timeout-error.js +0 -15
  135. package/dist/node_modules/tedious/lib/errors.d.ts +0 -17
  136. package/dist/node_modules/tedious/lib/errors.js +0 -23
  137. package/dist/node_modules/tedious/lib/guid-parser.d.ts +0 -3
  138. package/dist/node_modules/tedious/lib/guid-parser.js +0 -30
  139. package/dist/node_modules/tedious/lib/incoming-message-stream.d.ts +0 -19
  140. package/dist/node_modules/tedious/lib/incoming-message-stream.js +0 -97
  141. package/dist/node_modules/tedious/lib/instance-lookup.d.ts +0 -13
  142. package/dist/node_modules/tedious/lib/instance-lookup.js +0 -96
  143. package/dist/node_modules/tedious/lib/library.d.ts +0 -1
  144. package/dist/node_modules/tedious/lib/library.js +0 -8
  145. package/dist/node_modules/tedious/lib/login7-payload.d.ts +0 -51
  146. package/dist/node_modules/tedious/lib/login7-payload.js +0 -402
  147. package/dist/node_modules/tedious/lib/message-io.d.ts +0 -28
  148. package/dist/node_modules/tedious/lib/message-io.js +0 -153
  149. package/dist/node_modules/tedious/lib/message.d.ts +0 -11
  150. package/dist/node_modules/tedious/lib/message.js +0 -21
  151. package/dist/node_modules/tedious/lib/metadata-parser.d.ts +0 -48
  152. package/dist/node_modules/tedious/lib/metadata-parser.js +0 -380
  153. package/dist/node_modules/tedious/lib/ntlm-payload.d.ts +0 -23
  154. package/dist/node_modules/tedious/lib/ntlm-payload.js +0 -136
  155. package/dist/node_modules/tedious/lib/ntlm.d.ts +0 -4
  156. package/dist/node_modules/tedious/lib/ntlm.js +0 -72
  157. package/dist/node_modules/tedious/lib/outgoing-message-stream.d.ts +0 -15
  158. package/dist/node_modules/tedious/lib/outgoing-message-stream.js +0 -81
  159. package/dist/node_modules/tedious/lib/packet.d.ts +0 -33
  160. package/dist/node_modules/tedious/lib/packet.js +0 -191
  161. package/dist/node_modules/tedious/lib/prelogin-payload.d.ts +0 -61
  162. package/dist/node_modules/tedious/lib/prelogin-payload.js +0 -209
  163. package/dist/node_modules/tedious/lib/request.d.ts +0 -370
  164. package/dist/node_modules/tedious/lib/request.js +0 -387
  165. package/dist/node_modules/tedious/lib/rpcrequest-payload.d.ts +0 -16
  166. package/dist/node_modules/tedious/lib/rpcrequest-payload.js +0 -109
  167. package/dist/node_modules/tedious/lib/sender.d.ts +0 -5
  168. package/dist/node_modules/tedious/lib/sender.js +0 -83
  169. package/dist/node_modules/tedious/lib/special-stored-procedure.d.ts +0 -18
  170. package/dist/node_modules/tedious/lib/special-stored-procedure.js +0 -26
  171. package/dist/node_modules/tedious/lib/sqlbatch-payload.d.ts +0 -13
  172. package/dist/node_modules/tedious/lib/sqlbatch-payload.js +0 -34
  173. package/dist/node_modules/tedious/lib/tds-versions.d.ts +0 -6
  174. package/dist/node_modules/tedious/lib/tds-versions.js +0 -19
  175. package/dist/node_modules/tedious/lib/tedious.d.ts +0 -13
  176. package/dist/node_modules/tedious/lib/tedious.js +0 -249
  177. package/dist/node_modules/tedious/lib/token/colmetadata-token-parser.d.ts +0 -12
  178. package/dist/node_modules/tedious/lib/token/colmetadata-token-parser.js +0 -124
  179. package/dist/node_modules/tedious/lib/token/done-token-parser.d.ts +0 -6
  180. package/dist/node_modules/tedious/lib/token/done-token-parser.js +0 -76
  181. package/dist/node_modules/tedious/lib/token/env-change-token-parser.d.ts +0 -5
  182. package/dist/node_modules/tedious/lib/token/env-change-token-parser.js +0 -190
  183. package/dist/node_modules/tedious/lib/token/feature-ext-ack-parser.d.ts +0 -5
  184. package/dist/node_modules/tedious/lib/token/feature-ext-ack-parser.js +0 -52
  185. package/dist/node_modules/tedious/lib/token/fedauth-info-parser.d.ts +0 -5
  186. package/dist/node_modules/tedious/lib/token/fedauth-info-parser.js +0 -62
  187. package/dist/node_modules/tedious/lib/token/handler.d.ts +0 -135
  188. package/dist/node_modules/tedious/lib/token/handler.js +0 -444
  189. package/dist/node_modules/tedious/lib/token/helpers.d.ts +0 -28
  190. package/dist/node_modules/tedious/lib/token/helpers.js +0 -205
  191. package/dist/node_modules/tedious/lib/token/infoerror-token-parser.d.ts +0 -5
  192. package/dist/node_modules/tedious/lib/token/infoerror-token-parser.js +0 -80
  193. package/dist/node_modules/tedious/lib/token/loginack-token-parser.d.ts +0 -5
  194. package/dist/node_modules/tedious/lib/token/loginack-token-parser.js +0 -75
  195. package/dist/node_modules/tedious/lib/token/nbcrow-token-parser.d.ts +0 -4
  196. package/dist/node_modules/tedious/lib/token/nbcrow-token-parser.js +0 -104
  197. package/dist/node_modules/tedious/lib/token/order-token-parser.d.ts +0 -5
  198. package/dist/node_modules/tedious/lib/token/order-token-parser.js +0 -34
  199. package/dist/node_modules/tedious/lib/token/returnstatus-token-parser.d.ts +0 -5
  200. package/dist/node_modules/tedious/lib/token/returnstatus-token-parser.js +0 -21
  201. package/dist/node_modules/tedious/lib/token/returnvalue-token-parser.d.ts +0 -4
  202. package/dist/node_modules/tedious/lib/token/returnvalue-token-parser.js +0 -94
  203. package/dist/node_modules/tedious/lib/token/row-token-parser.d.ts +0 -4
  204. package/dist/node_modules/tedious/lib/token/row-token-parser.js +0 -77
  205. package/dist/node_modules/tedious/lib/token/sspi-token-parser.d.ts +0 -5
  206. package/dist/node_modules/tedious/lib/token/sspi-token-parser.js +0 -42
  207. package/dist/node_modules/tedious/lib/token/stream-parser.d.ts +0 -34
  208. package/dist/node_modules/tedious/lib/token/stream-parser.js +0 -341
  209. package/dist/node_modules/tedious/lib/token/token-stream-parser.d.ts +0 -15
  210. package/dist/node_modules/tedious/lib/token/token-stream-parser.js +0 -36
  211. package/dist/node_modules/tedious/lib/token/token.d.ts +0 -312
  212. package/dist/node_modules/tedious/lib/token/token.js +0 -328
  213. package/dist/node_modules/tedious/lib/tracking-buffer/writable-tracking-buffer.d.ts +0 -47
  214. package/dist/node_modules/tedious/lib/tracking-buffer/writable-tracking-buffer.js +0 -249
  215. package/dist/node_modules/tedious/lib/transaction.d.ts +0 -39
  216. package/dist/node_modules/tedious/lib/transaction.js +0 -137
  217. package/dist/node_modules/tedious/lib/transient-error-lookup.d.ts +0 -3
  218. package/dist/node_modules/tedious/lib/transient-error-lookup.js +0 -19
  219. package/dist/node_modules/tedious/lib/utils/with-timeout.d.ts +0 -7
  220. package/dist/node_modules/tedious/lib/utils/with-timeout.js +0 -36
  221. package/dist/node_modules/tedious/lib/value-parser.d.ts +0 -7
  222. package/dist/node_modules/tedious/lib/value-parser.js +0 -813
  223. package/dist/node_modules/tedious/node_modules/@types/node/assert/strict.d.ts +0 -105
  224. package/dist/node_modules/tedious/node_modules/@types/node/assert.d.ts +0 -955
  225. package/dist/node_modules/tedious/node_modules/@types/node/async_hooks.d.ts +0 -623
  226. package/dist/node_modules/tedious/node_modules/@types/node/buffer.buffer.d.ts +0 -466
  227. package/dist/node_modules/tedious/node_modules/@types/node/buffer.d.ts +0 -1810
  228. package/dist/node_modules/tedious/node_modules/@types/node/child_process.d.ts +0 -1428
  229. package/dist/node_modules/tedious/node_modules/@types/node/cluster.d.ts +0 -486
  230. package/dist/node_modules/tedious/node_modules/@types/node/compatibility/iterators.d.ts +0 -21
  231. package/dist/node_modules/tedious/node_modules/@types/node/console.d.ts +0 -151
  232. package/dist/node_modules/tedious/node_modules/@types/node/constants.d.ts +0 -20
  233. package/dist/node_modules/tedious/node_modules/@types/node/crypto.d.ts +0 -4065
  234. package/dist/node_modules/tedious/node_modules/@types/node/dgram.d.ts +0 -564
  235. package/dist/node_modules/tedious/node_modules/@types/node/diagnostics_channel.d.ts +0 -576
  236. package/dist/node_modules/tedious/node_modules/@types/node/dns/promises.d.ts +0 -503
  237. package/dist/node_modules/tedious/node_modules/@types/node/dns.d.ts +0 -922
  238. package/dist/node_modules/tedious/node_modules/@types/node/domain.d.ts +0 -166
  239. package/dist/node_modules/tedious/node_modules/@types/node/events.d.ts +0 -1054
  240. package/dist/node_modules/tedious/node_modules/@types/node/fs/promises.d.ts +0 -1329
  241. package/dist/node_modules/tedious/node_modules/@types/node/fs.d.ts +0 -4676
  242. package/dist/node_modules/tedious/node_modules/@types/node/globals.d.ts +0 -150
  243. package/dist/node_modules/tedious/node_modules/@types/node/globals.typedarray.d.ts +0 -101
  244. package/dist/node_modules/tedious/node_modules/@types/node/http.d.ts +0 -2167
  245. package/dist/node_modules/tedious/node_modules/@types/node/http2.d.ts +0 -2480
  246. package/dist/node_modules/tedious/node_modules/@types/node/https.d.ts +0 -405
  247. package/dist/node_modules/tedious/node_modules/@types/node/index.d.ts +0 -115
  248. package/dist/node_modules/tedious/node_modules/@types/node/inspector/promises.d.ts +0 -41
  249. package/dist/node_modules/tedious/node_modules/@types/node/inspector.d.ts +0 -224
  250. package/dist/node_modules/tedious/node_modules/@types/node/inspector.generated.d.ts +0 -4226
  251. package/dist/node_modules/tedious/node_modules/@types/node/module.d.ts +0 -819
  252. package/dist/node_modules/tedious/node_modules/@types/node/net.d.ts +0 -933
  253. package/dist/node_modules/tedious/node_modules/@types/node/os.d.ts +0 -507
  254. package/dist/node_modules/tedious/node_modules/@types/node/package.json +0 -155
  255. package/dist/node_modules/tedious/node_modules/@types/node/path/posix.d.ts +0 -8
  256. package/dist/node_modules/tedious/node_modules/@types/node/path/win32.d.ts +0 -8
  257. package/dist/node_modules/tedious/node_modules/@types/node/path.d.ts +0 -187
  258. package/dist/node_modules/tedious/node_modules/@types/node/perf_hooks.d.ts +0 -643
  259. package/dist/node_modules/tedious/node_modules/@types/node/process.d.ts +0 -2161
  260. package/dist/node_modules/tedious/node_modules/@types/node/punycode.d.ts +0 -117
  261. package/dist/node_modules/tedious/node_modules/@types/node/querystring.d.ts +0 -152
  262. package/dist/node_modules/tedious/node_modules/@types/node/quic.d.ts +0 -910
  263. package/dist/node_modules/tedious/node_modules/@types/node/readline/promises.d.ts +0 -161
  264. package/dist/node_modules/tedious/node_modules/@types/node/readline.d.ts +0 -541
  265. package/dist/node_modules/tedious/node_modules/@types/node/repl.d.ts +0 -415
  266. package/dist/node_modules/tedious/node_modules/@types/node/sea.d.ts +0 -162
  267. package/dist/node_modules/tedious/node_modules/@types/node/sqlite.d.ts +0 -955
  268. package/dist/node_modules/tedious/node_modules/@types/node/stream/consumers.d.ts +0 -38
  269. package/dist/node_modules/tedious/node_modules/@types/node/stream/promises.d.ts +0 -211
  270. package/dist/node_modules/tedious/node_modules/@types/node/stream/web.d.ts +0 -296
  271. package/dist/node_modules/tedious/node_modules/@types/node/stream.d.ts +0 -1760
  272. package/dist/node_modules/tedious/node_modules/@types/node/string_decoder.d.ts +0 -67
  273. package/dist/node_modules/tedious/node_modules/@types/node/test/reporters.d.ts +0 -96
  274. package/dist/node_modules/tedious/node_modules/@types/node/test.d.ts +0 -2240
  275. package/dist/node_modules/tedious/node_modules/@types/node/timers/promises.d.ts +0 -108
  276. package/dist/node_modules/tedious/node_modules/@types/node/timers.d.ts +0 -159
  277. package/dist/node_modules/tedious/node_modules/@types/node/tls.d.ts +0 -1198
  278. package/dist/node_modules/tedious/node_modules/@types/node/trace_events.d.ts +0 -197
  279. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -462
  280. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +0 -71
  281. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -36
  282. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/index.d.ts +0 -117
  283. package/dist/node_modules/tedious/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +0 -72
  284. package/dist/node_modules/tedious/node_modules/@types/node/ts5.7/index.d.ts +0 -117
  285. package/dist/node_modules/tedious/node_modules/@types/node/tty.d.ts +0 -250
  286. package/dist/node_modules/tedious/node_modules/@types/node/url.d.ts +0 -519
  287. package/dist/node_modules/tedious/node_modules/@types/node/util/types.d.ts +0 -558
  288. package/dist/node_modules/tedious/node_modules/@types/node/util.d.ts +0 -1662
  289. package/dist/node_modules/tedious/node_modules/@types/node/v8.d.ts +0 -983
  290. package/dist/node_modules/tedious/node_modules/@types/node/vm.d.ts +0 -1208
  291. package/dist/node_modules/tedious/node_modules/@types/node/wasi.d.ts +0 -202
  292. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -59
  293. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/blob.d.ts +0 -23
  294. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/console.d.ts +0 -9
  295. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/crypto.d.ts +0 -39
  296. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  297. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/encoding.d.ts +0 -11
  298. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/events.d.ts +0 -106
  299. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/fetch.d.ts +0 -69
  300. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/importmeta.d.ts +0 -13
  301. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/messaging.d.ts +0 -23
  302. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/navigator.d.ts +0 -25
  303. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/performance.d.ts +0 -45
  304. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  305. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/streams.d.ts +0 -115
  306. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/timers.d.ts +0 -44
  307. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/url.d.ts +0 -24
  308. package/dist/node_modules/tedious/node_modules/@types/node/worker_threads.d.ts +0 -717
  309. package/dist/node_modules/tedious/node_modules/@types/node/zlib.d.ts +0 -618
  310. package/dist/node_modules/tedious/node_modules/bl/.github/dependabot.yml +0 -16
  311. package/dist/node_modules/tedious/node_modules/bl/.github/workflows/test-and-release.yml +0 -61
  312. package/dist/node_modules/tedious/node_modules/bl/BufferList.d.ts +0 -431
  313. package/dist/node_modules/tedious/node_modules/bl/BufferList.js +0 -421
  314. package/dist/node_modules/tedious/node_modules/bl/bl.js +0 -84
  315. package/dist/node_modules/tedious/node_modules/bl/index.d.ts +0 -88
  316. package/dist/node_modules/tedious/node_modules/bl/package.json +0 -123
  317. package/dist/node_modules/tedious/node_modules/bl/test/convert.js +0 -21
  318. package/dist/node_modules/tedious/node_modules/bl/test/indexOf.js +0 -492
  319. package/dist/node_modules/tedious/node_modules/bl/test/isBufferList.js +0 -32
  320. package/dist/node_modules/tedious/node_modules/bl/test/test.js +0 -1032
  321. package/dist/node_modules/tedious/node_modules/buffer/index.d.ts +0 -194
  322. package/dist/node_modules/tedious/node_modules/buffer/index.js +0 -2106
  323. package/dist/node_modules/tedious/node_modules/buffer/package.json +0 -93
  324. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_duplex.js +0 -4
  325. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_passthrough.js +0 -4
  326. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_readable.js +0 -4
  327. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_transform.js +0 -4
  328. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_writable.js +0 -4
  329. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/add-abort-signal.js +0 -52
  330. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -157
  331. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/compose.js +0 -194
  332. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -290
  333. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/duplex.js +0 -143
  334. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/duplexify.js +0 -378
  335. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -286
  336. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/from.js +0 -98
  337. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/lazy_transform.js +0 -51
  338. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/legacy.js +0 -89
  339. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/operators.js +0 -457
  340. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/passthrough.js +0 -39
  341. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -471
  342. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/readable.js +0 -1290
  343. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/state.js +0 -39
  344. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/transform.js +0 -180
  345. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/utils.js +0 -327
  346. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/writable.js +0 -819
  347. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/validators.js +0 -530
  348. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/browser.js +0 -35
  349. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/errors.js +0 -343
  350. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/index.js +0 -65
  351. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/primordials.js +0 -124
  352. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/util/inspect.js +0 -55
  353. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/util.js +0 -148
  354. package/dist/node_modules/tedious/node_modules/readable-stream/lib/stream/promises.js +0 -43
  355. package/dist/node_modules/tedious/node_modules/readable-stream/lib/stream.js +0 -143
  356. package/dist/node_modules/tedious/node_modules/readable-stream/package.json +0 -88
  357. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/.gitattributes +0 -4
  358. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/angular-sprintf.min.js +0 -3
  359. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/sprintf.min.js +0 -3
  360. package/dist/node_modules/tedious/node_modules/sprintf-js/package.json +0 -35
  361. package/dist/node_modules/tedious/node_modules/sprintf-js/src/angular-sprintf.js +0 -24
  362. package/dist/node_modules/tedious/node_modules/sprintf-js/src/sprintf.js +0 -231
  363. package/dist/node_modules/tedious/node_modules/undici-types/agent.d.ts +0 -32
  364. package/dist/node_modules/tedious/node_modules/undici-types/api.d.ts +0 -43
  365. package/dist/node_modules/tedious/node_modules/undici-types/balanced-pool.d.ts +0 -29
  366. package/dist/node_modules/tedious/node_modules/undici-types/cache-interceptor.d.ts +0 -172
  367. package/dist/node_modules/tedious/node_modules/undici-types/cache.d.ts +0 -36
  368. package/dist/node_modules/tedious/node_modules/undici-types/client-stats.d.ts +0 -15
  369. package/dist/node_modules/tedious/node_modules/undici-types/client.d.ts +0 -108
  370. package/dist/node_modules/tedious/node_modules/undici-types/connector.d.ts +0 -34
  371. package/dist/node_modules/tedious/node_modules/undici-types/content-type.d.ts +0 -21
  372. package/dist/node_modules/tedious/node_modules/undici-types/cookies.d.ts +0 -30
  373. package/dist/node_modules/tedious/node_modules/undici-types/diagnostics-channel.d.ts +0 -74
  374. package/dist/node_modules/tedious/node_modules/undici-types/dispatcher.d.ts +0 -276
  375. package/dist/node_modules/tedious/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -22
  376. package/dist/node_modules/tedious/node_modules/undici-types/errors.d.ts +0 -161
  377. package/dist/node_modules/tedious/node_modules/undici-types/eventsource.d.ts +0 -66
  378. package/dist/node_modules/tedious/node_modules/undici-types/fetch.d.ts +0 -211
  379. package/dist/node_modules/tedious/node_modules/undici-types/formdata.d.ts +0 -108
  380. package/dist/node_modules/tedious/node_modules/undici-types/global-dispatcher.d.ts +0 -9
  381. package/dist/node_modules/tedious/node_modules/undici-types/global-origin.d.ts +0 -7
  382. package/dist/node_modules/tedious/node_modules/undici-types/h2c-client.d.ts +0 -73
  383. package/dist/node_modules/tedious/node_modules/undici-types/handlers.d.ts +0 -15
  384. package/dist/node_modules/tedious/node_modules/undici-types/header.d.ts +0 -160
  385. package/dist/node_modules/tedious/node_modules/undici-types/index.d.ts +0 -80
  386. package/dist/node_modules/tedious/node_modules/undici-types/interceptors.d.ts +0 -39
  387. package/dist/node_modules/tedious/node_modules/undici-types/mock-agent.d.ts +0 -68
  388. package/dist/node_modules/tedious/node_modules/undici-types/mock-call-history.d.ts +0 -111
  389. package/dist/node_modules/tedious/node_modules/undici-types/mock-client.d.ts +0 -27
  390. package/dist/node_modules/tedious/node_modules/undici-types/mock-errors.d.ts +0 -12
  391. package/dist/node_modules/tedious/node_modules/undici-types/mock-interceptor.d.ts +0 -94
  392. package/dist/node_modules/tedious/node_modules/undici-types/mock-pool.d.ts +0 -27
  393. package/dist/node_modules/tedious/node_modules/undici-types/package.json +0 -55
  394. package/dist/node_modules/tedious/node_modules/undici-types/patch.d.ts +0 -29
  395. package/dist/node_modules/tedious/node_modules/undici-types/pool-stats.d.ts +0 -19
  396. package/dist/node_modules/tedious/node_modules/undici-types/pool.d.ts +0 -41
  397. package/dist/node_modules/tedious/node_modules/undici-types/proxy-agent.d.ts +0 -29
  398. package/dist/node_modules/tedious/node_modules/undici-types/readable.d.ts +0 -68
  399. package/dist/node_modules/tedious/node_modules/undici-types/retry-agent.d.ts +0 -8
  400. package/dist/node_modules/tedious/node_modules/undici-types/retry-handler.d.ts +0 -125
  401. package/dist/node_modules/tedious/node_modules/undici-types/snapshot-agent.d.ts +0 -109
  402. package/dist/node_modules/tedious/node_modules/undici-types/util.d.ts +0 -18
  403. package/dist/node_modules/tedious/node_modules/undici-types/utility.d.ts +0 -7
  404. package/dist/node_modules/tedious/node_modules/undici-types/webidl.d.ts +0 -341
  405. package/dist/node_modules/tedious/node_modules/undici-types/websocket.d.ts +0 -186
  406. package/dist/node_modules/tedious/package.json +0 -1
  407. package/dist/node_modules/tedious/tsconfig.build-types.json +0 -15
  408. package/dist/node_modules/tedious/tsconfig.json +0 -29
  409. package/dist/node_modules/tedious/types/js-md4.d.ts +0 -7
  410. package/dist/node_modules/tedious/types/native-duplexpair.d.ts +0 -12
@@ -1,813 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.isPLPStream = isPLPStream;
7
- exports.readPLPStream = readPLPStream;
8
- exports.readValue = readValue;
9
- var _metadataParser = require("./metadata-parser");
10
- var _dataType = require("./data-type");
11
- var _iconvLite = _interopRequireDefault(require("iconv-lite"));
12
- var _sprintfJs = require("sprintf-js");
13
- var _guidParser = require("./guid-parser");
14
- var _helpers = require("./token/helpers");
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
- const NULL = (1 << 16) - 1;
17
- const MAX = (1 << 16) - 1;
18
- const THREE_AND_A_THIRD = 3 + 1 / 3;
19
- const MONEY_DIVISOR = 10000;
20
- const PLP_NULL = 0xFFFFFFFFFFFFFFFFn;
21
- const UNKNOWN_PLP_LEN = 0xFFFFFFFFFFFFFFFEn;
22
- const DEFAULT_ENCODING = 'utf8';
23
- function readTinyInt(buf, offset) {
24
- return (0, _helpers.readUInt8)(buf, offset);
25
- }
26
- function readSmallInt(buf, offset) {
27
- return (0, _helpers.readInt16LE)(buf, offset);
28
- }
29
- function readInt(buf, offset) {
30
- return (0, _helpers.readInt32LE)(buf, offset);
31
- }
32
- function readBigInt(buf, offset) {
33
- let value;
34
- ({
35
- offset,
36
- value
37
- } = (0, _helpers.readBigInt64LE)(buf, offset));
38
- return new _helpers.Result(value.toString(), offset);
39
- }
40
- function readReal(buf, offset) {
41
- return (0, _helpers.readFloatLE)(buf, offset);
42
- }
43
- function readFloat(buf, offset) {
44
- return (0, _helpers.readDoubleLE)(buf, offset);
45
- }
46
- function readSmallMoney(buf, offset) {
47
- let value;
48
- ({
49
- offset,
50
- value
51
- } = (0, _helpers.readInt32LE)(buf, offset));
52
- return new _helpers.Result(value / MONEY_DIVISOR, offset);
53
- }
54
- function readMoney(buf, offset) {
55
- let high;
56
- ({
57
- offset,
58
- value: high
59
- } = (0, _helpers.readInt32LE)(buf, offset));
60
- let low;
61
- ({
62
- offset,
63
- value: low
64
- } = (0, _helpers.readUInt32LE)(buf, offset));
65
- return new _helpers.Result((low + 0x100000000 * high) / MONEY_DIVISOR, offset);
66
- }
67
- function readBit(buf, offset) {
68
- let value;
69
- ({
70
- offset,
71
- value
72
- } = (0, _helpers.readUInt8)(buf, offset));
73
- return new _helpers.Result(!!value, offset);
74
- }
75
- function readValue(buf, offset, metadata, options) {
76
- const type = metadata.type;
77
- switch (type.name) {
78
- case 'Null':
79
- return new _helpers.Result(null, offset);
80
- case 'TinyInt':
81
- {
82
- return readTinyInt(buf, offset);
83
- }
84
- case 'SmallInt':
85
- {
86
- return readSmallInt(buf, offset);
87
- }
88
- case 'Int':
89
- {
90
- return readInt(buf, offset);
91
- }
92
- case 'BigInt':
93
- {
94
- return readBigInt(buf, offset);
95
- }
96
- case 'IntN':
97
- {
98
- let dataLength;
99
- ({
100
- offset,
101
- value: dataLength
102
- } = (0, _helpers.readUInt8)(buf, offset));
103
- switch (dataLength) {
104
- case 0:
105
- return new _helpers.Result(null, offset);
106
- case 1:
107
- return readTinyInt(buf, offset);
108
- case 2:
109
- return readSmallInt(buf, offset);
110
- case 4:
111
- return readInt(buf, offset);
112
- case 8:
113
- return readBigInt(buf, offset);
114
- default:
115
- throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
116
- }
117
- }
118
- case 'Real':
119
- {
120
- return readReal(buf, offset);
121
- }
122
- case 'Float':
123
- {
124
- return readFloat(buf, offset);
125
- }
126
- case 'FloatN':
127
- {
128
- let dataLength;
129
- ({
130
- offset,
131
- value: dataLength
132
- } = (0, _helpers.readUInt8)(buf, offset));
133
- switch (dataLength) {
134
- case 0:
135
- return new _helpers.Result(null, offset);
136
- case 4:
137
- return readReal(buf, offset);
138
- case 8:
139
- return readFloat(buf, offset);
140
- default:
141
- throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
142
- }
143
- }
144
- case 'SmallMoney':
145
- {
146
- return readSmallMoney(buf, offset);
147
- }
148
- case 'Money':
149
- return readMoney(buf, offset);
150
- case 'MoneyN':
151
- {
152
- let dataLength;
153
- ({
154
- offset,
155
- value: dataLength
156
- } = (0, _helpers.readUInt8)(buf, offset));
157
- switch (dataLength) {
158
- case 0:
159
- return new _helpers.Result(null, offset);
160
- case 4:
161
- return readSmallMoney(buf, offset);
162
- case 8:
163
- return readMoney(buf, offset);
164
- default:
165
- throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
166
- }
167
- }
168
- case 'Bit':
169
- {
170
- return readBit(buf, offset);
171
- }
172
- case 'BitN':
173
- {
174
- let dataLength;
175
- ({
176
- offset,
177
- value: dataLength
178
- } = (0, _helpers.readUInt8)(buf, offset));
179
- switch (dataLength) {
180
- case 0:
181
- return new _helpers.Result(null, offset);
182
- case 1:
183
- return readBit(buf, offset);
184
- default:
185
- throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
186
- }
187
- }
188
- case 'VarChar':
189
- case 'Char':
190
- {
191
- const codepage = metadata.collation.codepage;
192
- let dataLength;
193
- ({
194
- offset,
195
- value: dataLength
196
- } = (0, _helpers.readUInt16LE)(buf, offset));
197
- if (dataLength === NULL) {
198
- return new _helpers.Result(null, offset);
199
- }
200
- return readChars(buf, offset, dataLength, codepage);
201
- }
202
- case 'NVarChar':
203
- case 'NChar':
204
- {
205
- let dataLength;
206
- ({
207
- offset,
208
- value: dataLength
209
- } = (0, _helpers.readUInt16LE)(buf, offset));
210
- if (dataLength === NULL) {
211
- return new _helpers.Result(null, offset);
212
- }
213
- return readNChars(buf, offset, dataLength);
214
- }
215
- case 'VarBinary':
216
- case 'Binary':
217
- {
218
- let dataLength;
219
- ({
220
- offset,
221
- value: dataLength
222
- } = (0, _helpers.readUInt16LE)(buf, offset));
223
- if (dataLength === NULL) {
224
- return new _helpers.Result(null, offset);
225
- }
226
- return readBinary(buf, offset, dataLength);
227
- }
228
- case 'Text':
229
- {
230
- let textPointerLength;
231
- ({
232
- offset,
233
- value: textPointerLength
234
- } = (0, _helpers.readUInt8)(buf, offset));
235
- if (textPointerLength === 0) {
236
- return new _helpers.Result(null, offset);
237
- }
238
-
239
- // Textpointer
240
- ({
241
- offset
242
- } = readBinary(buf, offset, textPointerLength));
243
-
244
- // Timestamp
245
- ({
246
- offset
247
- } = readBinary(buf, offset, 8));
248
- let dataLength;
249
- ({
250
- offset,
251
- value: dataLength
252
- } = (0, _helpers.readUInt32LE)(buf, offset));
253
- return readChars(buf, offset, dataLength, metadata.collation.codepage);
254
- }
255
- case 'NText':
256
- {
257
- let textPointerLength;
258
- ({
259
- offset,
260
- value: textPointerLength
261
- } = (0, _helpers.readUInt8)(buf, offset));
262
- if (textPointerLength === 0) {
263
- return new _helpers.Result(null, offset);
264
- }
265
-
266
- // Textpointer
267
- ({
268
- offset
269
- } = readBinary(buf, offset, textPointerLength));
270
-
271
- // Timestamp
272
- ({
273
- offset
274
- } = readBinary(buf, offset, 8));
275
- let dataLength;
276
- ({
277
- offset,
278
- value: dataLength
279
- } = (0, _helpers.readUInt32LE)(buf, offset));
280
- return readNChars(buf, offset, dataLength);
281
- }
282
- case 'Image':
283
- {
284
- let textPointerLength;
285
- ({
286
- offset,
287
- value: textPointerLength
288
- } = (0, _helpers.readUInt8)(buf, offset));
289
- if (textPointerLength === 0) {
290
- return new _helpers.Result(null, offset);
291
- }
292
-
293
- // Textpointer
294
- ({
295
- offset
296
- } = readBinary(buf, offset, textPointerLength));
297
-
298
- // Timestamp
299
- ({
300
- offset
301
- } = readBinary(buf, offset, 8));
302
- let dataLength;
303
- ({
304
- offset,
305
- value: dataLength
306
- } = (0, _helpers.readUInt32LE)(buf, offset));
307
- return readBinary(buf, offset, dataLength);
308
- }
309
- case 'SmallDateTime':
310
- {
311
- return readSmallDateTime(buf, offset, options.useUTC);
312
- }
313
- case 'DateTime':
314
- {
315
- return readDateTime(buf, offset, options.useUTC);
316
- }
317
- case 'DateTimeN':
318
- {
319
- let dataLength;
320
- ({
321
- offset,
322
- value: dataLength
323
- } = (0, _helpers.readUInt8)(buf, offset));
324
- switch (dataLength) {
325
- case 0:
326
- return new _helpers.Result(null, offset);
327
- case 4:
328
- return readSmallDateTime(buf, offset, options.useUTC);
329
- case 8:
330
- return readDateTime(buf, offset, options.useUTC);
331
- default:
332
- throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
333
- }
334
- }
335
- case 'Time':
336
- {
337
- let dataLength;
338
- ({
339
- offset,
340
- value: dataLength
341
- } = (0, _helpers.readUInt8)(buf, offset));
342
- if (dataLength === 0) {
343
- return new _helpers.Result(null, offset);
344
- }
345
- return readTime(buf, offset, dataLength, metadata.scale, options.useUTC);
346
- }
347
- case 'Date':
348
- {
349
- let dataLength;
350
- ({
351
- offset,
352
- value: dataLength
353
- } = (0, _helpers.readUInt8)(buf, offset));
354
- if (dataLength === 0) {
355
- return new _helpers.Result(null, offset);
356
- }
357
- return readDate(buf, offset, options.useUTC);
358
- }
359
- case 'DateTime2':
360
- {
361
- let dataLength;
362
- ({
363
- offset,
364
- value: dataLength
365
- } = (0, _helpers.readUInt8)(buf, offset));
366
- if (dataLength === 0) {
367
- return new _helpers.Result(null, offset);
368
- }
369
- return readDateTime2(buf, offset, dataLength, metadata.scale, options.useUTC);
370
- }
371
- case 'DateTimeOffset':
372
- {
373
- let dataLength;
374
- ({
375
- offset,
376
- value: dataLength
377
- } = (0, _helpers.readUInt8)(buf, offset));
378
- if (dataLength === 0) {
379
- return new _helpers.Result(null, offset);
380
- }
381
- return readDateTimeOffset(buf, offset, dataLength, metadata.scale);
382
- }
383
- case 'NumericN':
384
- case 'DecimalN':
385
- {
386
- let dataLength;
387
- ({
388
- offset,
389
- value: dataLength
390
- } = (0, _helpers.readUInt8)(buf, offset));
391
- if (dataLength === 0) {
392
- return new _helpers.Result(null, offset);
393
- }
394
- return readNumeric(buf, offset, dataLength, metadata.precision, metadata.scale);
395
- }
396
- case 'UniqueIdentifier':
397
- {
398
- let dataLength;
399
- ({
400
- offset,
401
- value: dataLength
402
- } = (0, _helpers.readUInt8)(buf, offset));
403
- switch (dataLength) {
404
- case 0:
405
- return new _helpers.Result(null, offset);
406
- case 0x10:
407
- return readUniqueIdentifier(buf, offset, options);
408
- default:
409
- throw new Error((0, _sprintfJs.sprintf)('Unsupported guid size %d', dataLength - 1));
410
- }
411
- }
412
- case 'Variant':
413
- {
414
- let dataLength;
415
- ({
416
- offset,
417
- value: dataLength
418
- } = (0, _helpers.readUInt32LE)(buf, offset));
419
- if (dataLength === 0) {
420
- return new _helpers.Result(null, offset);
421
- }
422
- return readVariant(buf, offset, options, dataLength);
423
- }
424
- default:
425
- {
426
- throw new Error('Invalid type!');
427
- }
428
- }
429
- }
430
- function isPLPStream(metadata) {
431
- switch (metadata.type.name) {
432
- case 'VarChar':
433
- case 'NVarChar':
434
- case 'VarBinary':
435
- {
436
- return metadata.dataLength === MAX;
437
- }
438
- case 'Xml':
439
- {
440
- return true;
441
- }
442
- case 'UDT':
443
- {
444
- return true;
445
- }
446
- }
447
- }
448
- function readUniqueIdentifier(buf, offset, options) {
449
- let data;
450
- ({
451
- value: data,
452
- offset
453
- } = readBinary(buf, offset, 0x10));
454
- return new _helpers.Result(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data), offset);
455
- }
456
- function readNumeric(buf, offset, dataLength, _precision, scale) {
457
- let sign;
458
- ({
459
- offset,
460
- value: sign
461
- } = (0, _helpers.readUInt8)(buf, offset));
462
- sign = sign === 1 ? 1 : -1;
463
- let value;
464
- if (dataLength === 5) {
465
- ({
466
- offset,
467
- value
468
- } = (0, _helpers.readUInt32LE)(buf, offset));
469
- } else if (dataLength === 9) {
470
- ({
471
- offset,
472
- value
473
- } = (0, _helpers.readUNumeric64LE)(buf, offset));
474
- } else if (dataLength === 13) {
475
- ({
476
- offset,
477
- value
478
- } = (0, _helpers.readUNumeric96LE)(buf, offset));
479
- } else if (dataLength === 17) {
480
- ({
481
- offset,
482
- value
483
- } = (0, _helpers.readUNumeric128LE)(buf, offset));
484
- } else {
485
- throw new Error((0, _sprintfJs.sprintf)('Unsupported numeric dataLength %d', dataLength));
486
- }
487
- return new _helpers.Result(value * sign / Math.pow(10, scale), offset);
488
- }
489
- function readVariant(buf, offset, options, dataLength) {
490
- let baseType;
491
- ({
492
- value: baseType,
493
- offset
494
- } = (0, _helpers.readUInt8)(buf, offset));
495
- const type = _dataType.TYPE[baseType];
496
- let propBytes;
497
- ({
498
- value: propBytes,
499
- offset
500
- } = (0, _helpers.readUInt8)(buf, offset));
501
- dataLength = dataLength - propBytes - 2;
502
- switch (type.name) {
503
- case 'UniqueIdentifier':
504
- return readUniqueIdentifier(buf, offset, options);
505
- case 'Bit':
506
- return readBit(buf, offset);
507
- case 'TinyInt':
508
- return readTinyInt(buf, offset);
509
- case 'SmallInt':
510
- return readSmallInt(buf, offset);
511
- case 'Int':
512
- return readInt(buf, offset);
513
- case 'BigInt':
514
- return readBigInt(buf, offset);
515
- case 'SmallDateTime':
516
- return readSmallDateTime(buf, offset, options.useUTC);
517
- case 'DateTime':
518
- return readDateTime(buf, offset, options.useUTC);
519
- case 'Real':
520
- return readReal(buf, offset);
521
- case 'Float':
522
- return readFloat(buf, offset);
523
- case 'SmallMoney':
524
- return readSmallMoney(buf, offset);
525
- case 'Money':
526
- return readMoney(buf, offset);
527
- case 'Date':
528
- return readDate(buf, offset, options.useUTC);
529
- case 'Time':
530
- {
531
- let scale;
532
- ({
533
- value: scale,
534
- offset
535
- } = (0, _helpers.readUInt8)(buf, offset));
536
- return readTime(buf, offset, dataLength, scale, options.useUTC);
537
- }
538
- case 'DateTime2':
539
- {
540
- let scale;
541
- ({
542
- value: scale,
543
- offset
544
- } = (0, _helpers.readUInt8)(buf, offset));
545
- return readDateTime2(buf, offset, dataLength, scale, options.useUTC);
546
- }
547
- case 'DateTimeOffset':
548
- {
549
- let scale;
550
- ({
551
- value: scale,
552
- offset
553
- } = (0, _helpers.readUInt8)(buf, offset));
554
- return readDateTimeOffset(buf, offset, dataLength, scale);
555
- }
556
- case 'VarBinary':
557
- case 'Binary':
558
- {
559
- // maxLength (unused?)
560
- ({
561
- offset
562
- } = (0, _helpers.readUInt16LE)(buf, offset));
563
- return readBinary(buf, offset, dataLength);
564
- }
565
- case 'NumericN':
566
- case 'DecimalN':
567
- {
568
- let precision;
569
- ({
570
- value: precision,
571
- offset
572
- } = (0, _helpers.readUInt8)(buf, offset));
573
- let scale;
574
- ({
575
- value: scale,
576
- offset
577
- } = (0, _helpers.readUInt8)(buf, offset));
578
- return readNumeric(buf, offset, dataLength, precision, scale);
579
- }
580
- case 'VarChar':
581
- case 'Char':
582
- {
583
- // maxLength (unused?)
584
- ({
585
- offset
586
- } = (0, _helpers.readUInt16LE)(buf, offset));
587
- let collation;
588
- ({
589
- value: collation,
590
- offset
591
- } = (0, _metadataParser.readCollation)(buf, offset));
592
- return readChars(buf, offset, dataLength, collation.codepage);
593
- }
594
- case 'NVarChar':
595
- case 'NChar':
596
- {
597
- // maxLength (unused?)
598
- ({
599
- offset
600
- } = (0, _helpers.readUInt16LE)(buf, offset));
601
-
602
- // collation (unused?)
603
- ({
604
- offset
605
- } = (0, _metadataParser.readCollation)(buf, offset));
606
- return readNChars(buf, offset, dataLength);
607
- }
608
- default:
609
- throw new Error('Invalid type!');
610
- }
611
- }
612
- function readBinary(buf, offset, dataLength) {
613
- if (buf.length < offset + dataLength) {
614
- throw new _helpers.NotEnoughDataError(offset + dataLength);
615
- }
616
- return new _helpers.Result(buf.slice(offset, offset + dataLength), offset + dataLength);
617
- }
618
- function readChars(buf, offset, dataLength, codepage) {
619
- if (buf.length < offset + dataLength) {
620
- throw new _helpers.NotEnoughDataError(offset + dataLength);
621
- }
622
- return new _helpers.Result(_iconvLite.default.decode(buf.slice(offset, offset + dataLength), codepage ?? DEFAULT_ENCODING), offset + dataLength);
623
- }
624
- function readNChars(buf, offset, dataLength) {
625
- if (buf.length < offset + dataLength) {
626
- throw new _helpers.NotEnoughDataError(offset + dataLength);
627
- }
628
- return new _helpers.Result(buf.toString('ucs2', offset, offset + dataLength), offset + dataLength);
629
- }
630
- async function readPLPStream(parser) {
631
- while (parser.buffer.length < parser.position + 8) {
632
- await parser.waitForChunk();
633
- }
634
- const expectedLength = parser.buffer.readBigUInt64LE(parser.position);
635
- parser.position += 8;
636
- if (expectedLength === PLP_NULL) {
637
- return null;
638
- }
639
- const chunks = [];
640
- let currentLength = 0;
641
- while (true) {
642
- while (parser.buffer.length < parser.position + 4) {
643
- await parser.waitForChunk();
644
- }
645
- const chunkLength = parser.buffer.readUInt32LE(parser.position);
646
- parser.position += 4;
647
- if (!chunkLength) {
648
- break;
649
- }
650
- while (parser.buffer.length < parser.position + chunkLength) {
651
- await parser.waitForChunk();
652
- }
653
- chunks.push(parser.buffer.slice(parser.position, parser.position + chunkLength));
654
- parser.position += chunkLength;
655
- currentLength += chunkLength;
656
- }
657
- if (expectedLength !== UNKNOWN_PLP_LEN) {
658
- if (currentLength !== Number(expectedLength)) {
659
- throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + expectedLength + ', but got ' + currentLength + ' bytes');
660
- }
661
- }
662
- return chunks;
663
- }
664
- function readSmallDateTime(buf, offset, useUTC) {
665
- let days;
666
- ({
667
- offset,
668
- value: days
669
- } = (0, _helpers.readUInt16LE)(buf, offset));
670
- let minutes;
671
- ({
672
- offset,
673
- value: minutes
674
- } = (0, _helpers.readUInt16LE)(buf, offset));
675
- let value;
676
- if (useUTC) {
677
- value = new Date(Date.UTC(1900, 0, 1 + days, 0, minutes));
678
- } else {
679
- value = new Date(1900, 0, 1 + days, 0, minutes);
680
- }
681
- return new _helpers.Result(value, offset);
682
- }
683
- function readDateTime(buf, offset, useUTC) {
684
- let days;
685
- ({
686
- offset,
687
- value: days
688
- } = (0, _helpers.readInt32LE)(buf, offset));
689
- let threeHundredthsOfSecond;
690
- ({
691
- offset,
692
- value: threeHundredthsOfSecond
693
- } = (0, _helpers.readInt32LE)(buf, offset));
694
- const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
695
- let value;
696
- if (useUTC) {
697
- value = new Date(Date.UTC(1900, 0, 1 + days, 0, 0, 0, milliseconds));
698
- } else {
699
- value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
700
- }
701
- return new _helpers.Result(value, offset);
702
- }
703
- function readTime(buf, offset, dataLength, scale, useUTC) {
704
- let value;
705
- switch (dataLength) {
706
- case 3:
707
- {
708
- ({
709
- value,
710
- offset
711
- } = (0, _helpers.readUInt24LE)(buf, offset));
712
- break;
713
- }
714
- case 4:
715
- {
716
- ({
717
- value,
718
- offset
719
- } = (0, _helpers.readUInt32LE)(buf, offset));
720
- break;
721
- }
722
- case 5:
723
- {
724
- ({
725
- value,
726
- offset
727
- } = (0, _helpers.readUInt40LE)(buf, offset));
728
- break;
729
- }
730
- default:
731
- {
732
- throw new Error('unreachable');
733
- }
734
- }
735
- if (scale < 7) {
736
- for (let i = scale; i < 7; i++) {
737
- value *= 10;
738
- }
739
- }
740
- let date;
741
- if (useUTC) {
742
- date = new Date(Date.UTC(1970, 0, 1, 0, 0, 0, value / 10000));
743
- } else {
744
- date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
745
- }
746
- Object.defineProperty(date, 'nanosecondsDelta', {
747
- enumerable: false,
748
- value: value % 10000 / Math.pow(10, 7)
749
- });
750
- return new _helpers.Result(date, offset);
751
- }
752
- function readDate(buf, offset, useUTC) {
753
- let days;
754
- ({
755
- offset,
756
- value: days
757
- } = (0, _helpers.readUInt24LE)(buf, offset));
758
- if (useUTC) {
759
- return new _helpers.Result(new Date(Date.UTC(2000, 0, days - 730118)), offset);
760
- } else {
761
- return new _helpers.Result(new Date(2000, 0, days - 730118), offset);
762
- }
763
- }
764
- function readDateTime2(buf, offset, dataLength, scale, useUTC) {
765
- let time;
766
- ({
767
- offset,
768
- value: time
769
- } = readTime(buf, offset, dataLength - 3, scale, useUTC));
770
- let days;
771
- ({
772
- offset,
773
- value: days
774
- } = (0, _helpers.readUInt24LE)(buf, offset));
775
- let date;
776
- if (useUTC) {
777
- date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
778
- } else {
779
- date = new Date(2000, 0, days - 730118, time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
780
- }
781
- Object.defineProperty(date, 'nanosecondsDelta', {
782
- enumerable: false,
783
- value: time.nanosecondsDelta
784
- });
785
- return new _helpers.Result(date, offset);
786
- }
787
- function readDateTimeOffset(buf, offset, dataLength, scale) {
788
- let time;
789
- ({
790
- offset,
791
- value: time
792
- } = readTime(buf, offset, dataLength - 5, scale, true));
793
- let days;
794
- ({
795
- offset,
796
- value: days
797
- } = (0, _helpers.readUInt24LE)(buf, offset));
798
-
799
- // time offset?
800
- ({
801
- offset
802
- } = (0, _helpers.readUInt16LE)(buf, offset));
803
- const date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
804
- Object.defineProperty(date, 'nanosecondsDelta', {
805
- enumerable: false,
806
- value: time.nanosecondsDelta
807
- });
808
- return new _helpers.Result(date, offset);
809
- }
810
- module.exports.readValue = readValue;
811
- module.exports.isPLPStream = isPLPStream;
812
- module.exports.readPLPStream = readPLPStream;
813
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX2RhdGFUeXBlIiwiX2ljb252TGl0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3ByaW50ZkpzIiwiX2d1aWRQYXJzZXIiLCJfaGVscGVycyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTlVMTCIsIk1BWCIsIlRIUkVFX0FORF9BX1RISVJEIiwiTU9ORVlfRElWSVNPUiIsIlBMUF9OVUxMIiwiVU5LTk9XTl9QTFBfTEVOIiwiREVGQVVMVF9FTkNPRElORyIsInJlYWRUaW55SW50IiwiYnVmIiwib2Zmc2V0IiwicmVhZFVJbnQ4IiwicmVhZFNtYWxsSW50IiwicmVhZEludDE2TEUiLCJyZWFkSW50IiwicmVhZEludDMyTEUiLCJyZWFkQmlnSW50IiwidmFsdWUiLCJyZWFkQmlnSW50NjRMRSIsIlJlc3VsdCIsInRvU3RyaW5nIiwicmVhZFJlYWwiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdCIsInJlYWREb3VibGVMRSIsInJlYWRTbWFsbE1vbmV5IiwicmVhZE1vbmV5IiwiaGlnaCIsImxvdyIsInJlYWRVSW50MzJMRSIsInJlYWRCaXQiLCJyZWFkVmFsdWUiLCJtZXRhZGF0YSIsIm9wdGlvbnMiLCJ0eXBlIiwibmFtZSIsImRhdGFMZW5ndGgiLCJFcnJvciIsImNvZGVwYWdlIiwiY29sbGF0aW9uIiwicmVhZFVJbnQxNkxFIiwicmVhZENoYXJzIiwicmVhZE5DaGFycyIsInJlYWRCaW5hcnkiLCJ0ZXh0UG9pbnRlckxlbmd0aCIsInJlYWRTbWFsbERhdGVUaW1lIiwidXNlVVRDIiwicmVhZERhdGVUaW1lIiwicmVhZFRpbWUiLCJzY2FsZSIsInJlYWREYXRlIiwicmVhZERhdGVUaW1lMiIsInJlYWREYXRlVGltZU9mZnNldCIsInJlYWROdW1lcmljIiwicHJlY2lzaW9uIiwicmVhZFVuaXF1ZUlkZW50aWZpZXIiLCJzcHJpbnRmIiwicmVhZFZhcmlhbnQiLCJpc1BMUFN0cmVhbSIsImRhdGEiLCJsb3dlckNhc2VHdWlkcyIsImJ1ZmZlclRvTG93ZXJDYXNlR3VpZCIsImJ1ZmZlclRvVXBwZXJDYXNlR3VpZCIsIl9wcmVjaXNpb24iLCJzaWduIiwicmVhZFVOdW1lcmljNjRMRSIsInJlYWRVTnVtZXJpYzk2TEUiLCJyZWFkVU51bWVyaWMxMjhMRSIsIk1hdGgiLCJwb3ciLCJiYXNlVHlwZSIsIlRZUEUiLCJwcm9wQnl0ZXMiLCJyZWFkQ29sbGF0aW9uIiwibGVuZ3RoIiwiTm90RW5vdWdoRGF0YUVycm9yIiwic2xpY2UiLCJpY29udiIsImRlY29kZSIsInJlYWRQTFBTdHJlYW0iLCJwYXJzZXIiLCJidWZmZXIiLCJwb3NpdGlvbiIsIndhaXRGb3JDaHVuayIsImV4cGVjdGVkTGVuZ3RoIiwicmVhZEJpZ1VJbnQ2NExFIiwiY2h1bmtzIiwiY3VycmVudExlbmd0aCIsImNodW5rTGVuZ3RoIiwicHVzaCIsIk51bWJlciIsImRheXMiLCJtaW51dGVzIiwiRGF0ZSIsIlVUQyIsInRocmVlSHVuZHJlZHRoc09mU2Vjb25kIiwibWlsbGlzZWNvbmRzIiwicm91bmQiLCJyZWFkVUludDI0TEUiLCJyZWFkVUludDQwTEUiLCJpIiwiZGF0ZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInRpbWUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwibmFub3NlY29uZHNEZWx0YSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvdmFsdWUtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZXIsIHsgdHlwZSBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IHR5cGUgTWV0YWRhdGEsIHJlYWRDb2xsYXRpb24gfSBmcm9tICcuL21ldGFkYXRhLXBhcnNlcic7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuXG5pbXBvcnQgaWNvbnYgZnJvbSAnaWNvbnYtbGl0ZSc7XG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnc3ByaW50Zi1qcyc7XG5pbXBvcnQgeyBidWZmZXJUb0xvd2VyQ2FzZUd1aWQsIGJ1ZmZlclRvVXBwZXJDYXNlR3VpZCB9IGZyb20gJy4vZ3VpZC1wYXJzZXInO1xuaW1wb3J0IHsgTm90RW5vdWdoRGF0YUVycm9yLCBSZXN1bHQsIHJlYWRCaWdJbnQ2NExFLCByZWFkRG91YmxlTEUsIHJlYWRGbG9hdExFLCByZWFkSW50MTZMRSwgcmVhZEludDMyTEUsIHJlYWRVSW50MTZMRSwgcmVhZFVJbnQzMkxFLCByZWFkVUludDgsIHJlYWRVSW50MjRMRSwgcmVhZFVJbnQ0MExFLCByZWFkVU51bWVyaWM2NExFLCByZWFkVU51bWVyaWM5NkxFLCByZWFkVU51bWVyaWMxMjhMRSB9IGZyb20gJy4vdG9rZW4vaGVscGVycyc7XG5cbmNvbnN0IE5VTEwgPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFRIUkVFX0FORF9BX1RISVJEID0gMyArICgxIC8gMyk7XG5jb25zdCBNT05FWV9ESVZJU09SID0gMTAwMDA7XG5jb25zdCBQTFBfTlVMTCA9IDB4RkZGRkZGRkZGRkZGRkZGRm47XG5jb25zdCBVTktOT1dOX1BMUF9MRU4gPSAweEZGRkZGRkZGRkZGRkZGRkVuO1xuY29uc3QgREVGQVVMVF9FTkNPRElORyA9ICd1dGY4JztcblxuZnVuY3Rpb24gcmVhZFRpbnlJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsSW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRJbnQxNkxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkSW50MzJMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCaWdJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PHN0cmluZz4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRCaWdJbnQ2NExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUudG9TdHJpbmcoKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFJlYWwoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZEZsb2F0TEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZERvdWJsZUxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgaGlnaDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogaGlnaCB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgbG93O1xuICAoeyBvZmZzZXQsIHZhbHVlOiBsb3cgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KChsb3cgKyAoMHgxMDAwMDAwMDAgKiBoaWdoKSkgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQml0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxib29sZWFuPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoISF2YWx1ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHVua25vd24+IHtcbiAgY29uc3QgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICBjYXNlICdUaW55SW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbEludCc6IHtcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ludCc6IHtcbiAgICAgIHJldHVybiByZWFkSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdCaWdJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZEJpZ0ludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW50Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRCaWdJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgSW50TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1JlYWwnOiB7XG4gICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0Zsb2F0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnRmxvYXROJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBGbG9hdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbE1vbmV5Jzoge1xuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgTW9uZXlOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnQml0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0JpdE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiByZWFkQml0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEJpdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgY29uc3QgY29kZXBhZ2UgPSBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlITtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgY29kZXBhZ2UpO1xuICAgIH1cblxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdOQ2hhcic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkTkNoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJCaW5hcnknOlxuICAgIGNhc2UgJ0JpbmFyeSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdUZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuY29sbGF0aW9uIS5jb2RlcGFnZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ05UZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ltYWdlJzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOiB7XG4gICAgICByZXR1cm4gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZSc6IHtcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRGF0ZVRpbWVOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnVGltZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lMic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5zY2FsZSEsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnNjYWxlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5wcmVjaXNpb24hLCBtZXRhZGF0YS5zY2FsZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ1VuaXF1ZUlkZW50aWZpZXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAweDEwOlxuICAgICAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZ3VpZCBzaXplICVkJywgZGF0YUxlbmd0aCEgLSAxKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyaWFudCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkVmFyaWFudChidWYsIG9mZnNldCwgb3B0aW9ucywgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGUhJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUExQU3RyZWFtKG1ldGFkYXRhOiBNZXRhZGF0YSkge1xuICBzd2l0Y2ggKG1ldGFkYXRhLnR5cGUubmFtZSkge1xuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdWYXJCaW5hcnknOiB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEuZGF0YUxlbmd0aCA9PT0gTUFYO1xuICAgIH1cblxuICAgIGNhc2UgJ1htbCc6IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNhc2UgJ1VEVCc6IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkVW5pcXVlSWRlbnRpZmllcihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGxldCBkYXRhO1xuICAoeyB2YWx1ZTogZGF0YSwgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCAweDEwKSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQob3B0aW9ucy5sb3dlckNhc2VHdWlkcyA/IGJ1ZmZlclRvTG93ZXJDYXNlR3VpZChkYXRhKSA6IGJ1ZmZlclRvVXBwZXJDYXNlR3VpZChkYXRhKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZE51bWVyaWMoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIF9wcmVjaXNpb246IG51bWJlciwgc2NhbGU6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgbGV0IHNpZ247XG4gICh7IG9mZnNldCwgdmFsdWU6IHNpZ24gfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gIHNpZ24gPSBzaWduID09PSAxID8gMSA6IC0xO1xuXG4gIGxldCB2YWx1ZTtcbiAgaWYgKGRhdGFMZW5ndGggPT09IDUpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcbiAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID09PSA5KSB7XG4gICAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVOdW1lcmljNjRMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDEzKSB7XG4gICAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVOdW1lcmljOTZMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDE3KSB7XG4gICAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVOdW1lcmljMTI4TEUoYnVmLCBvZmZzZXQpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgbnVtZXJpYyBkYXRhTGVuZ3RoICVkJywgZGF0YUxlbmd0aCkpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoKHZhbHVlICogc2lnbikgLyBNYXRoLnBvdygxMCwgc2NhbGUpLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFyaWFudChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGRhdGFMZW5ndGg6IG51bWJlcik6IFJlc3VsdDx1bmtub3duPiB7XG4gIGxldCBiYXNlVHlwZTtcbiAgKHsgdmFsdWU6IGJhc2VUeXBlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IHR5cGUgPSBUWVBFW2Jhc2VUeXBlXTtcblxuICBsZXQgcHJvcEJ5dGVzO1xuICAoeyB2YWx1ZTogcHJvcEJ5dGVzLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gIGRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoIC0gcHJvcEJ5dGVzIC0gMjtcblxuICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgIGNhc2UgJ1VuaXF1ZUlkZW50aWZpZXInOlxuICAgICAgcmV0dXJuIHJlYWRVbmlxdWVJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zKTtcblxuICAgIGNhc2UgJ0JpdCc6XG4gICAgICByZXR1cm4gcmVhZEJpdChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdUaW55SW50JzpcbiAgICAgIHJldHVybiByZWFkVGlueUludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdTbWFsbEludCc6XG4gICAgICByZXR1cm4gcmVhZFNtYWxsSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0ludCc6XG4gICAgICByZXR1cm4gcmVhZEludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdCaWdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRCaWdJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnU21hbGxEYXRlVGltZSc6XG4gICAgICByZXR1cm4gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgIGNhc2UgJ1JlYWwnOlxuICAgICAgcmV0dXJuIHJlYWRSZWFsKGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICAgIHJldHVybiByZWFkRmxvYXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnU21hbGxNb25leSc6XG4gICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnTW9uZXknOlxuICAgICAgcmV0dXJuIHJlYWRNb25leShidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiByZWFkRGF0ZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgY2FzZSAnVGltZSc6IHtcbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRUaW1lKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lMic6IHtcbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZTIoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWVPZmZzZXQnOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIHNjYWxlKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJCaW5hcnknOlxuICAgIGNhc2UgJ0JpbmFyeSc6IHtcbiAgICAgIC8vIG1heExlbmd0aCAodW51c2VkPylcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdOdW1lcmljTic6XG4gICAgY2FzZSAnRGVjaW1hbE4nOiB7XG4gICAgICBsZXQgcHJlY2lzaW9uO1xuICAgICAgKHsgdmFsdWU6IHByZWNpc2lvbiwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZE51bWVyaWMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIHByZWNpc2lvbiwgc2NhbGUpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ0NoYXInOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgY29sbGF0aW9uO1xuICAgICAgKHsgdmFsdWU6IGNvbGxhdGlvbiwgb2Zmc2V0IH0gPSByZWFkQ29sbGF0aW9uKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIGNvbGxhdGlvbi5jb2RlcGFnZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdOQ2hhcic6IHtcbiAgICAgIC8vIG1heExlbmd0aCAodW51c2VkPylcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIC8vIGNvbGxhdGlvbiAodW51c2VkPylcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZENvbGxhdGlvbihidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZE5DaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRCaW5hcnkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIpOiBSZXN1bHQ8QnVmZmVyPiB7XG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgZGF0YUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSwgb2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRDaGFycyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgY29kZXBhZ2U6IHN0cmluZyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGljb252LmRlY29kZShidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSwgY29kZXBhZ2UgPz8gREVGQVVMVF9FTkNPRElORyksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZWFkTkNoYXJzKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKTogUmVzdWx0PHN0cmluZz4ge1xuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGRhdGFMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGRhdGFMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnRvU3RyaW5nKCd1Y3MyJywgb2Zmc2V0LCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSwgb2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQTFBTdHJlYW0ocGFyc2VyOiBQYXJzZXIpOiBQcm9taXNlPG51bGwgfCBCdWZmZXJbXT4ge1xuICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggPCBwYXJzZXIucG9zaXRpb24gKyA4KSB7XG4gICAgYXdhaXQgcGFyc2VyLndhaXRGb3JDaHVuaygpO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBwYXJzZXIuYnVmZmVyLnJlYWRCaWdVSW50NjRMRShwYXJzZXIucG9zaXRpb24pO1xuICBwYXJzZXIucG9zaXRpb24gKz0gODtcblxuICBpZiAoZXhwZWN0ZWRMZW5ndGggPT09IFBMUF9OVUxMKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gIGxldCBjdXJyZW50TGVuZ3RoID0gMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHdoaWxlIChwYXJzZXIuYnVmZmVyLmxlbmd0aCA8IHBhcnNlci5wb3NpdGlvbiArIDQpIHtcbiAgICAgIGF3YWl0IHBhcnNlci53YWl0Rm9yQ2h1bmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaHVua0xlbmd0aCA9IHBhcnNlci5idWZmZXIucmVhZFVJbnQzMkxFKHBhcnNlci5wb3NpdGlvbik7XG4gICAgcGFyc2VyLnBvc2l0aW9uICs9IDQ7XG5cbiAgICBpZiAoIWNodW5rTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggPCBwYXJzZXIucG9zaXRpb24gKyBjaHVua0xlbmd0aCkge1xuICAgICAgYXdhaXQgcGFyc2VyLndhaXRGb3JDaHVuaygpO1xuICAgIH1cblxuICAgIGNodW5rcy5wdXNoKHBhcnNlci5idWZmZXIuc2xpY2UocGFyc2VyLnBvc2l0aW9uLCBwYXJzZXIucG9zaXRpb24gKyBjaHVua0xlbmd0aCkpO1xuICAgIHBhcnNlci5wb3NpdGlvbiArPSBjaHVua0xlbmd0aDtcbiAgICBjdXJyZW50TGVuZ3RoICs9IGNodW5rTGVuZ3RoO1xuICB9XG5cbiAgaWYgKGV4cGVjdGVkTGVuZ3RoICE9PSBVTktOT1dOX1BMUF9MRU4pIHtcbiAgICBpZiAoY3VycmVudExlbmd0aCAhPT0gTnVtYmVyKGV4cGVjdGVkTGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJ0aWFsbHkgTGVuZ3RoLXByZWZpeGVkIEJ5dGVzIHVubWF0Y2hlZCBsZW5ndGhzIDogZXhwZWN0ZWQgJyArIGV4cGVjdGVkTGVuZ3RoICsgJywgYnV0IGdvdCAnICsgY3VycmVudExlbmd0aCArICcgYnl0ZXMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2h1bmtzO1xufVxuXG5mdW5jdGlvbiByZWFkU21hbGxEYXRlVGltZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgbWludXRlcztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbWludXRlcyB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcykpO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbmV3IERhdGUoMTkwMCwgMCwgMSArIGRheXMsIDAsIG1pbnV0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRlVGltZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCB0aHJlZUh1bmRyZWR0aHNPZlNlY29uZDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQgfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gTWF0aC5yb3VuZCh0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCAqIFRIUkVFX0FORF9BX1RISVJEKTtcblxuICBsZXQgdmFsdWU7XG4gIGlmICh1c2VVVEMpIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCAwLCAwLCBtaWxsaXNlY29uZHMpKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCAwLCAwLCBtaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUsIG9mZnNldCk7XG59XG5cbmludGVyZmFjZSBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGEgZXh0ZW5kcyBEYXRlIHtcbiAgbmFub3NlY29uZHNEZWx0YTogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkVGltZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdmFsdWU7XG5cbiAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgY2FzZSAzOiB7XG4gICAgICAoeyB2YWx1ZSwgb2Zmc2V0IH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgNDoge1xuICAgICAgKHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIDU6IHtcbiAgICAgICh7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRVSW50NDBMRShidWYsIG9mZnNldCkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzY2FsZSA8IDcpIHtcbiAgICBmb3IgKGxldCBpID0gc2NhbGU7IGkgPCA3OyBpKyspIHtcbiAgICAgIHZhbHVlICo9IDEwO1xuICAgIH1cbiAgfVxuXG4gIGxldCBkYXRlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDE5NzAsIDAsIDEsIDAsIDAsIDAsIHZhbHVlIC8gMTAwMDApKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIDAsIDAsIDAsIHZhbHVlIC8gMTAwMDApIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6ICh2YWx1ZSAlIDEwMDAwKSAvIE1hdGgucG93KDEwLCA3KVxuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAodXNlVVRDKSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQobmV3IERhdGUoRGF0ZS5VVEMoMjAwMCwgMCwgZGF5cyAtIDczMDExOCkpLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpLCBvZmZzZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRlVGltZTIoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE+IHtcbiAgbGV0IHRpbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IHRpbWUgfSA9IHJlYWRUaW1lKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoIC0gMywgc2NhbGUsIHVzZVVUQykpO1xuXG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygyMDAwLCAwLCBkYXlzIC0gNzMwMTE4LCAwLCAwLCAwLCArdGltZSkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlID0gbmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IHRpbWUubmFub3NlY29uZHNEZWx0YVxuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB0aW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0aW1lIH0gPSByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCAtIDUsIHNjYWxlLCB0cnVlKSk7XG5cbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuXG4gIC8vIHRpbWUgb2Zmc2V0P1xuICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygyMDAwLCAwLCBkYXlzIC0gNzMwMTE4LCAwLCAwLCAwLCArdGltZSkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiB0aW1lLm5hbm9zZWNvbmRzRGVsdGFcbiAgfSk7XG4gIHJldHVybiBuZXcgUmVzdWx0KGRhdGUsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLnJlYWRWYWx1ZSA9IHJlYWRWYWx1ZTtcbm1vZHVsZS5leHBvcnRzLmlzUExQU3RyZWFtID0gaXNQTFBTdHJlYW07XG5tb2R1bGUuZXhwb3J0cy5yZWFkUExQU3RyZWFtID0gcmVhZFBMUFN0cmVhbTtcblxuZXhwb3J0IHsgcmVhZFZhbHVlLCBpc1BMUFN0cmVhbSwgcmVhZFBMUFN0cmVhbSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBLElBQUFBLGVBQUEsR0FBQUMsT0FBQTtBQUNB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