@dbx-tools/model 0.9.21 → 0.9.28

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 (86) hide show
  1. package/README.md +61 -10
  2. package/index.ts +12 -2
  3. package/lib/exports.d.ts +1 -0
  4. package/lib/exports.js +2 -0
  5. package/lib/index.d.ts +12 -2
  6. package/lib/index.js +9 -2
  7. package/lib/src/_metadata-contract.d.ts +42 -0
  8. package/lib/src/_metadata-contract.js +11 -0
  9. package/lib/src/_metadata-generator.d.ts +7 -0
  10. package/lib/src/_metadata-generator.js +182 -0
  11. package/lib/src/_ranking.d.ts +20 -0
  12. package/lib/src/_ranking.js +226 -0
  13. package/lib/src/_selection.d.ts +23 -0
  14. package/lib/src/_selection.js +95 -0
  15. package/lib/src/classes.d.ts +2 -2
  16. package/lib/src/classes.js +10 -8
  17. package/lib/src/classify.d.ts +130 -0
  18. package/lib/src/classify.js +283 -0
  19. package/lib/src/fallback.d.ts +4 -4
  20. package/lib/src/fallback.js +7 -7
  21. package/lib/src/generated/model-capabilities.json +90 -0
  22. package/lib/src/generated/model-rate-limits.json +342 -0
  23. package/lib/src/generated/retired-models.json +32 -0
  24. package/lib/src/invoke.js +3 -3
  25. package/lib/src/metadata.d.ts +33 -0
  26. package/lib/src/metadata.js +120 -0
  27. package/lib/src/model-catalog.d.ts +4 -4
  28. package/lib/src/model-catalog.js +19 -24
  29. package/lib/src/model-client.d.ts +67 -0
  30. package/lib/src/model-client.js +181 -0
  31. package/lib/src/policy.d.ts +14 -8
  32. package/lib/src/policy.js +173 -14
  33. package/lib/src/python.d.ts +2 -0
  34. package/lib/src/python.js +3 -0
  35. package/lib/src/resolve.d.ts +10 -143
  36. package/lib/src/resolve.js +11 -196
  37. package/lib/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +15 -5
  39. package/src/_metadata-contract.ts +56 -0
  40. package/src/_metadata-generator.ts +199 -0
  41. package/src/_ranking.ts +260 -0
  42. package/src/_selection.ts +141 -0
  43. package/src/classes.ts +11 -7
  44. package/src/classify.ts +324 -0
  45. package/src/fallback.ts +11 -7
  46. package/src/generated/model-capabilities.json +90 -0
  47. package/src/generated/model-rate-limits.json +342 -0
  48. package/src/generated/retired-models.json +32 -0
  49. package/src/invoke.ts +2 -2
  50. package/src/metadata.ts +189 -0
  51. package/src/model-catalog.ts +26 -28
  52. package/src/model-client.ts +311 -0
  53. package/src/policy.ts +176 -19
  54. package/src/python.ts +2 -0
  55. package/src/resolve.ts +24 -270
  56. package/._LICENSE +0 -0
  57. package/._README.md +0 -0
  58. package/._index.ts +0 -0
  59. package/._package.json +0 -0
  60. package/lib/._index.d.ts +0 -0
  61. package/lib/._index.js +0 -0
  62. package/lib/._tsconfig.tsbuildinfo +0 -0
  63. package/lib/src/.__native.d.ts +0 -0
  64. package/lib/src/.__native.js +0 -0
  65. package/lib/src/._classes.d.ts +0 -0
  66. package/lib/src/._classes.js +0 -0
  67. package/lib/src/._fallback.d.ts +0 -0
  68. package/lib/src/._fallback.js +0 -0
  69. package/lib/src/._invoke.d.ts +0 -0
  70. package/lib/src/._invoke.js +0 -0
  71. package/lib/src/._model-catalog.d.ts +0 -0
  72. package/lib/src/._model-catalog.js +0 -0
  73. package/lib/src/._policy.d.ts +0 -0
  74. package/lib/src/._policy.js +0 -0
  75. package/lib/src/._resolve.d.ts +0 -0
  76. package/lib/src/._resolve.js +0 -0
  77. package/lib/src/_native.d.ts +0 -14
  78. package/lib/src/_native.js +0 -124
  79. package/src/.__native.ts +0 -0
  80. package/src/._classes.ts +0 -0
  81. package/src/._fallback.ts +0 -0
  82. package/src/._invoke.ts +0 -0
  83. package/src/._model-catalog.ts +0 -0
  84. package/src/._policy.ts +0 -0
  85. package/src/._resolve.ts +0 -0
  86. package/src/_native.ts +0 -174
@@ -0,0 +1,342 @@
1
+ {
2
+ "generatedAt": 1791144427,
3
+ "catalogue": {
4
+ "models": {
5
+ "bge-large-en": {
6
+ "inputTokensPerMinute": null,
7
+ "outputTokensPerMinute": null,
8
+ "queriesPerHour": 2160000
9
+ },
10
+ "claude-4-1-opus": {
11
+ "inputTokensPerMinute": 200000,
12
+ "outputTokensPerMinute": 20000,
13
+ "queriesPerHour": 360000
14
+ },
15
+ "claude-4-5-haiku": {
16
+ "inputTokensPerMinute": 200000,
17
+ "outputTokensPerMinute": 20000,
18
+ "queriesPerHour": 360000
19
+ },
20
+ "claude-4-5-opus": {
21
+ "inputTokensPerMinute": 200000,
22
+ "outputTokensPerMinute": 20000,
23
+ "queriesPerHour": 360000
24
+ },
25
+ "claude-4-5-sonnet": {
26
+ "inputTokensPerMinute": 200000,
27
+ "outputTokensPerMinute": 20000,
28
+ "queriesPerHour": 360000
29
+ },
30
+ "claude-4-6-opus": {
31
+ "inputTokensPerMinute": 200000,
32
+ "outputTokensPerMinute": 20000,
33
+ "queriesPerHour": 360000
34
+ },
35
+ "claude-4-6-sonnet": {
36
+ "inputTokensPerMinute": 200000,
37
+ "outputTokensPerMinute": 20000,
38
+ "queriesPerHour": 360000
39
+ },
40
+ "claude-4-7-opus": {
41
+ "inputTokensPerMinute": 200000,
42
+ "outputTokensPerMinute": 20000,
43
+ "queriesPerHour": 360000
44
+ },
45
+ "claude-4-8-opus": {
46
+ "inputTokensPerMinute": 200000,
47
+ "outputTokensPerMinute": 20000,
48
+ "queriesPerHour": 360000
49
+ },
50
+ "claude-4-sonnet": {
51
+ "inputTokensPerMinute": 200000,
52
+ "outputTokensPerMinute": 20000,
53
+ "queriesPerHour": 360000
54
+ },
55
+ "claude-5-1-fable": {
56
+ "inputTokensPerMinute": 1000000,
57
+ "outputTokensPerMinute": 100000,
58
+ "queriesPerHour": 360000
59
+ },
60
+ "claude-5-5-opus": {
61
+ "inputTokensPerMinute": 1000000,
62
+ "outputTokensPerMinute": 100000,
63
+ "queriesPerHour": 360000
64
+ },
65
+ "claude-5-5-sonnet": {
66
+ "inputTokensPerMinute": 1000000,
67
+ "outputTokensPerMinute": 100000,
68
+ "queriesPerHour": 360000
69
+ },
70
+ "claude-5-fable": {
71
+ "inputTokensPerMinute": 1000000,
72
+ "outputTokensPerMinute": 100000,
73
+ "queriesPerHour": 360000
74
+ },
75
+ "claude-5-opus": {
76
+ "inputTokensPerMinute": 1000000,
77
+ "outputTokensPerMinute": 100000,
78
+ "queriesPerHour": 360000
79
+ },
80
+ "claude-5-sonnet": {
81
+ "inputTokensPerMinute": 1000000,
82
+ "outputTokensPerMinute": 100000,
83
+ "queriesPerHour": 360000
84
+ },
85
+ "deepseek-4-1-flash": {
86
+ "inputTokensPerMinute": 2000000,
87
+ "outputTokensPerMinute": 40000,
88
+ "queriesPerHour": 7200
89
+ },
90
+ "deepseek-4-flash-0731": {
91
+ "inputTokensPerMinute": 200000,
92
+ "outputTokensPerMinute": 10000,
93
+ "queriesPerHour": null
94
+ },
95
+ "deepseek-4-pro-0813": {
96
+ "inputTokensPerMinute": 200000,
97
+ "outputTokensPerMinute": 4000,
98
+ "queriesPerHour": 7200
99
+ },
100
+ "gemini-2-5-flash": {
101
+ "inputTokensPerMinute": 200000,
102
+ "outputTokensPerMinute": 20000,
103
+ "queriesPerHour": 360000
104
+ },
105
+ "gemini-2-5-pro": {
106
+ "inputTokensPerMinute": 200000,
107
+ "outputTokensPerMinute": 20000,
108
+ "queriesPerHour": 360000
109
+ },
110
+ "gemini-3-1-flash-image": {
111
+ "inputTokensPerMinute": 200000,
112
+ "outputTokensPerMinute": 20000,
113
+ "queriesPerHour": 360000
114
+ },
115
+ "gemini-3-1-flash-lite": {
116
+ "inputTokensPerMinute": 200000,
117
+ "outputTokensPerMinute": 20000,
118
+ "queriesPerHour": 360000
119
+ },
120
+ "gemini-3-1-pro-preview": {
121
+ "inputTokensPerMinute": 200000,
122
+ "outputTokensPerMinute": 20000,
123
+ "queriesPerHour": 360000
124
+ },
125
+ "gemini-3-5-flash": {
126
+ "inputTokensPerMinute": 1000000,
127
+ "outputTokensPerMinute": 100000,
128
+ "queriesPerHour": 360000
129
+ },
130
+ "gemini-3-5-flash-lite": {
131
+ "inputTokensPerMinute": 1000000,
132
+ "outputTokensPerMinute": 100000,
133
+ "queriesPerHour": 360000
134
+ },
135
+ "gemini-3-6-flash": {
136
+ "inputTokensPerMinute": 1000000,
137
+ "outputTokensPerMinute": 100000,
138
+ "queriesPerHour": 360000
139
+ },
140
+ "gemini-3-7-flash": {
141
+ "inputTokensPerMinute": 1000000,
142
+ "outputTokensPerMinute": 100000,
143
+ "queriesPerHour": 360000
144
+ },
145
+ "gemini-3-8-flash": {
146
+ "inputTokensPerMinute": 1000000,
147
+ "outputTokensPerMinute": 100000,
148
+ "queriesPerHour": 360000
149
+ },
150
+ "gemini-3-flash": {
151
+ "inputTokensPerMinute": 200000,
152
+ "outputTokensPerMinute": 20000,
153
+ "queriesPerHour": 360000
154
+ },
155
+ "gemini-3-pro-image": {
156
+ "inputTokensPerMinute": 200000,
157
+ "outputTokensPerMinute": 20000,
158
+ "queriesPerHour": 360000
159
+ },
160
+ "gemma-3-12b": {
161
+ "inputTokensPerMinute": 1000000,
162
+ "outputTokensPerMinute": 100000,
163
+ "queriesPerHour": 360000
164
+ },
165
+ "glm-5-2": {
166
+ "inputTokensPerMinute": 200000,
167
+ "outputTokensPerMinute": 20000,
168
+ "queriesPerHour": 7200
169
+ },
170
+ "glm-5-3": {
171
+ "inputTokensPerMinute": 2000000,
172
+ "outputTokensPerMinute": 40000,
173
+ "queriesPerHour": 7200
174
+ },
175
+ "glm-5-3-flash": {
176
+ "inputTokensPerMinute": 2000000,
177
+ "outputTokensPerMinute": 40000,
178
+ "queriesPerHour": 7200
179
+ },
180
+ "gpt-5": {
181
+ "inputTokensPerMinute": 200000,
182
+ "outputTokensPerMinute": 20000,
183
+ "queriesPerHour": 360000
184
+ },
185
+ "gpt-5-1": {
186
+ "inputTokensPerMinute": 200000,
187
+ "outputTokensPerMinute": 20000,
188
+ "queriesPerHour": 360000
189
+ },
190
+ "gpt-5-2": {
191
+ "inputTokensPerMinute": 200000,
192
+ "outputTokensPerMinute": 20000,
193
+ "queriesPerHour": 360000
194
+ },
195
+ "gpt-5-3-codex": {
196
+ "inputTokensPerMinute": 200000,
197
+ "outputTokensPerMinute": 20000,
198
+ "queriesPerHour": 360000
199
+ },
200
+ "gpt-5-4": {
201
+ "inputTokensPerMinute": 200000,
202
+ "outputTokensPerMinute": 20000,
203
+ "queriesPerHour": 360000
204
+ },
205
+ "gpt-5-4-mini": {
206
+ "inputTokensPerMinute": 200000,
207
+ "outputTokensPerMinute": 20000,
208
+ "queriesPerHour": 360000
209
+ },
210
+ "gpt-5-4-nano": {
211
+ "inputTokensPerMinute": 200000,
212
+ "outputTokensPerMinute": 20000,
213
+ "queriesPerHour": 360000
214
+ },
215
+ "gpt-5-5": {
216
+ "inputTokensPerMinute": 200000,
217
+ "outputTokensPerMinute": 20000,
218
+ "queriesPerHour": 360000
219
+ },
220
+ "gpt-5-5-pro": {
221
+ "inputTokensPerMinute": 200000,
222
+ "outputTokensPerMinute": 20000,
223
+ "queriesPerHour": 360000
224
+ },
225
+ "gpt-5-6-luna": {
226
+ "inputTokensPerMinute": 200000,
227
+ "outputTokensPerMinute": 20000,
228
+ "queriesPerHour": 360000
229
+ },
230
+ "gpt-5-6-sol": {
231
+ "inputTokensPerMinute": 200000,
232
+ "outputTokensPerMinute": 20000,
233
+ "queriesPerHour": 360000
234
+ },
235
+ "gpt-5-6-terra": {
236
+ "inputTokensPerMinute": 200000,
237
+ "outputTokensPerMinute": 20000,
238
+ "queriesPerHour": 360000
239
+ },
240
+ "gpt-5-mini": {
241
+ "inputTokensPerMinute": 200000,
242
+ "outputTokensPerMinute": 20000,
243
+ "queriesPerHour": 360000
244
+ },
245
+ "gpt-5-nano": {
246
+ "inputTokensPerMinute": 200000,
247
+ "outputTokensPerMinute": 20000,
248
+ "queriesPerHour": 360000
249
+ },
250
+ "gpt-6-1-sol": {
251
+ "inputTokensPerMinute": 1000000,
252
+ "outputTokensPerMinute": 100000,
253
+ "queriesPerHour": 360000
254
+ },
255
+ "gpt-6-astra": {
256
+ "inputTokensPerMinute": 1000000,
257
+ "outputTokensPerMinute": 100000,
258
+ "queriesPerHour": 360000
259
+ },
260
+ "gpt-6-luna": {
261
+ "inputTokensPerMinute": 1000000,
262
+ "outputTokensPerMinute": 100000,
263
+ "queriesPerHour": 360000
264
+ },
265
+ "gpt-6-sol": {
266
+ "inputTokensPerMinute": 1000000,
267
+ "outputTokensPerMinute": 100000,
268
+ "queriesPerHour": 360000
269
+ },
270
+ "gpt-oss-120b": {
271
+ "inputTokensPerMinute": 1000000,
272
+ "outputTokensPerMinute": 100000,
273
+ "queriesPerHour": 360000
274
+ },
275
+ "gpt-oss-20b": {
276
+ "inputTokensPerMinute": 1000000,
277
+ "outputTokensPerMinute": 100000,
278
+ "queriesPerHour": 360000
279
+ },
280
+ "grok-4-6": {
281
+ "inputTokensPerMinute": 1000000,
282
+ "outputTokensPerMinute": 100000,
283
+ "queriesPerHour": 360000
284
+ },
285
+ "grok-4-7": {
286
+ "inputTokensPerMinute": 1000000,
287
+ "outputTokensPerMinute": 100000,
288
+ "queriesPerHour": 360000
289
+ },
290
+ "gte-large-en": {
291
+ "inputTokensPerMinute": null,
292
+ "outputTokensPerMinute": null,
293
+ "queriesPerHour": 540000
294
+ },
295
+ "inkling": {
296
+ "inputTokensPerMinute": 200000,
297
+ "outputTokensPerMinute": 10000,
298
+ "queriesPerHour": 7200
299
+ },
300
+ "kimi-3": {
301
+ "inputTokensPerMinute": 2000000,
302
+ "outputTokensPerMinute": 40000,
303
+ "queriesPerHour": null
304
+ },
305
+ "llama-3-1-8b-instruct": {
306
+ "inputTokensPerMinute": 1000000,
307
+ "outputTokensPerMinute": 100000,
308
+ "queriesPerHour": 360000
309
+ },
310
+ "llama-3-3-70b-instruct": {
311
+ "inputTokensPerMinute": 1000000,
312
+ "outputTokensPerMinute": 100000,
313
+ "queriesPerHour": 360000
314
+ },
315
+ "llama-4-maverick": {
316
+ "inputTokensPerMinute": 1000000,
317
+ "outputTokensPerMinute": 100000,
318
+ "queriesPerHour": 360000
319
+ },
320
+ "qwen-3-5-122b-a10b": {
321
+ "inputTokensPerMinute": 1000000,
322
+ "outputTokensPerMinute": 100000,
323
+ "queriesPerHour": 360000
324
+ },
325
+ "qwen-3-5-4b": {
326
+ "inputTokensPerMinute": 2000000,
327
+ "outputTokensPerMinute": 40000,
328
+ "queriesPerHour": 7200
329
+ },
330
+ "qwen-3-embedding-0-6b": {
331
+ "inputTokensPerMinute": null,
332
+ "outputTokensPerMinute": null,
333
+ "queriesPerHour": 2160000
334
+ },
335
+ "qwen-3-next-80b-a3b-instruct": {
336
+ "inputTokensPerMinute": 1000000,
337
+ "outputTokensPerMinute": 100000,
338
+ "queriesPerHour": 360000
339
+ }
340
+ }
341
+ }
342
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "generatedAt": 1791144427,
3
+ "models": [
4
+ "Anthropic Claude 3.7 Sonnet",
5
+ "Anthropic Claude Sonnet 4",
6
+ "DBRX",
7
+ "DBRX Instruct",
8
+ "DeepSeek V4 Pro (0813)",
9
+ "Gemini 2.5 Flash",
10
+ "Gemini 2.5 Pro",
11
+ "Gemini 3 Pro",
12
+ "Kimi K2.7",
13
+ "Meta Llama 2 13B",
14
+ "Meta Llama 2 70B",
15
+ "Meta Llama 2 7B",
16
+ "Meta Llama 3 (70B)",
17
+ "Meta Llama 3 8B",
18
+ "Meta Llama 3.1 405B",
19
+ "Meta-Llama-2-70B-Chat",
20
+ "Mistral 7B",
21
+ "Mixtral 8x7B",
22
+ "Mixtral-8x7B Instruct",
23
+ "MPT 30B",
24
+ "MPT 30B Instruct",
25
+ "MPT 7B",
26
+ "MPT 7B Instruct",
27
+ "OpenAI GPT-5.1 Codex Max",
28
+ "OpenAI GPT-5.1 Codex Mini",
29
+ "OpenAI GPT-5.2 Codex",
30
+ "Thinking Machine Labs Inkling"
31
+ ]
32
+ }
package/lib/src/invoke.js CHANGED
@@ -17,7 +17,7 @@
17
17
  *
18
18
  * @module
19
19
  */
20
- import { isResponsesOnly as isResponsesOnlyRs } from "@dbx-tools/model-rs";
20
+ import { isResponsesOnly as isResponsesOnlyByPolicy } from "./policy.js";
21
21
  /**
22
22
  * Path segment appended to a serving endpoint for OpenAI-compatible chat
23
23
  * requests. Databricks routes `/serving-endpoints/<name>/invocations` to the
@@ -70,7 +70,7 @@ export function chatCompletionsUrl(host) {
70
70
  * those to {@link responsesUrl} instead of {@link invocationsUrl}.
71
71
  */
72
72
  export function isResponsesOnly(endpoint) {
73
- return isResponsesOnlyRs(endpoint);
73
+ return isResponsesOnlyByPolicy(endpoint);
74
74
  }
75
75
  /**
76
76
  * Pick the Databricks Responses upstream for an endpoint id: OpenAI-family
@@ -102,4 +102,4 @@ export async function authHeaders(client) {
102
102
  });
103
103
  return out;
104
104
  }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGVBQWUsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTNFOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBRWhEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUV0RTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG9DQUFvQyxDQUFDO0FBRTFFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzNELE9BQU8sSUFBSSxHQUFHLENBQ1oscUJBQXFCLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLGtCQUFrQixFQUFFLEVBQ3pFLElBQUksQ0FDTCxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2YsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxPQUFPLElBQUksR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3ZELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDN0MsT0FBTyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsUUFBZ0I7SUFDOUMsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7SUFDakUsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxRQUFnQjtJQUN0QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ25CLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDckIsQ0FBQztBQUNKLENBQUM7QUFjRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLE1BQWdDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDOUIsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FsbGluZyBhIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgZGlyZWN0bHkgb3ZlciBIVFRQLlxuICpcbiAqIFRoZSBTREsncyBgc2VydmluZ0VuZHBvaW50cy5xdWVyeWAgY292ZXJzIHRoZSB0eXBlZCByZXF1ZXN0IHNoYXBlcywgYnV0IGFuXG4gKiBPcGVuQUktY29tcGF0aWJsZSBjYWxsZXIgKGEgcHJveHksIGEgcGFzc3Rocm91Z2ggcm91dGUsIGEgc3RyZWFtaW5nIGNsaWVudClcbiAqIG5lZWRzIHRvIGlzc3VlIGl0cyBvd24gYGZldGNoYCBhZ2FpbnN0IERhdGFicmlja3MnIE9wZW5BSS1zaGFwZWQgVVJMcyB3aXRoXG4gKiBhbiBPcGVuQUkgYm9keS4gVGhhdCBuZWVkcyBleGFjdGx5IHR3byB0aGluZ3MgdGhlIFNESyBkb2Vzbid0IGhhbmQgb3V0XG4gKiBkaXJlY3RseTogdGhlIFVSTCAoe0BsaW5rIGludm9jYXRpb25zVXJsfSAvIHtAbGluayByZXNwb25zZXNVcmx9IC9cbiAqIHtAbGluayBvcGVuUmVzcG9uc2VzVXJsfSkgYW5kIGEgY3VycmVudGx5LXZhbGlkIHNldCBvZiBhdXRoIGhlYWRlcnNcbiAqICh7QGxpbmsgYXV0aEhlYWRlcnN9KS5cbiAqXG4gKiBBdXRoIGlzIGRlbGVnYXRlZCBlbnRpcmVseSB0byB0aGUgRGF0YWJyaWNrcyBTREs6IGBjb25maWcuYXV0aGVudGljYXRlYFxuICogcmUtcnVucyB0aGUgY29uZmlndXJlZCBjcmVkZW50aWFsIHByb3ZpZGVyIG9uIGV2ZXJ5IGNhbGwgYW5kIHJlZnJlc2hlcyB0aGVcbiAqIHVuZGVybHlpbmcgT0F1dGggLyBQQVQgdG9rZW4gd2hlbiBpdCBpcyBjbG9zZSB0byBleHBpcnksIHNvIGEgY2FsbGVyIG5ldmVyXG4gKiBtYW5hZ2VzIHRva2VuIGxpZmV0aW1lcyBpdHNlbGYgLSBtaW50IGhlYWRlcnMgcGVyIHJlcXVlc3QgYW5kIGVhY2ggb25lIGlzXG4gKiBzaWduZWQgd2l0aCBhIHZhbGlkIGJlYXJlciB0b2tlbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNSZXNwb25zZXNPbmx5IGFzIGlzUmVzcG9uc2VzT25seVJzIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwtcnNcIjtcblxuLyoqXG4gKiBQYXRoIHNlZ21lbnQgYXBwZW5kZWQgdG8gYSBzZXJ2aW5nIGVuZHBvaW50IGZvciBPcGVuQUktY29tcGF0aWJsZSBjaGF0XG4gKiByZXF1ZXN0cy4gRGF0YWJyaWNrcyByb3V0ZXMgYC9zZXJ2aW5nLWVuZHBvaW50cy88bmFtZT4vaW52b2NhdGlvbnNgIHRvIHRoZVxuICogZW5kcG9pbnQncyBDaGF0IENvbXBsZXRpb25zIHN1cmZhY2UgKGBtZXNzYWdlc2AgaW4sIGBjaG9pY2VzYCBvdXQpLiBTb21lXG4gKiBtb2RlbHMgKG5vdGFibHkgQ29kZXgpIHJlamVjdCB0aGlzIHBhdGggYW5kIHJlcXVpcmUge0BsaW5rIHJlc3BvbnNlc1VybH0uXG4gKi9cbmV4cG9ydCBjb25zdCBJTlZPQ0FUSU9OU19TVUZGSVggPSBcImludm9jYXRpb25zXCI7XG5cbi8qKlxuICogV29ya3NwYWNlLWxldmVsIE9wZW5BSSBSZXNwb25zZXMgQVBJIHBhdGguIEJvZHkgY2FycmllcyBgbW9kZWxgIChlbmRwb2ludFxuICogaWQpOyB1c2VkIGJ5IEdQVCAvIENvZGV4IG1vZGVscyB0aGF0IHNwZWFrIFJlc3BvbnNlcyBuYXRpdmVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFU1BPTlNFU19QQVRIID0gXCJzZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNcIjtcblxuLyoqXG4gKiBXb3Jrc3BhY2UtbGV2ZWwgT3BlbiBSZXNwb25zZXMgQVBJIHBhdGggLSB0aGUgY3Jvc3MtcHJvdmlkZXIgUmVzcG9uc2VzXG4gKiBzdXJmYWNlIChDbGF1ZGUsIEdlbWluaSwg4oCmKSB0aGF0IE9wZW5BSSBgL3Jlc3BvbnNlc2AgZG9lcyBub3QgY292ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBPUEVOX1JFU1BPTlNFU19QQVRIID0gXCJzZXJ2aW5nLWVuZHBvaW50cy9vcGVuLXJlc3BvbnNlc1wiO1xuXG4vKipcbiAqIFdvcmtzcGFjZS1sZXZlbCBPcGVuQUkgQ2hhdCBDb21wbGV0aW9ucyBwYXRoLiBCb2R5IGNhcnJpZXMgYG1vZGVsYCAoZW5kcG9pbnRcbiAqIGlkKSwgdW5saWtlIHtAbGluayBpbnZvY2F0aW9uc1VybH0gd2hpY2ggbmFtZXMgdGhlIGVuZHBvaW50IGluIHRoZSBVUkwuIFVzZVxuICogdGhpcyB3aGVuIHRoZSBjYWxsZXIgaGFzIGEgbW9kZWwgaWQgcmF0aGVyIHRoYW4gYSBwZXItZW5kcG9pbnQgcm91dGUgLSBlLmcuXG4gKiBhdHRhY2hpbmcgYSBwcm92aWRlciB0b29sIHNwZWMgdG8gd2hpY2hldmVyIGVuZHBvaW50IHdhcyByZXNvbHZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfQ09NUExFVElPTlNfUEFUSCA9IFwic2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc1wiO1xuXG4vKipcbiAqIFRoZSBPcGVuQUktY29tcGF0aWJsZSBjaGF0LWNvbXBsZXRpb25zIGludm9jYXRpb25zIFVSTCBmb3IgYW4gZW5kcG9pbnQgaWQuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCwgZS5nLiBgaHR0cHM6Ly9teS13b3Jrc3BhY2UuY2xvdWQuZGF0YWJyaWNrcy5jb20vYC5cbiAqICAgUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWQgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgLlxuICogQHBhcmFtIGVuZHBvaW50IC0gRW5kcG9pbnQgaWQgKGFscmVhZHkgcmVzb2x2ZWQ7IG5vdCBmdXp6eS1tYXRjaGVkIGhlcmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2NhdGlvbnNVcmwoaG9zdDogc3RyaW5nLCBlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoXG4gICAgYHNlcnZpbmctZW5kcG9pbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZHBvaW50KX0vJHtJTlZPQ0FUSU9OU19TVUZGSVh9YCxcbiAgICBob3N0LFxuICApLnRvU3RyaW5nKCk7XG59XG5cbi8qKiBXb3Jrc3BhY2UgT3BlbkFJIFJlc3BvbnNlcyBBUEkgVVJMIChgUE9TVGAsIG1vZGVsIGluIHRoZSBib2R5KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZXNVcmwoaG9zdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoUkVTUE9OU0VTX1BBVEgsIGhvc3QpLnRvU3RyaW5nKCk7XG59XG5cbi8qKiBXb3Jrc3BhY2UgT3BlbiBSZXNwb25zZXMgQVBJIFVSTCAoYFBPU1RgLCBtb2RlbCBpbiB0aGUgYm9keSkuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblJlc3BvbnNlc1VybChob3N0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChPUEVOX1JFU1BPTlNFU19QQVRILCBob3N0KS50b1N0cmluZygpO1xufVxuXG4vKiogV29ya3NwYWNlIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIFVSTCAoYFBPU1RgLCBtb2RlbCBpbiB0aGUgYm9keSkuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdENvbXBsZXRpb25zVXJsKGhvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVVJMKENIQVRfQ09NUExFVElPTlNfUEFUSCwgaG9zdCkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVuZHBvaW50IGlzIGtub3duIHRvIHJlamVjdCBDaGF0IENvbXBsZXRpb25zIGAvaW52b2NhdGlvbnNgXG4gKiBhbmQgcmVxdWlyZSB0aGUgUmVzcG9uc2VzIEFQSSAoQ29kZXggbW9kZWxzIHRvZGF5KS4gQ2FsbGVycyBzaG91bGQgcm91dGVcbiAqIHRob3NlIHRvIHtAbGluayByZXNwb25zZXNVcmx9IGluc3RlYWQgb2Yge0BsaW5rIGludm9jYXRpb25zVXJsfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzcG9uc2VzT25seShlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Jlc3BvbnNlc09ubHlScyhlbmRwb2ludCk7XG59XG5cbi8qKlxuICogUGljayB0aGUgRGF0YWJyaWNrcyBSZXNwb25zZXMgdXBzdHJlYW0gZm9yIGFuIGVuZHBvaW50IGlkOiBPcGVuQUktZmFtaWx5XG4gKiBtb2RlbHMgdXNlIGAvc2VydmluZy1lbmRwb2ludHMvcmVzcG9uc2VzYDsgZXZlcnl0aGluZyBlbHNlIHVzZXMgdGhlXG4gKiBjcm9zcy1wcm92aWRlciBgL3NlcnZpbmctZW5kcG9pbnRzL29wZW4tcmVzcG9uc2VzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlc1Vwc3RyZWFtVXJsKGhvc3Q6IHN0cmluZywgZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpc09wZW5BaUZhbWlseShlbmRwb2ludCkgPyByZXNwb25zZXNVcmwoaG9zdCkgOiBvcGVuUmVzcG9uc2VzVXJsKGhvc3QpO1xufVxuXG4vKiogR1BUIC8gQ29kZXggLyBvLXNlcmllcyBzdHlsZSBlbmRwb2ludCBuYW1lcyB0aGF0IHNwZWFrIE9wZW5BSSBSZXNwb25zZXMuICovXG5mdW5jdGlvbiBpc09wZW5BaUZhbWlseShlbmRwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBlbmRwb2ludC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKFxuICAgIG4uaW5jbHVkZXMoXCJncHRcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiY29kZXhcIikgfHxcbiAgICAvKF58W15hLXpdKW9bMS05XShbXmEtel18JCkvLnRlc3QobikgfHxcbiAgICBuLmluY2x1ZGVzKFwib3BlbmFpXCIpXG4gICk7XG59XG5cbi8qKlxuICogTWluaW1hbCBzdHJ1Y3R1cmFsIHNoYXBlIHtAbGluayBhdXRoSGVhZGVyc30gbmVlZHMuIERlY2xhcmVkIG5hcnJvd2x5IHJhdGhlclxuICogdGhhbiBhcyBhIGZ1bGwgYFdvcmtzcGFjZUNsaWVudExpa2VgIHNvIGEgY2FsbGVyIGhvbGRpbmcgaXRzIG93blxuICogYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgIGBXb3Jrc3BhY2VDbGllbnRgIHNhdGlzZmllcyBpdCByZWdhcmRsZXNzIG9mXG4gKiB3aGljaCBTREsgdmVyc2lvbiByZXNvbHZlZCBpbiBpdHMgdHJlZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoZW50aWNhdGluZ0NsaWVudExpa2Uge1xuICBjb25maWc6IHtcbiAgICBhdXRoZW50aWNhdGUoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbi8qKlxuICogTWludCBhdXRoIGhlYWRlcnMgZm9yIG9uZSB1cHN0cmVhbSByZXF1ZXN0IGFzIGEgcGxhaW4gb2JqZWN0LCByZWFkeSB0byBzcHJlYWRcbiAqIGludG8gYSBgZmV0Y2hgIGluaXQuIENhbGwgaXQgcGVyIHJlcXVlc3Q6IHRoZSBTREsgcmVmcmVzaGVzIHRoZSB1bmRlcmx5aW5nXG4gKiB0b2tlbiB3aGVuIG5lZWRlZCwgc28gYSBsb25nLWxpdmVkIHByb2Nlc3MgbmV2ZXIgaGFzIHRvIHRyYWNrIGV4cGlyeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoSGVhZGVycyhcbiAgY2xpZW50OiBBdXRoZW50aWNhdGluZ0NsaWVudExpa2UsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgb3V0W2tleV0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGVBQWUsSUFBSSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6RTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUM7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsa0NBQWtDLENBQUM7QUFFdEU7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxvQ0FBb0MsQ0FBQztBQUUxRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQVksRUFBRSxRQUFnQjtJQUMzRCxPQUFPLElBQUksR0FBRyxDQUNaLHFCQUFxQixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxrQkFBa0IsRUFBRSxFQUN6RSxJQUFJLENBQ0wsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNmLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE9BQU8sSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2xELENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLE9BQU8sSUFBSSxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQ2pFLE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxjQUFjLENBQUMsUUFBZ0I7SUFDdEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLE9BQU8sQ0FDTCxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNuQiw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBY0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixNQUFnQztJQUVoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUN2QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhbGxpbmcgYSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IGRpcmVjdGx5IG92ZXIgSFRUUC5cbiAqXG4gKiBUaGUgU0RLJ3MgYHNlcnZpbmdFbmRwb2ludHMucXVlcnlgIGNvdmVycyB0aGUgdHlwZWQgcmVxdWVzdCBzaGFwZXMsIGJ1dCBhblxuICogT3BlbkFJLWNvbXBhdGlibGUgY2FsbGVyIChhIHByb3h5LCBhIHBhc3N0aHJvdWdoIHJvdXRlLCBhIHN0cmVhbWluZyBjbGllbnQpXG4gKiBuZWVkcyB0byBpc3N1ZSBpdHMgb3duIGBmZXRjaGAgYWdhaW5zdCBEYXRhYnJpY2tzJyBPcGVuQUktc2hhcGVkIFVSTHMgd2l0aFxuICogYW4gT3BlbkFJIGJvZHkuIFRoYXQgbmVlZHMgZXhhY3RseSB0d28gdGhpbmdzIHRoZSBTREsgZG9lc24ndCBoYW5kIG91dFxuICogZGlyZWN0bHk6IHRoZSBVUkwgKHtAbGluayBpbnZvY2F0aW9uc1VybH0gLyB7QGxpbmsgcmVzcG9uc2VzVXJsfSAvXG4gKiB7QGxpbmsgb3BlblJlc3BvbnNlc1VybH0pIGFuZCBhIGN1cnJlbnRseS12YWxpZCBzZXQgb2YgYXV0aCBoZWFkZXJzXG4gKiAoe0BsaW5rIGF1dGhIZWFkZXJzfSkuXG4gKlxuICogQXV0aCBpcyBkZWxlZ2F0ZWQgZW50aXJlbHkgdG8gdGhlIERhdGFicmlja3MgU0RLOiBgY29uZmlnLmF1dGhlbnRpY2F0ZWBcbiAqIHJlLXJ1bnMgdGhlIGNvbmZpZ3VyZWQgY3JlZGVudGlhbCBwcm92aWRlciBvbiBldmVyeSBjYWxsIGFuZCByZWZyZXNoZXMgdGhlXG4gKiB1bmRlcmx5aW5nIE9BdXRoIC8gUEFUIHRva2VuIHdoZW4gaXQgaXMgY2xvc2UgdG8gZXhwaXJ5LCBzbyBhIGNhbGxlciBuZXZlclxuICogbWFuYWdlcyB0b2tlbiBsaWZldGltZXMgaXRzZWxmIC0gbWludCBoZWFkZXJzIHBlciByZXF1ZXN0IGFuZCBlYWNoIG9uZSBpc1xuICogc2lnbmVkIHdpdGggYSB2YWxpZCBiZWFyZXIgdG9rZW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlzUmVzcG9uc2VzT25seSBhcyBpc1Jlc3BvbnNlc09ubHlCeVBvbGljeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG4vKipcbiAqIFBhdGggc2VnbWVudCBhcHBlbmRlZCB0byBhIHNlcnZpbmcgZW5kcG9pbnQgZm9yIE9wZW5BSS1jb21wYXRpYmxlIGNoYXRcbiAqIHJlcXVlc3RzLiBEYXRhYnJpY2tzIHJvdXRlcyBgL3NlcnZpbmctZW5kcG9pbnRzLzxuYW1lPi9pbnZvY2F0aW9uc2AgdG8gdGhlXG4gKiBlbmRwb2ludCdzIENoYXQgQ29tcGxldGlvbnMgc3VyZmFjZSAoYG1lc3NhZ2VzYCBpbiwgYGNob2ljZXNgIG91dCkuIFNvbWVcbiAqIG1vZGVscyAobm90YWJseSBDb2RleCkgcmVqZWN0IHRoaXMgcGF0aCBhbmQgcmVxdWlyZSB7QGxpbmsgcmVzcG9uc2VzVXJsfS5cbiAqL1xuZXhwb3J0IGNvbnN0IElOVk9DQVRJT05TX1NVRkZJWCA9IFwiaW52b2NhdGlvbnNcIjtcblxuLyoqXG4gKiBXb3Jrc3BhY2UtbGV2ZWwgT3BlbkFJIFJlc3BvbnNlcyBBUEkgcGF0aC4gQm9keSBjYXJyaWVzIGBtb2RlbGAgKGVuZHBvaW50XG4gKiBpZCk7IHVzZWQgYnkgR1BUIC8gQ29kZXggbW9kZWxzIHRoYXQgc3BlYWsgUmVzcG9uc2VzIG5hdGl2ZWx5LlxuICovXG5leHBvcnQgY29uc3QgUkVTUE9OU0VTX1BBVEggPSBcInNlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc1wiO1xuXG4vKipcbiAqIFdvcmtzcGFjZS1sZXZlbCBPcGVuIFJlc3BvbnNlcyBBUEkgcGF0aCAtIHRoZSBjcm9zcy1wcm92aWRlciBSZXNwb25zZXNcbiAqIHN1cmZhY2UgKENsYXVkZSwgR2VtaW5pLCDigKYpIHRoYXQgT3BlbkFJIGAvcmVzcG9uc2VzYCBkb2VzIG5vdCBjb3Zlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QRU5fUkVTUE9OU0VTX1BBVEggPSBcInNlcnZpbmctZW5kcG9pbnRzL29wZW4tcmVzcG9uc2VzXCI7XG5cbi8qKlxuICogV29ya3NwYWNlLWxldmVsIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIHBhdGguIEJvZHkgY2FycmllcyBgbW9kZWxgIChlbmRwb2ludFxuICogaWQpLCB1bmxpa2Uge0BsaW5rIGludm9jYXRpb25zVXJsfSB3aGljaCBuYW1lcyB0aGUgZW5kcG9pbnQgaW4gdGhlIFVSTC4gVXNlXG4gKiB0aGlzIHdoZW4gdGhlIGNhbGxlciBoYXMgYSBtb2RlbCBpZCByYXRoZXIgdGhhbiBhIHBlci1lbmRwb2ludCByb3V0ZSAtIGUuZy5cbiAqIGF0dGFjaGluZyBhIHByb3ZpZGVyIHRvb2wgc3BlYyB0byB3aGljaGV2ZXIgZW5kcG9pbnQgd2FzIHJlc29sdmVkLlxuICovXG5leHBvcnQgY29uc3QgQ0hBVF9DT01QTEVUSU9OU19QQVRIID0gXCJzZXJ2aW5nLWVuZHBvaW50cy9jaGF0L2NvbXBsZXRpb25zXCI7XG5cbi8qKlxuICogVGhlIE9wZW5BSS1jb21wYXRpYmxlIGNoYXQtY29tcGxldGlvbnMgaW52b2NhdGlvbnMgVVJMIGZvciBhbiBlbmRwb2ludCBpZC5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0LCBlLmcuIGBodHRwczovL215LXdvcmtzcGFjZS5jbG91ZC5kYXRhYnJpY2tzLmNvbS9gLlxuICogICBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZCBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAuXG4gKiBAcGFyYW0gZW5kcG9pbnQgLSBFbmRwb2ludCBpZCAoYWxyZWFkeSByZXNvbHZlZDsgbm90IGZ1enp5LW1hdGNoZWQgaGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZvY2F0aW9uc1VybChob3N0OiBzdHJpbmcsIGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChcbiAgICBgc2VydmluZy1lbmRwb2ludHMvJHtlbmNvZGVVUklDb21wb25lbnQoZW5kcG9pbnQpfS8ke0lOVk9DQVRJT05TX1NVRkZJWH1gLFxuICAgIGhvc3QsXG4gICkudG9TdHJpbmcoKTtcbn1cblxuLyoqIFdvcmtzcGFjZSBPcGVuQUkgUmVzcG9uc2VzIEFQSSBVUkwgKGBQT1NUYCwgbW9kZWwgaW4gdGhlIGJvZHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlc1VybChob3N0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChSRVNQT05TRVNfUEFUSCwgaG9zdCkudG9TdHJpbmcoKTtcbn1cblxuLyoqIFdvcmtzcGFjZSBPcGVuIFJlc3BvbnNlcyBBUEkgVVJMIChgUE9TVGAsIG1vZGVsIGluIHRoZSBib2R5KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuUmVzcG9uc2VzVXJsKGhvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVVJMKE9QRU5fUkVTUE9OU0VTX1BBVEgsIGhvc3QpLnRvU3RyaW5nKCk7XG59XG5cbi8qKiBXb3Jrc3BhY2UgT3BlbkFJIENoYXQgQ29tcGxldGlvbnMgVVJMIChgUE9TVGAsIG1vZGVsIGluIHRoZSBib2R5KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0Q29tcGxldGlvbnNVcmwoaG9zdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoQ0hBVF9DT01QTEVUSU9OU19QQVRILCBob3N0KS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiB0aGUgZW5kcG9pbnQgaXMga25vd24gdG8gcmVqZWN0IENoYXQgQ29tcGxldGlvbnMgYC9pbnZvY2F0aW9uc2BcbiAqIGFuZCByZXF1aXJlIHRoZSBSZXNwb25zZXMgQVBJIChDb2RleCBtb2RlbHMgdG9kYXkpLiBDYWxsZXJzIHNob3VsZCByb3V0ZVxuICogdGhvc2UgdG8ge0BsaW5rIHJlc3BvbnNlc1VybH0gaW5zdGVhZCBvZiB7QGxpbmsgaW52b2NhdGlvbnNVcmx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNwb25zZXNPbmx5KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUmVzcG9uc2VzT25seUJ5UG9saWN5KGVuZHBvaW50KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBEYXRhYnJpY2tzIFJlc3BvbnNlcyB1cHN0cmVhbSBmb3IgYW4gZW5kcG9pbnQgaWQ6IE9wZW5BSS1mYW1pbHlcbiAqIG1vZGVscyB1c2UgYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgOyBldmVyeXRoaW5nIGVsc2UgdXNlcyB0aGVcbiAqIGNyb3NzLXByb3ZpZGVyIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2VzVXBzdHJlYW1VcmwoaG9zdDogc3RyaW5nLCBlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzT3BlbkFpRmFtaWx5KGVuZHBvaW50KSA/IHJlc3BvbnNlc1VybChob3N0KSA6IG9wZW5SZXNwb25zZXNVcmwoaG9zdCk7XG59XG5cbi8qKiBHUFQgLyBDb2RleCAvIG8tc2VyaWVzIHN0eWxlIGVuZHBvaW50IG5hbWVzIHRoYXQgc3BlYWsgT3BlbkFJIFJlc3BvbnNlcy4gKi9cbmZ1bmN0aW9uIGlzT3BlbkFpRmFtaWx5KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IGVuZHBvaW50LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAoXG4gICAgbi5pbmNsdWRlcyhcImdwdFwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJjb2RleFwiKSB8fFxuICAgIC8oXnxbXmEtel0pb1sxLTldKFteYS16XXwkKS8udGVzdChuKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJvcGVuYWlcIilcbiAgKTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIHN0cnVjdHVyYWwgc2hhcGUge0BsaW5rIGF1dGhIZWFkZXJzfSBuZWVkcy4gRGVjbGFyZWQgbmFycm93bHkgcmF0aGVyXG4gKiB0aGFuIGFzIGEgZnVsbCBgV29ya3NwYWNlQ2xpZW50TGlrZWAgc28gYSBjYWxsZXIgaG9sZGluZyBpdHMgb3duXG4gKiBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgYFdvcmtzcGFjZUNsaWVudGAgc2F0aXNmaWVzIGl0IHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoaWNoIFNESyB2ZXJzaW9uIHJlc29sdmVkIGluIGl0cyB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB7XG4gIGNvbmZpZzoge1xuICAgIGF1dGhlbnRpY2F0ZShoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTx2b2lkPjtcbiAgfTtcbn1cblxuLyoqXG4gKiBNaW50IGF1dGggaGVhZGVycyBmb3Igb25lIHVwc3RyZWFtIHJlcXVlc3QgYXMgYSBwbGFpbiBvYmplY3QsIHJlYWR5IHRvIHNwcmVhZFxuICogaW50byBhIGBmZXRjaGAgaW5pdC4gQ2FsbCBpdCBwZXIgcmVxdWVzdDogdGhlIFNESyByZWZyZXNoZXMgdGhlIHVuZGVybHlpbmdcbiAqIHRva2VuIHdoZW4gbmVlZGVkLCBzbyBhIGxvbmctbGl2ZWQgcHJvY2VzcyBuZXZlciBoYXMgdG8gdHJhY2sgZXhwaXJ5IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dGhIZWFkZXJzKFxuICBjbGllbnQ6IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBoZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICBvdXRba2V5XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import type { ModelStatus, ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
2
+ import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, type ModelRateLimits } from "./_metadata-contract.ts";
3
+ export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
4
+ export type { ModelCapabilitiesSnapshot, ModelCapabilityCatalogue, ModelRateLimitCatalogue, ModelRateLimits, ModelRateLimitsSnapshot, RetiredModelsSnapshot, } from "./_metadata-contract.ts";
5
+ /** Documented capabilities resolved for one model identity. */
6
+ export interface ModelCapabilities {
7
+ readonly responses: boolean;
8
+ readonly imageInput: boolean;
9
+ readonly applyPatch: boolean;
10
+ readonly webSearch: boolean;
11
+ }
12
+ /** Combined build-generated metadata resolved for one model identity. */
13
+ export interface ModelMetadata {
14
+ readonly status: ModelStatus;
15
+ readonly capabilities: ModelCapabilities;
16
+ readonly rateLimits?: ModelRateLimits;
17
+ }
18
+ /** Return the committed retired-model names. The array is cached and immutable. */
19
+ export declare function retiredModelNames(): readonly string[];
20
+ /** Resolve whether any supplied identity is listed in the retirement snapshot. */
21
+ export declare function modelStatusFor(...models: readonly (string | ServingEndpointSummary)[]): ModelStatus;
22
+ /** Resolve documented model capabilities from a name or endpoint summary. */
23
+ export declare function modelCapabilitiesFor(model: string | ServingEndpointSummary): ModelCapabilities;
24
+ /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
25
+ export declare function modelRateLimitsFor(model: string | ServingEndpointSummary): ModelRateLimits | undefined;
26
+ /** Resolve retirement, capability, and rate-limit metadata together. */
27
+ export declare function modelMetadataFor(model: string | ServingEndpointSummary): ModelMetadata;
28
+ /** Return generation timestamps for the three committed metadata snapshots. */
29
+ export declare function modelMetadataGeneratedAt(): Readonly<{
30
+ retiredModels: number;
31
+ capabilities: number;
32
+ rateLimits: number;
33
+ }>;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Build-generated Databricks model retirement, capability, and rate-limit metadata.
3
+ *
4
+ * The committed snapshots are refreshed by `bun run model:metadata`. Runtime
5
+ * lookups build their normalized sets and maps once per process and perform no
6
+ * documentation network requests.
7
+ *
8
+ * @module
9
+ */
10
+ import * as functionUtils from "@dbx-tools/shared-core/function-utils";
11
+ import capabilitiesSnapshotJson from "./generated/model-capabilities.json" with { type: "json" };
12
+ import rateLimitsSnapshotJson from "./generated/model-rate-limits.json" with { type: "json" };
13
+ import retiredModelsSnapshotJson from "./generated/retired-models.json" with { type: "json" };
14
+ import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./_metadata-contract.js";
15
+ import { modelSearchQuery } from "./policy.js";
16
+ export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
17
+ const retiredModelsSnapshot = retiredModelsSnapshotJson;
18
+ const capabilitiesSnapshot = capabilitiesSnapshotJson;
19
+ const rateLimitsSnapshot = rateLimitsSnapshotJson;
20
+ const metadataIndex = functionUtils.memoize(() => ({
21
+ retiredNames: Object.freeze([...retiredModelsSnapshot.models]),
22
+ retiredKeys: new Set(retiredModelsSnapshot.models.map(retiredModelKey).filter(Boolean)),
23
+ capabilities: {
24
+ responses: new Set(capabilitiesSnapshot.capabilities.responses),
25
+ imageInput: new Set(capabilitiesSnapshot.capabilities.imageInput),
26
+ applyPatch: new Set(capabilitiesSnapshot.capabilities.applyPatch),
27
+ webSearch: new Set(capabilitiesSnapshot.capabilities.webSearch),
28
+ },
29
+ rateLimits: new Map(Object.entries(rateLimitsSnapshot.catalogue.models)),
30
+ }));
31
+ /** Return the committed retired-model names. The array is cached and immutable. */
32
+ export function retiredModelNames() {
33
+ return metadataIndex().retiredNames;
34
+ }
35
+ /** Resolve whether any supplied identity is listed in the retirement snapshot. */
36
+ export function modelStatusFor(...models) {
37
+ const retired = metadataIndex().retiredKeys;
38
+ const deprecated = models
39
+ .flatMap((model) => modelIdentities(model))
40
+ .some((identity) => {
41
+ const candidate = retiredModelKey(identity);
42
+ for (const key of retired) {
43
+ if (candidate === key || candidate.startsWith(`${key}-`))
44
+ return true;
45
+ }
46
+ return false;
47
+ });
48
+ return { deprecated };
49
+ }
50
+ /** Resolve documented model capabilities from a name or endpoint summary. */
51
+ export function modelCapabilitiesFor(model) {
52
+ const capabilities = metadataIndex().capabilities;
53
+ const keys = modelIdentities(model, false).flatMap((identity) => modelKey(identity) ?? []);
54
+ return {
55
+ responses: keys.some((key) => capabilities.responses.has(key)),
56
+ imageInput: keys.some((key) => capabilities.imageInput.has(key)),
57
+ applyPatch: keys.some((key) => capabilities.applyPatch.has(key)),
58
+ webSearch: keys.some((key) => capabilities.webSearch.has(key)),
59
+ };
60
+ }
61
+ /** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
62
+ export function modelRateLimitsFor(model) {
63
+ const limits = metadataIndex().rateLimits;
64
+ for (const identity of modelIdentities(model)) {
65
+ const key = modelKey(identity);
66
+ if (!key)
67
+ continue;
68
+ const found = limits.get(key);
69
+ if (found)
70
+ return found;
71
+ }
72
+ return undefined;
73
+ }
74
+ /** Resolve retirement, capability, and rate-limit metadata together. */
75
+ export function modelMetadataFor(model) {
76
+ const rateLimits = modelRateLimitsFor(model);
77
+ return {
78
+ status: modelStatusFor(model),
79
+ capabilities: modelCapabilitiesFor(model),
80
+ ...(rateLimits ? { rateLimits } : {}),
81
+ };
82
+ }
83
+ /** Return generation timestamps for the three committed metadata snapshots. */
84
+ export function modelMetadataGeneratedAt() {
85
+ return {
86
+ retiredModels: retiredModelsSnapshot.generatedAt,
87
+ capabilities: capabilitiesSnapshot.generatedAt,
88
+ rateLimits: rateLimitsSnapshot.generatedAt,
89
+ };
90
+ }
91
+ function modelIdentities(model, includeDisplayName = true) {
92
+ if (typeof model === "string")
93
+ return [model];
94
+ return [
95
+ model.name,
96
+ ...(includeDisplayName ? [model.displayName] : []),
97
+ model.modelServiceName,
98
+ ...Object.values(model.serviceNames ?? {}),
99
+ ].filter((value) => Boolean(value));
100
+ }
101
+ function modelKey(value) {
102
+ return modelSearchQuery(value)?.replaceAll(" ", "-");
103
+ }
104
+ const RETIRED_MODEL_PREFIXES = new Set([
105
+ "ai",
106
+ "anthropic",
107
+ "databricks",
108
+ "dbx",
109
+ "google",
110
+ "meta",
111
+ "openai",
112
+ "system",
113
+ ]);
114
+ function retiredModelKey(value) {
115
+ const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
116
+ while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0]))
117
+ tokens.shift();
118
+ return tokens.join("-");
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBR3ZFLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyxzQkFBc0IsTUFBTSxvQ0FBb0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5RixPQUFPLHlCQUF5QixNQUFNLGlDQUFpQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlGLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRS9DLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBQ3RCLENBQUM7QUFVRixNQUFNLHFCQUFxQixHQUFHLHlCQUFrRCxDQUFDO0FBQ2pGLE1BQU0sb0JBQW9CLEdBQUcsd0JBQXFELENBQUM7QUFDbkYsTUFBTSxrQkFBa0IsR0FBRyxzQkFBaUQsQ0FBQztBQTBCN0UsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZGLFlBQVksRUFBRTtRQUNaLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQy9ELFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ2pFLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ2pFLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO0tBQ2hFO0lBQ0QsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQ3pFLENBQUMsQ0FBQyxDQUFDO0FBRUosbUZBQW1GO0FBQ25GLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsT0FBTyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUM7QUFDdEMsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUFHLE1BQW9EO0lBRXZELE1BQU0sT0FBTyxHQUFHLGFBQWEsRUFBRSxDQUFDLFdBQVcsQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxNQUFNO1NBQ3RCLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBc0M7SUFDekUsTUFBTSxZQUFZLEdBQUcsYUFBYSxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ2xELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0YsT0FBTztRQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLEtBQXNDO0lBRXRDLE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUMxQyxLQUFLLE1BQU0sUUFBUSxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRztZQUFFLFNBQVM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBc0M7SUFDckUsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsT0FBTztRQUNMLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQzdCLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7UUFDekMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3RDLENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSx3QkFBd0I7SUFLdEMsT0FBTztRQUNMLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxXQUFXO1FBQ2hELFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxXQUFXO1FBQzlDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO0tBQzNDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQXNDLEVBQ3RDLGtCQUFrQixHQUFHLElBQUk7SUFFekIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE9BQU87UUFDTCxLQUFLLENBQUMsSUFBSTtRQUNWLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3RCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztLQUMzQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFhO0lBQzdCLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNyQyxJQUFJO0lBQ0osV0FBVztJQUNYLFlBQVk7SUFDWixLQUFLO0lBQ0wsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtDQUNULENBQUMsQ0FBQztBQUVILFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGQtZ2VuZXJhdGVkIERhdGFicmlja3MgbW9kZWwgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgYW5kIHJhdGUtbGltaXQgbWV0YWRhdGEuXG4gKlxuICogVGhlIGNvbW1pdHRlZCBzbmFwc2hvdHMgYXJlIHJlZnJlc2hlZCBieSBgYnVuIHJ1biBtb2RlbDptZXRhZGF0YWAuIFJ1bnRpbWVcbiAqIGxvb2t1cHMgYnVpbGQgdGhlaXIgbm9ybWFsaXplZCBzZXRzIGFuZCBtYXBzIG9uY2UgcGVyIHByb2Nlc3MgYW5kIHBlcmZvcm0gbm9cbiAqIGRvY3VtZW50YXRpb24gbmV0d29yayByZXF1ZXN0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCAqIGFzIGZ1bmN0aW9uVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZnVuY3Rpb24tdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxTdGF0dXMsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmF0ZS1saW1pdHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL3JldGlyZWQtbW9kZWxzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7XG4gIE1PREVMX01FVEFEQVRBX1RUTF9NUyxcbiAgTU9ERUxfUkFURV9MSU1JVFNfVVJMLFxuICBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0cyxcbiAgdHlwZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCxcbiAgdHlwZSBSZXRpcmVkTW9kZWxzU25hcHNob3QsXG59IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuaW1wb3J0IHsgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG5leHBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBSRVRJUkVEX01PREVMU19VUkwsXG4gIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCxcbn07XG5leHBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZSxcbiAgTW9kZWxSYXRlTGltaXRDYXRhbG9ndWUsXG4gIE1vZGVsUmF0ZUxpbWl0cyxcbiAgTW9kZWxSYXRlTGltaXRzU25hcHNob3QsXG4gIFJldGlyZWRNb2RlbHNTbmFwc2hvdCxcbn0gZnJvbSBcIi4vX21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5cbmNvbnN0IHJldGlyZWRNb2RlbHNTbmFwc2hvdCA9IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gYXMgUmV0aXJlZE1vZGVsc1NuYXBzaG90O1xuY29uc3QgY2FwYWJpbGl0aWVzU25hcHNob3QgPSBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gYXMgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdDtcbmNvbnN0IHJhdGVMaW1pdHNTbmFwc2hvdCA9IHJhdGVMaW1pdHNTbmFwc2hvdEpzb24gYXMgTW9kZWxSYXRlTGltaXRzU25hcHNob3Q7XG5cbi8qKiBEb2N1bWVudGVkIGNhcGFiaWxpdGllcyByZXNvbHZlZCBmb3Igb25lIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENhcGFiaWxpdGllcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaW1hZ2VJbnB1dDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYXBwbHlQYXRjaDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgd2ViU2VhcmNoOiBib29sZWFuO1xufVxuXG4vKiogQ29tYmluZWQgYnVpbGQtZ2VuZXJhdGVkIG1ldGFkYXRhIHJlc29sdmVkIGZvciBvbmUgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsTWV0YWRhdGEge1xuICByZWFkb25seSBzdGF0dXM6IE1vZGVsU3RhdHVzO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzO1xuICByZWFkb25seSByYXRlTGltaXRzPzogTW9kZWxSYXRlTGltaXRzO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IHJldGlyZWRLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IHtcbiAgICByZWFkb25seSBbS2V5IGluIGtleW9mIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZV06IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIH07XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPjtcbn1cblxuY29uc3QgbWV0YWRhdGFJbmRleCA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZTxNZXRhZGF0YUluZGV4PigoKSA9PiAoe1xuICByZXRpcmVkTmFtZXM6IE9iamVjdC5mcmVlemUoWy4uLnJldGlyZWRNb2RlbHNTbmFwc2hvdC5tb2RlbHNdKSxcbiAgcmV0aXJlZEtleXM6IG5ldyBTZXQocmV0aXJlZE1vZGVsc1NuYXBzaG90Lm1vZGVscy5tYXAocmV0aXJlZE1vZGVsS2V5KS5maWx0ZXIoQm9vbGVhbikpLFxuICBjYXBhYmlsaXRpZXM6IHtcbiAgICByZXNwb25zZXM6IG5ldyBTZXQoY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgaW1hZ2VJbnB1dDogbmV3IFNldChjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dCksXG4gICAgYXBwbHlQYXRjaDogbmV3IFNldChjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMuYXBwbHlQYXRjaCksXG4gICAgd2ViU2VhcmNoOiBuZXcgU2V0KGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICB9LFxuICByYXRlTGltaXRzOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSksXG59KSk7XG5cbi8qKiBSZXR1cm4gdGhlIGNvbW1pdHRlZCByZXRpcmVkLW1vZGVsIG5hbWVzLiBUaGUgYXJyYXkgaXMgY2FjaGVkIGFuZCBpbW11dGFibGUuICovXG5leHBvcnQgZnVuY3Rpb24gcmV0aXJlZE1vZGVsTmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJldGlyZWROYW1lcztcbn1cblxuLyoqIFJlc29sdmUgd2hldGhlciBhbnkgc3VwcGxpZWQgaWRlbnRpdHkgaXMgbGlzdGVkIGluIHRoZSByZXRpcmVtZW50IHNuYXBzaG90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU3RhdHVzRm9yKFxuICAuLi5tb2RlbHM6IHJlYWRvbmx5IChzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KVtdXG4pOiBNb2RlbFN0YXR1cyB7XG4gIGNvbnN0IHJldGlyZWQgPSBtZXRhZGF0YUluZGV4KCkucmV0aXJlZEtleXM7XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSBtb2RlbHNcbiAgICAuZmxhdE1hcCgobW9kZWwpID0+IG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpXG4gICAgLnNvbWUoKGlkZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSByZXRpcmVkTW9kZWxLZXkoaWRlbnRpdHkpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmV0aXJlZCkge1xuICAgICAgICBpZiAoY2FuZGlkYXRlID09PSBrZXkgfHwgY2FuZGlkYXRlLnN0YXJ0c1dpdGgoYCR7a2V5fS1gKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIHJldHVybiB7IGRlcHJlY2F0ZWQgfTtcbn1cblxuLyoqIFJlc29sdmUgZG9jdW1lbnRlZCBtb2RlbCBjYXBhYmlsaXRpZXMgZnJvbSBhIG5hbWUgb3IgZW5kcG9pbnQgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbWV0YWRhdGFJbmRleCgpLmNhcGFiaWxpdGllcztcbiAgY29uc3Qga2V5cyA9IG1vZGVsSWRlbnRpdGllcyhtb2RlbCwgZmFsc2UpLmZsYXRNYXAoKGlkZW50aXR5KSA9PiBtb2RlbEtleShpZGVudGl0eSkgPz8gW10pO1xuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlczoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5yZXNwb25zZXMuaGFzKGtleSkpLFxuICAgIGltYWdlSW5wdXQ6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dC5oYXMoa2V5KSksXG4gICAgYXBwbHlQYXRjaDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5hcHBseVBhdGNoLmhhcyhrZXkpKSxcbiAgICB3ZWJTZWFyY2g6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMud2ViU2VhcmNoLmhhcyhrZXkpKSxcbiAgfTtcbn1cblxuLyoqIFJlc29sdmUgcHVibGlzaGVkIElUUE0sIE9UUE0sIGFuZCBRUEggbGltaXRzIGZyb20gYSBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJhdGVMaW1pdHNGb3IoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuKTogTW9kZWxSYXRlTGltaXRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGltaXRzID0gbWV0YWRhdGFJbmRleCgpLnJhdGVMaW1pdHM7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KGlkZW50aXR5KTtcbiAgICBpZiAoIWtleSkgY29udGludWU7XG4gICAgY29uc3QgZm91bmQgPSBsaW1pdHMuZ2V0KGtleSk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgYW5kIHJhdGUtbGltaXQgbWV0YWRhdGEgdG9nZXRoZXIuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUZvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGEge1xuICBjb25zdCByYXRlTGltaXRzID0gbW9kZWxSYXRlTGltaXRzRm9yKG1vZGVsKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKG1vZGVsKSxcbiAgICBjYXBhYmlsaXRpZXM6IG1vZGVsQ2FwYWJpbGl0aWVzRm9yKG1vZGVsKSxcbiAgICAuLi4ocmF0ZUxpbWl0cyA/IHsgcmF0ZUxpbWl0cyB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIGdlbmVyYXRpb24gdGltZXN0YW1wcyBmb3IgdGhlIHRocmVlIGNvbW1pdHRlZCBtZXRhZGF0YSBzbmFwc2hvdHMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUdlbmVyYXRlZEF0KCk6IFJlYWRvbmx5PHtcbiAgcmV0aXJlZE1vZGVsczogbnVtYmVyO1xuICBjYXBhYmlsaXRpZXM6IG51bWJlcjtcbiAgcmF0ZUxpbWl0czogbnVtYmVyO1xufT4ge1xuICByZXR1cm4ge1xuICAgIHJldGlyZWRNb2RlbHM6IHJldGlyZWRNb2RlbHNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJhdGVMaW1pdHM6IHJhdGVMaW1pdHNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kZWxJZGVudGl0aWVzKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgaW5jbHVkZURpc3BsYXlOYW1lID0gdHJ1ZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFttb2RlbF07XG4gIHJldHVybiBbXG4gICAgbW9kZWwubmFtZSxcbiAgICAuLi4oaW5jbHVkZURpc3BsYXlOYW1lID8gW21vZGVsLmRpc3BsYXlOYW1lXSA6IFtdKSxcbiAgICBtb2RlbC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgIC4uLk9iamVjdC52YWx1ZXMobW9kZWwuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxLZXkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtb2RlbFNlYXJjaFF1ZXJ5KHZhbHVlKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpO1xufVxuXG5jb25zdCBSRVRJUkVEX01PREVMX1BSRUZJWEVTID0gbmV3IFNldChbXG4gIFwiYWlcIixcbiAgXCJhbnRocm9waWNcIixcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwiZGJ4XCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwibWV0YVwiLFxuICBcIm9wZW5haVwiLFxuICBcInN5c3RlbVwiLFxuXSk7XG5cbmZ1bmN0aW9uIHJldGlyZWRNb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICB3aGlsZSAodG9rZW5zWzBdICYmIFJFVElSRURfTU9ERUxfUFJFRklYRVMuaGFzKHRva2Vuc1swXSkpIHRva2Vucy5zaGlmdCgpO1xuICByZXR1cm4gdG9rZW5zLmpvaW4oXCItXCIpO1xufVxuIl19
@@ -9,7 +9,7 @@
9
9
  * `quality` / `speed` / `cost` profile when present, the classified
10
10
  * {@link ModelClass}, and (for embedding endpoints) the measured vector
11
11
  * `dimension` - and snaps loose, human-typed names to real endpoint ids
12
- * through the Rust model ranker so tokens like `"claude sonnet"` resolve to
12
+ * through the TypeScript model ranker so tokens like `"claude sonnet"` resolve to
13
13
  * `databricks-claude-sonnet-4-6`.
14
14
  *
15
15
  * The class stamp and embedding dimension are computed once per cache load:
@@ -30,7 +30,7 @@ import { type ServingEndpointSummary } from "@dbx-tools/shared-model";
30
30
  export type WorkspaceClientLike = Pick<appkit.WorkspaceClientLike, "servingEndpoints">;
31
31
  /** Default TTL for the in-memory endpoint cache. Matches the Databricks SDK's session lifetime budget. */
32
32
  export declare const DEFAULT_MODEL_CACHE_TTL_MS: number;
33
- /** Default Rust distance threshold below which a fuzzy match is accepted. */
33
+ /** Default fuzzy distance threshold below which a match is accepted. */
34
34
  export declare const DEFAULT_FUZZY_THRESHOLD = 0.4;
35
35
  /** Options for {@link listServingEndpoints}. */
36
36
  export interface ListServingEndpointsOptions {
@@ -90,7 +90,7 @@ export declare function listServingEndpointsUncached(client: WorkspaceClientLike
90
90
  export declare function clearServingEndpointsCache(host?: string, cacheIdentity?: string): Promise<void>;
91
91
  /**
92
92
  * Result of fuzzy-resolving a user-supplied model name against the live
93
- * endpoint list. `score` is the Rust ranker's distance (`0` is exact, `1` is no match);
93
+ * endpoint list. `score` is the ranker's distance (`0` is exact, `1` is no match);
94
94
  * `matched` is `false` when the score exceeds the configured threshold so
95
95
  * callers can fall back to the original input (Databricks will then return a
96
96
  * clean 404).
@@ -118,7 +118,7 @@ export interface ScoredEndpoint {
118
118
  * (lowest score) first, keeping only those within `threshold`:
119
119
  *
120
120
  * 1. An exact name match short-circuits to a single `score: 0` result.
121
- * 2. Otherwise Rust tokenizes the input and scores every endpoint through the
121
+ * 2. Otherwise the shared TypeScript policy tokenizes and scores every endpoint through the
122
122
  * same fuzzy-distance policy used by {@link lookupModels}.
123
123
  *
124
124
  * Returns `[]` for an empty endpoint list or when `input` tokenizes to nothing,