@mochabug/adaptkit 0.14.6 → 1.0.0-beta.10

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 (70) hide show
  1. package/assets/build-client.js +107 -0
  2. package/assets/build.js +57 -0
  3. package/assets/configurator.App.tsx +123 -0
  4. package/assets/configurator.main.tsx +19 -0
  5. package/assets/configurator.ssg.tsx +31 -0
  6. package/assets/{configurator.ts → configurator_none.ts} +1 -1
  7. package/assets/configurator_react.tsx +38 -0
  8. package/assets/executor.App.tsx +103 -0
  9. package/assets/executor.main.tsx +19 -0
  10. package/assets/executor.ssg.tsx +31 -0
  11. package/assets/{executor_browser.ts → executor_browser_none.ts} +1 -1
  12. package/assets/executor_browser_react.tsx +51 -0
  13. package/assets/gitignore +3 -0
  14. package/assets/global.d.ts +7 -0
  15. package/assets/inject.js +15 -0
  16. package/assets/tsconf.json +9 -3
  17. package/bin/index.js +12 -3247
  18. package/bin/index.js.map +7 -0
  19. package/package.json +10 -22
  20. package/assets/rollup.config.ts +0 -40
  21. package/bin/add.d.ts +0 -3
  22. package/bin/add.d.ts.map +0 -1
  23. package/bin/genproto/buf/validate/validate.d.ts +0 -4657
  24. package/bin/genproto/buf/validate/validate.d.ts.map +0 -1
  25. package/bin/genproto/google/api/client.d.ts +0 -785
  26. package/bin/genproto/google/api/client.d.ts.map +0 -1
  27. package/bin/genproto/google/api/http.d.ts +0 -452
  28. package/bin/genproto/google/api/http.d.ts.map +0 -1
  29. package/bin/genproto/google/api/launch_stage.d.ts +0 -78
  30. package/bin/genproto/google/api/launch_stage.d.ts.map +0 -1
  31. package/bin/genproto/google/protobuf/descriptor.d.ts +0 -2337
  32. package/bin/genproto/google/protobuf/descriptor.d.ts.map +0 -1
  33. package/bin/genproto/google/protobuf/duration.d.ts +0 -113
  34. package/bin/genproto/google/protobuf/duration.d.ts.map +0 -1
  35. package/bin/genproto/google/protobuf/struct.d.ts +0 -185
  36. package/bin/genproto/google/protobuf/struct.d.ts.map +0 -1
  37. package/bin/genproto/google/protobuf/timestamp.d.ts +0 -156
  38. package/bin/genproto/google/protobuf/timestamp.d.ts.map +0 -1
  39. package/bin/genproto/mochabugapis/adapt/graph/exchange.d.ts +0 -50
  40. package/bin/genproto/mochabugapis/adapt/graph/exchange.d.ts.map +0 -1
  41. package/bin/genproto/mochabugapis/adapt/graph/jtd_schema.d.ts +0 -129
  42. package/bin/genproto/mochabugapis/adapt/graph/jtd_schema.d.ts.map +0 -1
  43. package/bin/genproto/mochabugapis/adapt/graph/receiver.d.ts +0 -46
  44. package/bin/genproto/mochabugapis/adapt/graph/receiver.d.ts.map +0 -1
  45. package/bin/genproto/mochabugapis/adapt/graph/signal_binding.d.ts +0 -93
  46. package/bin/genproto/mochabugapis/adapt/graph/signal_binding.d.ts.map +0 -1
  47. package/bin/genproto/mochabugapis/adapt/graph/signal_descriptor.d.ts +0 -56
  48. package/bin/genproto/mochabugapis/adapt/graph/signal_descriptor.d.ts.map +0 -1
  49. package/bin/genproto/mochabugapis/adapt/graph/transceiver.d.ts +0 -44
  50. package/bin/genproto/mochabugapis/adapt/graph/transceiver.d.ts.map +0 -1
  51. package/bin/genproto/mochabugapis/adapt/graph/transmitter.d.ts +0 -50
  52. package/bin/genproto/mochabugapis/adapt/graph/transmitter.d.ts.map +0 -1
  53. package/bin/genproto/mochabugapis/adapt/graph/vertex_config.d.ts +0 -68
  54. package/bin/genproto/mochabugapis/adapt/graph/vertex_config.d.ts.map +0 -1
  55. package/bin/genproto/mochabugapis/adapt/plugins/v1/plugins.client.d.ts +0 -46
  56. package/bin/genproto/mochabugapis/adapt/plugins/v1/plugins.client.d.ts.map +0 -1
  57. package/bin/genproto/mochabugapis/adapt/plugins/v1/plugins.d.ts +0 -840
  58. package/bin/genproto/mochabugapis/adapt/plugins/v1/plugins.d.ts.map +0 -1
  59. package/bin/index.d.ts +0 -2
  60. package/bin/index.d.ts.map +0 -1
  61. package/bin/init.d.ts +0 -2
  62. package/bin/init.d.ts.map +0 -1
  63. package/bin/oauth2.d.ts +0 -2
  64. package/bin/oauth2.d.ts.map +0 -1
  65. package/bin/publish.d.ts +0 -4
  66. package/bin/publish.d.ts.map +0 -1
  67. package/bin/utils.d.ts +0 -6
  68. package/bin/utils.d.ts.map +0 -1
  69. package/bin/vertices.d.ts +0 -3
  70. package/bin/vertices.d.ts.map +0 -1
package/bin/index.js CHANGED
@@ -1,2340 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import chalk from 'chalk';
3
- import { program } from 'commander';
4
- import figlet from 'figlet';
5
- import fs from 'fs';
6
- import isValidHostname from 'is-valid-hostname';
7
- import path from 'path';
8
- import semver from 'semver';
9
- import updateNotifier from 'update-notifier';
10
- import { input, select, confirm } from '@inquirer/prompts';
11
- import { ServiceType, stackIntercept, RpcError } from '@protobuf-ts/runtime-rpc';
12
- import { MessageType, reflectionMergePartial, UnknownFieldHandler, WireType, isJsonObject, typeofJsonValue } from '@protobuf-ts/runtime';
13
- import { mkdirp } from 'mkdirp';
14
- import { fileURLToPath } from 'url';
15
- import { execSync } from 'child_process';
16
- import { randomBytes } from 'crypto';
17
- import express from 'express';
18
- import fetch from 'node-fetch';
19
- import open from 'open';
20
- import pkceChallenge from 'pkce-challenge';
21
- import { ChannelCredentials } from '@grpc/grpc-js';
22
- import { GrpcTransport } from '@protobuf-ts/grpc-transport';
23
- import archiver from 'archiver';
24
- import fg from 'fast-glob';
25
- import sharp from 'sharp';
26
- import { PassThrough } from 'stream';
27
-
28
- // @generated by protobuf-ts 2.9.4 with parameter client_generic,force_server_none
29
- // @generated from protobuf file "mochabugapis/adapt/plugins/v1/plugins.proto" (package "mochabugapis.adapt.plugins.v1", syntax proto3)
30
- // tslint:disable
31
- //
32
- // Copyright 2023, mochabug AB
33
- //
34
- // Licensed under the Apache License, Version 2.0 (the "License");
35
- // you may not use this file except in compliance with the License.
36
- // You may obtain a copy of the License at
37
- //
38
- // http://www.apache.org/licenses/LICENSE-2.0
39
- //
40
- // Unless required by applicable law or agreed to in writing, software
41
- // distributed under the License is distributed on an "AS IS" BASIS,
42
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43
- // See the License for the specific language governing permissions and
44
- // limitations under the License.
45
- //
46
- /**
47
- * VertexType represents the type of a vertex.
48
- *
49
- * @generated from protobuf enum mochabugapis.adapt.plugins.v1.Vertex.VertexType
50
- */
51
- var Vertex_VertexType;
52
- (function (Vertex_VertexType) {
53
- /**
54
- * Unspecified type (default value, should not be used).
55
- *
56
- * @generated from protobuf enum value: VERTEX_TYPE_UNSPECIFIED = 0;
57
- */
58
- Vertex_VertexType[Vertex_VertexType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
59
- /**
60
- * Action type, available in all contexts and not exposed to the outside
61
- * world. This type has a lower security risk.
62
- *
63
- * @generated from protobuf enum value: VERTEX_TYPE_ACTION = 1;
64
- */
65
- Vertex_VertexType[Vertex_VertexType["ACTION"] = 1] = "ACTION";
66
- /**
67
- * Browser type, available only in a browser context.
68
- * The configuration always runs inside a browser context.
69
- * Security implications: be cautious about potentially sensitive data
70
- * exposure.
71
- *
72
- * @generated from protobuf enum value: VERTEX_TYPE_BROWSER = 2;
73
- */
74
- Vertex_VertexType[Vertex_VertexType["BROWSER"] = 2] = "BROWSER";
75
- /**
76
- * CronTrigger type, available only in a trigger context.
77
- * Triggered at specific intervals.
78
- *
79
- * @generated from protobuf enum value: VERTEX_TYPE_CRON_TRIGGER = 3;
80
- */
81
- Vertex_VertexType[Vertex_VertexType["CRON_TRIGGER"] = 3] = "CRON_TRIGGER";
82
- /**
83
- * ExternalTrigger type, available only in a trigger context.
84
- * Accessible via a publicly routable address.
85
- * Security implications: be cautious about exposing sensitive data or
86
- * functionality.
87
- *
88
- * @generated from protobuf enum value: VERTEX_TYPE_EXTERNAL_TRIGGER = 4;
89
- */
90
- Vertex_VertexType[Vertex_VertexType["EXTERNAL_TRIGGER"] = 4] = "EXTERNAL_TRIGGER";
91
- })(Vertex_VertexType || (Vertex_VertexType = {}));
92
- /**
93
- * The type of variable
94
- *
95
- * @generated from protobuf enum mochabugapis.adapt.plugins.v1.VariableService.Type
96
- */
97
- var VariableService_Type;
98
- (function (VariableService_Type) {
99
- /**
100
- * The type is not specified. Invalid value
101
- *
102
- * @generated from protobuf enum value: TYPE_UNSPECIFIED = 0;
103
- */
104
- VariableService_Type[VariableService_Type["UNSPECIFIED"] = 0] = "UNSPECIFIED";
105
- /**
106
- * The variable will hold a secret
107
- *
108
- * @generated from protobuf enum value: TYPE_SECRET = 1;
109
- */
110
- VariableService_Type[VariableService_Type["SECRET"] = 1] = "SECRET";
111
- /**
112
- * The variable will hold a string
113
- *
114
- * @generated from protobuf enum value: TYPE_STRING = 2;
115
- */
116
- VariableService_Type[VariableService_Type["STRING"] = 2] = "STRING";
117
- /**
118
- * The variable is a boolean value (a string either "true" or "false")
119
- *
120
- * @generated from protobuf enum value: TYPE_SWITCH = 3;
121
- */
122
- VariableService_Type[VariableService_Type["SWITCH"] = 3] = "SWITCH";
123
- })(VariableService_Type || (VariableService_Type = {}));
124
- /**
125
- * The algorithm used for signing JWT or SAML assertions
126
- *
127
- * @generated from protobuf enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg
128
- */
129
- var PrivateKeyAlg;
130
- (function (PrivateKeyAlg) {
131
- /**
132
- * Unknown algorithm (invalid)
133
- *
134
- * @generated from protobuf enum value: PRIVATE_KEY_ALG_UNSPECIFIED = 0;
135
- */
136
- PrivateKeyAlg[PrivateKeyAlg["UNSPECIFIED"] = 0] = "UNSPECIFIED";
137
- /**
138
- * RS256 algorithm
139
- *
140
- * @generated from protobuf enum value: PRIVATE_KEY_ALG_RS256 = 1;
141
- */
142
- PrivateKeyAlg[PrivateKeyAlg["RS256"] = 1] = "RS256";
143
- })(PrivateKeyAlg || (PrivateKeyAlg = {}));
144
- /**
145
- * The OAuth2 grant type
146
- *
147
- * @generated from protobuf enum mochabugapis.adapt.plugins.v1.Oauth2GrantType
148
- */
149
- var Oauth2GrantType;
150
- (function (Oauth2GrantType) {
151
- /**
152
- * Not specified (invalid)
153
- *
154
- * @generated from protobuf enum value: OAUTH2_GRANT_TYPE_UNSPECIFIED = 0;
155
- */
156
- Oauth2GrantType[Oauth2GrantType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
157
- /**
158
- * Authorization Code Grant
159
- * grant_type=authorization_code
160
- *
161
- * @generated from protobuf enum value: OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = 1;
162
- */
163
- Oauth2GrantType[Oauth2GrantType["AUTHORIZATION_CODE"] = 1] = "AUTHORIZATION_CODE";
164
- /**
165
- * Client Credentials Grant
166
- * grant_type=client_credentials
167
- *
168
- * @generated from protobuf enum value: OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS = 2;
169
- */
170
- Oauth2GrantType[Oauth2GrantType["CLIENT_CREDENTIALS"] = 2] = "CLIENT_CREDENTIALS";
171
- /**
172
- * JWT Bearer Assertion Grant
173
- * grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
174
- *
175
- * @generated from protobuf enum value: OAUTH2_GRANT_TYPE_JWT_BEARER = 3;
176
- */
177
- Oauth2GrantType[Oauth2GrantType["JWT_BEARER"] = 3] = "JWT_BEARER";
178
- /**
179
- * SAML 2.0 Bearer Assertion Grant
180
- * grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer
181
- *
182
- * @generated from protobuf enum value: OAUTH2_GRANT_TYPE_SAML2_BEARER = 4;
183
- */
184
- Oauth2GrantType[Oauth2GrantType["SAML2_BEARER"] = 4] = "SAML2_BEARER";
185
- })(Oauth2GrantType || (Oauth2GrantType = {}));
186
- /**
187
- * The OAuth2 client authentication method
188
- *
189
- * @generated from protobuf enum mochabugapis.adapt.plugins.v1.Oauth2AuthType
190
- */
191
- var Oauth2AuthType;
192
- (function (Oauth2AuthType) {
193
- /**
194
- * Not specified (invalid)
195
- *
196
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_UNSPECIFIED = 0;
197
- */
198
- Oauth2AuthType[Oauth2AuthType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
199
- /**
200
- * Basic Authentication (client ID and secret in Authorization header)
201
- *
202
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_BASIC = 1;
203
- */
204
- Oauth2AuthType[Oauth2AuthType["BASIC"] = 1] = "BASIC";
205
- /**
206
- * Form Authentication (client ID and secret in form body)
207
- *
208
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_FORM = 2;
209
- */
210
- Oauth2AuthType[Oauth2AuthType["FORM"] = 2] = "FORM";
211
- /**
212
- * Private Key JWT Authentication
213
- * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
214
- *
215
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT = 3;
216
- */
217
- Oauth2AuthType[Oauth2AuthType["PRIVATE_KEY_JWT"] = 3] = "PRIVATE_KEY_JWT";
218
- /**
219
- * Mutual TLS Authentication
220
- *
221
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_MTLS = 4;
222
- */
223
- Oauth2AuthType[Oauth2AuthType["MTLS"] = 4] = "MTLS";
224
- /**
225
- * SAML 2.0 Bearer Assertion for Client Authentication
226
- * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:saml2-bearer
227
- *
228
- * @generated from protobuf enum value: OAUTH2_AUTH_TYPE_SAML2_BEARER = 5;
229
- */
230
- Oauth2AuthType[Oauth2AuthType["SAML2_BEARER"] = 5] = "SAML2_BEARER";
231
- })(Oauth2AuthType || (Oauth2AuthType = {}));
232
- // @generated message type with reflection information, may provide speed optimized methods
233
- class UploadPluginRequest$Type extends MessageType {
234
- constructor() {
235
- super("mochabugapis.adapt.plugins.v1.UploadPluginRequest", [
236
- { no: 1, name: "manifest", kind: "message", oneof: "data", T: () => Manifest },
237
- { no: 2, name: "file", kind: "message", oneof: "data", T: () => File }
238
- ]);
239
- }
240
- create(value) {
241
- const message = globalThis.Object.create((this.messagePrototype));
242
- message.data = { oneofKind: undefined };
243
- if (value !== undefined)
244
- reflectionMergePartial(this, message, value);
245
- return message;
246
- }
247
- internalBinaryRead(reader, length, options, target) {
248
- let message = target ?? this.create(), end = reader.pos + length;
249
- while (reader.pos < end) {
250
- let [fieldNo, wireType] = reader.tag();
251
- switch (fieldNo) {
252
- case /* mochabugapis.adapt.plugins.v1.Manifest manifest */ 1:
253
- message.data = {
254
- oneofKind: "manifest",
255
- manifest: Manifest.internalBinaryRead(reader, reader.uint32(), options, message.data.manifest)
256
- };
257
- break;
258
- case /* mochabugapis.adapt.plugins.v1.File file */ 2:
259
- message.data = {
260
- oneofKind: "file",
261
- file: File.internalBinaryRead(reader, reader.uint32(), options, message.data.file)
262
- };
263
- break;
264
- default:
265
- let u = options.readUnknownField;
266
- if (u === "throw")
267
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
268
- let d = reader.skip(wireType);
269
- if (u !== false)
270
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
271
- }
272
- }
273
- return message;
274
- }
275
- internalBinaryWrite(message, writer, options) {
276
- /* mochabugapis.adapt.plugins.v1.Manifest manifest = 1; */
277
- if (message.data.oneofKind === "manifest")
278
- Manifest.internalBinaryWrite(message.data.manifest, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
279
- /* mochabugapis.adapt.plugins.v1.File file = 2; */
280
- if (message.data.oneofKind === "file")
281
- File.internalBinaryWrite(message.data.file, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
282
- let u = options.writeUnknownFields;
283
- if (u !== false)
284
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
285
- return writer;
286
- }
287
- }
288
- /**
289
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.UploadPluginRequest
290
- */
291
- const UploadPluginRequest = new UploadPluginRequest$Type();
292
- // @generated message type with reflection information, may provide speed optimized methods
293
- class UploadPluginResponse$Type extends MessageType {
294
- constructor() {
295
- super("mochabugapis.adapt.plugins.v1.UploadPluginResponse", []);
296
- }
297
- create(value) {
298
- const message = globalThis.Object.create((this.messagePrototype));
299
- if (value !== undefined)
300
- reflectionMergePartial(this, message, value);
301
- return message;
302
- }
303
- internalBinaryRead(reader, length, options, target) {
304
- return target ?? this.create();
305
- }
306
- internalBinaryWrite(message, writer, options) {
307
- let u = options.writeUnknownFields;
308
- if (u !== false)
309
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
310
- return writer;
311
- }
312
- }
313
- /**
314
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.UploadPluginResponse
315
- */
316
- const UploadPluginResponse = new UploadPluginResponse$Type();
317
- // @generated message type with reflection information, may provide speed optimized methods
318
- class File$Type extends MessageType {
319
- constructor() {
320
- super("mochabugapis.adapt.plugins.v1.File", [
321
- { no: 1, name: "path", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "2", maxLen: "4096", pattern: "^[^/]+(\\/[^/]+)*$" } } } },
322
- { no: 2, name: "data", kind: "scalar", T: 12 /*ScalarType.BYTES*/, options: { "buf.validate.field": { bytes: { minLen: "1", maxLen: "10485760" } } } }
323
- ]);
324
- }
325
- create(value) {
326
- const message = globalThis.Object.create((this.messagePrototype));
327
- message.path = "";
328
- message.data = new Uint8Array(0);
329
- if (value !== undefined)
330
- reflectionMergePartial(this, message, value);
331
- return message;
332
- }
333
- internalBinaryRead(reader, length, options, target) {
334
- let message = target ?? this.create(), end = reader.pos + length;
335
- while (reader.pos < end) {
336
- let [fieldNo, wireType] = reader.tag();
337
- switch (fieldNo) {
338
- case /* string path */ 1:
339
- message.path = reader.string();
340
- break;
341
- case /* bytes data */ 2:
342
- message.data = reader.bytes();
343
- break;
344
- default:
345
- let u = options.readUnknownField;
346
- if (u === "throw")
347
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
348
- let d = reader.skip(wireType);
349
- if (u !== false)
350
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
351
- }
352
- }
353
- return message;
354
- }
355
- internalBinaryWrite(message, writer, options) {
356
- /* string path = 1; */
357
- if (message.path !== "")
358
- writer.tag(1, WireType.LengthDelimited).string(message.path);
359
- /* bytes data = 2; */
360
- if (message.data.length)
361
- writer.tag(2, WireType.LengthDelimited).bytes(message.data);
362
- let u = options.writeUnknownFields;
363
- if (u !== false)
364
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
365
- return writer;
366
- }
367
- }
368
- /**
369
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.File
370
- */
371
- const File = new File$Type();
372
- // @generated message type with reflection information, may provide speed optimized methods
373
- class Manifest$Type extends MessageType {
374
- constructor() {
375
- super("mochabugapis.adapt.plugins.v1.Manifest", [
376
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
377
- { no: 2, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "5", maxLen: "150", pattern: "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" } } } },
378
- { no: 3, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100" } } } },
379
- { no: 4, name: "description", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "250" } } } },
380
- { no: 5, name: "organization", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { uuid: true } } } },
381
- { no: 6, name: "homepage", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "11", maxLen: "4096", pattern: "^https://[a-zA-Z0-9.-]+(?:\\.[a-zA-Z]{2,})(?:/.*)?$" } } } },
382
- { no: 7, name: "repository", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "11", maxLen: "4096", pattern: "^https://[a-zA-Z0-9.-]+(?:\\.[a-zA-Z]{2,})(?:/.*)?$" } } } },
383
- { no: 8, name: "bugs", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { cel: [{ id: "valid_email_or_url", message: "bugs must be a valid email or URL", expression: "size(this) >= 2 && size(this) <= 4096 && (this.isEmail() || this.matches('^https://[a-zA-Z0-9.-]+(?:\\\\.[a-zA-Z]{2,})(?:/.*)?$'))" }], ignore: "IGNORE_EMPTY" } } },
384
- { no: 9, name: "author", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "100" } } } },
385
- { no: 10, name: "logo", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "2", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)\\.(gif|jpg|jpeg|jfif|pjpeg|pjp|png|svg|webp|avif)$" } } } },
386
- { no: 11, name: "executors", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "2", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)\\.(mjs|js)$" } } } },
387
- { no: 12, name: "configurators", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "2", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)\\.(mjs|js)$" } } } },
388
- { no: 13, name: "assets", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "2", maxLen: "4096", pattern: "^[^/]+(\\/[^/]+)*$" } } } },
389
- { no: 14, name: "cdn", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "2", maxLen: "4096", pattern: "^[^/]+(\\/[^/]+)*$" } } } },
390
- { no: 15, name: "vertices", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Vertex, options: { "buf.validate.field": { cel: [{ id: "vertex_unique_names", message: "a name cannot appear more than once", expression: "this.map(vertex, vertex.name).unique()" }], repeated: { minItems: "1", maxItems: "100" } } } },
391
- { no: 16, name: "plugin_oauth2", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Oauth2Service, options: { "buf.validate.field": { cel: [{ id: "plugin_oauth2.oauth_unique_names", message: "a name cannot appear more than once", expression: "this.map(oauth, oauth.name).unique()" }], repeated: { minItems: "0", maxItems: "20", items: { cel: [{ id: "plugin_oauth2.oauth2.client_id", message: "The client_id property must be set", expression: "has(this.client_id)" }] } } } } },
392
- { no: 17, name: "plugin_variables", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => VariableService, options: { "buf.validate.field": { cel: [{ id: "vars_unique_names", message: "a name cannot appear more than once", expression: "this.map(variable, variable.name).unique()" }], repeated: { minItems: "0", maxItems: "100" } } } },
393
- { no: 18, name: "plugin_mtls", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => MTLSService, options: { "buf.validate.field": { cel: [{ id: "mtls_unique_names", message: "a name cannot appear more than once", expression: "this.map(mtls, mtls.name).unique()" }], repeated: { minItems: "0", maxItems: "20" } } } }
394
- ]);
395
- }
396
- create(value) {
397
- const message = globalThis.Object.create((this.messagePrototype));
398
- message.name = "";
399
- message.version = "";
400
- message.label = "";
401
- message.description = "";
402
- message.organization = "";
403
- message.executors = "";
404
- message.vertices = [];
405
- message.pluginOauth2 = [];
406
- message.pluginVariables = [];
407
- message.pluginMtls = [];
408
- if (value !== undefined)
409
- reflectionMergePartial(this, message, value);
410
- return message;
411
- }
412
- internalBinaryRead(reader, length, options, target) {
413
- let message = target ?? this.create(), end = reader.pos + length;
414
- while (reader.pos < end) {
415
- let [fieldNo, wireType] = reader.tag();
416
- switch (fieldNo) {
417
- case /* string name */ 1:
418
- message.name = reader.string();
419
- break;
420
- case /* string version */ 2:
421
- message.version = reader.string();
422
- break;
423
- case /* string label */ 3:
424
- message.label = reader.string();
425
- break;
426
- case /* string description */ 4:
427
- message.description = reader.string();
428
- break;
429
- case /* string organization */ 5:
430
- message.organization = reader.string();
431
- break;
432
- case /* optional string homepage */ 6:
433
- message.homepage = reader.string();
434
- break;
435
- case /* optional string repository */ 7:
436
- message.repository = reader.string();
437
- break;
438
- case /* optional string bugs */ 8:
439
- message.bugs = reader.string();
440
- break;
441
- case /* optional string author */ 9:
442
- message.author = reader.string();
443
- break;
444
- case /* optional string logo */ 10:
445
- message.logo = reader.string();
446
- break;
447
- case /* string executors */ 11:
448
- message.executors = reader.string();
449
- break;
450
- case /* optional string configurators */ 12:
451
- message.configurators = reader.string();
452
- break;
453
- case /* optional string assets */ 13:
454
- message.assets = reader.string();
455
- break;
456
- case /* optional string cdn */ 14:
457
- message.cdn = reader.string();
458
- break;
459
- case /* repeated mochabugapis.adapt.plugins.v1.Vertex vertices */ 15:
460
- message.vertices.push(Vertex.internalBinaryRead(reader, reader.uint32(), options));
461
- break;
462
- case /* repeated mochabugapis.adapt.plugins.v1.Oauth2Service plugin_oauth2 */ 16:
463
- message.pluginOauth2.push(Oauth2Service.internalBinaryRead(reader, reader.uint32(), options));
464
- break;
465
- case /* repeated mochabugapis.adapt.plugins.v1.VariableService plugin_variables */ 17:
466
- message.pluginVariables.push(VariableService.internalBinaryRead(reader, reader.uint32(), options));
467
- break;
468
- case /* repeated mochabugapis.adapt.plugins.v1.MTLSService plugin_mtls */ 18:
469
- message.pluginMtls.push(MTLSService.internalBinaryRead(reader, reader.uint32(), options));
470
- break;
471
- default:
472
- let u = options.readUnknownField;
473
- if (u === "throw")
474
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
475
- let d = reader.skip(wireType);
476
- if (u !== false)
477
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
478
- }
479
- }
480
- return message;
481
- }
482
- internalBinaryWrite(message, writer, options) {
483
- /* string name = 1; */
484
- if (message.name !== "")
485
- writer.tag(1, WireType.LengthDelimited).string(message.name);
486
- /* string version = 2; */
487
- if (message.version !== "")
488
- writer.tag(2, WireType.LengthDelimited).string(message.version);
489
- /* string label = 3; */
490
- if (message.label !== "")
491
- writer.tag(3, WireType.LengthDelimited).string(message.label);
492
- /* string description = 4; */
493
- if (message.description !== "")
494
- writer.tag(4, WireType.LengthDelimited).string(message.description);
495
- /* string organization = 5; */
496
- if (message.organization !== "")
497
- writer.tag(5, WireType.LengthDelimited).string(message.organization);
498
- /* optional string homepage = 6; */
499
- if (message.homepage !== undefined)
500
- writer.tag(6, WireType.LengthDelimited).string(message.homepage);
501
- /* optional string repository = 7; */
502
- if (message.repository !== undefined)
503
- writer.tag(7, WireType.LengthDelimited).string(message.repository);
504
- /* optional string bugs = 8; */
505
- if (message.bugs !== undefined)
506
- writer.tag(8, WireType.LengthDelimited).string(message.bugs);
507
- /* optional string author = 9; */
508
- if (message.author !== undefined)
509
- writer.tag(9, WireType.LengthDelimited).string(message.author);
510
- /* optional string logo = 10; */
511
- if (message.logo !== undefined)
512
- writer.tag(10, WireType.LengthDelimited).string(message.logo);
513
- /* string executors = 11; */
514
- if (message.executors !== "")
515
- writer.tag(11, WireType.LengthDelimited).string(message.executors);
516
- /* optional string configurators = 12; */
517
- if (message.configurators !== undefined)
518
- writer.tag(12, WireType.LengthDelimited).string(message.configurators);
519
- /* optional string assets = 13; */
520
- if (message.assets !== undefined)
521
- writer.tag(13, WireType.LengthDelimited).string(message.assets);
522
- /* optional string cdn = 14; */
523
- if (message.cdn !== undefined)
524
- writer.tag(14, WireType.LengthDelimited).string(message.cdn);
525
- /* repeated mochabugapis.adapt.plugins.v1.Vertex vertices = 15; */
526
- for (let i = 0; i < message.vertices.length; i++)
527
- Vertex.internalBinaryWrite(message.vertices[i], writer.tag(15, WireType.LengthDelimited).fork(), options).join();
528
- /* repeated mochabugapis.adapt.plugins.v1.Oauth2Service plugin_oauth2 = 16; */
529
- for (let i = 0; i < message.pluginOauth2.length; i++)
530
- Oauth2Service.internalBinaryWrite(message.pluginOauth2[i], writer.tag(16, WireType.LengthDelimited).fork(), options).join();
531
- /* repeated mochabugapis.adapt.plugins.v1.VariableService plugin_variables = 17; */
532
- for (let i = 0; i < message.pluginVariables.length; i++)
533
- VariableService.internalBinaryWrite(message.pluginVariables[i], writer.tag(17, WireType.LengthDelimited).fork(), options).join();
534
- /* repeated mochabugapis.adapt.plugins.v1.MTLSService plugin_mtls = 18; */
535
- for (let i = 0; i < message.pluginMtls.length; i++)
536
- MTLSService.internalBinaryWrite(message.pluginMtls[i], writer.tag(18, WireType.LengthDelimited).fork(), options).join();
537
- let u = options.writeUnknownFields;
538
- if (u !== false)
539
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
540
- return writer;
541
- }
542
- }
543
- /**
544
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.Manifest
545
- */
546
- const Manifest = new Manifest$Type();
547
- // @generated message type with reflection information, may provide speed optimized methods
548
- class Vertex$Type extends MessageType {
549
- constructor() {
550
- super("mochabugapis.adapt.plugins.v1.Vertex", [
551
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
552
- { no: 2, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100" } } } },
553
- { no: 3, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "250" } } } },
554
- { no: 4, name: "logo", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "2", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)\\.(gif|jpg|jpeg|jfif|pjpeg|pjp|png|svg|webp|avif)$" } } } },
555
- { no: 5, name: "type", kind: "enum", T: () => ["mochabugapis.adapt.plugins.v1.Vertex.VertexType", Vertex_VertexType, "VERTEX_TYPE_"], options: { "buf.validate.field": { enum: { notIn: [0] } } } },
556
- { no: 6, name: "config", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "5", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)" } } } },
557
- { no: 7, name: "metadata", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "5", maxLen: "4096", pattern: "^([^/]+(/[^/]+)*)\\.json$" } } } },
558
- { no: 8, name: "configurator", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
559
- { no: 9, name: "variables", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => VariableService, options: { "buf.validate.field": { cel: [{ id: "vars_unique_names", message: "a name cannot appear more than once", expression: "this.map(variable, variable.name).unique()" }], repeated: { minItems: "0", maxItems: "100" } } } },
560
- { no: 10, name: "mtls", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => MTLSService, options: { "buf.validate.field": { cel: [{ id: "mtls_unique_names", message: "a name cannot appear more than once", expression: "this.map(mtls, mtls.name).unique()" }], repeated: { minItems: "0", maxItems: "100" } } } },
561
- { no: 11, name: "code_oauth2", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Oauth2CodeBinding, options: { "buf.validate.field": { cel: [{ id: "vertex.code_oauth2.unique_names", message: "a name cannot appear more than once", expression: "this.map(oauth, oauth.name).unique()" }], repeated: { minItems: "0", maxItems: "20" } } } },
562
- { no: 12, name: "oauth2", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Oauth2Service, options: { "buf.validate.field": { cel: [{ id: "vertex.oauth2.unique_names", message: "a name cannot appear more than once", expression: "this.map(oauth, oauth.name).unique()" }], repeated: { minItems: "0", maxItems: "20", items: { cel: [{ id: "vertex.oauth2.client_id_and_code", message: "The client_id and the code property may not be set as well as the code grant type", expression: "!has(this.client_id) && !has(this.code) && this.grant_type != 1" }] } } } } }
563
- ], { "buf.validate.message": { cel: [{ id: "vertex.oauth2_and_code_bindings", message: "The names of the oauth2 services and the code bindings must be unique", expression: "(this.oauth2.map(val, val.name) + this.code_oauth2.map(val, val.name)).unique()" }] } });
564
- }
565
- create(value) {
566
- const message = globalThis.Object.create((this.messagePrototype));
567
- message.name = "";
568
- message.label = "";
569
- message.type = 0;
570
- message.metadata = "";
571
- message.configurator = false;
572
- message.variables = [];
573
- message.mtls = [];
574
- message.codeOauth2 = [];
575
- message.oauth2 = [];
576
- if (value !== undefined)
577
- reflectionMergePartial(this, message, value);
578
- return message;
579
- }
580
- internalBinaryRead(reader, length, options, target) {
581
- let message = target ?? this.create(), end = reader.pos + length;
582
- while (reader.pos < end) {
583
- let [fieldNo, wireType] = reader.tag();
584
- switch (fieldNo) {
585
- case /* string name */ 1:
586
- message.name = reader.string();
587
- break;
588
- case /* string label */ 2:
589
- message.label = reader.string();
590
- break;
591
- case /* optional string description */ 3:
592
- message.description = reader.string();
593
- break;
594
- case /* optional string logo */ 4:
595
- message.logo = reader.string();
596
- break;
597
- case /* mochabugapis.adapt.plugins.v1.Vertex.VertexType type */ 5:
598
- message.type = reader.int32();
599
- break;
600
- case /* optional string config */ 6:
601
- message.config = reader.string();
602
- break;
603
- case /* string metadata */ 7:
604
- message.metadata = reader.string();
605
- break;
606
- case /* bool configurator */ 8:
607
- message.configurator = reader.bool();
608
- break;
609
- case /* repeated mochabugapis.adapt.plugins.v1.VariableService variables */ 9:
610
- message.variables.push(VariableService.internalBinaryRead(reader, reader.uint32(), options));
611
- break;
612
- case /* repeated mochabugapis.adapt.plugins.v1.MTLSService mtls */ 10:
613
- message.mtls.push(MTLSService.internalBinaryRead(reader, reader.uint32(), options));
614
- break;
615
- case /* repeated mochabugapis.adapt.plugins.v1.Oauth2CodeBinding code_oauth2 */ 11:
616
- message.codeOauth2.push(Oauth2CodeBinding.internalBinaryRead(reader, reader.uint32(), options));
617
- break;
618
- case /* repeated mochabugapis.adapt.plugins.v1.Oauth2Service oauth2 */ 12:
619
- message.oauth2.push(Oauth2Service.internalBinaryRead(reader, reader.uint32(), options));
620
- break;
621
- default:
622
- let u = options.readUnknownField;
623
- if (u === "throw")
624
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
625
- let d = reader.skip(wireType);
626
- if (u !== false)
627
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
628
- }
629
- }
630
- return message;
631
- }
632
- internalBinaryWrite(message, writer, options) {
633
- /* string name = 1; */
634
- if (message.name !== "")
635
- writer.tag(1, WireType.LengthDelimited).string(message.name);
636
- /* string label = 2; */
637
- if (message.label !== "")
638
- writer.tag(2, WireType.LengthDelimited).string(message.label);
639
- /* optional string description = 3; */
640
- if (message.description !== undefined)
641
- writer.tag(3, WireType.LengthDelimited).string(message.description);
642
- /* optional string logo = 4; */
643
- if (message.logo !== undefined)
644
- writer.tag(4, WireType.LengthDelimited).string(message.logo);
645
- /* mochabugapis.adapt.plugins.v1.Vertex.VertexType type = 5; */
646
- if (message.type !== 0)
647
- writer.tag(5, WireType.Varint).int32(message.type);
648
- /* optional string config = 6; */
649
- if (message.config !== undefined)
650
- writer.tag(6, WireType.LengthDelimited).string(message.config);
651
- /* string metadata = 7; */
652
- if (message.metadata !== "")
653
- writer.tag(7, WireType.LengthDelimited).string(message.metadata);
654
- /* bool configurator = 8; */
655
- if (message.configurator !== false)
656
- writer.tag(8, WireType.Varint).bool(message.configurator);
657
- /* repeated mochabugapis.adapt.plugins.v1.VariableService variables = 9; */
658
- for (let i = 0; i < message.variables.length; i++)
659
- VariableService.internalBinaryWrite(message.variables[i], writer.tag(9, WireType.LengthDelimited).fork(), options).join();
660
- /* repeated mochabugapis.adapt.plugins.v1.MTLSService mtls = 10; */
661
- for (let i = 0; i < message.mtls.length; i++)
662
- MTLSService.internalBinaryWrite(message.mtls[i], writer.tag(10, WireType.LengthDelimited).fork(), options).join();
663
- /* repeated mochabugapis.adapt.plugins.v1.Oauth2CodeBinding code_oauth2 = 11; */
664
- for (let i = 0; i < message.codeOauth2.length; i++)
665
- Oauth2CodeBinding.internalBinaryWrite(message.codeOauth2[i], writer.tag(11, WireType.LengthDelimited).fork(), options).join();
666
- /* repeated mochabugapis.adapt.plugins.v1.Oauth2Service oauth2 = 12; */
667
- for (let i = 0; i < message.oauth2.length; i++)
668
- Oauth2Service.internalBinaryWrite(message.oauth2[i], writer.tag(12, WireType.LengthDelimited).fork(), options).join();
669
- let u = options.writeUnknownFields;
670
- if (u !== false)
671
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
672
- return writer;
673
- }
674
- }
675
- /**
676
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.Vertex
677
- */
678
- const Vertex = new Vertex$Type();
679
- // @generated message type with reflection information, may provide speed optimized methods
680
- class MTLSService$Type extends MessageType {
681
- constructor() {
682
- super("mochabugapis.adapt.plugins.v1.MTLSService", [
683
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
684
- { no: 2, name: "label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "100" } } } },
685
- { no: 3, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "250" } } } },
686
- { no: 4, name: "optional", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
687
- ]);
688
- }
689
- create(value) {
690
- const message = globalThis.Object.create((this.messagePrototype));
691
- message.name = "";
692
- if (value !== undefined)
693
- reflectionMergePartial(this, message, value);
694
- return message;
695
- }
696
- internalBinaryRead(reader, length, options, target) {
697
- let message = target ?? this.create(), end = reader.pos + length;
698
- while (reader.pos < end) {
699
- let [fieldNo, wireType] = reader.tag();
700
- switch (fieldNo) {
701
- case /* string name */ 1:
702
- message.name = reader.string();
703
- break;
704
- case /* optional string label */ 2:
705
- message.label = reader.string();
706
- break;
707
- case /* optional string description */ 3:
708
- message.description = reader.string();
709
- break;
710
- case /* optional bool optional */ 4:
711
- message.optional = reader.bool();
712
- break;
713
- default:
714
- let u = options.readUnknownField;
715
- if (u === "throw")
716
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
717
- let d = reader.skip(wireType);
718
- if (u !== false)
719
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
720
- }
721
- }
722
- return message;
723
- }
724
- internalBinaryWrite(message, writer, options) {
725
- /* string name = 1; */
726
- if (message.name !== "")
727
- writer.tag(1, WireType.LengthDelimited).string(message.name);
728
- /* optional string label = 2; */
729
- if (message.label !== undefined)
730
- writer.tag(2, WireType.LengthDelimited).string(message.label);
731
- /* optional string description = 3; */
732
- if (message.description !== undefined)
733
- writer.tag(3, WireType.LengthDelimited).string(message.description);
734
- /* optional bool optional = 4; */
735
- if (message.optional !== undefined)
736
- writer.tag(4, WireType.Varint).bool(message.optional);
737
- let u = options.writeUnknownFields;
738
- if (u !== false)
739
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
740
- return writer;
741
- }
742
- }
743
- /**
744
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.MTLSService
745
- */
746
- const MTLSService = new MTLSService$Type();
747
- // @generated message type with reflection information, may provide speed optimized methods
748
- class VariableService$Type extends MessageType {
749
- constructor() {
750
- super("mochabugapis.adapt.plugins.v1.VariableService", [
751
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
752
- { no: 2, name: "label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100" } } } },
753
- { no: 3, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "250" } } } },
754
- { no: 4, name: "type", kind: "enum", T: () => ["mochabugapis.adapt.plugins.v1.VariableService.Type", VariableService_Type, "TYPE_"], options: { "buf.validate.field": { enum: { notIn: [0] } } } },
755
- { no: 5, name: "optional", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
756
- ]);
757
- }
758
- create(value) {
759
- const message = globalThis.Object.create((this.messagePrototype));
760
- message.name = "";
761
- message.type = 0;
762
- if (value !== undefined)
763
- reflectionMergePartial(this, message, value);
764
- return message;
765
- }
766
- internalBinaryRead(reader, length, options, target) {
767
- let message = target ?? this.create(), end = reader.pos + length;
768
- while (reader.pos < end) {
769
- let [fieldNo, wireType] = reader.tag();
770
- switch (fieldNo) {
771
- case /* string name */ 1:
772
- message.name = reader.string();
773
- break;
774
- case /* optional string label */ 2:
775
- message.label = reader.string();
776
- break;
777
- case /* optional string description */ 3:
778
- message.description = reader.string();
779
- break;
780
- case /* mochabugapis.adapt.plugins.v1.VariableService.Type type */ 4:
781
- message.type = reader.int32();
782
- break;
783
- case /* optional bool optional */ 5:
784
- message.optional = reader.bool();
785
- break;
786
- default:
787
- let u = options.readUnknownField;
788
- if (u === "throw")
789
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
790
- let d = reader.skip(wireType);
791
- if (u !== false)
792
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
793
- }
794
- }
795
- return message;
796
- }
797
- internalBinaryWrite(message, writer, options) {
798
- /* string name = 1; */
799
- if (message.name !== "")
800
- writer.tag(1, WireType.LengthDelimited).string(message.name);
801
- /* optional string label = 2; */
802
- if (message.label !== undefined)
803
- writer.tag(2, WireType.LengthDelimited).string(message.label);
804
- /* optional string description = 3; */
805
- if (message.description !== undefined)
806
- writer.tag(3, WireType.LengthDelimited).string(message.description);
807
- /* mochabugapis.adapt.plugins.v1.VariableService.Type type = 4; */
808
- if (message.type !== 0)
809
- writer.tag(4, WireType.Varint).int32(message.type);
810
- /* optional bool optional = 5; */
811
- if (message.optional !== undefined)
812
- writer.tag(5, WireType.Varint).bool(message.optional);
813
- let u = options.writeUnknownFields;
814
- if (u !== false)
815
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
816
- return writer;
817
- }
818
- }
819
- /**
820
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.VariableService
821
- */
822
- const VariableService = new VariableService$Type();
823
- // @generated message type with reflection information, may provide speed optimized methods
824
- class Oauth2Service$Type extends MessageType {
825
- constructor() {
826
- super("mochabugapis.adapt.plugins.v1.Oauth2Service", [
827
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
828
- { no: 2, name: "label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "100" } } } },
829
- { no: 3, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "250" } } } },
830
- { no: 4, name: "grant_type", kind: "enum", T: () => ["mochabugapis.adapt.plugins.v1.Oauth2GrantType", Oauth2GrantType, "OAUTH2_GRANT_TYPE_"], options: { "buf.validate.field": { enum: { notIn: [0] } } } },
831
- { no: 5, name: "scopes", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { minItems: "1", maxItems: "500", unique: true, items: { string: { minLen: "1", maxLen: "100" } } } } } },
832
- { no: 6, name: "auth_method", kind: "enum", opt: true, T: () => ["mochabugapis.adapt.plugins.v1.Oauth2AuthType", Oauth2AuthType, "OAUTH2_AUTH_TYPE_"], options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", enum: { notIn: [0] } } } },
833
- { no: 7, name: "alg", kind: "enum", opt: true, T: () => ["mochabugapis.adapt.plugins.v1.PrivateKeyAlg", PrivateKeyAlg, "PRIVATE_KEY_ALG_"], options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", enum: { notIn: [0] } } } },
834
- { no: 8, name: "client_id", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", string: { minLen: "1", maxLen: "250" } } } },
835
- { no: 9, name: "token_endpoint", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "11", maxLen: "4096", pattern: "^https://[a-zA-Z0-9.-]+(?:\\.[a-zA-Z]{2,})(?:/.*)?$" } } } },
836
- { no: 10, name: "code", kind: "message", T: () => Oauth2Code },
837
- { no: 11, name: "optional", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
838
- ], { "buf.validate.message": { cel: [{ id: "oauth2.auth_method", message: "The auth_method property must be set in case of grant_type OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE or OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS", expression: "has(this.auth_method) == (this.grant_type == 1 || this.grant_type == 2)" }, { id: "oauth2.alg", message: "The alg property must be set in case of grant_type OAUTH2_GRANT_TYPE_JWT_BEARER, OAUTH2_GRANT_TYPE_SAML2_BEARER or auth_method OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT, OAUTH2_AUTH_TYPE_SAML2_BEARER", expression: "has(this.alg) == (this.grant_type == 3 || this.grant_type == 4 || this.auth_method == 3 || this.auth_method == 5)" }, { id: "oauth2.code", message: "The code property must be set in case of grant_type OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE", expression: "has(this.code) == (this.grant_type == 1)" }, { id: "oauth2.optional", message: "The optional property cannot be set to true in case of grant_type OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE", expression: "!has(this.optional) || this.grant_type != 1 || (!this.optional && this.grant_type == 1)" }] } });
839
- }
840
- create(value) {
841
- const message = globalThis.Object.create((this.messagePrototype));
842
- message.name = "";
843
- message.grantType = 0;
844
- message.scopes = [];
845
- message.tokenEndpoint = "";
846
- if (value !== undefined)
847
- reflectionMergePartial(this, message, value);
848
- return message;
849
- }
850
- internalBinaryRead(reader, length, options, target) {
851
- let message = target ?? this.create(), end = reader.pos + length;
852
- while (reader.pos < end) {
853
- let [fieldNo, wireType] = reader.tag();
854
- switch (fieldNo) {
855
- case /* string name */ 1:
856
- message.name = reader.string();
857
- break;
858
- case /* optional string label */ 2:
859
- message.label = reader.string();
860
- break;
861
- case /* optional string description */ 3:
862
- message.description = reader.string();
863
- break;
864
- case /* mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type */ 4:
865
- message.grantType = reader.int32();
866
- break;
867
- case /* repeated string scopes */ 5:
868
- message.scopes.push(reader.string());
869
- break;
870
- case /* optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method */ 6:
871
- message.authMethod = reader.int32();
872
- break;
873
- case /* optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg */ 7:
874
- message.alg = reader.int32();
875
- break;
876
- case /* optional string client_id */ 8:
877
- message.clientId = reader.string();
878
- break;
879
- case /* string token_endpoint */ 9:
880
- message.tokenEndpoint = reader.string();
881
- break;
882
- case /* optional mochabugapis.adapt.plugins.v1.Oauth2Code code */ 10:
883
- message.code = Oauth2Code.internalBinaryRead(reader, reader.uint32(), options, message.code);
884
- break;
885
- case /* optional bool optional */ 11:
886
- message.optional = reader.bool();
887
- break;
888
- default:
889
- let u = options.readUnknownField;
890
- if (u === "throw")
891
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
892
- let d = reader.skip(wireType);
893
- if (u !== false)
894
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
895
- }
896
- }
897
- return message;
898
- }
899
- internalBinaryWrite(message, writer, options) {
900
- /* string name = 1; */
901
- if (message.name !== "")
902
- writer.tag(1, WireType.LengthDelimited).string(message.name);
903
- /* optional string label = 2; */
904
- if (message.label !== undefined)
905
- writer.tag(2, WireType.LengthDelimited).string(message.label);
906
- /* optional string description = 3; */
907
- if (message.description !== undefined)
908
- writer.tag(3, WireType.LengthDelimited).string(message.description);
909
- /* mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type = 4; */
910
- if (message.grantType !== 0)
911
- writer.tag(4, WireType.Varint).int32(message.grantType);
912
- /* repeated string scopes = 5; */
913
- for (let i = 0; i < message.scopes.length; i++)
914
- writer.tag(5, WireType.LengthDelimited).string(message.scopes[i]);
915
- /* optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method = 6; */
916
- if (message.authMethod !== undefined)
917
- writer.tag(6, WireType.Varint).int32(message.authMethod);
918
- /* optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg = 7; */
919
- if (message.alg !== undefined)
920
- writer.tag(7, WireType.Varint).int32(message.alg);
921
- /* optional string client_id = 8; */
922
- if (message.clientId !== undefined)
923
- writer.tag(8, WireType.LengthDelimited).string(message.clientId);
924
- /* string token_endpoint = 9; */
925
- if (message.tokenEndpoint !== "")
926
- writer.tag(9, WireType.LengthDelimited).string(message.tokenEndpoint);
927
- /* optional mochabugapis.adapt.plugins.v1.Oauth2Code code = 10; */
928
- if (message.code)
929
- Oauth2Code.internalBinaryWrite(message.code, writer.tag(10, WireType.LengthDelimited).fork(), options).join();
930
- /* optional bool optional = 11; */
931
- if (message.optional !== undefined)
932
- writer.tag(11, WireType.Varint).bool(message.optional);
933
- let u = options.writeUnknownFields;
934
- if (u !== false)
935
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
936
- return writer;
937
- }
938
- }
939
- /**
940
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.Oauth2Service
941
- */
942
- const Oauth2Service = new Oauth2Service$Type();
943
- // @generated message type with reflection information, may provide speed optimized methods
944
- class Oauth2CodeBinding$Type extends MessageType {
945
- constructor() {
946
- super("mochabugapis.adapt.plugins.v1.Oauth2CodeBinding", [
947
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "100", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
948
- { no: 2, name: "optional", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
949
- ]);
950
- }
951
- create(value) {
952
- const message = globalThis.Object.create((this.messagePrototype));
953
- message.name = "";
954
- if (value !== undefined)
955
- reflectionMergePartial(this, message, value);
956
- return message;
957
- }
958
- internalBinaryRead(reader, length, options, target) {
959
- let message = target ?? this.create(), end = reader.pos + length;
960
- while (reader.pos < end) {
961
- let [fieldNo, wireType] = reader.tag();
962
- switch (fieldNo) {
963
- case /* string name */ 1:
964
- message.name = reader.string();
965
- break;
966
- case /* optional bool optional */ 2:
967
- message.optional = reader.bool();
968
- break;
969
- default:
970
- let u = options.readUnknownField;
971
- if (u === "throw")
972
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
973
- let d = reader.skip(wireType);
974
- if (u !== false)
975
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
976
- }
977
- }
978
- return message;
979
- }
980
- internalBinaryWrite(message, writer, options) {
981
- /* string name = 1; */
982
- if (message.name !== "")
983
- writer.tag(1, WireType.LengthDelimited).string(message.name);
984
- /* optional bool optional = 2; */
985
- if (message.optional !== undefined)
986
- writer.tag(2, WireType.Varint).bool(message.optional);
987
- let u = options.writeUnknownFields;
988
- if (u !== false)
989
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
990
- return writer;
991
- }
992
- }
993
- /**
994
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.Oauth2CodeBinding
995
- */
996
- const Oauth2CodeBinding = new Oauth2CodeBinding$Type();
997
- // @generated message type with reflection information, may provide speed optimized methods
998
- class Oauth2Code$Type extends MessageType {
999
- constructor() {
1000
- super("mochabugapis.adapt.plugins.v1.Oauth2Code", [
1001
- { no: 1, name: "auth_endpoint", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "11", maxLen: "4096", pattern: "^https://[a-zA-Z0-9.-]+(?:\\.[a-zA-Z]{2,})(?:/.*)?$" } } } },
1002
- { no: 2, name: "issuer", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "4096" } } } },
1003
- { no: 3, name: "jwks_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "11", maxLen: "4096", pattern: "^https://[a-zA-Z0-9.-]+(?:\\.[a-zA-Z]{2,})(?:/.*)?$" } } } },
1004
- { no: 4, name: "additional_params", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "scalar", T: 9 /*ScalarType.STRING*/ }, options: { "buf.validate.field": { map: { minPairs: "0", maxPairs: "50", keys: { string: { minLen: "1", maxLen: "250" } }, values: { string: { minLen: "1", maxLen: "250" } } } } } },
1005
- { no: 5, name: "use_pkce", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1006
- ]);
1007
- }
1008
- create(value) {
1009
- const message = globalThis.Object.create((this.messagePrototype));
1010
- message.authEndpoint = "";
1011
- message.issuer = "";
1012
- message.jwksUri = "";
1013
- message.additionalParams = {};
1014
- message.usePkce = false;
1015
- if (value !== undefined)
1016
- reflectionMergePartial(this, message, value);
1017
- return message;
1018
- }
1019
- internalBinaryRead(reader, length, options, target) {
1020
- let message = target ?? this.create(), end = reader.pos + length;
1021
- while (reader.pos < end) {
1022
- let [fieldNo, wireType] = reader.tag();
1023
- switch (fieldNo) {
1024
- case /* string auth_endpoint */ 1:
1025
- message.authEndpoint = reader.string();
1026
- break;
1027
- case /* string issuer */ 2:
1028
- message.issuer = reader.string();
1029
- break;
1030
- case /* string jwks_uri */ 3:
1031
- message.jwksUri = reader.string();
1032
- break;
1033
- case /* map<string, string> additional_params */ 4:
1034
- this.binaryReadMap4(message.additionalParams, reader, options);
1035
- break;
1036
- case /* bool use_pkce */ 5:
1037
- message.usePkce = reader.bool();
1038
- break;
1039
- default:
1040
- let u = options.readUnknownField;
1041
- if (u === "throw")
1042
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1043
- let d = reader.skip(wireType);
1044
- if (u !== false)
1045
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1046
- }
1047
- }
1048
- return message;
1049
- }
1050
- binaryReadMap4(map, reader, options) {
1051
- let len = reader.uint32(), end = reader.pos + len, key, val;
1052
- while (reader.pos < end) {
1053
- let [fieldNo, wireType] = reader.tag();
1054
- switch (fieldNo) {
1055
- case 1:
1056
- key = reader.string();
1057
- break;
1058
- case 2:
1059
- val = reader.string();
1060
- break;
1061
- default: throw new globalThis.Error("unknown map entry field for field mochabugapis.adapt.plugins.v1.Oauth2Code.additional_params");
1062
- }
1063
- }
1064
- map[key ?? ""] = val ?? "";
1065
- }
1066
- internalBinaryWrite(message, writer, options) {
1067
- /* string auth_endpoint = 1; */
1068
- if (message.authEndpoint !== "")
1069
- writer.tag(1, WireType.LengthDelimited).string(message.authEndpoint);
1070
- /* string issuer = 2; */
1071
- if (message.issuer !== "")
1072
- writer.tag(2, WireType.LengthDelimited).string(message.issuer);
1073
- /* string jwks_uri = 3; */
1074
- if (message.jwksUri !== "")
1075
- writer.tag(3, WireType.LengthDelimited).string(message.jwksUri);
1076
- /* map<string, string> additional_params = 4; */
1077
- for (let k of globalThis.Object.keys(message.additionalParams))
1078
- writer.tag(4, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k).tag(2, WireType.LengthDelimited).string(message.additionalParams[k]).join();
1079
- /* bool use_pkce = 5; */
1080
- if (message.usePkce !== false)
1081
- writer.tag(5, WireType.Varint).bool(message.usePkce);
1082
- let u = options.writeUnknownFields;
1083
- if (u !== false)
1084
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1085
- return writer;
1086
- }
1087
- }
1088
- /**
1089
- * @generated MessageType for protobuf message mochabugapis.adapt.plugins.v1.Oauth2Code
1090
- */
1091
- const Oauth2Code = new Oauth2Code$Type();
1092
- /**
1093
- * @generated ServiceType for protobuf service mochabugapis.adapt.plugins.v1.PluginService
1094
- */
1095
- const PluginService = new ServiceType("mochabugapis.adapt.plugins.v1.PluginService", [
1096
- { name: "UploadPlugin", clientStreaming: true, options: { "google.api.http": { post: "/v1/plugins/upload", body: "*" } }, I: UploadPluginRequest, O: UploadPluginResponse }
1097
- ], { "google.api.default_host": "adapt.mochabugapis.com", "google.api.oauth_scopes": "https://www.mochabugapis.com/auth/adapt/plugins,https://www.mochabugapis.com/auth/adapt/plugins.upload" });
1098
-
1099
- /**
1100
- * `NullValue` is a singleton enumeration to represent the null value for the
1101
- * `Value` type union.
1102
- *
1103
- * The JSON representation for `NullValue` is JSON `null`.
1104
- *
1105
- * @generated from protobuf enum google.protobuf.NullValue
1106
- */
1107
- var NullValue;
1108
- (function (NullValue) {
1109
- /**
1110
- * Null value.
1111
- *
1112
- * @generated from protobuf enum value: NULL_VALUE = 0;
1113
- */
1114
- NullValue[NullValue["NULL_VALUE"] = 0] = "NULL_VALUE";
1115
- })(NullValue || (NullValue = {}));
1116
- // @generated message type with reflection information, may provide speed optimized methods
1117
- class Struct$Type extends MessageType {
1118
- constructor() {
1119
- super("google.protobuf.Struct", [
1120
- { no: 1, name: "fields", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => Value } }
1121
- ]);
1122
- }
1123
- /**
1124
- * Encode `Struct` to JSON object.
1125
- */
1126
- internalJsonWrite(message, options) {
1127
- let json = {};
1128
- for (let [k, v] of Object.entries(message.fields)) {
1129
- json[k] = Value.toJson(v);
1130
- }
1131
- return json;
1132
- }
1133
- /**
1134
- * Decode `Struct` from JSON object.
1135
- */
1136
- internalJsonRead(json, options, target) {
1137
- if (!isJsonObject(json))
1138
- throw new globalThis.Error("Unable to parse message " + this.typeName + " from JSON " + typeofJsonValue(json) + ".");
1139
- if (!target)
1140
- target = this.create();
1141
- for (let [k, v] of globalThis.Object.entries(json)) {
1142
- target.fields[k] = Value.fromJson(v);
1143
- }
1144
- return target;
1145
- }
1146
- create(value) {
1147
- const message = globalThis.Object.create((this.messagePrototype));
1148
- message.fields = {};
1149
- if (value !== undefined)
1150
- reflectionMergePartial(this, message, value);
1151
- return message;
1152
- }
1153
- internalBinaryRead(reader, length, options, target) {
1154
- let message = target ?? this.create(), end = reader.pos + length;
1155
- while (reader.pos < end) {
1156
- let [fieldNo, wireType] = reader.tag();
1157
- switch (fieldNo) {
1158
- case /* map<string, google.protobuf.Value> fields */ 1:
1159
- this.binaryReadMap1(message.fields, reader, options);
1160
- break;
1161
- default:
1162
- let u = options.readUnknownField;
1163
- if (u === "throw")
1164
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1165
- let d = reader.skip(wireType);
1166
- if (u !== false)
1167
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1168
- }
1169
- }
1170
- return message;
1171
- }
1172
- binaryReadMap1(map, reader, options) {
1173
- let len = reader.uint32(), end = reader.pos + len, key, val;
1174
- while (reader.pos < end) {
1175
- let [fieldNo, wireType] = reader.tag();
1176
- switch (fieldNo) {
1177
- case 1:
1178
- key = reader.string();
1179
- break;
1180
- case 2:
1181
- val = Value.internalBinaryRead(reader, reader.uint32(), options);
1182
- break;
1183
- default: throw new globalThis.Error("unknown map entry field for field google.protobuf.Struct.fields");
1184
- }
1185
- }
1186
- map[key ?? ""] = val ?? Value.create();
1187
- }
1188
- internalBinaryWrite(message, writer, options) {
1189
- /* map<string, google.protobuf.Value> fields = 1; */
1190
- for (let k of globalThis.Object.keys(message.fields)) {
1191
- writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k);
1192
- writer.tag(2, WireType.LengthDelimited).fork();
1193
- Value.internalBinaryWrite(message.fields[k], writer, options);
1194
- writer.join().join();
1195
- }
1196
- let u = options.writeUnknownFields;
1197
- if (u !== false)
1198
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1199
- return writer;
1200
- }
1201
- }
1202
- /**
1203
- * @generated MessageType for protobuf message google.protobuf.Struct
1204
- */
1205
- const Struct = new Struct$Type();
1206
- // @generated message type with reflection information, may provide speed optimized methods
1207
- class Value$Type extends MessageType {
1208
- constructor() {
1209
- super("google.protobuf.Value", [
1210
- { no: 1, name: "null_value", kind: "enum", oneof: "kind", T: () => ["google.protobuf.NullValue", NullValue] },
1211
- { no: 2, name: "number_value", kind: "scalar", oneof: "kind", T: 1 /*ScalarType.DOUBLE*/ },
1212
- { no: 3, name: "string_value", kind: "scalar", oneof: "kind", T: 9 /*ScalarType.STRING*/ },
1213
- { no: 4, name: "bool_value", kind: "scalar", oneof: "kind", T: 8 /*ScalarType.BOOL*/ },
1214
- { no: 5, name: "struct_value", kind: "message", oneof: "kind", T: () => Struct },
1215
- { no: 6, name: "list_value", kind: "message", oneof: "kind", T: () => ListValue }
1216
- ]);
1217
- }
1218
- /**
1219
- * Encode `Value` to JSON value.
1220
- */
1221
- internalJsonWrite(message, options) {
1222
- if (message.kind.oneofKind === undefined)
1223
- throw new globalThis.Error();
1224
- switch (message.kind.oneofKind) {
1225
- case undefined: throw new globalThis.Error();
1226
- case "boolValue": return message.kind.boolValue;
1227
- case "nullValue": return null;
1228
- case "numberValue":
1229
- let numberValue = message.kind.numberValue;
1230
- if (typeof numberValue == "number" && !Number.isFinite(numberValue))
1231
- throw new globalThis.Error();
1232
- return numberValue;
1233
- case "stringValue": return message.kind.stringValue;
1234
- case "listValue":
1235
- let listValueField = this.fields.find(f => f.no === 6);
1236
- if (listValueField?.kind !== "message")
1237
- throw new globalThis.Error();
1238
- return listValueField.T().toJson(message.kind.listValue);
1239
- case "structValue":
1240
- let structValueField = this.fields.find(f => f.no === 5);
1241
- if (structValueField?.kind !== "message")
1242
- throw new globalThis.Error();
1243
- return structValueField.T().toJson(message.kind.structValue);
1244
- }
1245
- }
1246
- /**
1247
- * Decode `Value` from JSON value.
1248
- */
1249
- internalJsonRead(json, options, target) {
1250
- if (!target)
1251
- target = this.create();
1252
- switch (typeof json) {
1253
- case "number":
1254
- target.kind = { oneofKind: "numberValue", numberValue: json };
1255
- break;
1256
- case "string":
1257
- target.kind = { oneofKind: "stringValue", stringValue: json };
1258
- break;
1259
- case "boolean":
1260
- target.kind = { oneofKind: "boolValue", boolValue: json };
1261
- break;
1262
- case "object":
1263
- if (json === null) {
1264
- target.kind = { oneofKind: "nullValue", nullValue: NullValue.NULL_VALUE };
1265
- }
1266
- else if (globalThis.Array.isArray(json)) {
1267
- target.kind = { oneofKind: "listValue", listValue: ListValue.fromJson(json) };
1268
- }
1269
- else {
1270
- target.kind = { oneofKind: "structValue", structValue: Struct.fromJson(json) };
1271
- }
1272
- break;
1273
- default: throw new globalThis.Error("Unable to parse " + this.typeName + " from JSON " + typeofJsonValue(json));
1274
- }
1275
- return target;
1276
- }
1277
- create(value) {
1278
- const message = globalThis.Object.create((this.messagePrototype));
1279
- message.kind = { oneofKind: undefined };
1280
- if (value !== undefined)
1281
- reflectionMergePartial(this, message, value);
1282
- return message;
1283
- }
1284
- internalBinaryRead(reader, length, options, target) {
1285
- let message = target ?? this.create(), end = reader.pos + length;
1286
- while (reader.pos < end) {
1287
- let [fieldNo, wireType] = reader.tag();
1288
- switch (fieldNo) {
1289
- case /* google.protobuf.NullValue null_value */ 1:
1290
- message.kind = {
1291
- oneofKind: "nullValue",
1292
- nullValue: reader.int32()
1293
- };
1294
- break;
1295
- case /* double number_value */ 2:
1296
- message.kind = {
1297
- oneofKind: "numberValue",
1298
- numberValue: reader.double()
1299
- };
1300
- break;
1301
- case /* string string_value */ 3:
1302
- message.kind = {
1303
- oneofKind: "stringValue",
1304
- stringValue: reader.string()
1305
- };
1306
- break;
1307
- case /* bool bool_value */ 4:
1308
- message.kind = {
1309
- oneofKind: "boolValue",
1310
- boolValue: reader.bool()
1311
- };
1312
- break;
1313
- case /* google.protobuf.Struct struct_value */ 5:
1314
- message.kind = {
1315
- oneofKind: "structValue",
1316
- structValue: Struct.internalBinaryRead(reader, reader.uint32(), options, message.kind.structValue)
1317
- };
1318
- break;
1319
- case /* google.protobuf.ListValue list_value */ 6:
1320
- message.kind = {
1321
- oneofKind: "listValue",
1322
- listValue: ListValue.internalBinaryRead(reader, reader.uint32(), options, message.kind.listValue)
1323
- };
1324
- break;
1325
- default:
1326
- let u = options.readUnknownField;
1327
- if (u === "throw")
1328
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1329
- let d = reader.skip(wireType);
1330
- if (u !== false)
1331
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1332
- }
1333
- }
1334
- return message;
1335
- }
1336
- internalBinaryWrite(message, writer, options) {
1337
- /* google.protobuf.NullValue null_value = 1; */
1338
- if (message.kind.oneofKind === "nullValue")
1339
- writer.tag(1, WireType.Varint).int32(message.kind.nullValue);
1340
- /* double number_value = 2; */
1341
- if (message.kind.oneofKind === "numberValue")
1342
- writer.tag(2, WireType.Bit64).double(message.kind.numberValue);
1343
- /* string string_value = 3; */
1344
- if (message.kind.oneofKind === "stringValue")
1345
- writer.tag(3, WireType.LengthDelimited).string(message.kind.stringValue);
1346
- /* bool bool_value = 4; */
1347
- if (message.kind.oneofKind === "boolValue")
1348
- writer.tag(4, WireType.Varint).bool(message.kind.boolValue);
1349
- /* google.protobuf.Struct struct_value = 5; */
1350
- if (message.kind.oneofKind === "structValue")
1351
- Struct.internalBinaryWrite(message.kind.structValue, writer.tag(5, WireType.LengthDelimited).fork(), options).join();
1352
- /* google.protobuf.ListValue list_value = 6; */
1353
- if (message.kind.oneofKind === "listValue")
1354
- ListValue.internalBinaryWrite(message.kind.listValue, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
1355
- let u = options.writeUnknownFields;
1356
- if (u !== false)
1357
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1358
- return writer;
1359
- }
1360
- }
1361
- /**
1362
- * @generated MessageType for protobuf message google.protobuf.Value
1363
- */
1364
- const Value = new Value$Type();
1365
- // @generated message type with reflection information, may provide speed optimized methods
1366
- class ListValue$Type extends MessageType {
1367
- constructor() {
1368
- super("google.protobuf.ListValue", [
1369
- { no: 1, name: "values", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Value }
1370
- ]);
1371
- }
1372
- /**
1373
- * Encode `ListValue` to JSON array.
1374
- */
1375
- internalJsonWrite(message, options) {
1376
- return message.values.map(v => Value.toJson(v));
1377
- }
1378
- /**
1379
- * Decode `ListValue` from JSON array.
1380
- */
1381
- internalJsonRead(json, options, target) {
1382
- if (!globalThis.Array.isArray(json))
1383
- throw new globalThis.Error("Unable to parse " + this.typeName + " from JSON " + typeofJsonValue(json));
1384
- if (!target)
1385
- target = this.create();
1386
- let values = json.map(v => Value.fromJson(v));
1387
- target.values.push(...values);
1388
- return target;
1389
- }
1390
- create(value) {
1391
- const message = globalThis.Object.create((this.messagePrototype));
1392
- message.values = [];
1393
- if (value !== undefined)
1394
- reflectionMergePartial(this, message, value);
1395
- return message;
1396
- }
1397
- internalBinaryRead(reader, length, options, target) {
1398
- let message = target ?? this.create(), end = reader.pos + length;
1399
- while (reader.pos < end) {
1400
- let [fieldNo, wireType] = reader.tag();
1401
- switch (fieldNo) {
1402
- case /* repeated google.protobuf.Value values */ 1:
1403
- message.values.push(Value.internalBinaryRead(reader, reader.uint32(), options));
1404
- break;
1405
- default:
1406
- let u = options.readUnknownField;
1407
- if (u === "throw")
1408
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1409
- let d = reader.skip(wireType);
1410
- if (u !== false)
1411
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1412
- }
1413
- }
1414
- return message;
1415
- }
1416
- internalBinaryWrite(message, writer, options) {
1417
- /* repeated google.protobuf.Value values = 1; */
1418
- for (let i = 0; i < message.values.length; i++)
1419
- Value.internalBinaryWrite(message.values[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
1420
- let u = options.writeUnknownFields;
1421
- if (u !== false)
1422
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1423
- return writer;
1424
- }
1425
- }
1426
- /**
1427
- * @generated MessageType for protobuf message google.protobuf.ListValue
1428
- */
1429
- const ListValue = new ListValue$Type();
1430
-
1431
- // @generated message type with reflection information, may provide speed optimized methods
1432
- class JTDSchema$Type extends MessageType {
1433
- constructor() {
1434
- super("mochabugapis.adapt.graph.JTDSchema", [
1435
- { no: 1, name: "definitions", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => JTDSchema } },
1436
- { no: 2, name: "metadata", kind: "message", T: () => Struct },
1437
- { no: 3, name: "nullable", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
1438
- { no: 4, name: "ref", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1439
- { no: 5, name: "type", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1440
- { no: 6, name: "enum", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
1441
- { no: 7, name: "elements", kind: "message", T: () => JTDSchema },
1442
- { no: 8, name: "properties", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => JTDSchema } },
1443
- { no: 9, name: "optional_properties", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => JTDSchema } },
1444
- { no: 10, name: "additional_properties", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
1445
- { no: 11, name: "values", kind: "message", T: () => JTDSchema },
1446
- { no: 12, name: "discriminator", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1447
- { no: 13, name: "mapping", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => JTDSchema } }
1448
- ]);
1449
- }
1450
- create(value) {
1451
- const message = globalThis.Object.create((this.messagePrototype));
1452
- message.definitions = {};
1453
- message.enum = [];
1454
- message.properties = {};
1455
- message.optionalProperties = {};
1456
- message.mapping = {};
1457
- if (value !== undefined)
1458
- reflectionMergePartial(this, message, value);
1459
- return message;
1460
- }
1461
- internalBinaryRead(reader, length, options, target) {
1462
- let message = target ?? this.create(), end = reader.pos + length;
1463
- while (reader.pos < end) {
1464
- let [fieldNo, wireType] = reader.tag();
1465
- switch (fieldNo) {
1466
- case /* map<string, mochabugapis.adapt.graph.JTDSchema> definitions */ 1:
1467
- this.binaryReadMap1(message.definitions, reader, options);
1468
- break;
1469
- case /* optional google.protobuf.Struct metadata */ 2:
1470
- message.metadata = Struct.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
1471
- break;
1472
- case /* optional bool nullable */ 3:
1473
- message.nullable = reader.bool();
1474
- break;
1475
- case /* optional string ref */ 4:
1476
- message.ref = reader.string();
1477
- break;
1478
- case /* optional string type */ 5:
1479
- message.type = reader.string();
1480
- break;
1481
- case /* repeated string enum */ 6:
1482
- message.enum.push(reader.string());
1483
- break;
1484
- case /* optional mochabugapis.adapt.graph.JTDSchema elements */ 7:
1485
- message.elements = JTDSchema.internalBinaryRead(reader, reader.uint32(), options, message.elements);
1486
- break;
1487
- case /* map<string, mochabugapis.adapt.graph.JTDSchema> properties */ 8:
1488
- this.binaryReadMap8(message.properties, reader, options);
1489
- break;
1490
- case /* map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties */ 9:
1491
- this.binaryReadMap9(message.optionalProperties, reader, options);
1492
- break;
1493
- case /* optional bool additional_properties */ 10:
1494
- message.additionalProperties = reader.bool();
1495
- break;
1496
- case /* optional mochabugapis.adapt.graph.JTDSchema values */ 11:
1497
- message.values = JTDSchema.internalBinaryRead(reader, reader.uint32(), options, message.values);
1498
- break;
1499
- case /* optional string discriminator */ 12:
1500
- message.discriminator = reader.string();
1501
- break;
1502
- case /* map<string, mochabugapis.adapt.graph.JTDSchema> mapping */ 13:
1503
- this.binaryReadMap13(message.mapping, reader, options);
1504
- break;
1505
- default:
1506
- let u = options.readUnknownField;
1507
- if (u === "throw")
1508
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1509
- let d = reader.skip(wireType);
1510
- if (u !== false)
1511
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1512
- }
1513
- }
1514
- return message;
1515
- }
1516
- binaryReadMap1(map, reader, options) {
1517
- let len = reader.uint32(), end = reader.pos + len, key, val;
1518
- while (reader.pos < end) {
1519
- let [fieldNo, wireType] = reader.tag();
1520
- switch (fieldNo) {
1521
- case 1:
1522
- key = reader.string();
1523
- break;
1524
- case 2:
1525
- val = JTDSchema.internalBinaryRead(reader, reader.uint32(), options);
1526
- break;
1527
- default: throw new globalThis.Error("unknown map entry field for field mochabugapis.adapt.graph.JTDSchema.definitions");
1528
- }
1529
- }
1530
- map[key ?? ""] = val ?? JTDSchema.create();
1531
- }
1532
- binaryReadMap8(map, reader, options) {
1533
- let len = reader.uint32(), end = reader.pos + len, key, val;
1534
- while (reader.pos < end) {
1535
- let [fieldNo, wireType] = reader.tag();
1536
- switch (fieldNo) {
1537
- case 1:
1538
- key = reader.string();
1539
- break;
1540
- case 2:
1541
- val = JTDSchema.internalBinaryRead(reader, reader.uint32(), options);
1542
- break;
1543
- default: throw new globalThis.Error("unknown map entry field for field mochabugapis.adapt.graph.JTDSchema.properties");
1544
- }
1545
- }
1546
- map[key ?? ""] = val ?? JTDSchema.create();
1547
- }
1548
- binaryReadMap9(map, reader, options) {
1549
- let len = reader.uint32(), end = reader.pos + len, key, val;
1550
- while (reader.pos < end) {
1551
- let [fieldNo, wireType] = reader.tag();
1552
- switch (fieldNo) {
1553
- case 1:
1554
- key = reader.string();
1555
- break;
1556
- case 2:
1557
- val = JTDSchema.internalBinaryRead(reader, reader.uint32(), options);
1558
- break;
1559
- default: throw new globalThis.Error("unknown map entry field for field mochabugapis.adapt.graph.JTDSchema.optional_properties");
1560
- }
1561
- }
1562
- map[key ?? ""] = val ?? JTDSchema.create();
1563
- }
1564
- binaryReadMap13(map, reader, options) {
1565
- let len = reader.uint32(), end = reader.pos + len, key, val;
1566
- while (reader.pos < end) {
1567
- let [fieldNo, wireType] = reader.tag();
1568
- switch (fieldNo) {
1569
- case 1:
1570
- key = reader.string();
1571
- break;
1572
- case 2:
1573
- val = JTDSchema.internalBinaryRead(reader, reader.uint32(), options);
1574
- break;
1575
- default: throw new globalThis.Error("unknown map entry field for field mochabugapis.adapt.graph.JTDSchema.mapping");
1576
- }
1577
- }
1578
- map[key ?? ""] = val ?? JTDSchema.create();
1579
- }
1580
- internalBinaryWrite(message, writer, options) {
1581
- /* map<string, mochabugapis.adapt.graph.JTDSchema> definitions = 1; */
1582
- for (let k of globalThis.Object.keys(message.definitions)) {
1583
- writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k);
1584
- writer.tag(2, WireType.LengthDelimited).fork();
1585
- JTDSchema.internalBinaryWrite(message.definitions[k], writer, options);
1586
- writer.join().join();
1587
- }
1588
- /* optional google.protobuf.Struct metadata = 2; */
1589
- if (message.metadata)
1590
- Struct.internalBinaryWrite(message.metadata, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
1591
- /* optional bool nullable = 3; */
1592
- if (message.nullable !== undefined)
1593
- writer.tag(3, WireType.Varint).bool(message.nullable);
1594
- /* optional string ref = 4; */
1595
- if (message.ref !== undefined)
1596
- writer.tag(4, WireType.LengthDelimited).string(message.ref);
1597
- /* optional string type = 5; */
1598
- if (message.type !== undefined)
1599
- writer.tag(5, WireType.LengthDelimited).string(message.type);
1600
- /* repeated string enum = 6; */
1601
- for (let i = 0; i < message.enum.length; i++)
1602
- writer.tag(6, WireType.LengthDelimited).string(message.enum[i]);
1603
- /* optional mochabugapis.adapt.graph.JTDSchema elements = 7; */
1604
- if (message.elements)
1605
- JTDSchema.internalBinaryWrite(message.elements, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
1606
- /* map<string, mochabugapis.adapt.graph.JTDSchema> properties = 8; */
1607
- for (let k of globalThis.Object.keys(message.properties)) {
1608
- writer.tag(8, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k);
1609
- writer.tag(2, WireType.LengthDelimited).fork();
1610
- JTDSchema.internalBinaryWrite(message.properties[k], writer, options);
1611
- writer.join().join();
1612
- }
1613
- /* map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties = 9; */
1614
- for (let k of globalThis.Object.keys(message.optionalProperties)) {
1615
- writer.tag(9, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k);
1616
- writer.tag(2, WireType.LengthDelimited).fork();
1617
- JTDSchema.internalBinaryWrite(message.optionalProperties[k], writer, options);
1618
- writer.join().join();
1619
- }
1620
- /* optional bool additional_properties = 10; */
1621
- if (message.additionalProperties !== undefined)
1622
- writer.tag(10, WireType.Varint).bool(message.additionalProperties);
1623
- /* optional mochabugapis.adapt.graph.JTDSchema values = 11; */
1624
- if (message.values)
1625
- JTDSchema.internalBinaryWrite(message.values, writer.tag(11, WireType.LengthDelimited).fork(), options).join();
1626
- /* optional string discriminator = 12; */
1627
- if (message.discriminator !== undefined)
1628
- writer.tag(12, WireType.LengthDelimited).string(message.discriminator);
1629
- /* map<string, mochabugapis.adapt.graph.JTDSchema> mapping = 13; */
1630
- for (let k of globalThis.Object.keys(message.mapping)) {
1631
- writer.tag(13, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k);
1632
- writer.tag(2, WireType.LengthDelimited).fork();
1633
- JTDSchema.internalBinaryWrite(message.mapping[k], writer, options);
1634
- writer.join().join();
1635
- }
1636
- let u = options.writeUnknownFields;
1637
- if (u !== false)
1638
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1639
- return writer;
1640
- }
1641
- }
1642
- /**
1643
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.JTDSchema
1644
- */
1645
- const JTDSchema = new JTDSchema$Type();
1646
-
1647
- // @generated message type with reflection information, may provide speed optimized methods
1648
- class SignalDescriptor$Type extends MessageType {
1649
- constructor() {
1650
- super("mochabugapis.adapt.graph.SignalDescriptor", [
1651
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "50", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
1652
- { no: 5, name: "label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "50" } } } },
1653
- { no: 2, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
1654
- { no: 3, name: "schema", kind: "message", T: () => JTDSchema, options: { "buf.validate.field": { required: true } } },
1655
- { no: 4, name: "optional", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
1656
- ]);
1657
- }
1658
- create(value) {
1659
- const message = globalThis.Object.create((this.messagePrototype));
1660
- message.name = "";
1661
- if (value !== undefined)
1662
- reflectionMergePartial(this, message, value);
1663
- return message;
1664
- }
1665
- internalBinaryRead(reader, length, options, target) {
1666
- let message = target ?? this.create(), end = reader.pos + length;
1667
- while (reader.pos < end) {
1668
- let [fieldNo, wireType] = reader.tag();
1669
- switch (fieldNo) {
1670
- case /* string name */ 1:
1671
- message.name = reader.string();
1672
- break;
1673
- case /* optional string label */ 5:
1674
- message.label = reader.string();
1675
- break;
1676
- case /* optional string description */ 2:
1677
- message.description = reader.string();
1678
- break;
1679
- case /* mochabugapis.adapt.graph.JTDSchema schema */ 3:
1680
- message.schema = JTDSchema.internalBinaryRead(reader, reader.uint32(), options, message.schema);
1681
- break;
1682
- case /* optional bool optional */ 4:
1683
- message.optional = reader.bool();
1684
- break;
1685
- default:
1686
- let u = options.readUnknownField;
1687
- if (u === "throw")
1688
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1689
- let d = reader.skip(wireType);
1690
- if (u !== false)
1691
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1692
- }
1693
- }
1694
- return message;
1695
- }
1696
- internalBinaryWrite(message, writer, options) {
1697
- /* string name = 1; */
1698
- if (message.name !== "")
1699
- writer.tag(1, WireType.LengthDelimited).string(message.name);
1700
- /* optional string label = 5; */
1701
- if (message.label !== undefined)
1702
- writer.tag(5, WireType.LengthDelimited).string(message.label);
1703
- /* optional string description = 2; */
1704
- if (message.description !== undefined)
1705
- writer.tag(2, WireType.LengthDelimited).string(message.description);
1706
- /* mochabugapis.adapt.graph.JTDSchema schema = 3; */
1707
- if (message.schema)
1708
- JTDSchema.internalBinaryWrite(message.schema, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1709
- /* optional bool optional = 4; */
1710
- if (message.optional !== undefined)
1711
- writer.tag(4, WireType.Varint).bool(message.optional);
1712
- let u = options.writeUnknownFields;
1713
- if (u !== false)
1714
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1715
- return writer;
1716
- }
1717
- }
1718
- /**
1719
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.SignalDescriptor
1720
- */
1721
- const SignalDescriptor = new SignalDescriptor$Type();
1722
-
1723
- // @generated message type with reflection information, may provide speed optimized methods
1724
- class Transceiver$Type extends MessageType {
1725
- constructor() {
1726
- super("mochabugapis.adapt.graph.Transceiver", [
1727
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "50", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
1728
- { no: 2, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
1729
- { no: 3, name: "signals", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => SignalDescriptor, options: { "buf.validate.field": { cel: [{ id: "signals_unique_names", message: "Each signal must have a unique name.", expression: "this.map(signal, signal.name).unique()" }], repeated: { maxItems: "512" } } } }
1730
- ]);
1731
- }
1732
- create(value) {
1733
- const message = globalThis.Object.create((this.messagePrototype));
1734
- message.name = "";
1735
- message.signals = [];
1736
- if (value !== undefined)
1737
- reflectionMergePartial(this, message, value);
1738
- return message;
1739
- }
1740
- internalBinaryRead(reader, length, options, target) {
1741
- let message = target ?? this.create(), end = reader.pos + length;
1742
- while (reader.pos < end) {
1743
- let [fieldNo, wireType] = reader.tag();
1744
- switch (fieldNo) {
1745
- case /* string name */ 1:
1746
- message.name = reader.string();
1747
- break;
1748
- case /* optional string description */ 2:
1749
- message.description = reader.string();
1750
- break;
1751
- case /* repeated mochabugapis.adapt.graph.SignalDescriptor signals */ 3:
1752
- message.signals.push(SignalDescriptor.internalBinaryRead(reader, reader.uint32(), options));
1753
- break;
1754
- default:
1755
- let u = options.readUnknownField;
1756
- if (u === "throw")
1757
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1758
- let d = reader.skip(wireType);
1759
- if (u !== false)
1760
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1761
- }
1762
- }
1763
- return message;
1764
- }
1765
- internalBinaryWrite(message, writer, options) {
1766
- /* string name = 1; */
1767
- if (message.name !== "")
1768
- writer.tag(1, WireType.LengthDelimited).string(message.name);
1769
- /* optional string description = 2; */
1770
- if (message.description !== undefined)
1771
- writer.tag(2, WireType.LengthDelimited).string(message.description);
1772
- /* repeated mochabugapis.adapt.graph.SignalDescriptor signals = 3; */
1773
- for (let i = 0; i < message.signals.length; i++)
1774
- SignalDescriptor.internalBinaryWrite(message.signals[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1775
- let u = options.writeUnknownFields;
1776
- if (u !== false)
1777
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1778
- return writer;
1779
- }
1780
- }
1781
- /**
1782
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.Transceiver
1783
- */
1784
- const Transceiver = new Transceiver$Type();
1785
-
1786
- // @generated message type with reflection information, may provide speed optimized methods
1787
- class Exchange$Type extends MessageType {
1788
- constructor() {
1789
- super("mochabugapis.adapt.graph.Exchange", [
1790
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "50", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
1791
- { no: 2, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
1792
- { no: 3, name: "transmitters", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Transceiver, options: { "buf.validate.field": { cel: [{ id: "transmitters_unique_names", message: "Each transmitter must have a unique name.", expression: "this.map(transmitter, transmitter.name).unique()" }], repeated: { maxItems: "10" } } } },
1793
- { no: 4, name: "receivers", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Transceiver, options: { "buf.validate.field": { cel: [{ id: "receivers_unique_names", message: "Each receiver must have a unique name.", expression: "this.map(receiver, receiver.name).unique()" }], repeated: { minItems: "1", maxItems: "10" } } } }
1794
- ]);
1795
- }
1796
- create(value) {
1797
- const message = globalThis.Object.create((this.messagePrototype));
1798
- message.name = "";
1799
- message.transmitters = [];
1800
- message.receivers = [];
1801
- if (value !== undefined)
1802
- reflectionMergePartial(this, message, value);
1803
- return message;
1804
- }
1805
- internalBinaryRead(reader, length, options, target) {
1806
- let message = target ?? this.create(), end = reader.pos + length;
1807
- while (reader.pos < end) {
1808
- let [fieldNo, wireType] = reader.tag();
1809
- switch (fieldNo) {
1810
- case /* string name */ 1:
1811
- message.name = reader.string();
1812
- break;
1813
- case /* optional string description */ 2:
1814
- message.description = reader.string();
1815
- break;
1816
- case /* repeated mochabugapis.adapt.graph.Transceiver transmitters */ 3:
1817
- message.transmitters.push(Transceiver.internalBinaryRead(reader, reader.uint32(), options));
1818
- break;
1819
- case /* repeated mochabugapis.adapt.graph.Transceiver receivers */ 4:
1820
- message.receivers.push(Transceiver.internalBinaryRead(reader, reader.uint32(), options));
1821
- break;
1822
- default:
1823
- let u = options.readUnknownField;
1824
- if (u === "throw")
1825
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1826
- let d = reader.skip(wireType);
1827
- if (u !== false)
1828
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1829
- }
1830
- }
1831
- return message;
1832
- }
1833
- internalBinaryWrite(message, writer, options) {
1834
- /* string name = 1; */
1835
- if (message.name !== "")
1836
- writer.tag(1, WireType.LengthDelimited).string(message.name);
1837
- /* optional string description = 2; */
1838
- if (message.description !== undefined)
1839
- writer.tag(2, WireType.LengthDelimited).string(message.description);
1840
- /* repeated mochabugapis.adapt.graph.Transceiver transmitters = 3; */
1841
- for (let i = 0; i < message.transmitters.length; i++)
1842
- Transceiver.internalBinaryWrite(message.transmitters[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1843
- /* repeated mochabugapis.adapt.graph.Transceiver receivers = 4; */
1844
- for (let i = 0; i < message.receivers.length; i++)
1845
- Transceiver.internalBinaryWrite(message.receivers[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join();
1846
- let u = options.writeUnknownFields;
1847
- if (u !== false)
1848
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1849
- return writer;
1850
- }
1851
- }
1852
- /**
1853
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.Exchange
1854
- */
1855
- const Exchange = new Exchange$Type();
1856
-
1857
- // @generated message type with reflection information, may provide speed optimized methods
1858
- class Transmitter$Type extends MessageType {
1859
- constructor() {
1860
- super("mochabugapis.adapt.graph.Transmitter", [
1861
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "50", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
1862
- { no: 2, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
1863
- { no: 3, name: "signals", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => SignalDescriptor, options: { "buf.validate.field": { cel: [{ id: "signals_unique_names", message: "Each signal must have a unique name.", expression: "this.map(signal, signal.name).unique()" }], repeated: { maxItems: "512" } } } },
1864
- { no: 4, name: "failure", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1865
- ]);
1866
- }
1867
- create(value) {
1868
- const message = globalThis.Object.create((this.messagePrototype));
1869
- message.name = "";
1870
- message.signals = [];
1871
- message.failure = false;
1872
- if (value !== undefined)
1873
- reflectionMergePartial(this, message, value);
1874
- return message;
1875
- }
1876
- internalBinaryRead(reader, length, options, target) {
1877
- let message = target ?? this.create(), end = reader.pos + length;
1878
- while (reader.pos < end) {
1879
- let [fieldNo, wireType] = reader.tag();
1880
- switch (fieldNo) {
1881
- case /* string name */ 1:
1882
- message.name = reader.string();
1883
- break;
1884
- case /* optional string description */ 2:
1885
- message.description = reader.string();
1886
- break;
1887
- case /* repeated mochabugapis.adapt.graph.SignalDescriptor signals */ 3:
1888
- message.signals.push(SignalDescriptor.internalBinaryRead(reader, reader.uint32(), options));
1889
- break;
1890
- case /* bool failure */ 4:
1891
- message.failure = reader.bool();
1892
- break;
1893
- default:
1894
- let u = options.readUnknownField;
1895
- if (u === "throw")
1896
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1897
- let d = reader.skip(wireType);
1898
- if (u !== false)
1899
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1900
- }
1901
- }
1902
- return message;
1903
- }
1904
- internalBinaryWrite(message, writer, options) {
1905
- /* string name = 1; */
1906
- if (message.name !== "")
1907
- writer.tag(1, WireType.LengthDelimited).string(message.name);
1908
- /* optional string description = 2; */
1909
- if (message.description !== undefined)
1910
- writer.tag(2, WireType.LengthDelimited).string(message.description);
1911
- /* repeated mochabugapis.adapt.graph.SignalDescriptor signals = 3; */
1912
- for (let i = 0; i < message.signals.length; i++)
1913
- SignalDescriptor.internalBinaryWrite(message.signals[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1914
- /* bool failure = 4; */
1915
- if (message.failure !== false)
1916
- writer.tag(4, WireType.Varint).bool(message.failure);
1917
- let u = options.writeUnknownFields;
1918
- if (u !== false)
1919
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1920
- return writer;
1921
- }
1922
- }
1923
- /**
1924
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.Transmitter
1925
- */
1926
- const Transmitter = new Transmitter$Type();
1927
-
1928
- /**
1929
- * Some error codes that can appear on the binding
1930
- *
1931
- * @generated from protobuf enum mochabugapis.adapt.graph.SignalBinding.Error
1932
- */
1933
- var SignalBinding_Error;
1934
- (function (SignalBinding_Error) {
1935
- /**
1936
- * Not specified
1937
- *
1938
- * @generated from protobuf enum value: ERROR_UNSPECIFIED = 0;
1939
- */
1940
- SignalBinding_Error[SignalBinding_Error["UNSPECIFIED"] = 0] = "UNSPECIFIED";
1941
- /**
1942
- * Binding is missing, the signal is unbound even though the descriptor requires it to be bound
1943
- *
1944
- * @generated from protobuf enum value: ERROR_UNBOUND = 1;
1945
- */
1946
- SignalBinding_Error[SignalBinding_Error["UNBOUND"] = 1] = "UNBOUND";
1947
- /**
1948
- * The source does not exist
1949
- *
1950
- * @generated from protobuf enum value: ERROR_INVALID_SOURCE = 2;
1951
- */
1952
- SignalBinding_Error[SignalBinding_Error["INVALID_SOURCE"] = 2] = "INVALID_SOURCE";
1953
- /**
1954
- * The schema does not match, the source is valid
1955
- *
1956
- * @generated from protobuf enum value: ERROR_SCHEMA_MISMATCH = 3;
1957
- */
1958
- SignalBinding_Error[SignalBinding_Error["SCHEMA_MISMATCH"] = 3] = "SCHEMA_MISMATCH";
1959
- })(SignalBinding_Error || (SignalBinding_Error = {}));
1960
- // @generated message type with reflection information, may provide speed optimized methods
1961
- class SignalBinding$Type extends MessageType {
1962
- constructor() {
1963
- super("mochabugapis.adapt.graph.SignalBinding", [
1964
- { no: 1, name: "descriptor", kind: "message", T: () => SignalDescriptor, options: { "buf.validate.field": { required: true } } },
1965
- { no: 2, name: "reference", kind: "scalar", oneof: "binding", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
1966
- { no: 3, name: "constant", kind: "message", oneof: "binding", T: () => Value },
1967
- { no: 4, name: "error", kind: "enum", opt: true, T: () => ["mochabugapis.adapt.graph.SignalBinding.Error", SignalBinding_Error, "ERROR_"], options: { "buf.validate.field": { ignore: "IGNORE_EMPTY", enum: { notIn: [0] } } } }
1968
- ]);
1969
- }
1970
- create(value) {
1971
- const message = globalThis.Object.create((this.messagePrototype));
1972
- message.binding = { oneofKind: undefined };
1973
- if (value !== undefined)
1974
- reflectionMergePartial(this, message, value);
1975
- return message;
1976
- }
1977
- internalBinaryRead(reader, length, options, target) {
1978
- let message = target ?? this.create(), end = reader.pos + length;
1979
- while (reader.pos < end) {
1980
- let [fieldNo, wireType] = reader.tag();
1981
- switch (fieldNo) {
1982
- case /* mochabugapis.adapt.graph.SignalDescriptor descriptor */ 1:
1983
- message.descriptor = SignalDescriptor.internalBinaryRead(reader, reader.uint32(), options, message.descriptor);
1984
- break;
1985
- case /* string reference */ 2:
1986
- message.binding = {
1987
- oneofKind: "reference",
1988
- reference: reader.string()
1989
- };
1990
- break;
1991
- case /* google.protobuf.Value constant */ 3:
1992
- message.binding = {
1993
- oneofKind: "constant",
1994
- constant: Value.internalBinaryRead(reader, reader.uint32(), options, message.binding.constant)
1995
- };
1996
- break;
1997
- case /* optional mochabugapis.adapt.graph.SignalBinding.Error error */ 4:
1998
- message.error = reader.int32();
1999
- break;
2000
- default:
2001
- let u = options.readUnknownField;
2002
- if (u === "throw")
2003
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
2004
- let d = reader.skip(wireType);
2005
- if (u !== false)
2006
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
2007
- }
2008
- }
2009
- return message;
2010
- }
2011
- internalBinaryWrite(message, writer, options) {
2012
- /* mochabugapis.adapt.graph.SignalDescriptor descriptor = 1; */
2013
- if (message.descriptor)
2014
- SignalDescriptor.internalBinaryWrite(message.descriptor, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
2015
- /* string reference = 2; */
2016
- if (message.binding.oneofKind === "reference")
2017
- writer.tag(2, WireType.LengthDelimited).string(message.binding.reference);
2018
- /* google.protobuf.Value constant = 3; */
2019
- if (message.binding.oneofKind === "constant")
2020
- Value.internalBinaryWrite(message.binding.constant, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
2021
- /* optional mochabugapis.adapt.graph.SignalBinding.Error error = 4; */
2022
- if (message.error !== undefined)
2023
- writer.tag(4, WireType.Varint).int32(message.error);
2024
- let u = options.writeUnknownFields;
2025
- if (u !== false)
2026
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
2027
- return writer;
2028
- }
2029
- }
2030
- /**
2031
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.SignalBinding
2032
- */
2033
- const SignalBinding = new SignalBinding$Type();
2034
-
2035
- // @generated message type with reflection information, may provide speed optimized methods
2036
- class Receiver$Type extends MessageType {
2037
- constructor() {
2038
- super("mochabugapis.adapt.graph.Receiver", [
2039
- { no: 1, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { minLen: "1", maxLen: "50", pattern: "^[_$a-z][_$a-z0-9]*$" } } } },
2040
- { no: 2, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "250" } } } },
2041
- { no: 3, name: "bindings", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => SignalBinding, options: { "buf.validate.field": { cel: [{ id: "bindings_unique_names", message: "Each binding must have a unique name.", expression: "this.map(binding, binding.descriptor.name).unique()" }], repeated: { maxItems: "512" } } } }
2042
- ]);
2043
- }
2044
- create(value) {
2045
- const message = globalThis.Object.create((this.messagePrototype));
2046
- message.name = "";
2047
- message.bindings = [];
2048
- if (value !== undefined)
2049
- reflectionMergePartial(this, message, value);
2050
- return message;
2051
- }
2052
- internalBinaryRead(reader, length, options, target) {
2053
- let message = target ?? this.create(), end = reader.pos + length;
2054
- while (reader.pos < end) {
2055
- let [fieldNo, wireType] = reader.tag();
2056
- switch (fieldNo) {
2057
- case /* string name */ 1:
2058
- message.name = reader.string();
2059
- break;
2060
- case /* optional string description */ 2:
2061
- message.description = reader.string();
2062
- break;
2063
- case /* repeated mochabugapis.adapt.graph.SignalBinding bindings */ 3:
2064
- message.bindings.push(SignalBinding.internalBinaryRead(reader, reader.uint32(), options));
2065
- break;
2066
- default:
2067
- let u = options.readUnknownField;
2068
- if (u === "throw")
2069
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
2070
- let d = reader.skip(wireType);
2071
- if (u !== false)
2072
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
2073
- }
2074
- }
2075
- return message;
2076
- }
2077
- internalBinaryWrite(message, writer, options) {
2078
- /* string name = 1; */
2079
- if (message.name !== "")
2080
- writer.tag(1, WireType.LengthDelimited).string(message.name);
2081
- /* optional string description = 2; */
2082
- if (message.description !== undefined)
2083
- writer.tag(2, WireType.LengthDelimited).string(message.description);
2084
- /* repeated mochabugapis.adapt.graph.SignalBinding bindings = 3; */
2085
- for (let i = 0; i < message.bindings.length; i++)
2086
- SignalBinding.internalBinaryWrite(message.bindings[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
2087
- let u = options.writeUnknownFields;
2088
- if (u !== false)
2089
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
2090
- return writer;
2091
- }
2092
- }
2093
- /**
2094
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.Receiver
2095
- */
2096
- const Receiver = new Receiver$Type();
2097
-
2098
- // @generated message type with reflection information, may provide speed optimized methods
2099
- class VertexConfigMetadata$Type extends MessageType {
2100
- constructor() {
2101
- super("mochabugapis.adapt.graph.VertexConfigMetadata", [
2102
- { no: 1, name: "complete", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
2103
- { no: 2, name: "receivers", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Receiver, options: { "buf.validate.field": { cel: [{ id: "receivers_unique_names", message: "Each receiver must have a unique name.", expression: "this.map(receiver, receiver.name).unique()" }], repeated: { minItems: "1", maxItems: "50" } } } },
2104
- { no: 3, name: "transmitters", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Transmitter, options: { "buf.validate.field": { cel: [{ id: "transmitters_unique_names", message: "Each transmitter must have a unique name.", expression: "this.map(transmitter, transmitter.name).unique()" }], repeated: { maxItems: "50" } } } },
2105
- { no: 4, name: "procedures", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Exchange, options: { "buf.validate.field": { cel: [{ id: "procedures_unique_names", message: "Each procedure must have a unique name.", expression: "this.map(procedure, procedure.name).unique()" }], repeated: { maxItems: "10" } } } },
2106
- { no: 5, name: "streams", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Exchange, options: { "buf.validate.field": { cel: [{ id: "streams_unique_names", message: "Each stream must have a unique name.", expression: "this.map(stream, stream.name).unique()" }], repeated: { maxItems: "10" } } } },
2107
- { no: 6, name: "cron_schedule", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { ignore: "IGNORE_DEFAULT", string: { minLen: "1", maxLen: "100" } } } }
2108
- ]);
2109
- }
2110
- create(value) {
2111
- const message = globalThis.Object.create((this.messagePrototype));
2112
- message.complete = false;
2113
- message.receivers = [];
2114
- message.transmitters = [];
2115
- message.procedures = [];
2116
- message.streams = [];
2117
- if (value !== undefined)
2118
- reflectionMergePartial(this, message, value);
2119
- return message;
2120
- }
2121
- internalBinaryRead(reader, length, options, target) {
2122
- let message = target ?? this.create(), end = reader.pos + length;
2123
- while (reader.pos < end) {
2124
- let [fieldNo, wireType] = reader.tag();
2125
- switch (fieldNo) {
2126
- case /* bool complete */ 1:
2127
- message.complete = reader.bool();
2128
- break;
2129
- case /* repeated mochabugapis.adapt.graph.Receiver receivers */ 2:
2130
- message.receivers.push(Receiver.internalBinaryRead(reader, reader.uint32(), options));
2131
- break;
2132
- case /* repeated mochabugapis.adapt.graph.Transmitter transmitters */ 3:
2133
- message.transmitters.push(Transmitter.internalBinaryRead(reader, reader.uint32(), options));
2134
- break;
2135
- case /* repeated mochabugapis.adapt.graph.Exchange procedures */ 4:
2136
- message.procedures.push(Exchange.internalBinaryRead(reader, reader.uint32(), options));
2137
- break;
2138
- case /* repeated mochabugapis.adapt.graph.Exchange streams */ 5:
2139
- message.streams.push(Exchange.internalBinaryRead(reader, reader.uint32(), options));
2140
- break;
2141
- case /* optional string cron_schedule */ 6:
2142
- message.cronSchedule = reader.string();
2143
- break;
2144
- default:
2145
- let u = options.readUnknownField;
2146
- if (u === "throw")
2147
- throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
2148
- let d = reader.skip(wireType);
2149
- if (u !== false)
2150
- (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
2151
- }
2152
- }
2153
- return message;
2154
- }
2155
- internalBinaryWrite(message, writer, options) {
2156
- /* bool complete = 1; */
2157
- if (message.complete !== false)
2158
- writer.tag(1, WireType.Varint).bool(message.complete);
2159
- /* repeated mochabugapis.adapt.graph.Receiver receivers = 2; */
2160
- for (let i = 0; i < message.receivers.length; i++)
2161
- Receiver.internalBinaryWrite(message.receivers[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join();
2162
- /* repeated mochabugapis.adapt.graph.Transmitter transmitters = 3; */
2163
- for (let i = 0; i < message.transmitters.length; i++)
2164
- Transmitter.internalBinaryWrite(message.transmitters[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
2165
- /* repeated mochabugapis.adapt.graph.Exchange procedures = 4; */
2166
- for (let i = 0; i < message.procedures.length; i++)
2167
- Exchange.internalBinaryWrite(message.procedures[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join();
2168
- /* repeated mochabugapis.adapt.graph.Exchange streams = 5; */
2169
- for (let i = 0; i < message.streams.length; i++)
2170
- Exchange.internalBinaryWrite(message.streams[i], writer.tag(5, WireType.LengthDelimited).fork(), options).join();
2171
- /* optional string cron_schedule = 6; */
2172
- if (message.cronSchedule !== undefined)
2173
- writer.tag(6, WireType.LengthDelimited).string(message.cronSchedule);
2174
- let u = options.writeUnknownFields;
2175
- if (u !== false)
2176
- (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
2177
- return writer;
2178
- }
2179
- }
2180
- /**
2181
- * @generated MessageType for protobuf message mochabugapis.adapt.graph.VertexConfigMetadata
2182
- */
2183
- const VertexConfigMetadata = new VertexConfigMetadata$Type();
2184
-
2185
- // Copyright 2023, mochabug AB
2186
- //
2187
- // Licensed under the Apache License, Version 2.0 (the "License");
2188
- // you may not use this file except in compliance with the License.
2189
- // You may obtain a copy of the License at
2190
- //
2191
- // http://www.apache.org/licenses/LICENSE-2.0
2192
- //
2193
- // Unless required by applicable law or agreed to in writing, software
2194
- // distributed under the License is distributed on an "AS IS" BASIS,
2195
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2196
- // See the License for the specific language governing permissions and
2197
- // limitations under the License.
2198
- function readAsset(name) {
2199
- return fs
2200
- .readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'assets', name))
2201
- .toString();
2202
- }
2203
- function writeFile(filePath, content) {
2204
- const dir = path.dirname(filePath);
2205
- mkdirp.sync(dir);
2206
- fs.writeFileSync(filePath, content);
2207
- }
2208
- function readManifest(filePath) {
2209
- const fullPath = path.resolve(filePath);
2210
- if (!fs.existsSync(fullPath)) {
2211
- console.error(chalk.red(`Invalid command: Manifest file not found at ${fullPath}.`));
2212
- return null;
2213
- }
2214
- try {
2215
- const manifestData = fs.readFileSync(fullPath).toString();
2216
- return Manifest.fromJsonString(manifestData);
2217
- }
2218
- catch (error) {
2219
- console.error(chalk.red(`An error occurred while reading the manifest`));
2220
- console.error(error.message);
2221
- return null;
2222
- }
2223
- }
2224
- function labelize(val) {
2225
- return (val.charAt(0).toUpperCase() + val.substring(1)).replace('_', ' ');
2226
- }
2227
-
2228
- // Copyright 2023, mochabug AB
2229
- //
2230
- // Licensed under the Apache License, Version 2.0 (the "License");
2231
- // you may not use this file except in compliance with the License.
2232
- // You may obtain a copy of the License at
2233
- //
2234
- // http://www.apache.org/licenses/LICENSE-2.0
2235
- //
2236
- // Unless required by applicable law or agreed to in writing, software
2237
- // distributed under the License is distributed on an "AS IS" BASIS,
2238
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2239
- // See the License for the specific language governing permissions and
2240
- // limitations under the License.
2241
- function convertVertexType(type) {
2242
- switch (type) {
2243
- case 'action':
2244
- return Vertex_VertexType.ACTION;
2245
- case 'cron-trigger':
2246
- return Vertex_VertexType.CRON_TRIGGER;
2247
- case 'external-trigger':
2248
- return Vertex_VertexType.EXTERNAL_TRIGGER;
2249
- case 'browser':
2250
- return Vertex_VertexType.BROWSER;
2251
- default:
2252
- throw new Error('The node type is invalid');
2253
- }
2254
- }
2255
- function addVertex(cwd, name, type, hasConfigurator, existingVertices) {
2256
- // Create a folder with the vertex name
2257
- const folder = path.join(cwd, 'src', name);
2258
- if (fs.existsSync(folder)) {
2259
- throw new Error(`The folder for the new vertex: ${folder} already exists`);
2260
- }
2261
- mkdirp.sync(folder);
2262
- const execFile = path.join(folder, 'executor.ts');
2263
- const vertex = {
2264
- name,
2265
- label: labelize(name),
2266
- description: `The better description of what ${name} is doing, the better it is for both AI and humans`,
2267
- type: convertVertexType(type),
2268
- metadata: path.join('src', name, 'metadata.json'), // We ommit the default config
2269
- configurator: hasConfigurator,
2270
- mtls: [],
2271
- codeOauth2: [],
2272
- oauth2: [],
2273
- variables: []
2274
- };
2275
- // Write the new task
2276
- switch (vertex.type) {
2277
- case Vertex_VertexType.ACTION:
2278
- writeFile(execFile, readAsset('executor_action.ts'));
2279
- break;
2280
- case Vertex_VertexType.BROWSER:
2281
- writeFile(execFile, readAsset('executor_browser.ts'));
2282
- break;
2283
- case Vertex_VertexType.EXTERNAL_TRIGGER:
2284
- writeFile(execFile, readAsset('executor_external_trigger.ts'));
2285
- break;
2286
- case Vertex_VertexType.CRON_TRIGGER:
2287
- writeFile(execFile, readAsset('executor_cron_trigger.ts'));
2288
- break;
2289
- default:
2290
- throw new Error('The vertex type is invalid');
2291
- }
2292
- // Write the export file for executors
2293
- fs.writeFileSync(path.join(cwd, 'src', 'executors.ts'), generateExport([name, ...existingVertices.map((v) => v.name)], 'ExecutorEnvironment'));
2294
- const vertexConfig = {
2295
- complete: true,
2296
- receivers: [
2297
- {
2298
- name: 'input',
2299
- description: 'Default input receiver',
2300
- bindings: []
2301
- }
2302
- ],
2303
- transmitters: [
2304
- {
2305
- name: 'output',
2306
- description: 'Default output transmitter',
2307
- signals: [],
2308
- failure: false
2309
- }
2310
- ],
2311
- procedures: [],
2312
- streams: []
2313
- };
2314
- // Runs every 5 seconds
2315
- if (vertex.type === Vertex_VertexType.CRON_TRIGGER) {
2316
- vertexConfig.cronSchedule = '/5 * * * * *';
2317
- }
2318
- if (hasConfigurator) {
2319
- const configFile = path.join(folder, 'configurator.ts');
2320
- writeFile(configFile, readAsset('configurator.ts'));
2321
- // If we have a config, make sure we don't say that the config is complete by default
2322
- vertexConfig.complete = false;
2323
- // Write the export file for configurators
2324
- fs.writeFileSync(path.join(cwd, 'src', 'configurators.ts'), generateExport([
2325
- name,
2326
- ...existingVertices.filter((v) => v.configurator).map((v) => v.name)
2327
- ], 'ConfiguratorEnvironment'));
2328
- }
2329
- // Write the config json file
2330
- fs.writeFileSync(path.join(folder, 'metadata.json'), VertexConfigMetadata.toJsonString(vertexConfig, { prettySpaces: 2 }));
2331
- return vertex;
2332
- }
2333
- function generateExport(vertices, env) {
2334
- const imports = vertices
2335
- .map((v) => `import ${v} from './${v}/${env === 'ExecutorEnvironment' ? 'executor' : 'configurator'}';`)
2336
- .join('\n');
2337
- return `/**
2
+ var g={name:"@mochabug/adaptkit",version:"1.0.0-beta.10"};function oe(e,n){return e!==null&&typeof e=="object"&&"$typeName"in e&&typeof e.$typeName=="string"?n===void 0?!0:n.typeName===e.$typeName:!1}var c;(function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"})(c||(c={}));function wn(){let e=0,n=0;for(let o=0;o<28;o+=7){let s=this.buf[this.pos++];if(e|=(s&127)<<o,!(s&128))return this.assertBounds(),[e,n]}let t=this.buf[this.pos++];if(e|=(t&15)<<28,n=(t&112)>>4,!(t&128))return this.assertBounds(),[e,n];for(let o=3;o<=31;o+=7){let s=this.buf[this.pos++];if(n|=(s&127)<<o,!(s&128))return this.assertBounds(),[e,n]}throw new Error("invalid varint")}function ye(e,n,t){for(let a=0;a<28;a=a+7){let i=e>>>a,r=!(!(i>>>7)&&n==0),l=(r?i|128:i)&255;if(t.push(l),!r)return}let o=e>>>28&15|(n&7)<<4,s=!!(n>>3);if(t.push((s?o|128:o)&255),!!s){for(let a=3;a<31;a=a+7){let i=n>>>a,r=!!(i>>>7),l=(r?i|128:i)&255;if(t.push(l),!r)return}t.push(n>>>31&1)}}var Ie=4294967296;function Te(e){let n=e[0]==="-";n&&(e=e.slice(1));let t=1e6,o=0,s=0;function a(i,r){let l=Number(e.slice(i,r));s*=t,o=o*t+l,o>=Ie&&(s=s+(o/Ie|0),o=o%Ie)}return a(-24,-18),a(-18,-12),a(-12,-6),a(-6),n?Un(o,s):_e(o,s)}function vn(e,n){let t=_e(e,n),o=t.hi&2147483648;o&&(t=Un(t.lo,t.hi));let s=Pe(t.lo,t.hi);return o?"-"+s:s}function Pe(e,n){if({lo:e,hi:n}=jo(e,n),n<=2097151)return String(Ie*n+e);let t=e&16777215,o=(e>>>24|n<<8)&16777215,s=n>>16&65535,a=t+o*6777216+s*6710656,i=o+s*8147497,r=s*2,l=1e7;return a>=l&&(i+=Math.floor(a/l),a%=l),i>=l&&(r+=Math.floor(i/l),i%=l),r.toString()+Ln(i)+Ln(a)}function jo(e,n){return{lo:e>>>0,hi:n>>>0}}function _e(e,n){return{lo:e|0,hi:n|0}}function Un(e,n){return n=~n,e?e=~e+1:n+=1,_e(e,n)}var Ln=e=>{let n=String(e);return"0000000".slice(n.length)+n};function Oe(e,n){if(e>=0){for(;e>127;)n.push(e&127|128),e=e>>>7;n.push(e)}else{for(let t=0;t<9;t++)n.push(e&127|128),e=e>>7;n.push(1)}}function kn(){let e=this.buf[this.pos++],n=e&127;if(!(e&128))return this.assertBounds(),n;if(e=this.buf[this.pos++],n|=(e&127)<<7,!(e&128))return this.assertBounds(),n;if(e=this.buf[this.pos++],n|=(e&127)<<14,!(e&128))return this.assertBounds(),n;if(e=this.buf[this.pos++],n|=(e&127)<<21,!(e&128))return this.assertBounds(),n;e=this.buf[this.pos++],n|=(e&15)<<28;for(let t=5;e&128&&t<10;t++)e=this.buf[this.pos++];if(e&128)throw new Error("invalid varint");return this.assertBounds(),n>>>0}var p=$o();function $o(){let e=new DataView(new ArrayBuffer(8));if(typeof BigInt=="function"&&typeof e.getBigInt64=="function"&&typeof e.getBigUint64=="function"&&typeof e.setBigInt64=="function"&&typeof e.setBigUint64=="function"&&(typeof process!="object"||typeof process.env!="object"||process.env.BUF_BIGINT_DISABLE!=="1")){let t=BigInt("-9223372036854775808"),o=BigInt("9223372036854775807"),s=BigInt("0"),a=BigInt("18446744073709551615");return{zero:BigInt(0),supported:!0,parse(i){let r=typeof i=="bigint"?i:BigInt(i);if(r>o||r<t)throw new Error(`invalid int64: ${i}`);return r},uParse(i){let r=typeof i=="bigint"?i:BigInt(i);if(r>a||r<s)throw new Error(`invalid uint64: ${i}`);return r},enc(i){return e.setBigInt64(0,this.parse(i),!0),{lo:e.getInt32(0,!0),hi:e.getInt32(4,!0)}},uEnc(i){return e.setBigInt64(0,this.uParse(i),!0),{lo:e.getInt32(0,!0),hi:e.getInt32(4,!0)}},dec(i,r){return e.setInt32(0,i,!0),e.setInt32(4,r,!0),e.getBigInt64(0,!0)},uDec(i,r){return e.setInt32(0,i,!0),e.setInt32(4,r,!0),e.getBigUint64(0,!0)}}}return{zero:"0",supported:!1,parse(t){return typeof t!="string"&&(t=t.toString()),Dn(t),t},uParse(t){return typeof t!="string"&&(t=t.toString()),Qn(t),t},enc(t){return typeof t!="string"&&(t=t.toString()),Dn(t),Te(t)},uEnc(t){return typeof t!="string"&&(t=t.toString()),Qn(t),Te(t)},dec(t,o){return vn(t,o)},uDec(t,o){return Pe(t,o)}}}function Dn(e){if(!/^-?[0-9]+$/.test(e))throw new Error("invalid int64: "+e)}function Qn(e){if(!/^[0-9]+$/.test(e))throw new Error("invalid uint64: "+e)}function F(e,n){switch(e){case c.STRING:return"";case c.BOOL:return!1;default:return 0;case c.DOUBLE:case c.FLOAT:return 0;case c.INT64:case c.UINT64:case c.SFIXED64:case c.FIXED64:case c.SINT64:return n?"0":p.zero;case c.BYTES:return new Uint8Array(0)}}function Tn(e,n){switch(e){case c.BOOL:return n===!1;case c.STRING:return n==="";case c.BYTES:return n instanceof Uint8Array&&!n.byteLength;default:return n==0}}var qo=["FieldValueInvalidError","FieldListRangeError","ForeignFieldError"],C=class extends Error{constructor(n,t,o="FieldValueInvalidError"){super(t),this.name=o,this.field=()=>n}};function Pn(e){return e instanceof Error&&qo.includes(e.name)&&"field"in e&&typeof e.field=="function"}var _n=2,Y=Symbol.for("reflect unsafe local");function Ge(e,n){let t=e[n.localName].case;return t===void 0?t:n.fields.find(o=>o.localName===t)}function On(e,n){let t=n.localName;if(n.oneof)return e[n.oneof.localName].case===t;if(n.presence!=_n)return e[t]!==void 0&&Object.prototype.hasOwnProperty.call(e,t);switch(n.fieldKind){case"list":return e[t].length>0;case"map":return Object.keys(e[t]).length>0;case"scalar":return!Tn(n.scalar,e[t]);case"enum":return e[t]!==n.enum.values[0].number}throw new Error("message field with implicit presence")}function D(e,n){return Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==void 0}function he(e,n){if(n.oneof){let t=e[n.oneof.localName];return t.case===n.localName?t.value:void 0}return e[n.localName]}function fe(e,n,t){n.oneof?e[n.oneof.localName]={case:n.localName,value:t}:e[n.localName]=t}function jn(e,n){let t=n.localName;if(n.oneof){let o=n.oneof.localName;e[o].case===t&&(e[o]={case:void 0})}else if(n.presence!=_n)delete e[t];else switch(n.fieldKind){case"map":e[t]={};break;case"list":e[t]=[];break;case"enum":e[t]=n.enum.values[0].number;break;case"scalar":e[t]=F(n.scalar,n.longAsString);break}}function M(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function se(e,n){var t,o,s,a;if(M(e)&&Y in e&&"add"in e&&"field"in e&&typeof e.field=="function"){if(n!==void 0){let i=n,r=e.field();return i.listKind==r.listKind&&i.scalar===r.scalar&&((t=i.message)===null||t===void 0?void 0:t.typeName)===((o=r.message)===null||o===void 0?void 0:o.typeName)&&((s=i.enum)===null||s===void 0?void 0:s.typeName)===((a=r.enum)===null||a===void 0?void 0:a.typeName)}return!0}return!1}function ae(e,n){var t,o,s,a;if(M(e)&&Y in e&&"has"in e&&"field"in e&&typeof e.field=="function"){if(n!==void 0){let i=n,r=e.field();return i.mapKey===r.mapKey&&i.mapKind==r.mapKind&&i.scalar===r.scalar&&((t=i.message)===null||t===void 0?void 0:t.typeName)===((o=r.message)===null||o===void 0?void 0:o.typeName)&&((s=i.enum)===null||s===void 0?void 0:s.typeName)===((a=r.enum)===null||a===void 0?void 0:a.typeName)}return!0}return!1}function ie(e,n){return M(e)&&Y in e&&"desc"in e&&M(e.desc)&&e.desc.kind==="message"&&(n===void 0||e.desc.typeName==n.typeName)}function $n(e){return qn(e.$typeName)}function H(e){let n=e.fields[0];return qn(e.typeName)&&n!==void 0&&n.fieldKind=="scalar"&&n.name=="value"&&n.number==1}function qn(e){return e.startsWith("google.protobuf.")&&["DoubleValue","FloatValue","Int64Value","UInt64Value","Int32Value","UInt32Value","BoolValue","StringValue","BytesValue"].includes(e.substring(16))}var es=999,ns=998,Ze=2;function B(e,n){if(oe(n,e))return n;let t=is(e);return n!==void 0&&ts(e,t,n),t}function ts(e,n,t){for(let o of e.members){let s=t[o.localName];if(s==null)continue;let a;if(o.kind=="oneof"){let i=Ge(t,o);if(!i)continue;a=i,s=he(t,i)}else a=o;switch(a.fieldKind){case"message":s=$e(a,s);break;case"scalar":s=tt(a,s);break;case"list":s=ss(a,s);break;case"map":s=os(a,s);break}fe(n,a,s)}return n}function tt(e,n){return e.scalar==c.BYTES?qe(n):n}function os(e,n){if(M(n)){if(e.scalar==c.BYTES)return et(n,qe);if(e.mapKind=="message")return et(n,t=>$e(e,t))}return n}function ss(e,n){if(Array.isArray(n)){if(e.scalar==c.BYTES)return n.map(qe);if(e.listKind=="message")return n.map(t=>$e(e,t))}return n}function $e(e,n){if(e.fieldKind=="message"&&!e.oneof&&H(e.message))return tt(e.message.fields[0],n);if(M(n)){if(e.message.typeName=="google.protobuf.Struct"&&e.parent.typeName!=="google.protobuf.Value")return n;if(!oe(n,e.message))return B(e.message,n)}return n}function qe(e){return Array.isArray(e)?new Uint8Array(e):e}function et(e,n){let t={};for(let o of Object.entries(e))t[o[0]]=n(o[1]);return t}var as=Symbol(),nt=new WeakMap;function is(e){let n;if(rs(e)){let t=nt.get(e),o,s;if(t)({prototype:o,members:s}=t);else{o={},s=new Set;for(let a of e.members)a.kind!="oneof"&&(a.fieldKind!="scalar"&&a.fieldKind!="enum"||a.presence!=Ze&&(s.add(a),o[a.localName]=je(a)));nt.set(e,{prototype:o,members:s})}n=Object.create(o),n.$typeName=e.typeName;for(let a of e.members)s.has(a)||a.kind=="field"&&(a.fieldKind=="message"||(a.fieldKind=="scalar"||a.fieldKind=="enum")&&a.presence!=Ze)||(n[a.localName]=je(a))}else{n={$typeName:e.typeName};for(let t of e.members)(t.kind=="oneof"||t.presence==Ze)&&(n[t.localName]=je(t))}return n}function rs(e){switch(e.file.edition){case es:return!1;case ns:return!0;default:return e.fields.some(n=>n.presence!=Ze&&n.fieldKind!="message"&&!n.oneof)}}function je(e){if(e.kind=="oneof")return{case:void 0};if(e.fieldKind=="list")return[];if(e.fieldKind=="map")return{};if(e.fieldKind=="message")return as;let n=e.getDefaultValue();return n!==void 0?e.fieldKind=="scalar"&&e.longAsString?n.toString():n:e.fieldKind=="scalar"?F(e.scalar,e.longAsString):e.enum.values[0].number}var en=Symbol.for("@bufbuild/protobuf/text-encoding");function re(){if(globalThis[en]==null){let e=new globalThis.TextEncoder,n=new globalThis.TextDecoder;globalThis[en]={encodeUtf8(t){return e.encode(t)},decodeUtf8(t){return n.decode(t)},checkUtf8(t){try{return encodeURIComponent(t),!0}catch{return!1}}}}return globalThis[en]}var f;(function(e){e[e.Varint=0]="Varint",e[e.Bit64=1]="Bit64",e[e.LengthDelimited=2]="LengthDelimited",e[e.StartGroup=3]="StartGroup",e[e.EndGroup=4]="EndGroup",e[e.Bit32=5]="Bit32"})(f||(f={}));var tn=34028234663852886e22,on=-34028234663852886e22,sn=4294967295,an=2147483647,rn=-2147483648,P=class{constructor(n=re().encodeUtf8){this.encodeUtf8=n,this.stack=[],this.chunks=[],this.buf=[]}finish(){this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]);let n=0;for(let s=0;s<this.chunks.length;s++)n+=this.chunks[s].length;let t=new Uint8Array(n),o=0;for(let s=0;s<this.chunks.length;s++)t.set(this.chunks[s],o),o+=this.chunks[s].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let n=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(n.byteLength),this.raw(n)}tag(n,t){return this.uint32((n<<3|t)>>>0)}raw(n){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(n),this}uint32(n){for(ot(n);n>127;)this.buf.push(n&127|128),n=n>>>7;return this.buf.push(n),this}int32(n){return nn(n),Oe(n,this.buf),this}bool(n){return this.buf.push(n?1:0),this}bytes(n){return this.uint32(n.byteLength),this.raw(n)}string(n){let t=this.encodeUtf8(n);return this.uint32(t.byteLength),this.raw(t)}float(n){cs(n);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,n,!0),this.raw(t)}double(n){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,n,!0),this.raw(t)}fixed32(n){ot(n);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,n,!0),this.raw(t)}sfixed32(n){nn(n);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,n,!0),this.raw(t)}sint32(n){return nn(n),n=(n<<1^n>>31)>>>0,Oe(n,this.buf),this}sfixed64(n){let t=new Uint8Array(8),o=new DataView(t.buffer),s=p.enc(n);return o.setInt32(0,s.lo,!0),o.setInt32(4,s.hi,!0),this.raw(t)}fixed64(n){let t=new Uint8Array(8),o=new DataView(t.buffer),s=p.uEnc(n);return o.setInt32(0,s.lo,!0),o.setInt32(4,s.hi,!0),this.raw(t)}int64(n){let t=p.enc(n);return ye(t.lo,t.hi,this.buf),this}sint64(n){let t=p.enc(n),o=t.hi>>31,s=t.lo<<1^o,a=(t.hi<<1|t.lo>>>31)^o;return ye(s,a,this.buf),this}uint64(n){let t=p.uEnc(n);return ye(t.lo,t.hi,this.buf),this}},Q=class{constructor(n,t=re().decodeUtf8){this.decodeUtf8=t,this.varint64=wn,this.uint32=kn,this.buf=n,this.len=n.length,this.pos=0,this.view=new DataView(n.buffer,n.byteOffset,n.byteLength)}tag(){let n=this.uint32(),t=n>>>3,o=n&7;if(t<=0||o<0||o>5)throw new Error("illegal tag: field no "+t+" wire type "+o);return[t,o]}skip(n,t){let o=this.pos;switch(n){case f.Varint:for(;this.buf[this.pos++]&128;);break;case f.Bit64:this.pos+=4;case f.Bit32:this.pos+=4;break;case f.LengthDelimited:let s=this.uint32();this.pos+=s;break;case f.StartGroup:for(;;){let[a,i]=this.tag();if(i===f.EndGroup){if(t!==void 0&&a!==t)throw new Error("invalid end group tag");break}this.skip(i,a)}break;default:throw new Error("cant skip wire type "+n)}return this.assertBounds(),this.buf.subarray(o,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return this.uint32()|0}sint32(){let n=this.uint32();return n>>>1^-(n&1)}int64(){return p.dec(...this.varint64())}uint64(){return p.uDec(...this.varint64())}sint64(){let[n,t]=this.varint64(),o=-(n&1);return n=(n>>>1|(t&1)<<31)^o,t=t>>>1^o,p.dec(n,t)}bool(){let[n,t]=this.varint64();return n!==0||t!==0}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return p.uDec(this.sfixed32(),this.sfixed32())}sfixed64(){return p.dec(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let n=this.uint32(),t=this.pos;return this.pos+=n,this.assertBounds(),this.buf.subarray(t,t+n)}string(){return this.decodeUtf8(this.bytes())}};function nn(e){if(typeof e=="string")e=Number(e);else if(typeof e!="number")throw new Error("invalid int32: "+typeof e);if(!Number.isInteger(e)||e>an||e<rn)throw new Error("invalid int32: "+e)}function ot(e){if(typeof e=="string")e=Number(e);else if(typeof e!="number")throw new Error("invalid uint32: "+typeof e);if(!Number.isInteger(e)||e>sn||e<0)throw new Error("invalid uint32: "+e)}function cs(e){if(typeof e=="string"){let n=e;if(e=Number(e),isNaN(e)&&n!=="NaN")throw new Error("invalid float32: "+n)}else if(typeof e!="number")throw new Error("invalid float32: "+typeof e);if(Number.isFinite(e)&&(e>tn||e<on))throw new Error("invalid float32: "+e)}function K(e,n){let t=e.fieldKind=="list"?se(n,e):e.fieldKind=="map"?ae(n,e):ln(e,n);if(t===!0)return;let o;switch(e.fieldKind){case"list":o=`expected ${rt(e)}, got ${A(n)}`;break;case"map":o=`expected ${ct(e)}, got ${A(n)}`;break;default:o=Ae(e,n,t)}return new C(e,o)}function cn(e,n,t){let o=ln(e,t);if(o!==!0)return new C(e,`list item #${n+1}: ${Ae(e,t,o)}`)}function st(e,n,t){let o=at(n,e.mapKey);if(o!==!0)return new C(e,`invalid map key: ${Ae({scalar:e.mapKey},n,o)}`);let s=ln(e,t);if(s!==!0)return new C(e,`map entry ${A(n)}: ${Ae(e,t,s)}`)}function ln(e,n){return e.scalar!==void 0?at(n,e.scalar):e.enum!==void 0?e.enum.open?Number.isInteger(n):e.enum.values.some(t=>t.number===n):ie(n,e.message)}function at(e,n){switch(n){case c.DOUBLE:return typeof e=="number";case c.FLOAT:return typeof e!="number"?!1:Number.isNaN(e)||!Number.isFinite(e)?!0:e>tn||e<on?`${e.toFixed()} out of range`:!0;case c.INT32:case c.SFIXED32:case c.SINT32:return typeof e!="number"||!Number.isInteger(e)?!1:e>an||e<rn?`${e.toFixed()} out of range`:!0;case c.FIXED32:case c.UINT32:return typeof e!="number"||!Number.isInteger(e)?!1:e>sn||e<0?`${e.toFixed()} out of range`:!0;case c.BOOL:return typeof e=="boolean";case c.STRING:return typeof e!="string"?!1:re().checkUtf8(e)||"invalid UTF8";case c.BYTES:return e instanceof Uint8Array;case c.INT64:case c.SFIXED64:case c.SINT64:if(typeof e!="string"&&typeof e!="bigint"&&typeof e!="number")return!1;try{p.parse(e)}catch{return`${e} out of range`}return!0;case c.FIXED64:case c.UINT64:if(typeof e!="string"&&typeof e!="bigint"&&typeof e!="number")return!1;try{p.uParse(e)}catch{return`${e} out of range`}return!0}}function Ae(e,n,t){return t=typeof t=="string"?`: ${t}`:`, got ${A(n)}`,e.scalar!==void 0?`expected ${ls(e.scalar)}`+t:e.enum!==void 0?`expected ${e.enum.toString()}`+t:`expected ${it(e.message)}`+t}function A(e){switch(typeof e){case"object":return e===null?"null":e instanceof Uint8Array?`Uint8Array(${e.length})`:Array.isArray(e)?`Array(${e.length})`:se(e)?rt(e.field()):ae(e)?ct(e.field()):ie(e)?it(e.desc):oe(e)?`message ${e.$typeName}`:"object";case"string":return e.length>30?"string":`"${e.split('"').join('\\"')}"`;case"boolean":return String(e);case"number":return String(e);case"bigint":return String(e)+"n";default:return typeof e}}function it(e){return`ReflectMessage (${e.typeName})`}function rt(e){switch(e.listKind){case"message":return`ReflectList (${e.message.toString()})`;case"enum":return`ReflectList (${e.enum.toString()})`;case"scalar":return`ReflectList (${c[e.scalar]})`}}function ct(e){switch(e.mapKind){case"message":return`ReflectMap (${c[e.mapKey]}, ${e.message.toString()})`;case"enum":return`ReflectMap (${c[e.mapKey]}, ${e.enum.toString()})`;case"scalar":return`ReflectMap (${c[e.mapKey]}, ${c[e.scalar]})`}}function ls(e){switch(e){case c.STRING:return"string";case c.BOOL:return"boolean";case c.INT64:case c.SINT64:case c.SFIXED64:return"bigint (int64)";case c.UINT64:case c.FIXED64:return"bigint (uint64)";case c.BYTES:return"Uint8Array";case c.DOUBLE:return"number (float64)";case c.FLOAT:return"number (float32)";case c.FIXED32:case c.UINT32:return"number (uint32)";case c.INT32:case c.SFIXED32:case c.SINT32:return"number (int32)"}}function X(e,n,t=!0){return new Ce(e,n,t)}var Ce=class{get sortedFields(){var n;return(n=this._sortedFields)!==null&&n!==void 0?n:this._sortedFields=this.desc.fields.concat().sort((t,o)=>t.number-o.number)}constructor(n,t,o=!0){this.lists=new Map,this.maps=new Map,this.check=o,this.desc=n,this.message=this[Y]=t??B(n),this.fields=n.fields,this.oneofs=n.oneofs,this.members=n.members}findNumber(n){return this._fieldsByNumber||(this._fieldsByNumber=new Map(this.desc.fields.map(t=>[t.number,t]))),this._fieldsByNumber.get(n)}oneofCase(n){return ce(this.message,n),Ge(this.message,n)}isSet(n){return ce(this.message,n),On(this.message,n)}clear(n){ce(this.message,n),jn(this.message,n)}get(n){ce(this.message,n);let t=he(this.message,n);switch(n.fieldKind){case"list":let o=this.lists.get(n);return(!o||o[Y]!==t)&&this.lists.set(n,o=new gn(n,t,this.check)),o;case"map":let s=this.maps.get(n);return(!s||s[Y]!==t)&&this.maps.set(n,s=new mn(n,t,this.check)),s;case"message":return pn(n,t,this.check);case"scalar":return t===void 0?F(n.scalar,!1):In(n,t);case"enum":return t??n.enum.values[0].number}}set(n,t){if(ce(this.message,n),this.check){let s=K(n,t);if(s)throw s}let o;n.fieldKind=="message"?o=bn(n,t):ae(t)||se(t)?o=t[Y]:o=yn(n,t),fe(this.message,n,o)}getUnknown(){return this.message.$unknown}setUnknown(n){this.message.$unknown=n}};function ce(e,n){if(n.parent.typeName!==e.$typeName)throw new C(n,`cannot use ${n.toString()} with message ${e.$typeName}`,"ForeignFieldError")}var gn=class{field(){return this._field}get size(){return this._arr.length}constructor(n,t,o){this._field=n,this._arr=this[Y]=t,this.check=o}get(n){let t=this._arr[n];return t===void 0?void 0:dn(this._field,t,this.check)}set(n,t){if(n<0||n>=this._arr.length)throw new C(this._field,`list item #${n+1}: out of range`);if(this.check){let o=cn(this._field,n,t);if(o)throw o}this._arr[n]=lt(this._field,t)}add(n){if(this.check){let t=cn(this._field,this._arr.length,n);if(t)throw t}this._arr.push(lt(this._field,n))}clear(){this._arr.splice(0,this._arr.length)}[Symbol.iterator](){return this.values()}keys(){return this._arr.keys()}*values(){for(let n of this._arr)yield dn(this._field,n,this.check)}*entries(){for(let n=0;n<this._arr.length;n++)yield[n,dn(this._field,this._arr[n],this.check)]}};var mn=class{constructor(n,t,o=!0){this.obj=this[Y]=t??{},this.check=o,this._field=n}field(){return this._field}set(n,t){if(this.check){let o=st(this._field,n,t);if(o)throw o}return this.obj[Ve(n)]=ds(this._field,t),this}delete(n){let t=Ve(n),o=Object.prototype.hasOwnProperty.call(this.obj,t);return o&&delete this.obj[t],o}clear(){for(let n of Object.keys(this.obj))delete this.obj[n]}get(n){let t=this.obj[Ve(n)];return t!==void 0&&(t=un(this._field,t,this.check)),t}has(n){return Object.prototype.hasOwnProperty.call(this.obj,Ve(n))}*keys(){for(let n of Object.keys(this.obj))yield dt(n,this._field.mapKey)}*entries(){for(let n of Object.entries(this.obj))yield[dt(n[0],this._field.mapKey),un(this._field,n[1],this.check)]}[Symbol.iterator](){return this.entries()}get size(){return Object.keys(this.obj).length}*values(){for(let n of Object.values(this.obj))yield un(this._field,n,this.check)}forEach(n,t){for(let o of this.entries())n.call(t,o[1],o[0],this)}};function bn(e,n){return ie(n)?$n(n.message)&&!e.oneof&&e.fieldKind=="message"?n.message.value:n.desc.typeName=="google.protobuf.Struct"&&e.parent.typeName!="google.protobuf.Value"?gt(n.message):n.message:n}function pn(e,n,t){return n!==void 0&&(H(e.message)&&!e.oneof&&e.fieldKind=="message"?n={$typeName:e.message.typeName,value:In(e.message.fields[0],n)}:e.message.typeName=="google.protobuf.Struct"&&e.parent.typeName!="google.protobuf.Value"&&M(n)&&(n=ut(n))),new Ce(e.message,n,t)}function lt(e,n){return e.listKind=="message"?bn(e,n):yn(e,n)}function dn(e,n,t){return e.listKind=="message"?pn(e,n,t):In(e,n)}function ds(e,n){return e.mapKind=="message"?bn(e,n):yn(e,n)}function un(e,n,t){return e.mapKind=="message"?pn(e,n,t):n}function Ve(e){return typeof e=="string"||typeof e=="number"?e:String(e)}function dt(e,n){switch(n){case c.STRING:return e;case c.INT32:case c.FIXED32:case c.UINT32:case c.SFIXED32:case c.SINT32:{let t=Number.parseInt(e);if(Number.isFinite(t))return t;break}case c.BOOL:switch(e){case"true":return!0;case"false":return!1}break;case c.UINT64:case c.FIXED64:try{return p.uParse(e)}catch{}break;default:try{return p.parse(e)}catch{}break}return e}function In(e,n){switch(e.scalar){case c.INT64:case c.SFIXED64:case c.SINT64:"longAsString"in e&&e.longAsString&&typeof n=="string"&&(n=p.parse(n));break;case c.FIXED64:case c.UINT64:"longAsString"in e&&e.longAsString&&typeof n=="string"&&(n=p.uParse(n));break}return n}function yn(e,n){switch(e.scalar){case c.INT64:case c.SFIXED64:case c.SINT64:"longAsString"in e&&e.longAsString?n=String(n):(typeof n=="string"||typeof n=="number")&&(n=p.parse(n));break;case c.FIXED64:case c.UINT64:"longAsString"in e&&e.longAsString?n=String(n):(typeof n=="string"||typeof n=="number")&&(n=p.uParse(n));break}return n}function ut(e){let n={$typeName:"google.protobuf.Struct",fields:{}};if(M(e))for(let[t,o]of Object.entries(e))n.fields[t]=bt(o);return n}function gt(e){let n={};for(let[t,o]of Object.entries(e.fields))n[t]=mt(o);return n}function mt(e){switch(e.kind.case){case"structValue":return gt(e.kind.value);case"listValue":return e.kind.value.values.map(mt);case"nullValue":case void 0:return null;default:return e.kind.value}}function bt(e){let n={$typeName:"google.protobuf.Value",kind:{case:void 0}};switch(typeof e){case"number":n.kind={case:"numberValue",value:e};break;case"string":n.kind={case:"stringValue",value:e};break;case"boolean":n.kind={case:"boolValue",value:e};break;case"object":if(e===null)n.kind={case:"nullValue",value:0};else if(Array.isArray(e)){let t={$typeName:"google.protobuf.ListValue",values:[]};if(Array.isArray(e))for(let o of e)t.values.push(bt(o));n.kind={case:"listValue",value:t}}else n.kind={case:"structValue",value:ut(e)};break}return n}function Se(e){let n=us(),t=e.length*3/4;e[e.length-2]=="="?t-=2:e[e.length-1]=="="&&(t-=1);let o=new Uint8Array(t),s=0,a=0,i,r=0;for(let l=0;l<e.length;l++){if(i=n[e.charCodeAt(l)],i===void 0)switch(e[l]){case"=":a=0;case`
3
+ `:case"\r":case" ":case" ":continue;default:throw Error("invalid base64 string")}switch(a){case 0:r=i,a=1;break;case 1:o[s++]=r<<2|(i&48)>>4,r=i,a=2;break;case 2:o[s++]=(r&15)<<4|(i&60)>>2,r=i,a=3;break;case 3:o[s++]=(r&3)<<6|i,a=0;break}}if(a==1)throw Error("invalid base64 string");return o.subarray(0,s)}function It(e,n="std"){let t=yt(n),o=n=="std",s="",a=0,i,r=0;for(let l=0;l<e.length;l++)switch(i=e[l],a){case 0:s+=t[i>>2],r=(i&3)<<4,a=1;break;case 1:s+=t[r|i>>4],r=(i&15)<<2,a=2;break;case 2:s+=t[r|i>>6],s+=t[i&63],a=0;break}return a&&(s+=t[r],o&&(s+="=",a==1&&(s+="="))),s}var Xe,pt,_;function yt(e){return Xe||(Xe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),pt=Xe.slice(0,-2).concat("-","_")),e=="url"?pt:Xe}function us(){if(!_){_=[];let e=yt("std");for(let n=0;n<e.length;n++)_[e[n].charCodeAt(0)]=n;_[45]=e.indexOf("+"),_[95]=e.indexOf("/")}return _}function U(e){let n=!1,t=[];for(let o=0;o<e.length;o++){let s=e.charAt(o);switch(s){case"_":n=!0;break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":t.push(s),n=!1;break;default:n&&(n=!1,s=s.toUpperCase()),t.push(s);break}}return t.join("")}var gs=new Set(["constructor","toString","toJSON","valueOf"]);function O(e){return gs.has(e)?e+"$":e}function le(e){for(let n of e.field)D(n,"jsonName")||(n.jsonName=U(n.name));e.nestedType.forEach(le)}function Gt(e,n){let t=e.values.find(o=>o.name===n);if(!t)throw new Error(`cannot parse ${e} default value: ${n}`);return t.number}function ht(e,n){switch(e){case c.STRING:return n;case c.BYTES:{let t=ms(n);if(t===!1)throw new Error(`cannot parse ${c[e]} default value: ${n}`);return t}case c.INT64:case c.SFIXED64:case c.SINT64:return p.parse(n);case c.UINT64:case c.FIXED64:return p.uParse(n);case c.DOUBLE:case c.FLOAT:switch(n){case"inf":return Number.POSITIVE_INFINITY;case"-inf":return Number.NEGATIVE_INFINITY;case"nan":return Number.NaN;default:return parseFloat(n)}case c.BOOL:return n==="true";case c.INT32:case c.UINT32:case c.SINT32:case c.FIXED32:case c.SFIXED32:return parseInt(n,10)}}function ms(e){let n=[],t={tail:e,c:"",next(){return this.tail.length==0?!1:(this.c=this.tail[0],this.tail=this.tail.substring(1),!0)},take(o){if(this.tail.length>=o){let s=this.tail.substring(0,o);return this.tail=this.tail.substring(o),s}return!1}};for(;t.next();)switch(t.c){case"\\":if(t.next())switch(t.c){case"\\":n.push(t.c.charCodeAt(0));break;case"b":n.push(8);break;case"f":n.push(12);break;case"n":n.push(10);break;case"r":n.push(13);break;case"t":n.push(9);break;case"v":n.push(11);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":{let o=t.c,s=t.take(2);if(s===!1)return!1;let a=parseInt(o+s,8);if(isNaN(a))return!1;n.push(a);break}case"x":{let o=t.c,s=t.take(2);if(s===!1)return!1;let a=parseInt(o+s,16);if(isNaN(a))return!1;n.push(a);break}case"u":{let o=t.c,s=t.take(4);if(s===!1)return!1;let a=parseInt(o+s,16);if(isNaN(a))return!1;let i=new Uint8Array(4);new DataView(i.buffer).setInt32(0,a,!0),n.push(i[0],i[1],i[2],i[3]);break}case"U":{let o=t.c,s=t.take(8);if(s===!1)return!1;let a=p.uEnc(o+s),i=new Uint8Array(8),r=new DataView(i.buffer);r.setInt32(0,a.lo,!0),r.setInt32(4,a.hi,!0),n.push(i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7]);break}}break;default:n.push(t.c.charCodeAt(0))}return new Uint8Array(n)}function*Be(e){switch(e.kind){case"file":for(let n of e.messages)yield n,yield*Be(n);yield*e.enums,yield*e.services,yield*e.extensions;break;case"message":for(let n of e.nestedMessages)yield n,yield*Be(n);yield*e.nestedEnums,yield*e.nestedExtensions;break}}function We(...e){let n=bs();if(!e.length)return n;if("$typeName"in e[0]&&e[0].$typeName=="google.protobuf.FileDescriptorSet"){for(let o of e[0].file)At(o,n);return n}if("$typeName"in e[0]){let i=function(r){let l=[];for(let d of r.dependency){if(n.getFile(d)!=null||a.has(d))continue;let u=s(d);if(!u)throw new Error(`Unable to resolve ${d}, imported by ${r.name}`);"kind"in u?n.addFile(u,!1,!0):(a.add(u.name),l.push(u))}return l.concat(...l.map(i))};var t=i;let o=e[0],s=e[1],a=new Set;for(let r of[o,...i(o)].reverse())At(r,n)}else for(let o of e)for(let s of o.files)n.addFile(s);return n}function bs(){let e=new Map,n=new Map,t=new Map;return{kind:"registry",types:e,extendees:n,[Symbol.iterator](){return e.values()},get files(){return t.values()},addFile(o,s,a){if(t.set(o.proto.name,o),!s)for(let i of Be(o))this.add(i);if(a)for(let i of o.dependencies)this.addFile(i,s,a)},add(o){if(o.kind=="extension"){let s=n.get(o.extendee.typeName);s||n.set(o.extendee.typeName,s=new Map),s.set(o.number,o)}e.set(o.typeName,o)},get(o){return e.get(o)},getFile(o){return t.get(o)},getMessage(o){let s=e.get(o);return s?.kind=="message"?s:void 0},getEnum(o){let s=e.get(o);return s?.kind=="enum"?s:void 0},getExtension(o){let s=e.get(o);return s?.kind=="extension"?s:void 0},getExtensionFor(o,s){var a;return(a=n.get(o.typeName))===null||a===void 0?void 0:a.get(s)},getService(o){let s=e.get(o);return s?.kind=="service"?s:void 0}}}var ps=998,Is=999,ys=9,Je=10,de=11,Gs=12,ft=14,An=3,hs=2,Zt=1,fs=0,Gn=1,Zs=2,As=3,Vs=1,Cs=2,Xs=1;var Ct={998:{fieldPresence:1,enumType:2,repeatedFieldEncoding:2,utf8Validation:3,messageEncoding:1,jsonFormat:2},999:{fieldPresence:2,enumType:1,repeatedFieldEncoding:1,utf8Validation:2,messageEncoding:1,jsonFormat:1},1e3:{fieldPresence:1,enumType:1,repeatedFieldEncoding:1,utf8Validation:2,messageEncoding:1,jsonFormat:1}};function At(e,n){var t,o;let s={kind:"file",proto:e,deprecated:(o=(t=e.options)===null||t===void 0?void 0:t.deprecated)!==null&&o!==void 0?o:!1,edition:Ws(e),name:e.name.replace(/\.proto$/,""),dependencies:xs(e,n),enums:[],messages:[],extensions:[],services:[],toString(){return`file ${e.name}`}},a=new Map,i={get(r){return a.get(r)},add(r){var l;N(((l=r.proto.options)===null||l===void 0?void 0:l.mapEntry)===!0),a.set(r.typeName,r)}};for(let r of e.enumType)Xt(r,s,void 0,n);for(let r of e.messageType)St(r,s,void 0,n,i);for(let r of e.service)Ss(r,s,n);hn(s,n);for(let r of a.values())fn(r,n,i);for(let r of s.messages)fn(r,n,i),hn(r,n);n.addFile(s,!0)}function hn(e,n){switch(e.kind){case"file":for(let t of e.proto.extension){let o=Zn(t,e,n);e.extensions.push(o),n.add(o)}break;case"message":for(let t of e.proto.extension){let o=Zn(t,e,n);e.nestedExtensions.push(o),n.add(o)}for(let t of e.nestedMessages)hn(t,n);break}}function fn(e,n,t){let o=e.proto.oneofDecl.map(a=>Js(a,e)),s=new Set;for(let a of e.proto.field){let i=Es(a,o),r=Zn(a,e,n,i,t);e.fields.push(r),e.field[r.localName]=r,i===void 0?e.members.push(r):(i.fields.push(r),s.has(i)||(s.add(i),e.members.push(i)))}for(let a of o.filter(i=>s.has(i)))e.oneofs.push(a);for(let a of e.nestedMessages)fn(a,n,t)}function Xt(e,n,t,o){var s,a,i;let r=Rs(e.name,e.value),l={kind:"enum",proto:e,deprecated:(a=(s=e.options)===null||s===void 0?void 0:s.deprecated)!==null&&a!==void 0?a:!1,file:n,parent:t,open:!0,name:e.name,typeName:xe(e,t,n),value:{},values:[],sharedPrefix:r,toString(){return`enum ${this.typeName}`}};l.open=Hs(l),o.add(l),e.value.forEach(d=>{var u,I;let W=d.name;l.values.push(l.value[d.number]={kind:"enum_value",proto:d,deprecated:(I=(u=d.options)===null||u===void 0?void 0:u.deprecated)!==null&&I!==void 0?I:!1,parent:l,name:W,localName:O(r==null?W:W.substring(r.length)),number:d.number,toString(){return`enum value ${l.typeName}.${W}`}})}),((i=t?.nestedEnums)!==null&&i!==void 0?i:n.enums).push(l)}function St(e,n,t,o,s){var a,i,r,l;let d={kind:"message",proto:e,deprecated:(i=(a=e.options)===null||a===void 0?void 0:a.deprecated)!==null&&i!==void 0?i:!1,file:n,parent:t,name:e.name,typeName:xe(e,t,n),fields:[],field:{},oneofs:[],members:[],nestedEnums:[],nestedMessages:[],nestedExtensions:[],toString(){return`message ${this.typeName}`}};((r=e.options)===null||r===void 0?void 0:r.mapEntry)===!0?s.add(d):(((l=t?.nestedMessages)!==null&&l!==void 0?l:n.messages).push(d),o.add(d));for(let u of e.enumType)Xt(u,n,d,o);for(let u of e.nestedType)St(u,n,d,o,s)}function Ss(e,n,t){var o,s;let a={kind:"service",proto:e,deprecated:(s=(o=e.options)===null||o===void 0?void 0:o.deprecated)!==null&&s!==void 0?s:!1,file:n,name:e.name,typeName:xe(e,void 0,n),methods:[],method:{},toString(){return`service ${this.typeName}`}};n.services.push(a),t.add(a);for(let i of e.method){let r=Bs(i,a,t);a.methods.push(r),a.method[r.localName]=r}}function Bs(e,n,t){var o,s,a,i;let r;e.clientStreaming&&e.serverStreaming?r="bidi_streaming":e.clientStreaming?r="client_streaming":e.serverStreaming?r="server_streaming":r="unary";let l=t.getMessage(L(e.inputType)),d=t.getMessage(L(e.outputType));N(l,`invalid MethodDescriptorProto: input_type ${e.inputType} not found`),N(d,`invalid MethodDescriptorProto: output_type ${e.inputType} not found`);let u=e.name;return{kind:"rpc",proto:e,deprecated:(s=(o=e.options)===null||o===void 0?void 0:o.deprecated)!==null&&s!==void 0?s:!1,parent:n,name:u,localName:O(u.length?O(u[0].toLowerCase()+u.substring(1)):u),methodKind:r,input:l,output:d,idempotency:(i=(a=e.options)===null||a===void 0?void 0:a.idempotencyLevel)!==null&&i!==void 0?i:fs,toString(){return`rpc ${n.typeName}.${u}`}}}function Js(e,n){return{kind:"oneof",proto:e,deprecated:!1,parent:n,fields:[],name:e.name,localName:O(U(e.name)),toString(){return`oneof ${n.typeName}.${this.name}`}}}function Zn(e,n,t,o,s){var a,i,r;let l=s===void 0,d={kind:"field",proto:e,deprecated:(i=(a=e.options)===null||a===void 0?void 0:a.deprecated)!==null&&i!==void 0?i:!1,name:e.name,number:e.number,scalar:void 0,message:void 0,enum:void 0,presence:Ys(e,o,l,n),listKind:void 0,mapKind:void 0,mapKey:void 0,delimitedEncoding:void 0,packed:void 0,longAsString:!1,getDefaultValue:void 0};if(l){let x=n.kind=="file"?n:n.file,v=n.kind=="file"?void 0:n,G=xe(e,v,x);d.kind="extension",d.file=x,d.parent=v,d.oneof=void 0,d.typeName=G,d.jsonName=`[${G}]`,d.toString=()=>`extension ${G}`;let R=t.getMessage(L(e.extendee));N(R,`invalid FieldDescriptorProto: extendee ${e.extendee} not found`),d.extendee=R}else{let x=n;N(x.kind=="message"),d.parent=x,d.oneof=o,d.localName=o?U(e.name):O(U(e.name)),d.jsonName=e.jsonName,d.toString=()=>`field ${x.typeName}.${e.name}`}let u=e.label,I=e.type,W=(r=e.options)===null||r===void 0?void 0:r.jstype;if(u===An){let x=I==de?s?.get(L(e.typeName)):void 0;if(x){d.fieldKind="map";let{key:v,value:G}=Ms(x);return d.mapKey=v.scalar,d.mapKind=G.fieldKind,d.message=G.message,d.delimitedEncoding=!1,d.enum=G.enum,d.scalar=G.scalar,d}switch(d.fieldKind="list",I){case de:case Je:d.listKind="message",d.message=t.getMessage(L(e.typeName)),N(d.message),d.delimitedEncoding=Vt(e,n);break;case ft:d.listKind="enum",d.enum=t.getEnum(L(e.typeName)),N(d.enum);break;default:d.listKind="scalar",d.scalar=I,d.longAsString=W==Zt;break}return d.packed=Ns(e,n),d}switch(I){case de:case Je:d.fieldKind="message",d.message=t.getMessage(L(e.typeName)),N(d.message,`invalid FieldDescriptorProto: type_name ${e.typeName} not found`),d.delimitedEncoding=Vt(e,n),d.getDefaultValue=()=>{};break;case ft:{let x=t.getEnum(L(e.typeName));N(x!==void 0,`invalid FieldDescriptorProto: type_name ${e.typeName} not found`),d.fieldKind="enum",d.enum=t.getEnum(L(e.typeName)),d.getDefaultValue=()=>D(e,"defaultValue")?Gt(x,e.defaultValue):void 0;break}default:{d.fieldKind="scalar",d.scalar=I,d.longAsString=W==Zt,d.getDefaultValue=()=>D(e,"defaultValue")?ht(I,e.defaultValue):void 0;break}}return d}function Ws(e){switch(e.syntax){case"":case"proto2":return ps;case"proto3":return Is;case"editions":if(e.edition in Ct)return e.edition;throw new Error(`${e.name}: unsupported edition`);default:throw new Error(`${e.name}: unsupported syntax "${e.syntax}"`)}}function xs(e,n){return e.dependency.map(t=>{let o=n.getFile(t);if(!o)throw new Error(`Cannot find ${t}, imported by ${e.name}`);return o})}function Rs(e,n){let t=Fs(e)+"_";for(let o of n){if(!o.name.toLowerCase().startsWith(t))return;let s=o.name.substring(t.length);if(s.length==0||/^\d/.test(s))return}return t}function Fs(e){return(e.substring(0,1)+e.substring(1).replace(/[A-Z]/g,n=>"_"+n)).toLowerCase()}function xe(e,n,t){let o;return n?o=`${n.typeName}.${e.name}`:t.proto.package.length>0?o=`${t.proto.package}.${e.name}`:o=`${e.name}`,o}function L(e){return e.startsWith(".")?e.substring(1):e}function Es(e,n){if(!D(e,"oneofIndex")||e.proto3Optional)return;let t=n[e.oneofIndex];return N(t,`invalid FieldDescriptorProto: oneof #${e.oneofIndex} for field #${e.number} not found`),t}function Ys(e,n,t,o){return e.label==hs?As:e.label==An?Zs:n||e.proto3Optional||e.type==de||t?Gn:j("fieldPresence",{proto:e,parent:o})}function Ns(e,n){if(e.label!=An)return!1;switch(e.type){case ys:case Gs:case Je:case de:return!1}let t=e.options;return t&&D(t,"packed")?t.packed:Vs==j("repeatedFieldEncoding",{proto:e,parent:n})}function Ms(e){let n=e.fields.find(o=>o.number===1),t=e.fields.find(o=>o.number===2);return N(n&&n.fieldKind=="scalar"&&n.scalar!=c.BYTES&&n.scalar!=c.FLOAT&&n.scalar!=c.DOUBLE&&t&&t.fieldKind!="list"&&t.fieldKind!="map"),{key:n,value:t}}function Hs(e){var n;return Xs==j("enumType",{proto:e.proto,parent:(n=e.parent)!==null&&n!==void 0?n:e.file})}function Vt(e,n){return e.type==Je?!0:Cs==j("messageEncoding",{proto:e,parent:n})}function j(e,n){var t,o;let s=(t=n.proto.options)===null||t===void 0?void 0:t.features;if(s){let a=s[e];if(a!=0)return a}if("kind"in n){if(n.kind=="message")return j(e,(o=n.parent)!==null&&o!==void 0?o:n.file);let a=Ct[n.edition];if(!a)throw new Error(`feature default for edition ${n.edition} not found`);return a[e]}return j(e,n.parent)}function N(e,n){if(!e)throw new Error(n)}function Bt(e){let n=zs(e);return n.messageType.forEach(le),We(n,()=>{}).getFile(n.name)}function zs(e){return Object.assign(Object.create({syntax:"",edition:0}),Object.assign(Object.assign({$typeName:"google.protobuf.FileDescriptorProto",dependency:[],publicDependency:[],weakDependency:[],service:[],extension:[]},e),{messageType:e.messageType.map(Jt),enumType:e.enumType.map(Wt)}))}function Jt(e){var n,t,o,s,a,i,r,l;return{$typeName:"google.protobuf.DescriptorProto",name:e.name,field:(t=(n=e.field)===null||n===void 0?void 0:n.map(Ks))!==null&&t!==void 0?t:[],extension:[],nestedType:(s=(o=e.nestedType)===null||o===void 0?void 0:o.map(Jt))!==null&&s!==void 0?s:[],enumType:(i=(a=e.enumType)===null||a===void 0?void 0:a.map(Wt))!==null&&i!==void 0?i:[],extensionRange:(l=(r=e.extensionRange)===null||r===void 0?void 0:r.map(d=>Object.assign({$typeName:"google.protobuf.DescriptorProto.ExtensionRange"},d)))!==null&&l!==void 0?l:[],oneofDecl:[],reservedRange:[],reservedName:[]}}function Ks(e){return Object.assign(Object.create({label:1,typeName:"",extendee:"",defaultValue:"",oneofIndex:0,jsonName:"",proto3Optional:!1}),Object.assign(Object.assign({$typeName:"google.protobuf.FieldDescriptorProto"},e),{options:e.options?Ls(e.options):void 0}))}function Ls(e){var n,t,o;return Object.assign(Object.create({ctype:0,packed:!1,jstype:0,lazy:!1,unverifiedLazy:!1,deprecated:!1,weak:!1,debugRedact:!1,retention:0}),Object.assign(Object.assign({$typeName:"google.protobuf.FieldOptions"},e),{targets:(n=e.targets)!==null&&n!==void 0?n:[],editionDefaults:(o=(t=e.editionDefaults)===null||t===void 0?void 0:t.map(a=>Object.assign({$typeName:"google.protobuf.FieldOptions.EditionDefault"},a)))!==null&&o!==void 0?o:[],uninterpretedOption:[]}))}function Wt(e){return{$typeName:"google.protobuf.EnumDescriptorProto",name:e.name,reservedName:[],reservedRange:[],value:e.value.map(n=>Object.assign({$typeName:"google.protobuf.EnumValueDescriptorProto"},n))}}function J(e,n,...t){return t.reduce((o,s)=>o.nestedMessages[s],e.messages[n])}var T=Bt({name:"google/protobuf/descriptor.proto",package:"google.protobuf",messageType:[{name:"FileDescriptorSet",field:[{name:"file",number:1,type:11,label:3,typeName:".google.protobuf.FileDescriptorProto"}]},{name:"FileDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"package",number:2,type:9,label:1},{name:"dependency",number:3,type:9,label:3},{name:"public_dependency",number:10,type:5,label:3},{name:"weak_dependency",number:11,type:5,label:3},{name:"message_type",number:4,type:11,label:3,typeName:".google.protobuf.DescriptorProto"},{name:"enum_type",number:5,type:11,label:3,typeName:".google.protobuf.EnumDescriptorProto"},{name:"service",number:6,type:11,label:3,typeName:".google.protobuf.ServiceDescriptorProto"},{name:"extension",number:7,type:11,label:3,typeName:".google.protobuf.FieldDescriptorProto"},{name:"options",number:8,type:11,label:1,typeName:".google.protobuf.FileOptions"},{name:"source_code_info",number:9,type:11,label:1,typeName:".google.protobuf.SourceCodeInfo"},{name:"syntax",number:12,type:9,label:1},{name:"edition",number:14,type:14,label:1,typeName:".google.protobuf.Edition"}]},{name:"DescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"field",number:2,type:11,label:3,typeName:".google.protobuf.FieldDescriptorProto"},{name:"extension",number:6,type:11,label:3,typeName:".google.protobuf.FieldDescriptorProto"},{name:"nested_type",number:3,type:11,label:3,typeName:".google.protobuf.DescriptorProto"},{name:"enum_type",number:4,type:11,label:3,typeName:".google.protobuf.EnumDescriptorProto"},{name:"extension_range",number:5,type:11,label:3,typeName:".google.protobuf.DescriptorProto.ExtensionRange"},{name:"oneof_decl",number:8,type:11,label:3,typeName:".google.protobuf.OneofDescriptorProto"},{name:"options",number:7,type:11,label:1,typeName:".google.protobuf.MessageOptions"},{name:"reserved_range",number:9,type:11,label:3,typeName:".google.protobuf.DescriptorProto.ReservedRange"},{name:"reserved_name",number:10,type:9,label:3}],nestedType:[{name:"ExtensionRange",field:[{name:"start",number:1,type:5,label:1},{name:"end",number:2,type:5,label:1},{name:"options",number:3,type:11,label:1,typeName:".google.protobuf.ExtensionRangeOptions"}]},{name:"ReservedRange",field:[{name:"start",number:1,type:5,label:1},{name:"end",number:2,type:5,label:1}]}]},{name:"ExtensionRangeOptions",field:[{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"},{name:"declaration",number:2,type:11,label:3,typeName:".google.protobuf.ExtensionRangeOptions.Declaration",options:{retention:2}},{name:"features",number:50,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"verification",number:3,type:14,label:1,typeName:".google.protobuf.ExtensionRangeOptions.VerificationState",defaultValue:"UNVERIFIED",options:{retention:2}}],nestedType:[{name:"Declaration",field:[{name:"number",number:1,type:5,label:1},{name:"full_name",number:2,type:9,label:1},{name:"type",number:3,type:9,label:1},{name:"reserved",number:5,type:8,label:1},{name:"repeated",number:6,type:8,label:1}]}],enumType:[{name:"VerificationState",value:[{name:"DECLARATION",number:0},{name:"UNVERIFIED",number:1}]}],extensionRange:[{start:1e3,end:536870912}]},{name:"FieldDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"number",number:3,type:5,label:1},{name:"label",number:4,type:14,label:1,typeName:".google.protobuf.FieldDescriptorProto.Label"},{name:"type",number:5,type:14,label:1,typeName:".google.protobuf.FieldDescriptorProto.Type"},{name:"type_name",number:6,type:9,label:1},{name:"extendee",number:2,type:9,label:1},{name:"default_value",number:7,type:9,label:1},{name:"oneof_index",number:9,type:5,label:1},{name:"json_name",number:10,type:9,label:1},{name:"options",number:8,type:11,label:1,typeName:".google.protobuf.FieldOptions"},{name:"proto3_optional",number:17,type:8,label:1}],enumType:[{name:"Type",value:[{name:"TYPE_DOUBLE",number:1},{name:"TYPE_FLOAT",number:2},{name:"TYPE_INT64",number:3},{name:"TYPE_UINT64",number:4},{name:"TYPE_INT32",number:5},{name:"TYPE_FIXED64",number:6},{name:"TYPE_FIXED32",number:7},{name:"TYPE_BOOL",number:8},{name:"TYPE_STRING",number:9},{name:"TYPE_GROUP",number:10},{name:"TYPE_MESSAGE",number:11},{name:"TYPE_BYTES",number:12},{name:"TYPE_UINT32",number:13},{name:"TYPE_ENUM",number:14},{name:"TYPE_SFIXED32",number:15},{name:"TYPE_SFIXED64",number:16},{name:"TYPE_SINT32",number:17},{name:"TYPE_SINT64",number:18}]},{name:"Label",value:[{name:"LABEL_OPTIONAL",number:1},{name:"LABEL_REPEATED",number:3},{name:"LABEL_REQUIRED",number:2}]}]},{name:"OneofDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"options",number:2,type:11,label:1,typeName:".google.protobuf.OneofOptions"}]},{name:"EnumDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"value",number:2,type:11,label:3,typeName:".google.protobuf.EnumValueDescriptorProto"},{name:"options",number:3,type:11,label:1,typeName:".google.protobuf.EnumOptions"},{name:"reserved_range",number:4,type:11,label:3,typeName:".google.protobuf.EnumDescriptorProto.EnumReservedRange"},{name:"reserved_name",number:5,type:9,label:3}],nestedType:[{name:"EnumReservedRange",field:[{name:"start",number:1,type:5,label:1},{name:"end",number:2,type:5,label:1}]}]},{name:"EnumValueDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"number",number:2,type:5,label:1},{name:"options",number:3,type:11,label:1,typeName:".google.protobuf.EnumValueOptions"}]},{name:"ServiceDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"method",number:2,type:11,label:3,typeName:".google.protobuf.MethodDescriptorProto"},{name:"options",number:3,type:11,label:1,typeName:".google.protobuf.ServiceOptions"}]},{name:"MethodDescriptorProto",field:[{name:"name",number:1,type:9,label:1},{name:"input_type",number:2,type:9,label:1},{name:"output_type",number:3,type:9,label:1},{name:"options",number:4,type:11,label:1,typeName:".google.protobuf.MethodOptions"},{name:"client_streaming",number:5,type:8,label:1,defaultValue:"false"},{name:"server_streaming",number:6,type:8,label:1,defaultValue:"false"}]},{name:"FileOptions",field:[{name:"java_package",number:1,type:9,label:1},{name:"java_outer_classname",number:8,type:9,label:1},{name:"java_multiple_files",number:10,type:8,label:1,defaultValue:"false"},{name:"java_generate_equals_and_hash",number:20,type:8,label:1,options:{deprecated:!0}},{name:"java_string_check_utf8",number:27,type:8,label:1,defaultValue:"false"},{name:"optimize_for",number:9,type:14,label:1,typeName:".google.protobuf.FileOptions.OptimizeMode",defaultValue:"SPEED"},{name:"go_package",number:11,type:9,label:1},{name:"cc_generic_services",number:16,type:8,label:1,defaultValue:"false"},{name:"java_generic_services",number:17,type:8,label:1,defaultValue:"false"},{name:"py_generic_services",number:18,type:8,label:1,defaultValue:"false"},{name:"deprecated",number:23,type:8,label:1,defaultValue:"false"},{name:"cc_enable_arenas",number:31,type:8,label:1,defaultValue:"true"},{name:"objc_class_prefix",number:36,type:9,label:1},{name:"csharp_namespace",number:37,type:9,label:1},{name:"swift_prefix",number:39,type:9,label:1},{name:"php_class_prefix",number:40,type:9,label:1},{name:"php_namespace",number:41,type:9,label:1},{name:"php_metadata_namespace",number:44,type:9,label:1},{name:"ruby_package",number:45,type:9,label:1},{name:"features",number:50,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],enumType:[{name:"OptimizeMode",value:[{name:"SPEED",number:1},{name:"CODE_SIZE",number:2},{name:"LITE_RUNTIME",number:3}]}],extensionRange:[{start:1e3,end:536870912}]},{name:"MessageOptions",field:[{name:"message_set_wire_format",number:1,type:8,label:1,defaultValue:"false"},{name:"no_standard_descriptor_accessor",number:2,type:8,label:1,defaultValue:"false"},{name:"deprecated",number:3,type:8,label:1,defaultValue:"false"},{name:"map_entry",number:7,type:8,label:1},{name:"deprecated_legacy_json_field_conflicts",number:11,type:8,label:1,options:{deprecated:!0}},{name:"features",number:12,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],extensionRange:[{start:1e3,end:536870912}]},{name:"FieldOptions",field:[{name:"ctype",number:1,type:14,label:1,typeName:".google.protobuf.FieldOptions.CType",defaultValue:"STRING"},{name:"packed",number:2,type:8,label:1},{name:"jstype",number:6,type:14,label:1,typeName:".google.protobuf.FieldOptions.JSType",defaultValue:"JS_NORMAL"},{name:"lazy",number:5,type:8,label:1,defaultValue:"false"},{name:"unverified_lazy",number:15,type:8,label:1,defaultValue:"false"},{name:"deprecated",number:3,type:8,label:1,defaultValue:"false"},{name:"weak",number:10,type:8,label:1,defaultValue:"false"},{name:"debug_redact",number:16,type:8,label:1,defaultValue:"false"},{name:"retention",number:17,type:14,label:1,typeName:".google.protobuf.FieldOptions.OptionRetention"},{name:"targets",number:19,type:14,label:3,typeName:".google.protobuf.FieldOptions.OptionTargetType"},{name:"edition_defaults",number:20,type:11,label:3,typeName:".google.protobuf.FieldOptions.EditionDefault"},{name:"features",number:21,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"feature_support",number:22,type:11,label:1,typeName:".google.protobuf.FieldOptions.FeatureSupport"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],nestedType:[{name:"EditionDefault",field:[{name:"edition",number:3,type:14,label:1,typeName:".google.protobuf.Edition"},{name:"value",number:2,type:9,label:1}]},{name:"FeatureSupport",field:[{name:"edition_introduced",number:1,type:14,label:1,typeName:".google.protobuf.Edition"},{name:"edition_deprecated",number:2,type:14,label:1,typeName:".google.protobuf.Edition"},{name:"deprecation_warning",number:3,type:9,label:1},{name:"edition_removed",number:4,type:14,label:1,typeName:".google.protobuf.Edition"}]}],enumType:[{name:"CType",value:[{name:"STRING",number:0},{name:"CORD",number:1},{name:"STRING_PIECE",number:2}]},{name:"JSType",value:[{name:"JS_NORMAL",number:0},{name:"JS_STRING",number:1},{name:"JS_NUMBER",number:2}]},{name:"OptionRetention",value:[{name:"RETENTION_UNKNOWN",number:0},{name:"RETENTION_RUNTIME",number:1},{name:"RETENTION_SOURCE",number:2}]},{name:"OptionTargetType",value:[{name:"TARGET_TYPE_UNKNOWN",number:0},{name:"TARGET_TYPE_FILE",number:1},{name:"TARGET_TYPE_EXTENSION_RANGE",number:2},{name:"TARGET_TYPE_MESSAGE",number:3},{name:"TARGET_TYPE_FIELD",number:4},{name:"TARGET_TYPE_ONEOF",number:5},{name:"TARGET_TYPE_ENUM",number:6},{name:"TARGET_TYPE_ENUM_ENTRY",number:7},{name:"TARGET_TYPE_SERVICE",number:8},{name:"TARGET_TYPE_METHOD",number:9}]}],extensionRange:[{start:1e3,end:536870912}]},{name:"OneofOptions",field:[{name:"features",number:1,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],extensionRange:[{start:1e3,end:536870912}]},{name:"EnumOptions",field:[{name:"allow_alias",number:2,type:8,label:1},{name:"deprecated",number:3,type:8,label:1,defaultValue:"false"},{name:"deprecated_legacy_json_field_conflicts",number:6,type:8,label:1,options:{deprecated:!0}},{name:"features",number:7,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],extensionRange:[{start:1e3,end:536870912}]},{name:"EnumValueOptions",field:[{name:"deprecated",number:1,type:8,label:1,defaultValue:"false"},{name:"features",number:2,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"debug_redact",number:3,type:8,label:1,defaultValue:"false"},{name:"feature_support",number:4,type:11,label:1,typeName:".google.protobuf.FieldOptions.FeatureSupport"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],extensionRange:[{start:1e3,end:536870912}]},{name:"ServiceOptions",field:[{name:"features",number:34,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"deprecated",number:33,type:8,label:1,defaultValue:"false"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],extensionRange:[{start:1e3,end:536870912}]},{name:"MethodOptions",field:[{name:"deprecated",number:33,type:8,label:1,defaultValue:"false"},{name:"idempotency_level",number:34,type:14,label:1,typeName:".google.protobuf.MethodOptions.IdempotencyLevel",defaultValue:"IDEMPOTENCY_UNKNOWN"},{name:"features",number:35,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"uninterpreted_option",number:999,type:11,label:3,typeName:".google.protobuf.UninterpretedOption"}],enumType:[{name:"IdempotencyLevel",value:[{name:"IDEMPOTENCY_UNKNOWN",number:0},{name:"NO_SIDE_EFFECTS",number:1},{name:"IDEMPOTENT",number:2}]}],extensionRange:[{start:1e3,end:536870912}]},{name:"UninterpretedOption",field:[{name:"name",number:2,type:11,label:3,typeName:".google.protobuf.UninterpretedOption.NamePart"},{name:"identifier_value",number:3,type:9,label:1},{name:"positive_int_value",number:4,type:4,label:1},{name:"negative_int_value",number:5,type:3,label:1},{name:"double_value",number:6,type:1,label:1},{name:"string_value",number:7,type:12,label:1},{name:"aggregate_value",number:8,type:9,label:1}],nestedType:[{name:"NamePart",field:[{name:"name_part",number:1,type:9,label:2},{name:"is_extension",number:2,type:8,label:2}]}]},{name:"FeatureSet",field:[{name:"field_presence",number:1,type:14,label:1,typeName:".google.protobuf.FeatureSet.FieldPresence",options:{retention:1,targets:[4,1],editionDefaults:[{value:"EXPLICIT",edition:900},{value:"IMPLICIT",edition:999},{value:"EXPLICIT",edition:1e3}]}},{name:"enum_type",number:2,type:14,label:1,typeName:".google.protobuf.FeatureSet.EnumType",options:{retention:1,targets:[6,1],editionDefaults:[{value:"CLOSED",edition:900},{value:"OPEN",edition:999}]}},{name:"repeated_field_encoding",number:3,type:14,label:1,typeName:".google.protobuf.FeatureSet.RepeatedFieldEncoding",options:{retention:1,targets:[4,1],editionDefaults:[{value:"EXPANDED",edition:900},{value:"PACKED",edition:999}]}},{name:"utf8_validation",number:4,type:14,label:1,typeName:".google.protobuf.FeatureSet.Utf8Validation",options:{retention:1,targets:[4,1],editionDefaults:[{value:"NONE",edition:900},{value:"VERIFY",edition:999}]}},{name:"message_encoding",number:5,type:14,label:1,typeName:".google.protobuf.FeatureSet.MessageEncoding",options:{retention:1,targets:[4,1],editionDefaults:[{value:"LENGTH_PREFIXED",edition:900}]}},{name:"json_format",number:6,type:14,label:1,typeName:".google.protobuf.FeatureSet.JsonFormat",options:{retention:1,targets:[3,6,1],editionDefaults:[{value:"LEGACY_BEST_EFFORT",edition:900},{value:"ALLOW",edition:999}]}}],enumType:[{name:"FieldPresence",value:[{name:"FIELD_PRESENCE_UNKNOWN",number:0},{name:"EXPLICIT",number:1},{name:"IMPLICIT",number:2},{name:"LEGACY_REQUIRED",number:3}]},{name:"EnumType",value:[{name:"ENUM_TYPE_UNKNOWN",number:0},{name:"OPEN",number:1},{name:"CLOSED",number:2}]},{name:"RepeatedFieldEncoding",value:[{name:"REPEATED_FIELD_ENCODING_UNKNOWN",number:0},{name:"PACKED",number:1},{name:"EXPANDED",number:2}]},{name:"Utf8Validation",value:[{name:"UTF8_VALIDATION_UNKNOWN",number:0},{name:"VERIFY",number:2},{name:"NONE",number:3}]},{name:"MessageEncoding",value:[{name:"MESSAGE_ENCODING_UNKNOWN",number:0},{name:"LENGTH_PREFIXED",number:1},{name:"DELIMITED",number:2}]},{name:"JsonFormat",value:[{name:"JSON_FORMAT_UNKNOWN",number:0},{name:"ALLOW",number:1},{name:"LEGACY_BEST_EFFORT",number:2}]}],extensionRange:[{start:1e3,end:9995},{start:9995,end:1e4},{start:1e4,end:10001}]},{name:"FeatureSetDefaults",field:[{name:"defaults",number:1,type:11,label:3,typeName:".google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault"},{name:"minimum_edition",number:4,type:14,label:1,typeName:".google.protobuf.Edition"},{name:"maximum_edition",number:5,type:14,label:1,typeName:".google.protobuf.Edition"}],nestedType:[{name:"FeatureSetEditionDefault",field:[{name:"edition",number:3,type:14,label:1,typeName:".google.protobuf.Edition"},{name:"overridable_features",number:4,type:11,label:1,typeName:".google.protobuf.FeatureSet"},{name:"fixed_features",number:5,type:11,label:1,typeName:".google.protobuf.FeatureSet"}]}]},{name:"SourceCodeInfo",field:[{name:"location",number:1,type:11,label:3,typeName:".google.protobuf.SourceCodeInfo.Location"}],nestedType:[{name:"Location",field:[{name:"path",number:1,type:5,label:3,options:{packed:!0}},{name:"span",number:2,type:5,label:3,options:{packed:!0}},{name:"leading_comments",number:3,type:9,label:1},{name:"trailing_comments",number:4,type:9,label:1},{name:"leading_detached_comments",number:6,type:9,label:3}]}]},{name:"GeneratedCodeInfo",field:[{name:"annotation",number:1,type:11,label:3,typeName:".google.protobuf.GeneratedCodeInfo.Annotation"}],nestedType:[{name:"Annotation",field:[{name:"path",number:1,type:5,label:3,options:{packed:!0}},{name:"source_file",number:2,type:9,label:1},{name:"begin",number:3,type:5,label:1},{name:"end",number:4,type:5,label:1},{name:"semantic",number:5,type:14,label:1,typeName:".google.protobuf.GeneratedCodeInfo.Annotation.Semantic"}],enumType:[{name:"Semantic",value:[{name:"NONE",number:0},{name:"SET",number:1},{name:"ALIAS",number:2}]}]}]}],enumType:[{name:"Edition",value:[{name:"EDITION_UNKNOWN",number:0},{name:"EDITION_LEGACY",number:900},{name:"EDITION_PROTO2",number:998},{name:"EDITION_PROTO3",number:999},{name:"EDITION_2023",number:1e3},{name:"EDITION_2024",number:1001},{name:"EDITION_1_TEST_ONLY",number:1},{name:"EDITION_2_TEST_ONLY",number:2},{name:"EDITION_99997_TEST_ONLY",number:99997},{name:"EDITION_99998_TEST_ONLY",number:99998},{name:"EDITION_99999_TEST_ONLY",number:99999},{name:"EDITION_MAX",number:2147483647}]}]});var Tt=J(T,1);var xt;(function(e){e[e.DECLARATION=0]="DECLARATION",e[e.UNVERIFIED=1]="UNVERIFIED"})(xt||(xt={}));var Rt;(function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.GROUP=10]="GROUP",e[e.MESSAGE=11]="MESSAGE",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.ENUM=14]="ENUM",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"})(Rt||(Rt={}));var Ft;(function(e){e[e.OPTIONAL=1]="OPTIONAL",e[e.REPEATED=3]="REPEATED",e[e.REQUIRED=2]="REQUIRED"})(Ft||(Ft={}));var Et;(function(e){e[e.SPEED=1]="SPEED",e[e.CODE_SIZE=2]="CODE_SIZE",e[e.LITE_RUNTIME=3]="LITE_RUNTIME"})(Et||(Et={}));var Yt;(function(e){e[e.STRING=0]="STRING",e[e.CORD=1]="CORD",e[e.STRING_PIECE=2]="STRING_PIECE"})(Yt||(Yt={}));var Nt;(function(e){e[e.JS_NORMAL=0]="JS_NORMAL",e[e.JS_STRING=1]="JS_STRING",e[e.JS_NUMBER=2]="JS_NUMBER"})(Nt||(Nt={}));var Mt;(function(e){e[e.RETENTION_UNKNOWN=0]="RETENTION_UNKNOWN",e[e.RETENTION_RUNTIME=1]="RETENTION_RUNTIME",e[e.RETENTION_SOURCE=2]="RETENTION_SOURCE"})(Mt||(Mt={}));var Ht;(function(e){e[e.TARGET_TYPE_UNKNOWN=0]="TARGET_TYPE_UNKNOWN",e[e.TARGET_TYPE_FILE=1]="TARGET_TYPE_FILE",e[e.TARGET_TYPE_EXTENSION_RANGE=2]="TARGET_TYPE_EXTENSION_RANGE",e[e.TARGET_TYPE_MESSAGE=3]="TARGET_TYPE_MESSAGE",e[e.TARGET_TYPE_FIELD=4]="TARGET_TYPE_FIELD",e[e.TARGET_TYPE_ONEOF=5]="TARGET_TYPE_ONEOF",e[e.TARGET_TYPE_ENUM=6]="TARGET_TYPE_ENUM",e[e.TARGET_TYPE_ENUM_ENTRY=7]="TARGET_TYPE_ENUM_ENTRY",e[e.TARGET_TYPE_SERVICE=8]="TARGET_TYPE_SERVICE",e[e.TARGET_TYPE_METHOD=9]="TARGET_TYPE_METHOD"})(Ht||(Ht={}));var zt;(function(e){e[e.IDEMPOTENCY_UNKNOWN=0]="IDEMPOTENCY_UNKNOWN",e[e.NO_SIDE_EFFECTS=1]="NO_SIDE_EFFECTS",e[e.IDEMPOTENT=2]="IDEMPOTENT"})(zt||(zt={}));var Kt;(function(e){e[e.FIELD_PRESENCE_UNKNOWN=0]="FIELD_PRESENCE_UNKNOWN",e[e.EXPLICIT=1]="EXPLICIT",e[e.IMPLICIT=2]="IMPLICIT",e[e.LEGACY_REQUIRED=3]="LEGACY_REQUIRED"})(Kt||(Kt={}));var Lt;(function(e){e[e.ENUM_TYPE_UNKNOWN=0]="ENUM_TYPE_UNKNOWN",e[e.OPEN=1]="OPEN",e[e.CLOSED=2]="CLOSED"})(Lt||(Lt={}));var wt;(function(e){e[e.REPEATED_FIELD_ENCODING_UNKNOWN=0]="REPEATED_FIELD_ENCODING_UNKNOWN",e[e.PACKED=1]="PACKED",e[e.EXPANDED=2]="EXPANDED"})(wt||(wt={}));var vt;(function(e){e[e.UTF8_VALIDATION_UNKNOWN=0]="UTF8_VALIDATION_UNKNOWN",e[e.VERIFY=2]="VERIFY",e[e.NONE=3]="NONE"})(vt||(vt={}));var Ut;(function(e){e[e.MESSAGE_ENCODING_UNKNOWN=0]="MESSAGE_ENCODING_UNKNOWN",e[e.LENGTH_PREFIXED=1]="LENGTH_PREFIXED",e[e.DELIMITED=2]="DELIMITED"})(Ut||(Ut={}));var kt;(function(e){e[e.JSON_FORMAT_UNKNOWN=0]="JSON_FORMAT_UNKNOWN",e[e.ALLOW=1]="ALLOW",e[e.LEGACY_BEST_EFFORT=2]="LEGACY_BEST_EFFORT"})(kt||(kt={}));var Dt;(function(e){e[e.NONE=0]="NONE",e[e.SET=1]="SET",e[e.ALIAS=2]="ALIAS"})(Dt||(Dt={}));var Qt;(function(e){e[e.EDITION_UNKNOWN=0]="EDITION_UNKNOWN",e[e.EDITION_LEGACY=900]="EDITION_LEGACY",e[e.EDITION_PROTO2=998]="EDITION_PROTO2",e[e.EDITION_PROTO3=999]="EDITION_PROTO3",e[e.EDITION_2023=1e3]="EDITION_2023",e[e.EDITION_2024=1001]="EDITION_2024",e[e.EDITION_1_TEST_ONLY=1]="EDITION_1_TEST_ONLY",e[e.EDITION_2_TEST_ONLY=2]="EDITION_2_TEST_ONLY",e[e.EDITION_99997_TEST_ONLY=99997]="EDITION_99997_TEST_ONLY",e[e.EDITION_99998_TEST_ONLY=99998]="EDITION_99998_TEST_ONLY",e[e.EDITION_99999_TEST_ONLY=99999]="EDITION_99999_TEST_ONLY",e[e.EDITION_MAX=2147483647]="EDITION_MAX"})(Qt||(Qt={}));var Pt={readUnknownFields:!0};function ws(e){return e?Object.assign(Object.assign({},Pt),e):Pt}function Re(e,n,t){let o=X(e,void 0,!1);return _t(o,new Q(n),ws(t),!1,n.byteLength),o.message}function _t(e,n,t,o,s){var a;let i=o?n.len:n.pos+s,r,l,d=(a=e.getUnknown())!==null&&a!==void 0?a:[];for(;n.pos<i&&([r,l]=n.tag(),!(o&&l==f.EndGroup));){let u=e.findNumber(r);if(!u){let I=n.skip(l,r);t.readUnknownFields&&d.push({no:r,wireType:l,data:I});continue}Vn(e,n,u,l,t)}if(o&&(l!=f.EndGroup||r!==s))throw new Error("invalid end group tag");d.length>0&&e.setUnknown(d)}function Vn(e,n,t,o,s){switch(t.fieldKind){case"scalar":e.set(t,$(n,t.scalar));break;case"enum":e.set(t,$(n,c.INT32));break;case"message":e.set(t,Cn(n,s,t,e.get(t)));break;case"list":Us(n,o,e.get(t),s);break;case"map":vs(n,e.get(t),s);break}}function vs(e,n,t){let o=n.field(),s,a,i=e.pos+e.uint32();for(;e.pos<i;){let[r]=e.tag();switch(r){case 1:s=$(e,o.mapKey);break;case 2:switch(o.mapKind){case"scalar":a=$(e,o.scalar);break;case"enum":a=e.int32();break;case"message":a=Cn(e,t,o);break}break}}if(s===void 0&&(s=F(o.mapKey,!1)),a===void 0)switch(o.mapKind){case"scalar":a=F(o.scalar,!1);break;case"enum":a=o.enum.values[0].number;break;case"message":a=X(o.message,void 0,!1);break}n.set(s,a)}function Us(e,n,t,o){var s;let a=t.field();if(a.listKind==="message"){t.add(Cn(e,o,a));return}let i=(s=a.scalar)!==null&&s!==void 0?s:c.INT32;if(!(n==f.LengthDelimited&&i!=c.STRING&&i!=c.BYTES)){t.add($(e,i));return}let l=e.uint32()+e.pos;for(;e.pos<l;)t.add($(e,i))}function Cn(e,n,t,o){let s=t.delimitedEncoding,a=o??X(t.message,void 0,!1);return _t(a,e,n,s,s?t.number:e.uint32()),a}function $(e,n){switch(n){case c.STRING:return e.string();case c.BOOL:return e.bool();case c.DOUBLE:return e.double();case c.FLOAT:return e.float();case c.INT32:return e.int32();case c.INT64:return e.int64();case c.UINT64:return e.uint64();case c.FIXED64:return e.fixed64();case c.BYTES:return e.bytes();case c.FIXED32:return e.fixed32();case c.SFIXED32:return e.sfixed32();case c.SFIXED64:return e.sfixed64();case c.SINT64:return e.sint64();case c.UINT32:return e.uint32();case c.SINT32:return e.sint32()}}function V(e,n){var t;let o=Re(Tt,Se(e));return o.messageType.forEach(le),o.dependency=(t=n?.map(a=>a.proto.name))!==null&&t!==void 0?t:[],We(o,a=>n?.find(i=>i.proto.name===a)).getFile(o.name)}var Ot=V("Ch9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiKwoJVGltZXN0YW1wEg8KB3NlY29uZHMYASABKAMSDQoFbmFub3MYAiABKAVChQEKE2NvbS5nb29nbGUucHJvdG9idWZCDlRpbWVzdGFtcFByb3RvUAFaMmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3RpbWVzdGFtcHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM");var ks=V("Chlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiJgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM"),jt=J(ks,0);var Ds=3,$t={writeUnknownFields:!0};function Qs(e){return e?Object.assign(Object.assign({},$t),e):$t}function qt(e,n,t){return Fe(new P,Qs(t),X(e,n)).finish()}function Fe(e,n,t){var o;for(let s of t.sortedFields){if(!t.isSet(s)){if(s.presence==Ds)throw new Error(`cannot encode field ${t.desc.typeName}.${s.name} to binary: required field not set`);continue}Xn(e,n,t,s)}if(n.writeUnknownFields)for(let{no:s,wireType:a,data:i}of(o=t.getUnknown())!==null&&o!==void 0?o:[])e.tag(s,a).raw(i);return e}function Xn(e,n,t,o){var s;switch(o.fieldKind){case"scalar":case"enum":Ee(e,(s=o.scalar)!==null&&s!==void 0?s:c.INT32,o.number,t.get(o));break;case"list":Ts(e,n,o,t.get(o));break;case"message":eo(e,n,o,t.get(o));break;case"map":for(let[a,i]of t.get(o))Ps(e,n,o,a,i);break}}function Ee(e,n,t,o){no(e.tag(t,_s(n)),n,o)}function eo(e,n,t,o){t.delimitedEncoding?Fe(e.tag(t.number,f.StartGroup),n,o).tag(t.number,f.EndGroup):Fe(e.tag(t.number,f.LengthDelimited).fork(),n,o).join()}function Ts(e,n,t,o){var s;if(t.listKind=="message"){for(let i of o)eo(e,n,t,i);return}let a=(s=t.scalar)!==null&&s!==void 0?s:c.INT32;if(t.packed){if(!o.size)return;e.tag(t.number,f.LengthDelimited).fork();for(let i of o)no(e,a,i);e.join();return}for(let i of o)Ee(e,a,t.number,i)}function Ps(e,n,t,o,s){var a;switch(e.tag(t.number,f.LengthDelimited).fork(),Ee(e,t.mapKey,1,o),t.mapKind){case"scalar":case"enum":Ee(e,(a=t.scalar)!==null&&a!==void 0?a:c.INT32,2,s);break;case"message":Fe(e.tag(2,f.LengthDelimited).fork(),n,s).join();break}e.join()}function no(e,n,t){switch(n){case c.STRING:e.string(t);break;case c.BOOL:e.bool(t);break;case c.DOUBLE:e.double(t);break;case c.FLOAT:e.float(t);break;case c.INT32:e.int32(t);break;case c.INT64:e.int64(t);break;case c.UINT64:e.uint64(t);break;case c.FIXED64:e.fixed64(t);break;case c.BYTES:e.bytes(t);break;case c.FIXED32:e.fixed32(t);break;case c.SFIXED32:e.sfixed32(t);break;case c.SFIXED64:e.sfixed64(t);break;case c.SINT64:e.sint64(t);break;case c.UINT32:e.uint32(t);break;case c.SINT32:e.sint32(t);break}}function _s(e){switch(e){case c.BYTES:case c.STRING:return f.LengthDelimited;case c.DOUBLE:case c.FIXED64:case c.SFIXED64:return f.Bit64;case c.FIXED32:case c.SFIXED32:case c.FLOAT:return f.Bit32;default:return f.Varint}}function to(e,n,t){let o=!1;return t||(t=B(jt),o=!0),t.value=qt(e,n),t.typeUrl=js(n.$typeName),o?t:void 0}function Os(e,n){if(e.typeUrl==="")return!1;let t=typeof n=="string"?n:n.typeName,o=so(e.typeUrl);return t===o}function oo(e,n){if(e.typeUrl==="")return;let t=n.kind=="message"?n:n.getMessage(so(e.typeUrl));if(!(!t||!Os(e,t)))return Re(t,e.value)}function js(e){return`type.googleapis.com/${e}`}function so(e){let n=e.lastIndexOf("/"),t=n>=0?e.substring(n+1):e;if(!t.length)throw new Error(`invalid type url: ${e}`);return t}var Ye=V("Ch5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIqCghEdXJhdGlvbhIPCgdzZWNvbmRzGAEgASgDEg0KBW5hbm9zGAIgASgFQoMBChNjb20uZ29vZ2xlLnByb3RvYnVmQg1EdXJhdGlvblByb3RvUAFaMWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2R1cmF0aW9ucGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMw");var Sn=V("Chxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvEg9nb29nbGUucHJvdG9idWYihAEKBlN0cnVjdBIzCgZmaWVsZHMYASADKAsyIy5nb29nbGUucHJvdG9idWYuU3RydWN0LkZpZWxkc0VudHJ5GkUKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEi6gEKBVZhbHVlEjAKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSAASFgoMbnVtYmVyX3ZhbHVlGAIgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAMgASgJSAASFAoKYm9vbF92YWx1ZRgEIAEoCEgAEi8KDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIABIwCgpsaXN0X3ZhbHVlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZUgAQgYKBGtpbmQiMwoJTGlzdFZhbHVlEiYKBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSobCglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAAQn8KE2NvbS5nb29nbGUucHJvdG9idWZCC1N0cnVjdFByb3RvUAFaL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3N0cnVjdHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM"),ao=J(Sn,0),Bn=J(Sn,1),io=J(Sn,2),Ne;(function(e){e[e.NULL_VALUE=0]="NULL_VALUE"})(Ne||(Ne={}));function ro(e,n){lo(n,e);let t=$s(e.$unknown,n),[o,s,a]=q(n);for(let i of t)Vn(o,new Q(i.data),s,i.wireType,{readUnknownFields:!1});return a()}function co(e,n,t){var o;lo(n,e);let s=((o=e.$unknown)!==null&&o!==void 0?o:[]).filter(d=>d.no!==n.number),[a,i]=q(n,t),r=new P;Xn(r,{writeUnknownFields:!1},a,i);let l=new Q(r.finish());for(;l.pos<l.len;){let[d,u]=l.tag(),I=l.skip(u,d);s.push({no:d,wireType:u,data:I})}e.$unknown=s}function $s(e,n){if(e===void 0)return[];if(n.fieldKind==="enum"||n.fieldKind==="scalar"){for(let t=e.length-1;t>=0;--t)if(e[t].no==n.number)return[e[t]];return[]}return e.filter(t=>t.no===n.number)}function q(e,n){let t=e.typeName,o=Object.assign(Object.assign({},e),{kind:"field",parent:e.extendee,localName:t}),s=Object.assign(Object.assign({},e.extendee),{fields:[o],members:[o],oneofs:[]}),a=B(s,n!==void 0?{[t]:n}:void 0);return[X(s,a),o,()=>{let i=a[t];if(i===void 0){let r=e.message;return H(r)?F(r.fields[0].scalar,r.fields[0].longAsString):B(r)}return i}]}function lo(e,n){if(e.extendee.typeName!=n.$typeName)throw new Error(`extension ${e.typeName} can only be applied to message ${e.extendee.typeName}`)}var qs=3,ea=2,uo={alwaysEmitImplicit:!1,enumAsInteger:!1,useProtoFieldName:!1};function na(e){return e?Object.assign(Object.assign({},uo),e):uo}function Jn(e,n,t){return ue(X(e,n),na(t))}function Me(e,n,t){var o;let s=Jn(e,n,t);return JSON.stringify(s,null,(o=t?.prettySpaces)!==null&&o!==void 0?o:0)}function ue(e,n){var t;let o=aa(e,n);if(o!==void 0)return o;let s={};for(let a of e.sortedFields){if(!e.isSet(a)){if(a.presence==qs)throw new Error(`cannot encode field ${e.desc.typeName}.${a.name} to JSON: required field not set`);if(!n.alwaysEmitImplicit||a.presence!==ea)continue}let i=go(a,e.get(a),n);i!==void 0&&(s[sa(a,n)]=i)}if(n.registry){let a=new Set;for(let i of(t=e.getUnknown())!==null&&t!==void 0?t:[]){if(a.has(i.no))continue;let r=n.registry.getExtensionFor(e.desc,i.no);if(!r)continue;let l=ro(e.message,r),[d,u]=q(r,l),I=go(u,d.get(u),n);I!==void 0&&(s[r.jsonName]=I)}}return s}function go(e,n,t){switch(e.fieldKind){case"scalar":return He(e,n);case"message":return ue(n,t);case"enum":return Wn(e.enum,n,t.enumAsInteger);case"list":return oa(n,t);case"map":return ta(n,t)}}function ta(e,n){let t=e.field(),o={};switch(t.mapKind){case"scalar":for(let[s,a]of e)o[s]=He(t,a);break;case"message":for(let[s,a]of e)o[s]=ue(a,n);break;case"enum":for(let[s,a]of e)o[s]=Wn(t.enum,a,n.enumAsInteger);break}return n.alwaysEmitImplicit||e.size>0?o:void 0}function oa(e,n){let t=e.field(),o=[];switch(t.listKind){case"scalar":for(let s of e)o.push(He(t,s));break;case"enum":for(let s of e)o.push(Wn(t.enum,s,n.enumAsInteger));break;case"message":for(let s of e)o.push(ue(s,n));break}return n.alwaysEmitImplicit||o.length>0?o:void 0}function Wn(e,n,t){var o;if(typeof n!="number")throw new Error(`cannot encode ${e} to JSON: expected number, got ${A(n)}`);if(e.typeName=="google.protobuf.NullValue")return null;if(t)return n;let s=e.value[n];return(o=s?.name)!==null&&o!==void 0?o:n}function He(e,n){var t,o,s,a,i,r;switch(e.scalar){case c.INT32:case c.SFIXED32:case c.SINT32:case c.FIXED32:case c.UINT32:if(typeof n!="number")throw new Error(`cannot encode ${e} to JSON: ${(t=K(e,n))===null||t===void 0?void 0:t.message}`);return n;case c.FLOAT:case c.DOUBLE:if(typeof n!="number")throw new Error(`cannot encode ${e} to JSON: ${(o=K(e,n))===null||o===void 0?void 0:o.message}`);return isNaN(n)?"NaN":n===Number.POSITIVE_INFINITY?"Infinity":n===Number.NEGATIVE_INFINITY?"-Infinity":n;case c.STRING:if(typeof n!="string")throw new Error(`cannot encode ${e} to JSON: ${(s=K(e,n))===null||s===void 0?void 0:s.message}`);return n;case c.BOOL:if(typeof n!="boolean")throw new Error(`cannot encode ${e} to JSON: ${(a=K(e,n))===null||a===void 0?void 0:a.message}`);return n;case c.UINT64:case c.FIXED64:case c.INT64:case c.SFIXED64:case c.SINT64:if(typeof n!="bigint"&&typeof n!="string")throw new Error(`cannot encode ${e} to JSON: ${(i=K(e,n))===null||i===void 0?void 0:i.message}`);return n.toString();case c.BYTES:if(n instanceof Uint8Array)return It(n);throw new Error(`cannot encode ${e} to JSON: ${(r=K(e,n))===null||r===void 0?void 0:r.message}`)}}function sa(e,n){return n.useProtoFieldName?e.name:e.jsonName}function aa(e,n){if(e.desc.typeName.startsWith("google.protobuf."))switch(e.desc.typeName){case"google.protobuf.Any":return ia(e.message,n);case"google.protobuf.Timestamp":return la(e.message);case"google.protobuf.Duration":return ra(e.message);case"google.protobuf.FieldMask":return ca(e.message);case"google.protobuf.Struct":return mo(e.message);case"google.protobuf.Value":return xn(e.message);case"google.protobuf.ListValue":return bo(e.message);default:if(H(e.desc)){let t=e.desc.fields[0];return He(t,e.get(t))}return}}function ia(e,n){if(e.typeUrl==="")return{};let{registry:t}=n,o,s;if(t&&(o=oo(e,t),o&&(s=t.getMessage(o.$typeName))),!s||!o)throw new Error(`cannot encode message ${e.$typeName} to JSON: "${e.typeUrl}" is not in the type registry`);let a=ue(X(s,o),n);return(s.typeName.startsWith("google.protobuf.")||a===null||Array.isArray(a)||typeof a!="object")&&(a={value:a}),a["@type"]=e.typeUrl,a}function ra(e){if(Number(e.seconds)>315576e6||Number(e.seconds)<-315576e6)throw new Error(`cannot encode message ${e.$typeName} to JSON: value out of range`);let n=e.seconds.toString();if(e.nanos!==0){let t=Math.abs(e.nanos).toString();t="0".repeat(9-t.length)+t,t.substring(3)==="000000"?t=t.substring(0,3):t.substring(6)==="000"&&(t=t.substring(0,6)),n+="."+t,e.nanos<0&&Number(e.seconds)==0&&(n="-"+n)}return n+"s"}function ca(e){return e.paths.map(n=>{if(n.match(/_[0-9]?_/g)||n.match(/[A-Z]/g))throw new Error(`cannot encode message ${e.$typeName} to JSON: lowerCamelCase of path name "`+n+'" is irreversible');return U(n)}).join(",")}function mo(e){let n={};for(let[t,o]of Object.entries(e.fields))n[t]=xn(o);return n}function xn(e){switch(e.kind.case){case"nullValue":return null;case"numberValue":if(!Number.isFinite(e.kind.value))throw new Error(`${e.$typeName} cannot be NaN or Infinity`);return e.kind.value;case"boolValue":return e.kind.value;case"stringValue":return e.kind.value;case"structValue":return mo(e.kind.value);case"listValue":return bo(e.kind.value);default:throw new Error(`${e.$typeName} must have a value`)}}function bo(e){return e.values.map(xn)}function la(e){let n=Number(e.seconds)*1e3;if(n<Date.parse("0001-01-01T00:00:00Z")||n>Date.parse("9999-12-31T23:59:59Z"))throw new Error(`cannot encode message ${e.$typeName} to JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);if(e.nanos<0)throw new Error(`cannot encode message ${e.$typeName} to JSON: nanos must not be negative`);let t="Z";if(e.nanos>0){let o=(e.nanos+1e9).toString().substring(1);o.substring(3)==="000000"?t="."+o.substring(0,3)+"Z":o.substring(6)==="000"?t="."+o.substring(0,6)+"Z":t="."+o+"Z"}return new Date(n).toISOString().replace(".000Z",t)}var po={ignoreUnknownFields:!1};function da(e){return e?Object.assign(Object.assign({},po),e):po}function yo(e,n,t){return Rn(e,ya(n,e.typeName),t)}function Rn(e,n,t){let o=X(e);try{ee(o,n,da(t))}catch(s){throw Pn(s)?new Error(`cannot decode ${s.field()} from JSON: ${s.message}`,{cause:s}):s}return o.message}function ee(e,n,t){var o;if(Ga(e,n,t))return;if(n==null||Array.isArray(n)||typeof n!="object")throw new Error(`cannot decode ${e.desc} from JSON: ${A(n)}`);let s=new Map,a=new Map;for(let i of e.desc.fields)a.set(i.name,i).set(i.jsonName,i);for(let[i,r]of Object.entries(n)){let l=a.get(i);if(l){if(l.oneof){if(r===null&&l.fieldKind=="scalar")continue;let d=s.get(l.oneof);if(d!==void 0)throw new C(l.oneof,`oneof set multiple times by ${d.name} and ${l.name}`);s.set(l.oneof,l)}Io(e,l,r,t)}else{let d;if(i.startsWith("[")&&i.endsWith("]")&&(d=(o=t.registry)===null||o===void 0?void 0:o.getExtension(i.substring(1,i.length-1)))&&d.extendee.typeName===e.desc.typeName){let[u,I,W]=q(d);Io(u,I,r,t),co(e.message,d,W())}if(!d&&!t.ignoreUnknownFields)throw new Error(`cannot decode ${e.desc} from JSON: key "${i}" is unknown`)}}}function Io(e,n,t,o){switch(n.fieldKind){case"scalar":pa(e,n,t);break;case"enum":ba(e,n,t,o);break;case"message":ma(e,n,t,o);break;case"list":ga(e.get(n),t,o);break;case"map":ua(e.get(n),t,o);break}}function ua(e,n,t){if(n===null)return;let o=e.field();if(typeof n!="object"||Array.isArray(n))throw new C(o,"expected object, got "+A(n));for(let[s,a]of Object.entries(n)){if(a===null)throw new C(o,"map value must not be null");let i;switch(o.mapKind){case"message":let l=X(o.message);ee(l,a,t),i=l;break;case"enum":if(i=Fn(o.enum,a,t.ignoreUnknownFields,!0),i===ze)return;break;case"scalar":i=Le(o,a,!0);break}let r=Ia(o.mapKey,s);e.set(r,i)}}function ga(e,n,t){if(n===null)return;let o=e.field();if(!Array.isArray(n))throw new C(o,"expected Array, got "+A(n));for(let s of n){if(s===null)throw new C(o,"list item must not be null");switch(o.listKind){case"message":let a=X(o.message);ee(a,s,t),e.add(a);break;case"enum":let i=Fn(o.enum,s,t.ignoreUnknownFields,!0);i!==ze&&e.add(i);break;case"scalar":e.add(Le(o,s,!0));break}}}function ma(e,n,t,o){if(t===null&&n.message.typeName!="google.protobuf.Value"){e.clear(n);return}let s=e.isSet(n)?e.get(n):X(n.message);ee(s,t,o),e.set(n,s)}function ba(e,n,t,o){let s=Fn(n.enum,t,o.ignoreUnknownFields,!1);s===Ke?e.clear(n):s!==ze&&e.set(n,s)}function pa(e,n,t){let o=Le(n,t,!1);o===Ke?e.clear(n):e.set(n,o)}var ze=Symbol();function Fn(e,n,t,o){if(n===null)return e.typeName=="google.protobuf.NullValue"?0:o?e.values[0].number:Ke;switch(typeof n){case"number":if(Number.isInteger(n))return n;break;case"string":let s=e.values.find(a=>a.name===n);if(s!==void 0)return s.number;if(t)return ze;break}throw new Error(`cannot decode ${e} from JSON: ${A(n)}`)}var Ke=Symbol();function Le(e,n,t){if(n===null)return t?F(e.scalar,!1):Ke;switch(e.scalar){case c.DOUBLE:case c.FLOAT:if(n==="NaN")return NaN;if(n==="Infinity")return Number.POSITIVE_INFINITY;if(n==="-Infinity")return Number.NEGATIVE_INFINITY;if(typeof n=="number"){if(isNaN(n))throw new C(e,"unexpected NaN number");if(!isFinite(n))throw new C(e,"unexpected infinite number");break}if(typeof n=="string"){if(n===""||n.trim().length!==n.length)break;let o=Number(n);if(!isFinite(o))break;return o}break;case c.INT32:case c.FIXED32:case c.SFIXED32:case c.SINT32:case c.UINT32:return Go(n);case c.BYTES:if(typeof n=="string"){if(n==="")return new Uint8Array(0);try{return Se(n)}catch(o){let s=o instanceof Error?o.message:String(o);throw new C(e,s)}}break}return n}function Ia(e,n){switch(e){case c.BOOL:switch(n){case"true":return!0;case"false":return!1}return n;case c.INT32:case c.FIXED32:case c.UINT32:case c.SFIXED32:case c.SINT32:return Go(n);default:return n}}function Go(e){if(typeof e=="string"){if(e===""||e.trim().length!==e.length)return e;let n=Number(e);return Number.isNaN(n)?e:n}return e}function ya(e,n){try{return JSON.parse(e)}catch(t){let o=t instanceof Error?t.message:String(t);throw new Error(`cannot decode message ${n} from JSON: ${o}`,{cause:t})}}function Ga(e,n,t){if(!e.desc.typeName.startsWith("google.protobuf."))return!1;switch(e.desc.typeName){case"google.protobuf.Any":return ha(e.message,n,t),!0;case"google.protobuf.Timestamp":return fa(e.message,n),!0;case"google.protobuf.Duration":return Za(e.message,n),!0;case"google.protobuf.FieldMask":return Aa(e.message,n),!0;case"google.protobuf.Struct":return ho(e.message,n),!0;case"google.protobuf.Value":return En(e.message,n),!0;case"google.protobuf.ListValue":return fo(e.message,n),!0;default:if(H(e.desc)){let o=e.desc.fields[0];return n===null?e.clear(o):e.set(o,Le(o,n,!0)),!0}return!1}}function ha(e,n,t){var o;if(n===null||Array.isArray(n)||typeof n!="object")throw new Error(`cannot decode message ${e.$typeName} from JSON: expected object but got ${A(n)}`);if(Object.keys(n).length==0)return;let s=n["@type"];if(typeof s!="string"||s=="")throw new Error(`cannot decode message ${e.$typeName} from JSON: "@type" is empty`);let a=s.includes("/")?s.substring(s.lastIndexOf("/")+1):s;if(!a.length)throw new Error(`cannot decode message ${e.$typeName} from JSON: "@type" is invalid`);let i=(o=t.registry)===null||o===void 0?void 0:o.getMessage(a);if(!i)throw new Error(`cannot decode message ${e.$typeName} from JSON: ${s} is not in the type registry`);let r=X(i);if(a.startsWith("google.protobuf.")&&Object.prototype.hasOwnProperty.call(n,"value")){let l=n.value;ee(r,l,t)}else{let l=Object.assign({},n);delete l["@type"],ee(r,l,t)}to(r.desc,r.message,e)}function fa(e,n){if(typeof n!="string")throw new Error(`cannot decode message ${e.$typeName} from JSON: ${A(n)}`);let t=n.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);if(!t)throw new Error(`cannot decode message ${e.$typeName} from JSON: invalid RFC 3339 string`);let o=Date.parse(t[1]+"-"+t[2]+"-"+t[3]+"T"+t[4]+":"+t[5]+":"+t[6]+(t[8]?t[8]:"Z"));if(Number.isNaN(o))throw new Error(`cannot decode message ${e.$typeName} from JSON: invalid RFC 3339 string`);if(o<Date.parse("0001-01-01T00:00:00Z")||o>Date.parse("9999-12-31T23:59:59Z"))throw new Error(`cannot decode message ${e.$typeName} from JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);e.seconds=p.parse(o/1e3),e.nanos=0,t[7]&&(e.nanos=parseInt("1"+t[7]+"0".repeat(9-t[7].length))-1e9)}function Za(e,n){if(typeof n!="string")throw new Error(`cannot decode message ${e.$typeName} from JSON: ${A(n)}`);let t=n.match(/^(-?[0-9]+)(?:\.([0-9]+))?s/);if(t===null)throw new Error(`cannot decode message ${e.$typeName} from JSON: ${A(n)}`);let o=Number(t[1]);if(o>315576e6||o<-315576e6)throw new Error(`cannot decode message ${e.$typeName} from JSON: ${A(n)}`);if(e.seconds=p.parse(o),typeof t[2]!="string")return;let s=t[2]+"0".repeat(9-t[2].length);e.nanos=parseInt(s),(o<0||Object.is(o,-0))&&(e.nanos=-e.nanos)}function Aa(e,n){if(typeof n!="string")throw new Error(`cannot decode message ${e.$typeName} from JSON: ${A(n)}`);if(n==="")return;function t(o){if(o.includes("_"))throw new Error(`cannot decode message ${e.$typeName} from JSON: path names must be lowerCamelCase`);let s=o.replace(/[A-Z]/g,a=>"_"+a.toLowerCase());return s[0]==="_"?s.substring(1):s}e.paths=n.split(",").map(t)}function ho(e,n){if(typeof n!="object"||n==null||Array.isArray(n))throw new Error(`cannot decode message ${e.$typeName} from JSON ${A(n)}`);for(let[t,o]of Object.entries(n)){let s=B(Bn);En(s,o),e.fields[t]=s}}function En(e,n){switch(typeof n){case"number":e.kind={case:"numberValue",value:n};break;case"string":e.kind={case:"stringValue",value:n};break;case"boolean":e.kind={case:"boolValue",value:n};break;case"object":if(n===null)e.kind={case:"nullValue",value:Ne.NULL_VALUE};else if(Array.isArray(n)){let t=B(io);fo(t,n),e.kind={case:"listValue",value:t}}else{let t=B(ao);ho(t,n),e.kind={case:"structValue",value:t}}break;default:throw new Error(`cannot decode message ${e.$typeName} from JSON ${A(n)}`)}return e}function fo(e,n){if(!Array.isArray(n))throw new Error(`cannot decode message ${e.$typeName} from JSON ${A(n)}`);for(let t of n){let o=B(Bn);En(o,t),e.values.push(o)}}import b from"chalk";import{program as w}from"commander";import ja from"figlet";import $a from"fs";import qa from"path";import ei from"semver";import ni from"update-notifier";import{confirm as Ja,input as Wa,select as xo}from"@inquirer/prompts";import zn from"chalk";import xa from"fs";function Zo(e,n,...t){if(t.length>0)throw new Error;return e.services[n]}var Vo=V("ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI9CgpDb25zdHJhaW50EgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSJNChJNZXNzYWdlQ29uc3RyYWludHMSEAoIZGlzYWJsZWQYASABKAgSJQoDY2VsGAMgAygLMhguYnVmLnZhbGlkYXRlLkNvbnN0cmFpbnQiJAoQT25lb2ZDb25zdHJhaW50cxIQCghyZXF1aXJlZBgBIAEoCCKoCAoQRmllbGRDb25zdHJhaW50cxIlCgNjZWwYFyADKAsyGC5idWYudmFsaWRhdGUuQ29uc3RyYWludBIQCghyZXF1aXJlZBgZIAEoCBIkCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlEikKBWZsb2F0GAEgASgLMhguYnVmLnZhbGlkYXRlLkZsb2F0UnVsZXNIABIrCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIABIpCgVpbnQzMhgDIAEoCzIYLmJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzSAASKQoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAEisKBnVpbnQzMhgFIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50MzJSdWxlc0gAEisKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAEisKBnNpbnQzMhgHIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50MzJSdWxlc0gAEisKBnNpbnQ2NBgIIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50NjRSdWxlc0gAEi0KB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSAASLQoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIABIvCghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSAASLwoIc2ZpeGVkNjQYDCABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkNjRSdWxlc0gAEicKBGJvb2wYDSABKAsyFy5idWYudmFsaWRhdGUuQm9vbFJ1bGVzSAASKwoGc3RyaW5nGA4gASgLMhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzSAASKQoFYnl0ZXMYDyABKAsyGC5idWYudmFsaWRhdGUuQnl0ZXNSdWxlc0gAEicKBGVudW0YECABKAsyFy5idWYudmFsaWRhdGUuRW51bVJ1bGVzSAASLwoIcmVwZWF0ZWQYEiABKAsyGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlc0gAEiUKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAEiUKA2FueRgUIAEoCzIWLmJ1Zi52YWxpZGF0ZS5BbnlSdWxlc0gAEi8KCGR1cmF0aW9uGBUgASgLMhsuYnVmLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIABIxCgl0aW1lc3RhbXAYFiABKAsyHC5idWYudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAEIGCgR0eXBlIl8KFVByZWRlZmluZWRDb25zdHJhaW50cxIlCgNjZWwYASADKAsyGC5idWYudmFsaWRhdGUuQ29uc3RyYWludEoECBgQGUoECBoQG1ITc2tpcHBlZGlnbm9yZV9lbXB0eSK1FwoKRmxvYXRSdWxlcxJpCgVjb25zdBgBIAEoAkJawkhXClUKC2Zsb2F0LmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEp8BCgJsdBgCIAEoAkKQAcJIjAEKiQEKCGZsb2F0Lmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEq8BCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLvBwoCZ3QYBCABKAJC4AfCSNwHCo0BCghmbG9hdC5ndBqAASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCsMBCgtmbG9hdC5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs0BChVmbG9hdC5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrTAQoMZmxvYXQuZ3RfbHRlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycK3QEKFmZsb2F0Lmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEroICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESdQoCaW4YBiADKAJCacJIZgpkCghmbG9hdC5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ2CgZub3RfaW4YByADKAJCZsJIYwphCgxmbG9hdC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJ1CgZmaW5pdGUYCCABKAhCZcJIYgpgCgxmbG9hdC5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEisKB2V4YW1wbGUYCSADKAJCGsJIFwoVCg1mbG9hdC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLHFwoLRG91YmxlUnVsZXMSagoFY29uc3QYASABKAFCW8JIWApWCgxkb3VibGUuY29uc3QaRnRoaXMgIT0gcnVsZXMuY29uc3QgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSoAEKAmx0GAIgASgBQpEBwkiNAQqKAQoJZG91YmxlLmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErABCgNsdGUYAyABKAFCoAHCSJwBCpkBCgpkb3VibGUubHRlGooBIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS9AcKAmd0GAQgASgBQuUHwkjhBwqOAQoJZG91YmxlLmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKxAEKDGRvdWJsZS5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs4BChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK1AEKDWRvdWJsZS5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwreAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEr8ICgNndGUYBSABKAFCrwjCSKsICpwBCgpkb3VibGUuZ3RlGo0BIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCtMBCg1kb3VibGUuZ3RlX2x0GsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrdAQoXZG91YmxlLmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuMBCg5kb3VibGUuZ3RlX2x0ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK7QEKGGRvdWJsZS5ndGVfbHRlX2V4Y2x1c2l2ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ2CgJpbhgGIAMoAUJqwkhnCmUKCWRvdWJsZS5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ3CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSdgoGZmluaXRlGAggASgIQmbCSGMKYQoNZG91YmxlLmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSLAoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLnFAoKSW50MzJSdWxlcxJpCgVjb25zdBgBIAEoBUJawkhXClUKC2ludDMyLmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEooBCgJsdBgCIAEoBUJ8wkh5CncKCGludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpwBCgNsdGUYAyABKAVCjAHCSIgBCoUBCglpbnQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpcHCgJndBgEIAEoBUKIB8JIhAcKegoIaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrMBCgtpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKuwEKFWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsMBCgxpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCssBChZpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLjBwoDZ3RlGAUgASgFQtMHwkjPBwqIAQoJaW50MzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnUKAmluGAYgAygFQmnCSGYKZAoIaW50MzIuaW4aWCEodGhpcyBpbiBkeW4ocnVsZXMpWydpbiddKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZHluKHJ1bGVzKVsnaW4nXV0pIDogJycSdgoGbm90X2luGAcgAygFQmbCSGMKYQoMaW50MzIubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKwoHZXhhbXBsZRgIIAMoBUIawkgXChUKDWludDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIucUCgpJbnQ2NFJ1bGVzEmkKBWNvbnN0GAEgASgDQlrCSFcKVQoLaW50NjQuY29uc3QaRnRoaXMgIT0gcnVsZXMuY29uc3QgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSigEKAmx0GAIgASgDQnzCSHkKdwoIaW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnAEKA2x0ZRgDIAEoA0KMAcJIiAEKhQEKCWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASlwcKAmd0GAQgASgDQogHwkiEBwp6CghpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKswEKC2ludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq7AQoVaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwwEKDGludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKywEKFmludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEuMHCgNndGUYBSABKANC0wfCSM8HCogBCglpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrCAQoMaW50NjQuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsoBChZpbnQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrSAQoNaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwraAQoXaW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESdQoCaW4YBiADKANCacJIZgpkCghpbnQ2NC5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ2CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAkgAygDQhrCSBcKFQoNaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i+BQKC1VJbnQzMlJ1bGVzEmoKBWNvbnN0GAEgASgNQlvCSFgKVgoMdWludDMyLmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEosBCgJsdBgCIAEoDUJ9wkh6CngKCXVpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgNQo0HwkiJBwp7Cgl1aW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnYKAmluGAYgAygNQmrCSGcKZQoJdWludDMyLmluGlghKHRoaXMgaW4gZHluKHJ1bGVzKVsnaW4nXSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2R5bihydWxlcylbJ2luJ11dKSA6ICcnEncKBm5vdF9pbhgHIAMoDUJnwkhkCmIKDXVpbnQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIsCgdleGFtcGxlGAggAygNQhvCSBgKFgoOdWludDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIvgUCgtVSW50NjRSdWxlcxJqCgVjb25zdBgBIAEoBEJbwkhYClYKDHVpbnQ2NC5jb25zdBpGdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxKLAQoCbHQYAiABKARCfcJIegp4Cgl1aW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnQEKA2x0ZRgDIAEoBEKNAcJIiQEKhgEKCnVpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEpwHCgJndBgEIAEoBEKNB8JIiQcKewoJdWludDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq0AQoMdWludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq8AQoWdWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsQBCg11aW50NjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrMAQoXdWludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEugHCgNndGUYBSABKARC2AfCSNQHCokBCgp1aW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwwEKDXVpbnQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKywEKF3VpbnQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrTAQoOdWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2wEKGHVpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ2CgJpbhgGIAMoBEJqwkhnCmUKCXVpbnQ2NC5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ3CgZub3RfaW4YByADKARCZ8JIZApiCg11aW50NjQubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoBEIbwkgYChYKDnVpbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiL4FAoLU0ludDMyUnVsZXMSagoFY29uc3QYASABKBFCW8JIWApWCgxzaW50MzIuY29uc3QaRnRoaXMgIT0gcnVsZXMuY29uc3QgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSiwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp0BCgNsdGUYAyABKBFCjQHCSIkBCoYBCgpzaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKcBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLoBwoDZ3RlGAUgASgRQtgHwkjUBwqJAQoKc2ludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsMBCg1zaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCssBChdzaW50MzIuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0wEKDnNpbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtsBChhzaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESdgoCaW4YBiADKBFCasJIZwplCglzaW50MzIuaW4aWCEodGhpcyBpbiBkeW4ocnVsZXMpWydpbiddKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZHluKHJ1bGVzKVsnaW4nXV0pIDogJycSdwoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBFCG8JIGAoWCg5zaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i+BQKC1NJbnQ2NFJ1bGVzEmoKBWNvbnN0GAEgASgSQlvCSFgKVgoMc2ludDY0LmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEosBCgJsdBgCIAEoEkJ9wkh6CngKCXNpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgSQo0HwkiJBwp7CglzaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnYKAmluGAYgAygSQmrCSGcKZQoJc2ludDY0LmluGlghKHRoaXMgaW4gZHluKHJ1bGVzKVsnaW4nXSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2R5bihydWxlcylbJ2luJ11dKSA6ICcnEncKBm5vdF9pbhgHIAMoEkJnwkhkCmIKDXNpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIsCgdleGFtcGxlGAggAygSQhvCSBgKFgoOc2ludDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIokVCgxGaXhlZDMyUnVsZXMSawoFY29uc3QYASABKAdCXMJIWQpXCg1maXhlZDMyLmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEowBCgJsdBgCIAEoB0J+wkh7CnkKCmZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASngEKA2x0ZRgDIAEoB0KOAcJIigEKhwEKC2ZpeGVkMzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKhBwoCZ3QYBCABKAdCkgfCSI4HCnwKCmZpeGVkMzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu0HCgNndGUYBSABKAdC3QfCSNkHCooBCgtmaXhlZDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsQBCg5maXhlZDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoYZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrUAQoPZml4ZWQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtwBChlmaXhlZDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEncKAmluGAYgAygHQmvCSGgKZgoKZml4ZWQzMi5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ4CgZub3RfaW4YByADKAdCaMJIZQpjCg5maXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAdCHMJIGQoXCg9maXhlZDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIokVCgxGaXhlZDY0UnVsZXMSawoFY29uc3QYASABKAZCXMJIWQpXCg1maXhlZDY0LmNvbnN0GkZ0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbcnVsZXMuY29uc3RdKSA6ICcnEowBCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASngEKA2x0ZRgDIAEoBkKOAcJIigEKhwEKC2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKhBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu0HCgNndGUYBSABKAZC3QfCSNkHCooBCgtmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsQBCg5maXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoYZml4ZWQ2NC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrUAQoPZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtwBChlmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEncKAmluGAYgAygGQmvCSGgKZgoKZml4ZWQ2NC5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ4CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAZCHMJIGQoXCg9maXhlZDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIpoVCg1TRml4ZWQzMlJ1bGVzEmwKBWNvbnN0GAEgASgPQl3CSFoKWAoOc2ZpeGVkMzIuY29uc3QaRnRoaXMgIT0gcnVsZXMuY29uc3QgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSjQEKAmx0GAIgASgPQn/CSHwKegoLc2ZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgPQpcHwkiTBwp9CgtzZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESeAoCaW4YBiADKA9CbMJIaQpnCgtzZml4ZWQzMi5pbhpYISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ5CgZub3RfaW4YByADKA9CacJIZgpkCg9zZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygPQh3CSBoKGAoQc2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4imhUKDVNGaXhlZDY0UnVsZXMSbAoFY29uc3QYASABKBBCXcJIWgpYCg5zZml4ZWQ2NC5jb25zdBpGdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxKNAQoCbHQYAiABKBBCf8JIfAp6CgtzZml4ZWQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKfAQoDbHRlGAMgASgQQo8BwkiLAQqIAQoMc2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKmBwoCZ3QYBCABKBBClwfCSJMHCn0KC3NmaXhlZDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkNjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkNjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkNjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES8gcKA2d0ZRgFIAEoEELiB8JI3gcKiwEKDHNmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ4CgJpbhgGIAMoEEJswkhpCmcKC3NmaXhlZDY0LmluGlghKHRoaXMgaW4gZHluKHJ1bGVzKVsnaW4nXSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2R5bihydWxlcylbJ2luJ11dKSA6ICcnEnkKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKBBCHcJIGgoYChBzZml4ZWQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKsAQoJQm9vbFJ1bGVzEmgKBWNvbnN0GAEgASgIQlnCSFYKVAoKYm9vbC5jb25zdBpGdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIi4DYKC1N0cmluZ1J1bGVzEmwKBWNvbnN0GAEgASgJQl3CSFoKWAoMc3RyaW5nLmNvbnN0Gkh0aGlzICE9IHJ1bGVzLmNvbnN0ID8gJ3ZhbHVlIG11c3QgZXF1YWwgYCVzYCcuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSfgoDbGVuGBMgASgEQnHCSG4KbAoKc3RyaW5nLmxlbhpedWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKZAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKXAQoHbWF4X2xlbhgDIAEoBEKFAcJIgQEKfwoOc3RyaW5nLm1heF9sZW4abXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSmwEKCWxlbl9ieXRlcxgUIAEoBEKHAcJIgwEKgAEKEHN0cmluZy5sZW5fYnl0ZXMabHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSAhPSBydWxlcy5sZW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKjAQoJbWluX2J5dGVzGAQgASgEQo8BwkiLAQqIAQoQc3RyaW5nLm1pbl9ieXRlcxp0dWludChieXRlcyh0aGlzKS5zaXplKCkpIDwgcnVsZXMubWluX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSogEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJycSjQEKB3BhdHRlcm4YBiABKAlCfMJIeQp3Cg5zdHJpbmcucGF0dGVybhplIXRoaXMubWF0Y2hlcyhydWxlcy5wYXR0ZXJuKSA/ICd2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycShAEKBnByZWZpeBgHIAEoCUJ0wkhxCm8KDXN0cmluZy5wcmVmaXgaXiF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgJXNgJy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSggEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEpABCghjb250YWlucxgJIAEoCUJ+wkh7CnkKD3N0cmluZy5jb250YWlucxpmIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ3ZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpgBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJycSdgoCaW4YCiADKAlCasJIZwplCglzdHJpbmcuaW4aWCEodGhpcyBpbiBkeW4ocnVsZXMpWydpbiddKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZHluKHJ1bGVzKVsnaW4nXV0pIDogJycSdwoGbm90X2luGAsgAygJQmfCSGQKYgoNc3RyaW5nLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEt8BCgVlbWFpbBgMIAEoCELNAcJIyQEKYQoMc3RyaW5nLmVtYWlsEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLnAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLHAQoCaXAYDiABKAhCuAHCSLQBClUKCXN0cmluZy5pcBIgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjQYDyABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY0EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtYBCgRpcHY2GBAgASgIQsUBwkjBAQpcCgtzdHJpbmcuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK/AQoDdXJpGBEgASgIQq8BwkirAQpRCgpzdHJpbmcudXJpEhl2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEmYKB3VyaV9yZWYYEiABKAhCU8JIUApOCg5zdHJpbmcudXJpX3JlZhIZdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVSSRohIXJ1bGVzLnVyaV9yZWYgfHwgdGhpcy5pc1VyaVJlZigpSAASkAIKB2FkZHJlc3MYFSABKAhC/AHCSPgBCoEBCg5zdHJpbmcuYWRkcmVzcxItdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKYAgoEdXVpZBgWIAEoCEKHAsJIgwIKpQEKC3N0cmluZy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS8AEKBXR1dWlkGCEgASgIQt4BwkjaAQpzCgxzdHJpbmcudHV1aWQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASlgIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvgBwkj0AQp4ChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEs8CChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQq8CwkirAgqTAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SNXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS8gEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABKDAgoLaXB2NF9wcmVmaXgYHiABKAhC6wHCSOcBCnUKEnN0cmluZy5pcHY0X3ByZWZpeBIhdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjZfcHJlZml4GB8gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2Nl9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAErUCCg1ob3N0X2FuZF9wb3J0GCAgASgIQpsCwkiXAgqZAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSQXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEqgFChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhguYnVmLnZhbGlkYXRlLktub3duUmVnZXhC8QTCSO0ECvABCiNzdHJpbmcud2VsbF9rbm93bl9yZWdleC5oZWFkZXJfbmFtZRImdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgaGVhZGVyIG5hbWUaoAFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoIWhhcyhydWxlcy5zdHJpY3QpIHx8IHJ1bGVzLnN0cmljdCA/J146P1swLTlhLXpBLVohIyQlJlwnKistLl5ffH5ceDYwXSskJyA6J15bXlx1MDAwMFx1MDAwQVx1MDAwRF0rJCcpCo0BCilzdHJpbmcud2VsbF9rbm93bl9yZWdleC5oZWFkZXJfbmFtZV9lbXB0eRI1dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIEhUVFAgaGVhZGVyIG5hbWUaKXJ1bGVzLndlbGxfa25vd25fcmVnZXggIT0gMSB8fCB0aGlzICE9ICcnCucBCiRzdHJpbmcud2VsbF9rbm93bl9yZWdleC5oZWFkZXJfdmFsdWUSJ3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciB2YWx1ZRqVAXJ1bGVzLndlbGxfa25vd25fcmVnZXggIT0gMiB8fCB0aGlzLm1hdGNoZXMoIWhhcyhydWxlcy5zdHJpY3QpIHx8IHJ1bGVzLnN0cmljdCA/J15bXlx1MDAwMC1cdTAwMDhcdTAwMEEtXHUwMDFGXHUwMDdGXSokJyA6J15bXlx1MDAwMFx1MDAwQVx1MDAwRF0qJCcpSAASDgoGc3RyaWN0GBkgASgIEiwKB2V4YW1wbGUYIiADKAlCG8JIGAoWCg5zdHJpbmcuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgwKCndlbGxfa25vd24ivxAKCkJ5dGVzUnVsZXMSZgoFY29uc3QYASABKAxCV8JIVApSCgtieXRlcy5jb25zdBpDdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxJ4CgNsZW4YDSABKARCa8JIaApmCglieXRlcy5sZW4aWXVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5sZW5dKSA6ICcnEpABCgdtaW5fbGVuGAIgASgEQn/CSHwKegoNYnl0ZXMubWluX2xlbhppdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9sZW5dKSA6ICcnEogBCgdtYXhfbGVuGAMgASgEQnfCSHQKcgoNYnl0ZXMubWF4X2xlbhphdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJxKQAQoHcGF0dGVybhgEIAEoCUJ/wkh8CnoKDWJ5dGVzLnBhdHRlcm4aaSFzdHJpbmcodGhpcykubWF0Y2hlcyhydWxlcy5wYXR0ZXJuKSA/ICd2YWx1ZSBtdXN0IG1hdGNoIHJlZ2V4IHBhdHRlcm4gYCVzYCcuZm9ybWF0KFtydWxlcy5wYXR0ZXJuXSkgOiAnJxKBAQoGcHJlZml4GAUgASgMQnHCSG4KbAoMYnl0ZXMucHJlZml4GlwhdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggJXgnLmZvcm1hdChbcnVsZXMucHJlZml4XSkgOiAnJxJ/CgZzdWZmaXgYBiABKAxCb8JIbApqCgxieXRlcy5zdWZmaXgaWiF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggJXgnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxKDAQoIY29udGFpbnMYByABKAxCccJIbgpsCg5ieXRlcy5jb250YWlucxpaIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ3ZhbHVlIGRvZXMgbm90IGNvbnRhaW4gJXgnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpcBCgJpbhgIIAMoDEKKAcJIhgEKgwEKCGJ5dGVzLmluGndkeW4ocnVsZXMpWydpbiddLnNpemUoKSA+IDAgJiYgISh0aGlzIGluIGR5bihydWxlcylbJ2luJ10pID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtkeW4ocnVsZXMpWydpbiddXSkgOiAnJxJ2CgZub3RfaW4YCSADKAxCZsJIYwphCgxieXRlcy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLrAQoCaXAYCiABKAhC3AHCSNgBCnQKCGJ5dGVzLmlwEiB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5AEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS5QEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biKvAwoJRW51bVJ1bGVzEmgKBWNvbnN0GAEgASgFQlnCSFYKVAoKZW51bS5jb25zdBpGdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxIUCgxkZWZpbmVkX29ubHkYAiABKAgSdAoCaW4YAyADKAVCaMJIZQpjCgdlbnVtLmluGlghKHRoaXMgaW4gZHluKHJ1bGVzKVsnaW4nXSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2R5bihydWxlcylbJ2luJ11dKSA6ICcnEnUKBm5vdF9pbhgEIAMoBUJlwkhiCmAKC2VudW0ubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIoEECg1SZXBlYXRlZFJ1bGVzEp4BCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJycSogEKCW1heF9pdGVtcxgCIAEoBEKOAcJIigEKhwEKEnJlcGVhdGVkLm1heF9pdGVtcxpxdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfaXRlbXMgPyAndmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAlcyBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1heF9pdGVtc10pIDogJycScAoGdW5pcXVlGAMgASgIQmDCSF0KWwoPcmVwZWF0ZWQudW5pcXVlEihyZXBlYXRlZCB2YWx1ZSBtdXN0IGNvbnRhaW4gdW5pcXVlIGl0ZW1zGh4hcnVsZXMudW5pcXVlIHx8IHRoaXMudW5pcXVlKCkSLQoFaXRlbXMYBCABKAsyHi5idWYudmFsaWRhdGUuRmllbGRDb25zdHJhaW50cyoJCOgHEICAgIACIpYDCghNYXBSdWxlcxKPAQoJbWluX3BhaXJzGAEgASgEQnzCSHkKdwoNbWFwLm1pbl9wYWlycxpmdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbGVhc3QgJWQgZW50cmllcycuZm9ybWF0KFtydWxlcy5taW5fcGFpcnNdKSA6ICcnEo4BCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJxIsCgRrZXlzGAQgASgLMh4uYnVmLnZhbGlkYXRlLkZpZWxkQ29uc3RyYWludHMSLgoGdmFsdWVzGAUgASgLMh4uYnVmLnZhbGlkYXRlLkZpZWxkQ29uc3RyYWludHMqCQjoBxCAgICAAiImCghBbnlSdWxlcxIKCgJpbhgCIAMoCRIOCgZub3RfaW4YAyADKAki9RYKDUR1cmF0aW9uUnVsZXMShwEKBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQl3CSFoKWAoOZHVyYXRpb24uY29uc3QaRnRoaXMgIT0gcnVsZXMuY29uc3QgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtydWxlcy5jb25zdF0pIDogJycSqAEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQn/CSHwKegoLZHVyYXRpb24ubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASugEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASwQcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQpcHwkiTBwp9CgtkdXJhdGlvbi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDmR1cmF0aW9uLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD2R1cmF0aW9uLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEo0ICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESkwEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQmzCSGkKZwoLZHVyYXRpb24uaW4aWCEodGhpcyBpbiBkeW4ocnVsZXMpWydpbiddKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZHluKHJ1bGVzKVsnaW4nXV0pIDogJycSlAEKBm5vdF9pbhgIIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJpwkhmCmQKD2R1cmF0aW9uLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEkkKB2V4YW1wbGUYCSADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CHcJIGgoYChBkdXJhdGlvbi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiL4FwoOVGltZXN0YW1wUnVsZXMSiQEKBWNvbnN0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEJewkhbClkKD3RpbWVzdGFtcC5jb25zdBpGdGhpcyAhPSBydWxlcy5jb25zdCA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW3J1bGVzLmNvbnN0XSkgOiAnJxKrAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQoABwkh9CnsKDHRpbWVzdGFtcC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK8AQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEmwKBmx0X25vdxgHIAEoCEJawkhXClUKEHRpbWVzdGFtcC5sdF9ub3caQShydWxlcy5sdF9ub3cgJiYgdGhpcyA+IG5vdykgPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbm93JyA6ICcnSAASxwcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEpMICgNndGUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQucHwkjjBwqMAQoNdGltZXN0YW1wLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsYBChB0aW1lc3RhbXAuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs4BChp0aW1lc3RhbXAuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1gEKEXRpbWVzdGFtcC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt4BCht0aW1lc3RhbXAuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESbwoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIARK4AQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQowBwkiIAQqFAQoQdGltZXN0YW1wLndpdGhpbhpxdGhpcyA8IG5vdy1ydWxlcy53aXRoaW4gfHwgdGhpcyA+IG5vdytydWxlcy53aXRoaW4gPyAndmFsdWUgbXVzdCBiZSB3aXRoaW4gJXMgb2Ygbm93Jy5mb3JtYXQoW3J1bGVzLndpdGhpbl0pIDogJycSSwoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iOQoKVmlvbGF0aW9ucxIrCgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvbiKlAQoJVmlvbGF0aW9uEiYKBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIlCgRydWxlGAYgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aBIVCg1jb25zdHJhaW50X2lkGAIgASgJEg8KB21lc3NhZ2UYAyABKAkSDwoHZm9yX2tleRgEIAEoCEoECAEQAlIKZmllbGRfcGF0aCI9CglGaWVsZFBhdGgSMAoIZWxlbWVudHMYASADKAsyHi5idWYudmFsaWRhdGUuRmllbGRQYXRoRWxlbWVudCLpAgoQRmllbGRQYXRoRWxlbWVudBIUCgxmaWVsZF9udW1iZXIYASABKAUSEgoKZmllbGRfbmFtZRgCIAEoCRI+CgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPAoIa2V5X3R5cGUYBCABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI+Cgp2YWx1ZV90eXBlGAUgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSDwoFaW5kZXgYBiABKARIABISCghib29sX2tleRgHIAEoCEgAEhEKB2ludF9rZXkYCCABKANIABISCgh1aW50X2tleRgJIAEoBEgAEhQKCnN0cmluZ19rZXkYCiABKAlIAEILCglzdWJzY3JpcHQqhwEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIZChVJR05PUkVfSUZfVU5QT1BVTEFURUQQARIbChdJR05PUkVfSUZfREVGQVVMVF9WQUxVRRACEhEKDUlHTk9SRV9BTFdBWVMQAyoaSUdOT1JFX0VNUFRZSUdOT1JFX0RFRkFVTFQqbgoKS25vd25SZWdleBIbChdLTk9XTl9SRUdFWF9VTlNQRUNJRklFRBAAEiAKHEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX05BTUUQARIhCh1LTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9WQUxVRRACOlwKB21lc3NhZ2USHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYhwkgASgLMiAuYnVmLnZhbGlkYXRlLk1lc3NhZ2VDb25zdHJhaW50c1IHbWVzc2FnZTpUCgVvbmVvZhIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYhwkgASgLMh4uYnVmLnZhbGlkYXRlLk9uZW9mQ29uc3RyYWludHNSBW9uZW9mOlQKBWZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiHCSABKAsyHi5idWYudmFsaWRhdGUuRmllbGRDb25zdHJhaW50c1IFZmllbGQ6YwoKcHJlZGVmaW5lZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYiAkgASgLMiMuYnVmLnZhbGlkYXRlLlByZWRlZmluZWRDb25zdHJhaW50c1IKcHJlZGVmaW5lZEJuChJidWlsZC5idWYudmFsaWRhdGVCDVZhbGlkYXRlUHJvdG9QAVpHYnVmLmJ1aWxkL2dlbi9nby9idWZidWlsZC9wcm90b3ZhbGlkYXRlL3Byb3RvY29sYnVmZmVycy9nby9idWYvdmFsaWRhdGU",[T,Ye,Ot]);var Co=V("ChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkiVAoESHR0cBIjCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGUSJwofZnVsbHlfZGVjb2RlX3Jlc2VydmVkX2V4cGFuc2lvbhgCIAEoCCKBAgoISHR0cFJ1bGUSEAoIc2VsZWN0b3IYASABKAkSDQoDZ2V0GAIgASgJSAASDQoDcHV0GAMgASgJSAASDgoEcG9zdBgEIAEoCUgAEhAKBmRlbGV0ZRgFIAEoCUgAEg8KBXBhdGNoGAYgASgJSAASLwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAEgwKBGJvZHkYByABKAkSFQoNcmVzcG9uc2VfYm9keRgMIAEoCRIxChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZUIJCgdwYXR0ZXJuIi8KEUN1c3RvbUh0dHBQYXR0ZXJuEgwKBGtpbmQYASABKAkSDAoEcGF0aBgCIAEoCUJqCg5jb20uZ29vZ2xlLmFwaUIJSHR0cFByb3RvUAFaQWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpL2Fubm90YXRpb25zO2Fubm90YXRpb25z+AEBogIER0FQSWIGcHJvdG8z");var Xo=V("Chxnb29nbGUvYXBpL2Fubm90YXRpb25zLnByb3RvEgpnb29nbGUuYXBpOksKBGh0dHASHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxiwyrwiIAEoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBGh0dHBCbgoOY29tLmdvb2dsZS5hcGlCEEFubm90YXRpb25zUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzM",[Co,T]);var So=V("Ch1nb29nbGUvYXBpL2xhdW5jaF9zdGFnZS5wcm90bxIKZ29vZ2xlLmFwaSqMAQoLTGF1bmNoU3RhZ2USHAoYTEFVTkNIX1NUQUdFX1VOU1BFQ0lGSUVEEAASEQoNVU5JTVBMRU1FTlRFRBAGEg0KCVBSRUxBVU5DSBAHEhAKDEVBUkxZX0FDQ0VTUxABEgkKBUFMUEhBEAISCAoEQkVUQRADEgYKAkdBEAQSDgoKREVQUkVDQVRFRBAFQloKDmNvbS5nb29nbGUuYXBpQhBMYXVuY2hTdGFnZVByb3RvUAFaLWdvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvYXBpO2FwaaICBEdBUEliBnByb3RvMw");var Bo=V("Chdnb29nbGUvYXBpL2NsaWVudC5wcm90bxIKZ29vZ2xlLmFwaSK+AQoWQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxIeChJyZWZlcmVuY2VfZG9jc191cmkYASABKAlCAhgBEjoKDGRlc3RpbmF0aW9ucxgCIAMoDjIkLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeURlc3RpbmF0aW9uEkgKGnNlbGVjdGl2ZV9nYXBpY19nZW5lcmF0aW9uGAMgASgLMiQuZ29vZ2xlLmFwaS5TZWxlY3RpdmVHYXBpY0dlbmVyYXRpb24i+wMKFUNsaWVudExpYnJhcnlTZXR0aW5ncxIPCgd2ZXJzaW9uGAEgASgJEi0KDGxhdW5jaF9zdGFnZRgCIAEoDjIXLmdvb2dsZS5hcGkuTGF1bmNoU3RhZ2USGgoScmVzdF9udW1lcmljX2VudW1zGAMgASgIEi8KDWphdmFfc2V0dGluZ3MYFSABKAsyGC5nb29nbGUuYXBpLkphdmFTZXR0aW5ncxItCgxjcHBfc2V0dGluZ3MYFiABKAsyFy5nb29nbGUuYXBpLkNwcFNldHRpbmdzEi0KDHBocF9zZXR0aW5ncxgXIAEoCzIXLmdvb2dsZS5hcGkuUGhwU2V0dGluZ3MSMwoPcHl0aG9uX3NldHRpbmdzGBggASgLMhouZ29vZ2xlLmFwaS5QeXRob25TZXR0aW5ncxIvCg1ub2RlX3NldHRpbmdzGBkgASgLMhguZ29vZ2xlLmFwaS5Ob2RlU2V0dGluZ3MSMwoPZG90bmV0X3NldHRpbmdzGBogASgLMhouZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncxIvCg1ydWJ5X3NldHRpbmdzGBsgASgLMhguZ29vZ2xlLmFwaS5SdWJ5U2V0dGluZ3MSKwoLZ29fc2V0dGluZ3MYHCABKAsyFi5nb29nbGUuYXBpLkdvU2V0dGluZ3MiqAMKClB1Ymxpc2hpbmcSMwoPbWV0aG9kX3NldHRpbmdzGAIgAygLMhouZ29vZ2xlLmFwaS5NZXRob2RTZXR0aW5ncxIVCg1uZXdfaXNzdWVfdXJpGGUgASgJEhkKEWRvY3VtZW50YXRpb25fdXJpGGYgASgJEhYKDmFwaV9zaG9ydF9uYW1lGGcgASgJEhQKDGdpdGh1Yl9sYWJlbBhoIAEoCRIeChZjb2Rlb3duZXJfZ2l0aHViX3RlYW1zGGkgAygJEhYKDmRvY190YWdfcHJlZml4GGogASgJEjsKDG9yZ2FuaXphdGlvbhhrIAEoDjIlLmdvb2dsZS5hcGkuQ2xpZW50TGlicmFyeU9yZ2FuaXphdGlvbhI7ChBsaWJyYXJ5X3NldHRpbmdzGG0gAygLMiEuZ29vZ2xlLmFwaS5DbGllbnRMaWJyYXJ5U2V0dGluZ3MSKQohcHJvdG9fcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG4gASgJEigKIHJlc3RfcmVmZXJlbmNlX2RvY3VtZW50YXRpb25fdXJpGG8gASgJIuMBCgxKYXZhU2V0dGluZ3MSFwoPbGlicmFyeV9wYWNrYWdlGAEgASgJEkwKE3NlcnZpY2VfY2xhc3NfbmFtZXMYAiADKAsyLy5nb29nbGUuYXBpLkphdmFTZXR0aW5ncy5TZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EjIKBmNvbW1vbhgDIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxo4ChZTZXJ2aWNlQ2xhc3NOYW1lc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiQQoLQ3BwU2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzIkEKC1BocFNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncyL0AQoOUHl0aG9uU2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzEk4KFWV4cGVyaW1lbnRhbF9mZWF0dXJlcxgCIAEoCzIvLmdvb2dsZS5hcGkuUHl0aG9uU2V0dGluZ3MuRXhwZXJpbWVudGFsRmVhdHVyZXMaXgoURXhwZXJpbWVudGFsRmVhdHVyZXMSHQoVcmVzdF9hc3luY19pb19lbmFibGVkGAEgASgIEicKH3Byb3RvYnVmX3B5dGhvbmljX3R5cGVzX2VuYWJsZWQYAiABKAgiQgoMTm9kZVNldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncyKqAwoORG90bmV0U2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzEkkKEHJlbmFtZWRfc2VydmljZXMYAiADKAsyLy5nb29nbGUuYXBpLkRvdG5ldFNldHRpbmdzLlJlbmFtZWRTZXJ2aWNlc0VudHJ5EksKEXJlbmFtZWRfcmVzb3VyY2VzGAMgAygLMjAuZ29vZ2xlLmFwaS5Eb3RuZXRTZXR0aW5ncy5SZW5hbWVkUmVzb3VyY2VzRW50cnkSGQoRaWdub3JlZF9yZXNvdXJjZXMYBCADKAkSIAoYZm9yY2VkX25hbWVzcGFjZV9hbGlhc2VzGAUgAygJEh4KFmhhbmR3cml0dGVuX3NpZ25hdHVyZXMYBiADKAkaNgoUUmVuYW1lZFNlcnZpY2VzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo3ChVSZW5hbWVkUmVzb3VyY2VzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgxSdWJ5U2V0dGluZ3MSMgoGY29tbW9uGAEgASgLMiIuZ29vZ2xlLmFwaS5Db21tb25MYW5ndWFnZVNldHRpbmdzIr8BCgpHb1NldHRpbmdzEjIKBmNvbW1vbhgBIAEoCzIiLmdvb2dsZS5hcGkuQ29tbW9uTGFuZ3VhZ2VTZXR0aW5ncxJFChByZW5hbWVkX3NlcnZpY2VzGAIgAygLMisuZ29vZ2xlLmFwaS5Hb1NldHRpbmdzLlJlbmFtZWRTZXJ2aWNlc0VudHJ5GjYKFFJlbmFtZWRTZXJ2aWNlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEizwIKDk1ldGhvZFNldHRpbmdzEhAKCHNlbGVjdG9yGAEgASgJEjwKDGxvbmdfcnVubmluZxgCIAEoCzImLmdvb2dsZS5hcGkuTWV0aG9kU2V0dGluZ3MuTG9uZ1J1bm5pbmcSHQoVYXV0b19wb3B1bGF0ZWRfZmllbGRzGAMgAygJGs0BCgtMb25nUnVubmluZxI1ChJpbml0aWFsX3BvbGxfZGVsYXkYASABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SHQoVcG9sbF9kZWxheV9tdWx0aXBsaWVyGAIgASgCEjEKDm1heF9wb2xsX2RlbGF5GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEjUKEnRvdGFsX3BvbGxfdGltZW91dBgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIrChhTZWxlY3RpdmVHYXBpY0dlbmVyYXRpb24SDwoHbWV0aG9kcxgBIAMoCSqjAQoZQ2xpZW50TGlicmFyeU9yZ2FuaXphdGlvbhIrCidDTElFTlRfTElCUkFSWV9PUkdBTklaQVRJT05fVU5TUEVDSUZJRUQQABIJCgVDTE9VRBABEgcKA0FEUxACEgoKBlBIT1RPUxADEg8KC1NUUkVFVF9WSUVXEAQSDAoIU0hPUFBJTkcQBRIHCgNHRU8QBhIRCg1HRU5FUkFUSVZFX0FJEAcqZwoYQ2xpZW50TGlicmFyeURlc3RpbmF0aW9uEioKJkNMSUVOVF9MSUJSQVJZX0RFU1RJTkFUSU9OX1VOU1BFQ0lGSUVEEAASCgoGR0lUSFVCEAoSEwoPUEFDS0FHRV9NQU5BR0VSEBQ6SgoQbWV0aG9kX3NpZ25hdHVyZRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGJsIIAMoCVIPbWV0aG9kU2lnbmF0dXJlOkMKDGRlZmF1bHRfaG9zdBIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiZCCABKAlSC2RlZmF1bHRIb3N0OkMKDG9hdXRoX3Njb3BlcxIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiaCCABKAlSC29hdXRoU2NvcGVzOkQKC2FwaV92ZXJzaW9uEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGMG6q/oBIAEoCVIKYXBpVmVyc2lvbkJpCg5jb20uZ29vZ2xlLmFwaUILQ2xpZW50UHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnOiAgRHQVBJYgZwcm90bzM",[So,T,Ye]);var we=V("Cittb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9wbHVnaW5zLnByb3RvEh1tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MSKWAQoTVXBsb2FkUGx1Z2luUmVxdWVzdBI7CghtYW5pZmVzdBgBIAEoCzInLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk1hbmlmZXN0SAASMwoEZmlsZRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAEINCgRkYXRhEgW6SAIIASIWChRVcGxvYWRQbHVnaW5SZXNwb25zZSJPCgRGaWxlEisKBHBhdGgYASABKAlCHbpIGnIYEAIYgCAyEV5bXi9dKyhcL1teL10rKSokEhoKBGRhdGEYAiABKAxCDLpICXoHEAEYgLSJEyKIEAoITWFuaWZlc3QSLQoEbmFtZRgBIAEoCUIfukgcchoQARhkMhReW18kYS16XVtfJGEtejAtOV0qJBLUAQoHdmVyc2lvbhgCIAEoCULCAbpIvgFyuwEQBRiWATKzAV4oMHxbMS05XVxkKilcLigwfFsxLTldXGQqKVwuKDB8WzEtOV1cZCopKD86LSgoPzowfFsxLTldXGQqfFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XC4oPzowfFsxLTldXGQqfFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcKyhbMC05YS16QS1aLV0rKD86XC5bMC05YS16QS1aLV0rKSopKT8kEhgKBWxhYmVsGAMgASgJQgm6SAZyBBABGGQSHwoLZGVzY3JpcHRpb24YBCABKAlCCrpIB3IFEAEY+gESHgoMb3JnYW5pemF0aW9uGAUgASgJQgi6SAVyA7ABARJYCghob21lcGFnZRgGIAEoCUJBukg+2AEBcjkQCxiAIDIyXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcLlthLXpBLVpdezIsfSkoPzovLiopPyRIAIgBARJaCgpyZXBvc2l0b3J5GAcgASgJQkG6SD7YAQFyORALGIAgMjJeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlwuW2EtekEtWl17Mix9KSg/Oi8uKik/JEgBiAEBEtkBCgRidWdzGAggASgJQsUBukjBAboBugEKEnZhbGlkX2VtYWlsX29yX3VybBIhYnVncyBtdXN0IGJlIGEgdmFsaWQgZW1haWwgb3IgVVJMGoABc2l6ZSh0aGlzKSA+PSAyICYmIHNpemUodGhpcykgPD0gNDA5NiAmJiAodGhpcy5pc0VtYWlsKCkgfHwgdGhpcy5tYXRjaGVzKCdeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlxcLlthLXpBLVpdezIsfSkoPzovLiopPyQnKSnYAQFIAogBARIhCgZhdXRob3IYCSABKAlCDLpICdgBAXIEEAEYZEgDiAEBEmUKBGxvZ28YCiABKAlCUrpIT9gBAXJKEAIYgCAyQ14oW14vXSsoL1teL10rKSopXC4oZ2lmfGpwZ3xqcGVnfGpmaWZ8cGpwZWd8cGpwfHBuZ3xzdmd8d2VicHxhdmlmKSRIBIgBARI7CglleGVjdXRvcnMYCyABKAlCKLpIJXIjEAIYgCAyHF4oW14vXSsoL1teL10rKSopXC4obWpzfGpzKSQSRwoNY29uZmlndXJhdG9ycxgMIAEoCUIrukgo2AEBciMQAhiAIDIcXihbXi9dKygvW14vXSspKilcLihtanN8anMpJEgFiAEBEjIKBmFzc2V0cxgNIAEoCUIdukgachgQAhiAIDIRXlteL10rKFwvW14vXSspKiRIBogBARIvCgNjZG4YDiABKAlCHbpIGnIYEAIYgCAyEV5bXi9dKyhcL1teL10rKSokSAeIAQESqAEKCHZlcnRpY2VzGA8gAygLMiUubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVmVydGV4Qm+6SGy6AWIKE3ZlcnRleF91bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiZ0aGlzLm1hcCh2ZXJ0ZXgsIHZlcnRleC5uYW1lKS51bmlxdWUoKZIBBAgBEGQSnwIKDXBsdWdpbl9vYXV0aDIYECADKAsyLC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5PYXV0aDJTZXJ2aWNlQtkBukjVAboBbQogcGx1Z2luX29hdXRoMi5vYXV0aF91bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiR0aGlzLm1hcChvYXV0aCwgb2F1dGgubmFtZSkudW5pcXVlKCmSAWIIABAUIly6AVkKHnBsdWdpbl9vYXV0aDIub2F1dGgyLmNsaWVudF9pZBIiVGhlIGNsaWVudF9pZCBwcm9wZXJ0eSBtdXN0IGJlIHNldBoTaGFzKHRoaXMuY2xpZW50X2lkKRK7AQoQcGx1Z2luX3ZhcmlhYmxlcxgRIAMoCzIuLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLlZhcmlhYmxlU2VydmljZUJxukhuugFkChF2YXJzX3VuaXF1ZV9uYW1lcxIjYSBuYW1lIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UaKnRoaXMubWFwKHZhcmlhYmxlLCB2YXJpYWJsZS5uYW1lKS51bmlxdWUoKZIBBAgAEGQSqgEKC3BsdWdpbl9tdGxzGBIgAygLMioubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuTVRMU1NlcnZpY2VCabpIZroBXAoRbXRsc191bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiJ0aGlzLm1hcChtdGxzLCBtdGxzLm5hbWUpLnVuaXF1ZSgpkgEECAAQFEILCglfaG9tZXBhZ2VCDQoLX3JlcG9zaXRvcnlCBwoFX2J1Z3NCCQoHX2F1dGhvckIHCgVfbG9nb0IQCg5fY29uZmlndXJhdG9yc0IJCgdfYXNzZXRzQgYKBF9jZG4ixg0KBlZlcnRleBItCgRuYW1lGAEgASgJQh+6SBxyGhABGGQyFF5bXyRhLXpdW18kYS16MC05XSokEhgKBWxhYmVsGAIgASgJQgm6SAZyBBABGGQSJwoLZGVzY3JpcHRpb24YAyABKAlCDbpICtgBAXIFEAEY+gFIAIgBARJlCgRsb2dvGAQgASgJQlK6SE/YAQFyShACGIAgMkNeKFteL10rKC9bXi9dKykqKVwuKGdpZnxqcGd8anBlZ3xqZmlmfHBqcGVnfHBqcHxwbmd8c3ZnfHdlYnB8YXZpZikkSAGIAQESSAoEdHlwZRgFIAEoDjIwLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLlZlcnRleC5WZXJ0ZXhUeXBlQgi6SAWCAQIgABIyCgZjb25maWcYBiABKAlCHbpIGnIYEAUYgCAyEV4oW14vXSsoL1teL10rKSopSAKIAQESNgoIbWV0YWRhdGEYByABKAlCJLpIIXIfEAUYgCAyGF4oW14vXSsoL1teL10rKSopXC5qc29uJBIUCgxjb25maWd1cmF0b3IYCCABKAgStAEKCXZhcmlhYmxlcxgJIAMoCzIuLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLlZhcmlhYmxlU2VydmljZUJxukhuugFkChF2YXJzX3VuaXF1ZV9uYW1lcxIjYSBuYW1lIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UaKnRoaXMubWFwKHZhcmlhYmxlLCB2YXJpYWJsZS5uYW1lKS51bmlxdWUoKZIBBAgAEGQSowEKBG10bHMYCiADKAsyKi5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5NVExTU2VydmljZUJpukhmugFcChFtdGxzX3VuaXF1ZV9uYW1lcxIjYSBuYW1lIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UaInRoaXMubWFwKG10bHMsIG10bHMubmFtZSkudW5pcXVlKCmSAQQIABBkEsABCgtjb2RlX29hdXRoMhgLIAMoCzIwLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkNvZGVCaW5kaW5nQnm6SHa6AWwKH3ZlcnRleC5jb2RlX29hdXRoMi51bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiR0aGlzLm1hcChvYXV0aCwgb2F1dGgubmFtZSkudW5pcXVlKCmSAQQIABAUEvICCgZvYXV0aDIYDCADKAsyLC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5PYXV0aDJTZXJ2aWNlQrMCukivAroBZwoadmVydGV4Lm9hdXRoMi51bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiR0aGlzLm1hcChvYXV0aCwgb2F1dGgubmFtZSkudW5pcXVlKCmSAcEBCAAQFCK6AboBtgEKIHZlcnRleC5vYXV0aDIuY2xpZW50X2lkX2FuZF9jb2RlElFUaGUgY2xpZW50X2lkIGFuZCB0aGUgY29kZSBwcm9wZXJ0eSBtYXkgbm90IGJlIHNldCBhcyB3ZWxsIGFzIHRoZSBjb2RlIGdyYW50IHR5cGUaPyFoYXModGhpcy5jbGllbnRfaWQpICYmICFoYXModGhpcy5jb2RlKSAmJiB0aGlzLmdyYW50X3R5cGUgIT0gMSKaAQoKVmVydGV4VHlwZRIbChdWRVJURVhfVFlQRV9VTlNQRUNJRklFRBAAEhYKElZFUlRFWF9UWVBFX0FDVElPThABEhcKE1ZFUlRFWF9UWVBFX0JST1dTRVIQAhIcChhWRVJURVhfVFlQRV9DUk9OX1RSSUdHRVIQAxIgChxWRVJURVhfVFlQRV9FWFRFUk5BTF9UUklHR0VSEAQ6wAG6SLwBGrkBCh92ZXJ0ZXgub2F1dGgyX2FuZF9jb2RlX2JpbmRpbmdzEkVUaGUgbmFtZXMgb2YgdGhlIG9hdXRoMiBzZXJ2aWNlcyBhbmQgdGhlIGNvZGUgYmluZGluZ3MgbXVzdCBiZSB1bmlxdWUaTyh0aGlzLm9hdXRoMi5tYXAodmFsLCB2YWwubmFtZSkgKyB0aGlzLmNvZGVfb2F1dGgyLm1hcCh2YWwsIHZhbC5uYW1lKSkudW5pcXVlKClCDgoMX2Rlc2NyaXB0aW9uQgcKBV9sb2dvQgkKB19jb25maWcixQEKC01UTFNTZXJ2aWNlEi0KBG5hbWUYASABKAlCH7pIHHIaEAEYZDIUXltfJGEtel1bXyRhLXowLTldKiQSIAoFbGFiZWwYAiABKAlCDLpICdgBAXIEEAEYZEgAiAEBEicKC2Rlc2NyaXB0aW9uGAMgASgJQg26SArYAQFyBRABGPoBSAGIAQESFQoIb3B0aW9uYWwYBCABKAhIAogBAUIICgZfbGFiZWxCDgoMX2Rlc2NyaXB0aW9uQgsKCV9vcHRpb25hbCLkAgoPVmFyaWFibGVTZXJ2aWNlEi0KBG5hbWUYASABKAlCH7pIHHIaEAEYZDIUXltfJGEtel1bXyRhLXowLTldKiQSHQoFbGFiZWwYAiABKAlCCbpIBnIEEAEYZEgAiAEBEicKC2Rlc2NyaXB0aW9uGAMgASgJQg26SArYAQFyBRABGPoBSAGIAQESSwoEdHlwZRgEIAEoDjIzLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLlZhcmlhYmxlU2VydmljZS5UeXBlQgi6SAWCAQIgABIVCghvcHRpb25hbBgFIAEoCEgCiAEBIk8KBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEg8KC1RZUEVfU0VDUkVUEAESDwoLVFlQRV9TVFJJTkcQAhIPCgtUWVBFX1NXSVRDSBADQggKBl9sYWJlbEIOCgxfZGVzY3JpcHRpb25CCwoJX29wdGlvbmFsIugMCg1PYXV0aDJTZXJ2aWNlEi0KBG5hbWUYASABKAlCH7pIHHIaEAEYZDIUXltfJGEtel1bXyRhLXowLTldKiQSIAoFbGFiZWwYAiABKAlCDLpICdgBAXIEEAEYZEgAiAEBEicKC2Rlc2NyaXB0aW9uGAMgASgJQg26SArYAQFyBRABGPoBSAGIAQESTAoKZ3JhbnRfdHlwZRgEIAEoDjIuLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkdyYW50VHlwZUIIukgFggECIAASJQoGc2NvcGVzGAUgAygJQhW6SBKSAQ8IARD0AxgBIgZyBBABGGQSVAoLYXV0aF9tZXRob2QYBiABKA4yLS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5PYXV0aDJBdXRoVHlwZUILukgI2AEBggECIABIAogBARJLCgNhbGcYByABKA4yLC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Qcml2YXRlS2V5QWxnQgu6SAjYAQGCAQIgAEgDiAEBEiUKCWNsaWVudF9pZBgIIAEoCUINukgK2AEBcgUQARj6AUgEiAEBElYKDnRva2VuX2VuZHBvaW50GAkgASgJQj66SDtyORALGIAgMjJeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlwuW2EtekEtWl17Mix9KSg/Oi8uKik/JBI8CgRjb2RlGAogASgLMikubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyQ29kZUgFiAEBEhUKCG9wdGlvbmFsGAsgASgISAaIAQE6mge6SJYHGucBChJvYXV0aDIuYXV0aF9tZXRob2QShwFUaGUgYXV0aF9tZXRob2QgcHJvcGVydHkgbXVzdCBiZSBzZXQgaW4gY2FzZSBvZiBncmFudF90eXBlIE9BVVRIMl9HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERSBvciBPQVVUSDJfR1JBTlRfVFlQRV9DTElFTlRfQ1JFREVOVElBTFMaR2hhcyh0aGlzLmF1dGhfbWV0aG9kKSA9PSAodGhpcy5ncmFudF90eXBlID09IDEgfHwgdGhpcy5ncmFudF90eXBlID09IDIpGsACCgpvYXV0aDIuYWxnEr4BVGhlIGFsZyBwcm9wZXJ0eSBtdXN0IGJlIHNldCBpbiBjYXNlIG9mIGdyYW50X3R5cGUgT0FVVEgyX0dSQU5UX1RZUEVfSldUX0JFQVJFUiwgT0FVVEgyX0dSQU5UX1RZUEVfU0FNTDJfQkVBUkVSIG9yIGF1dGhfbWV0aG9kIE9BVVRIMl9BVVRIX1RZUEVfUFJJVkFURV9LRVlfSldULCBPQVVUSDJfQVVUSF9UWVBFX1NBTUwyX0JFQVJFUhpxaGFzKHRoaXMuYWxnKSA9PSAodGhpcy5ncmFudF90eXBlID09IDMgfHwgdGhpcy5ncmFudF90eXBlID09IDQgfHwgdGhpcy5hdXRoX21ldGhvZCA9PSAzIHx8IHRoaXMuYXV0aF9tZXRob2QgPT0gNSkakQEKC29hdXRoMi5jb2RlElhUaGUgY29kZSBwcm9wZXJ0eSBtdXN0IGJlIHNldCBpbiBjYXNlIG9mIGdyYW50X3R5cGUgT0FVVEgyX0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFGihoYXModGhpcy5jb2RlKSA9PSAodGhpcy5ncmFudF90eXBlID09IDEpGtIBCg9vYXV0aDIub3B0aW9uYWwSZlRoZSBvcHRpb25hbCBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIHRydWUgaW4gY2FzZSBvZiBncmFudF90eXBlIE9BVVRIMl9HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRpXIWhhcyh0aGlzLm9wdGlvbmFsKSB8fCB0aGlzLmdyYW50X3R5cGUgIT0gMSB8fCAoIXRoaXMub3B0aW9uYWwgJiYgdGhpcy5ncmFudF90eXBlID09IDEpQggKBl9sYWJlbEIOCgxfZGVzY3JpcHRpb25CDgoMX2F1dGhfbWV0aG9kQgYKBF9hbGdCDAoKX2NsaWVudF9pZEIHCgVfY29kZUILCglfb3B0aW9uYWwiZgoRT2F1dGgyQ29kZUJpbmRpbmcSLQoEbmFtZRgBIAEoCUIfukgcchoQARhkMhReW18kYS16XVtfJGEtejAtOV0qJBIVCghvcHRpb25hbBgCIAEoCEgAiAEBQgsKCV9vcHRpb25hbCKWAwoKT2F1dGgyQ29kZRJVCg1hdXRoX2VuZHBvaW50GAEgASgJQj66SDtyORALGIAgMjJeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlwuW2EtekEtWl17Mix9KSg/Oi8uKik/JBIaCgZpc3N1ZXIYAiABKAlCCrpIB3IFEAEYgCASUAoIandrc191cmkYAyABKAlCPrpIO3I5EAsYgCAyMl5odHRwczovL1thLXpBLVowLTkuLV0rKD86XC5bYS16QS1aXXsyLH0pKD86Ly4qKT8kEngKEWFkZGl0aW9uYWxfcGFyYW1zGAQgAygLMj8ubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyQ29kZS5BZGRpdGlvbmFsUGFyYW1zRW50cnlCHLpIGZoBFggAEDIiB3IFEAEY+gEqB3IFEAEY+gESEAoIdXNlX3BrY2UYBSABKAgaNwoVQWRkaXRpb25hbFBhcmFtc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEqSwoNUHJpdmF0ZUtleUFsZxIfChtQUklWQVRFX0tFWV9BTEdfVU5TUEVDSUZJRUQQABIZChVQUklWQVRFX0tFWV9BTEdfUlMyNTYQASrOAQoPT2F1dGgyR3JhbnRUeXBlEiEKHU9BVVRIMl9HUkFOVF9UWVBFX1VOU1BFQ0lGSUVEEAASKAokT0FVVEgyX0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFEAESKAokT0FVVEgyX0dSQU5UX1RZUEVfQ0xJRU5UX0NSRURFTlRJQUxTEAISIAocT0FVVEgyX0dSQU5UX1RZUEVfSldUX0JFQVJFUhADEiIKHk9BVVRIMl9HUkFOVF9UWVBFX1NBTUwyX0JFQVJFUhAEKs0BCg5PYXV0aDJBdXRoVHlwZRIgChxPQVVUSDJfQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASGgoWT0FVVEgyX0FVVEhfVFlQRV9CQVNJQxABEhkKFU9BVVRIMl9BVVRIX1RZUEVfRk9STRACEiQKIE9BVVRIMl9BVVRIX1RZUEVfUFJJVkFURV9LRVlfSldUEAMSGQoVT0FVVEgyX0FVVEhfVFlQRV9NVExTEAQSIQodT0FVVEgyX0FVVEhfVFlQRV9TQU1MMl9CRUFSRVIQBTKvAgoNUGx1Z2luU2VydmljZRKYAQoMVXBsb2FkUGx1Z2luEjIubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVXBsb2FkUGx1Z2luUmVxdWVzdBozLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLlVwbG9hZFBsdWdpblJlc3BvbnNlIh2C0+STAhc6ASoiEi92MS9wbHVnaW5zL3VwbG9hZCgBGoIBykEWYWRhcHQubW9jaGFidWdhcGlzLmNvbdJBZmh0dHBzOi8vd3d3Lm1vY2hhYnVnYXBpcy5jb20vYXV0aC9hZGFwdC9wbHVnaW5zLGh0dHBzOi8vd3d3Lm1vY2hhYnVnYXBpcy5jb20vYXV0aC9hZGFwdC9wbHVnaW5zLnVwbG9hZGIGcHJvdG8z",[Vo,Xo,Bo]),Nn=J(we,0);var ne=J(we,3),Mn=J(we,4);var Hn=Zo(we,0);import{execSync as Xa}from"child_process";import me from"fs";import{mkdirp as Sa}from"mkdirp";import S from"path";import Jo from"chalk";import ve from"fs";import{mkdirp as Va}from"mkdirp";import Ue from"path";import{fileURLToPath as Ca}from"url";function y(e){return ve.readFileSync(Ue.join(Ue.dirname(Ca(import.meta.url)),"..","assets",e)).toString()}function h(e,n){let t=Ue.dirname(e);Va.sync(t),ve.writeFileSync(e,n)}function ge(e){let n=Ue.resolve(e);if(!ve.existsSync(n))return console.error(Jo.red(`Invalid command: Manifest file not found at ${n}.`)),null;try{let t=ve.readFileSync(n).toString();return yo(ne,t)}catch(t){return console.error(Jo.red("An error occurred while reading the manifest")),console.error(t.message),null}}function ke(e){return(e.charAt(0).toUpperCase()+e.substring(1)).replace("_"," ")}function Ba(e){switch(e){case"action":return"VERTEX_TYPE_ACTION";case"cron-trigger":return"VERTEX_TYPE_CRON_TRIGGER";case"external-trigger":return"VERTEX_TYPE_EXTERNAL_TRIGGER";case"browser":return"VERTEX_TYPE_BROWSER";default:throw new Error("The node type is invalid")}}function De(e,n,t,o,s,a){let i=S.join(e,"src","vertices",n);if(me.existsSync(i))throw new Error(`The folder for the new vertex: ${i} already exists`);Sa.sync(i);let r=S.join(i,"executor.ts"),l={name:n,label:ke(n),description:`The better description of what ${n} is doing, the better it is for both AI and humans`,type:Ba(t),metadata:S.join("src","vertices",n,"metadata.json"),configurator:o,mtls:[],codeOauth2:[],oauth2:[],variables:[]};if(a==="react"){Xa("npm install react react-dom @types/react @types/react-dom",{cwd:e,stdio:"inherit"});let u=S.join(e,"src/vertices",n,"ui");o&&(h(S.join(u,"configurator.App.tsx"),y("configurator.App.tsx")),h(S.join(u,"configurator.main.tsx"),y("configurator.main.tsx")),h(S.join(u,"configurator.ssg.tsx"),y("configurator.ssg.tsx"))),t==="browser"&&(h(S.join(u,"executor.App.tsx"),y("executor.App.tsx")),h(S.join(u,"executor.main.tsx"),y("executor.main.tsx")),h(S.join(u,"executor.ssg.tsx"),y("executor.ssg.tsx"))),me.existsSync(S.join(e,"build-client.js"))||h(S.join(e,"build-client.js"),y("build-client.js"))}switch(l.type){case"VERTEX_TYPE_ACTION":h(r,y("executor_action.ts"));break;case"VERTEX_TYPE_BROWSER":a==="react"?h(r,y("executor_browser_react.tsx").replaceAll("___VERTEX_NAME___",n)):h(r,y("executor_browser_none.ts"));break;case"VERTEX_TYPE_EXTERNAL_TRIGGER":h(r,y("executor_external_trigger.ts"));break;case"VERTEX_TYPE_CRON_TRIGGER":h(r,y("executor_cron_trigger.ts"));break;default:throw new Error("The vertex type is invalid")}me.writeFileSync(S.join(e,"src","executors.ts"),Wo([n,...s.map(u=>u.name)],"ExecutorEnvironment"));let d={complete:!0,receivers:[{name:"input",description:"Default input receiver",bindings:[]}],transmitters:[{name:"output",description:"Default output transmitter",signals:[],failure:!1}],procedures:[],streams:[]};return l.type==="VERTEX_TYPE_CRON_TRIGGER"&&(d.cronSchedule="/5 * * * * *"),o&&(a==="react"?h(S.join(i,"configurator.ts"),y("configurator_react.tsx").replaceAll("___VERTEX_NAME___",n)):h(S.join(i,"configurator.ts"),y("configurator_none.ts")),d.complete=!1,me.writeFileSync(S.join(e,"src","configurators.ts"),Wo([n,...s.filter(u=>u.configurator).map(u=>u.name)],"ConfiguratorEnvironment"))),me.writeFileSync(S.join(i,"metadata.json"),JSON.stringify(d,null,2)),l}function Wo(e,n){let t=e.map(o=>`import ${o} from './vertices/${o}/${n==="ExecutorEnvironment"?"executor":"configurator"}';`).join(`
4
+ `);return`/**
2338
5
  * ---------------------------------------------------------------------------
2339
6
  * THIS FILE IS AUTOGENERATED - DO NOT EDIT MANUALLY
2340
7
  * ---------------------------------------------------------------------------
@@ -2349,917 +16,15 @@ function generateExport(vertices, env) {
2349
16
  * ---------------------------------------------------------------------------
2350
17
  */
2351
18
  import { selectVertex } from '@mochabug/adapt-plugin-toolkit/router';
2352
- ${imports}
19
+ ${t}
2353
20
 
2354
21
  export default {
2355
- async fetch(req: Request, env: ${env}, ctx: ExecutionContext): Promise<Response> {
2356
- return await selectVertex(req, env, ctx, { ${vertices.join(', ')} });
22
+ async fetch(req: Request, env: ${n}, ctx: ExecutionContext): Promise<Response> {
23
+ return await selectVertex(req, env, ctx, { ${e.join(", ")} });
2357
24
  },
2358
- };`;
2359
- }
2360
-
2361
- // Copyright 2023, mochabug AB
2362
- //
2363
- // Licensed under the Apache License, Version 2.0 (the "License");
2364
- // you may not use this file except in compliance with the License.
2365
- // You may obtain a copy of the License at
2366
- //
2367
- // http://www.apache.org/licenses/LICENSE-2.0
2368
- //
2369
- // Unless required by applicable law or agreed to in writing, software
2370
- // distributed under the License is distributed on an "AS IS" BASIS,
2371
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2372
- // See the License for the specific language governing permissions and
2373
- // limitations under the License.
2374
- async function add(manifest) {
2375
- const vertexName = await input({
2376
- message: 'Type a new unused vertex name',
2377
- transformer: (val) => {
2378
- return val.trim();
2379
- },
2380
- validate: (val) => {
2381
- val = val.trim();
2382
- if (manifest.vertices.filter((item) => item.name === val).length > 0) {
2383
- return false;
2384
- }
2385
- return /^[_a-z][_a-z0-9]*$/.test(val);
2386
- }
2387
- });
2388
- const vertexType = await select({
2389
- message: 'Choose your vertex type',
2390
- choices: [
2391
- {
2392
- name: 'action',
2393
- value: 'action',
2394
- description: 'An action is a vertex that performs a task, such as sending an email or updating a database.'
2395
- },
2396
- {
2397
- name: 'browser',
2398
- value: 'browser',
2399
- description: 'A browser is a vertex that interacts with a web browser, such as navigating to a page or clicking a button.'
2400
- },
2401
- {
2402
- name: 'cron-trigger',
2403
- value: 'cron-trigger',
2404
- description: 'A cron trigger is a vertex that triggers at a specific time, such as every day at 3:00 PM.'
2405
- },
2406
- {
2407
- name: 'external-trigger',
2408
- value: 'external-trigger',
2409
- description: 'An external trigger is a vertex that triggers from an external event, such as a webhook or a message queue.'
2410
- }
2411
- ]
2412
- });
2413
- const hasConfigurator = await confirm({
2414
- message: 'Need a configurator for the vertex?'
2415
- });
2416
- console.log(chalk.magenta('Creating new vertex templates...'));
2417
- const vertex = addVertex('.', vertexName, vertexType, hasConfigurator, manifest.vertices);
2418
- manifest.vertices.push(vertex);
2419
- if (!manifest.configurators && vertex.configurator) {
2420
- manifest.configurators = 'dist/configurators.js';
2421
- }
2422
- console.log(chalk.magenta('Updating manifest...'));
2423
- fs.writeFileSync('manifest.json', Manifest.toJsonString(manifest, {
2424
- enumAsInteger: false,
2425
- prettySpaces: 2,
2426
- emitDefaultValues: false
2427
- }));
2428
- console.log(chalk.bgGreen('Success'));
2429
- }
2430
-
2431
- // Copyright 2023, mochabug AB
2432
- //
2433
- // Licensed under the Apache License, Version 2.0 (the "License");
2434
- // you may not use this file except in compliance with the License.
2435
- // You may obtain a copy of the License at
2436
- //
2437
- // http://www.apache.org/licenses/LICENSE-2.0
2438
- //
2439
- // Unless required by applicable law or agreed to in writing, software
2440
- // distributed under the License is distributed on an "AS IS" BASIS,
2441
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2442
- // See the License for the specific language governing permissions and
2443
- // limitations under the License.
2444
- async function init(dir) {
2445
- const name = await input({
2446
- message: 'Type plugin name',
2447
- transformer: (val) => {
2448
- return val.trim().toLowerCase();
2449
- },
2450
- validate: (val) => {
2451
- return /^[_a-z][_a-z0-9]*$/.test(val);
2452
- }
2453
- });
2454
- const vertexType = await select({
2455
- message: 'Choose your vertex type',
2456
- choices: [
2457
- {
2458
- name: 'action',
2459
- value: 'action',
2460
- description: 'An action is a vertex that performs a task, such as sending an email or updating a database.'
2461
- },
2462
- {
2463
- name: 'browser',
2464
- value: 'browser',
2465
- description: 'A browser is a vertex that interacts with a web browser, such as navigating to a page or clicking a button.'
2466
- },
2467
- {
2468
- name: 'cron-trigger',
2469
- value: 'cron-trigger',
2470
- description: 'A cron trigger is a vertex that triggers at a specific time, such as every day at 3:00 PM.'
2471
- },
2472
- {
2473
- name: 'external-trigger',
2474
- value: 'external-trigger',
2475
- description: 'An external trigger is a vertex that triggers from an external event, such as a webhook or a message queue.'
2476
- }
2477
- ]
2478
- });
2479
- const vertexName = await input({
2480
- message: 'Type a new unused vertex name',
2481
- transformer: (val) => {
2482
- return val.trim().toLowerCase();
2483
- },
2484
- validate: (val) => {
2485
- return /^[_a-z][_a-z0-9]*$/.test(val);
2486
- }
2487
- });
2488
- const hasConfigurator = await confirm({
2489
- message: 'Need a configurator for the vertex?'
2490
- });
2491
- mkdirp.sync(dir);
2492
- const cwd = !path.isAbsolute(dir) ? path.join(process.cwd(), dir) : dir;
2493
- // Creating a minimal npm package
2494
- console.log(chalk.magenta('Creating package.json...'));
2495
- const defPackage = {
2496
- name: name,
2497
- version: '',
2498
- private: true,
2499
- type: 'module',
2500
- scripts: {
2501
- build: 'rollup -c rollup.config.js',
2502
- add: 'adaptkit add',
2503
- publish: 'npm run build && adaptkit publish',
2504
- emulate: 'npm run build && adaptkit emulate'
2505
- }
2506
- };
2507
- writeFile(path.join(cwd, 'package.json'), JSON.stringify(defPackage, null, 2));
2508
- writeFile(path.join(cwd, 'README.md'), readAsset('readme.md'));
2509
- writeFile(path.join(cwd, 'LICENSE.md'), readAsset('license.md'));
2510
- execSync('npm install --save-dev @mochabug/adapt-plugin-typings typescript ts-node tslib rollup @rollup/plugin-typescript @rollup/plugin-terser @rollup/plugin-node-resolve @rollup/plugin-commonjs', {
2511
- cwd: cwd,
2512
- stdio: 'inherit'
2513
- });
2514
- execSync('npm install @mochabug/adapt-plugin-toolkit', {
2515
- cwd: cwd,
2516
- stdio: 'inherit'
2517
- });
2518
- console.log(chalk.magenta('Setting up project structure...'));
2519
- writeFile(path.join(cwd, 'tsconfig.json'), readAsset('tsconf.json'));
2520
- writeFile(path.join(cwd, '.gitignore'), readAsset('gitignore'));
2521
- writeFile(path.join(cwd, 'rollup.config.js'), readAsset('rollup.config.ts'));
2522
- const vertex = addVertex(cwd, vertexName, vertexType, hasConfigurator, []);
2523
- console.log(chalk.magenta('Creating manifest...'));
2524
- const manifest = {
2525
- name: name,
2526
- organization: '00000000-0000-0000-0000-000000000000',
2527
- version: '0.0.1-beta.1',
2528
- label: labelize(name),
2529
- description: `A nice description of what ${name} does`,
2530
- author: 'John Doe',
2531
- bugs: 'bugs@foobar.com',
2532
- homepage: `https://www.foobar.com`,
2533
- repository: `https://github.com`,
2534
- vertices: [vertex],
2535
- executors: 'dist/executors.js',
2536
- pluginVariables: [],
2537
- pluginOauth2: [],
2538
- pluginMtls: []
2539
- };
2540
- if (!vertex.metadata) {
2541
- throw new Error('This cannot happen');
2542
- }
2543
- if (vertex.configurator) {
2544
- manifest.configurators = 'dist/configurators.js';
2545
- }
2546
- // Write out the actual manifest and we're done
2547
- fs.writeFileSync(path.join(cwd, 'manifest.json'), Manifest.toJsonString(manifest, {
2548
- enumAsInteger: false,
2549
- prettySpaces: 2,
2550
- emitDefaultValues: false
2551
- }));
2552
- console.log(chalk.bgGreen('Success'));
2553
- }
2554
-
2555
- // Copyright 2023, mochabug AB
2556
- //
2557
- // Licensed under the Apache License, Version 2.0 (the "License");
2558
- // you may not use this file except in compliance with the License.
2559
- // You may obtain a copy of the License at
2560
- //
2561
- // http://www.apache.org/licenses/LICENSE-2.0
2562
- //
2563
- // Unless required by applicable law or agreed to in writing, software
2564
- // distributed under the License is distributed on an "AS IS" BASIS,
2565
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2566
- // See the License for the specific language governing permissions and
2567
- // limitations under the License.
2568
- const OAUTH_CALLBACK_PORT = 51421;
2569
- const PORT_RANGE = 5;
2570
- const OAUTH_SCOPE = 'https://www.mochabugapis.com/auth/adapt/plugins.upload';
2571
- const AUDIENCE = 'https://adapt-dev.mochabugapis.com';
2572
- function createCodeUrl({ clientId, redirectUri, scope, state, authUrl, codeChallenge, audience }) {
2573
- const res = new URL(authUrl);
2574
- res.searchParams.set('response_type', 'code');
2575
- res.searchParams.set('client_id', clientId);
2576
- res.searchParams.set('audience', audience);
2577
- res.searchParams.set('redirect_uri', redirectUri);
2578
- res.searchParams.set('scope', scope);
2579
- res.searchParams.set('state', state);
2580
- res.searchParams.set('code_challenge', codeChallenge);
2581
- res.searchParams.set('code_challenge_method', 'S256');
2582
- return res.toString();
2583
- }
2584
- function createExchangeBody({ redirectUri, codeVerifier, clientId, code }) {
2585
- const res = new URLSearchParams();
2586
- res.set('grant_type', 'authorization_code');
2587
- res.set('code_verifier', codeVerifier);
2588
- res.set('client_id', clientId);
2589
- res.set('code', code);
2590
- res.set('redirect_uri', redirectUri);
2591
- return res.toString();
2592
- }
2593
- function startServer(app, attempt = 0) {
2594
- return new Promise((resolve, reject) => {
2595
- // Calculate the current port to try based on the base port and the attempt number.
2596
- const currentPort = OAUTH_CALLBACK_PORT + attempt;
2597
- // Attempt to listen on the current port.
2598
- const server = app.listen(currentPort, () => {
2599
- console.log(chalk.green.bold(`Server running on http://localhost:${currentPort} to listen to OAuth2 callbacks`));
2600
- resolve({ server, port: currentPort });
2601
- });
2602
- // Handle the error event when the server fails to start.
2603
- server.on('error', (err) => {
2604
- if (err.code === 'EADDRINUSE' && attempt < PORT_RANGE - 1) {
2605
- // If the address is in use, close the current server and try the next port.
2606
- console.log(chalk.yellow.bold(`Port ${currentPort} is in use, trying next available port.`));
2607
- server.close();
2608
- resolve(startServer(app, attempt + 1));
2609
- }
2610
- else {
2611
- reject(err);
2612
- }
2613
- });
2614
- });
2615
- }
2616
- // Define constants or import them
2617
- const LOGGING_PREFIX = '[waitForConsent]';
2618
- // Returns the access token
2619
- async function waitForConsent(issuerUrl, errorUrl, clientId) {
2620
- console.info(`${LOGGING_PREFIX} Starting OAuth2 consent workflow for client: ${clientId}`);
2621
- const authUrl = `${issuerUrl}/oauth2/auth`;
2622
- const tokenUrl = `${issuerUrl}/oauth2/token`;
2623
- console.info(`${LOGGING_PREFIX} Authorization URL: ${authUrl}`);
2624
- console.info(`${LOGGING_PREFIX} Token URL: ${tokenUrl}`);
2625
- const app = express();
2626
- const state = randomBytes(32).toString('hex');
2627
- console.info(`${LOGGING_PREFIX} Generated state for CSRF protection`);
2628
- const localUrls = {
2629
- base: ``,
2630
- redirect: ``
2631
- };
2632
- const { code_verifier, code_challenge } = await pkceChallenge();
2633
- console.info(`${LOGGING_PREFIX} PKCE Challenge generated`);
2634
- let resolveToken;
2635
- let rejectToken;
2636
- let token;
2637
- const tokenPromise = new Promise((resolve, reject) => {
2638
- resolveToken = resolve;
2639
- rejectToken = reject;
2640
- });
2641
- app.get('/', async (_, res) => {
2642
- const codeUrl = createCodeUrl({
2643
- authUrl,
2644
- clientId,
2645
- redirectUri: localUrls.redirect,
2646
- scope: OAUTH_SCOPE,
2647
- state,
2648
- codeChallenge: code_challenge,
2649
- audience: AUDIENCE
2650
- });
2651
- console.info(`${LOGGING_PREFIX} Redirecting to code URL for user consent`);
2652
- res.redirect(codeUrl);
2653
- });
2654
- // We need to use callbacks to the success / failed pages so that we don't
2655
- // expose the code longer than necessary.
2656
- app.get('/callback', async (req, res) => {
2657
- if ('error' in req.query) {
2658
- console.error(`${LOGGING_PREFIX} OAuth Error: error in callback`);
2659
- const queryString = req.url.split('?')[1];
2660
- res.redirect(`${errorUrl}?${queryString}`);
2661
- rejectToken();
2662
- return;
2663
- }
2664
- if (req.query.state !== state) {
2665
- console.error(`${LOGGING_PREFIX} OAuth Error: Invalid state. Received state does not match.`);
2666
- const errorDescription = encodeURIComponent('Invalid state parameter.');
2667
- res.redirect(`${errorUrl}?error=invalid_request&error_description=${errorDescription}`);
2668
- rejectToken();
2669
- return;
2670
- }
2671
- console.info(`${LOGGING_PREFIX} OAuth state validated`);
2672
- const body = createExchangeBody({
2673
- clientId,
2674
- redirectUri: localUrls.redirect,
2675
- codeVerifier: code_verifier,
2676
- code: req.query.code
2677
- });
2678
- try {
2679
- console.info(`${LOGGING_PREFIX} Exchanging code for token`);
2680
- const response = await fetch(tokenUrl, {
2681
- method: 'POST',
2682
- headers: {
2683
- 'Content-Type': 'application/x-www-form-urlencoded',
2684
- Accept: 'application/json'
2685
- },
2686
- body
2687
- });
2688
- // Redirect to error
2689
- if (!response.ok) {
2690
- console.error(`${LOGGING_PREFIX} OAuth Error: could not exchange code for token`);
2691
- const queryString = response.url.split('?')[1];
2692
- res.redirect(`${errorUrl}?${queryString}`);
2693
- rejectToken();
2694
- return;
2695
- }
2696
- const data = (await response.json());
2697
- console.info(`${LOGGING_PREFIX} Token exchange successful`);
2698
- console.info(`${LOGGING_PREFIX} Token exchange successful. Details: `, {
2699
- expires_in: data.expires_in,
2700
- scope: data.scope,
2701
- type: data.token_type,
2702
- token: '<secret>'
2703
- });
2704
- token = data.access_token;
2705
- res.redirect('/success');
2706
- }
2707
- catch (error) {
2708
- console.error(`${LOGGING_PREFIX} Error exchanging token: ${error}`);
2709
- res.redirect(`${errorUrl}?error=unkown&error_description=${encodeURIComponent('Unknown error during token exchange')}`);
2710
- rejectToken();
2711
- }
2712
- });
2713
- app.get('/success', (_, res) => {
2714
- res.send(readAsset('success_page.html'));
2715
- if (!token) {
2716
- console.error('Token is undefined');
2717
- rejectToken();
2718
- }
2719
- resolveToken();
2720
- });
2721
- let server;
2722
- try {
2723
- console.info(`${LOGGING_PREFIX} Starting local server to handle callbacks`);
2724
- const serverStart = await startServer(app);
2725
- server = serverStart.server;
2726
- localUrls.base = `http://localhost:${serverStart.port}`;
2727
- localUrls.redirect = `${localUrls.base}/callback`;
2728
- console.info(`${LOGGING_PREFIX} Server started on ${localUrls.base}`);
2729
- }
2730
- catch (e) {
2731
- console.error(`${LOGGING_PREFIX} Error starting server: ${e}`);
2732
- return;
2733
- }
2734
- try {
2735
- console.info(`${LOGGING_PREFIX} Opening user consent page`);
2736
- await open(localUrls.base);
2737
- console.info(`${LOGGING_PREFIX} Waiting for user consent...`);
2738
- await tokenPromise;
2739
- console.info(`${LOGGING_PREFIX} OAuth consent workflow completed successfully`);
2740
- if (!token) {
2741
- console.error('Token is undefined');
2742
- }
2743
- return token;
2744
- }
2745
- catch (error) {
2746
- console.error(`${LOGGING_PREFIX} Error in OAuth2 flow: ${error}`);
2747
- return undefined;
2748
- }
2749
- finally {
2750
- console.info(`${LOGGING_PREFIX} Closing the server...`);
2751
- server.closeAllConnections();
2752
- server.close();
2753
- console.info(`${LOGGING_PREFIX} Server closed`);
2754
- }
2755
- }
2756
-
2757
- /**
2758
- * PluginService provides a service for uploading a plugin.
2759
- *
2760
- * @generated from protobuf service mochabugapis.adapt.plugins.v1.PluginService
2761
- */
2762
- class PluginServiceClient {
2763
- _transport;
2764
- typeName = PluginService.typeName;
2765
- methods = PluginService.methods;
2766
- options = PluginService.options;
2767
- constructor(_transport) {
2768
- this._transport = _transport;
2769
- }
2770
- /**
2771
- * UploadPlugin is a streaming RPC method that allows uploading a plugin in
2772
- * chunks. The client can send multiple UploadPluginRequest messages, and the
2773
- * server will respond with a single UploadPluginResponse after processing all
2774
- * requests.
2775
- *
2776
- * @generated from protobuf rpc: UploadPlugin(stream mochabugapis.adapt.plugins.v1.UploadPluginRequest) returns (mochabugapis.adapt.plugins.v1.UploadPluginResponse);
2777
- */
2778
- uploadPlugin(options) {
2779
- const method = this.methods[0], opt = this._transport.mergeOptions(options);
2780
- return stackIntercept("clientStreaming", this._transport, method, opt);
2781
- }
2782
- }
2783
-
2784
- // Copyright 2023, mochabug AB
2785
- //
2786
- // Licensed under the Apache License, Version 2.0 (the "License");
2787
- // you may not use this file except in compliance with the License.
2788
- // You may obtain a copy of the License at
2789
- //
2790
- // http://www.apache.org/licenses/LICENSE-2.0
2791
- //
2792
- // Unless required by applicable law or agreed to in writing, software
2793
- // distributed under the License is distributed on an "AS IS" BASIS,
2794
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2795
- // See the License for the specific language governing permissions and
2796
- // limitations under the License.
2797
- async function resize(filepath, height, width) {
2798
- const extname = path.extname(filepath);
2799
- switch (extname) {
2800
- case '.avif':
2801
- return await sharp(filepath).resize(height, width).avif().toBuffer();
2802
- case '.gif':
2803
- return await sharp(filepath).resize(height, width).gif().toBuffer();
2804
- case '.jpg':
2805
- case '.jpeg':
2806
- case '.jfif':
2807
- case '.pjpeg':
2808
- case '.pjp':
2809
- return await sharp(filepath).resize(height, width).jpeg().toBuffer();
2810
- case '.png':
2811
- return await sharp(filepath).resize(height, width).png().toBuffer();
2812
- case '.svg':
2813
- return fs.readFileSync(filepath);
2814
- case '.webp':
2815
- return await sharp(filepath).resize(height, width).webp().toBuffer();
2816
- }
2817
- throw new Error('Invalid logotype');
2818
- }
2819
- function isPathSafe(filePath) {
2820
- const currentWorkingDir = path.resolve('.');
2821
- const absoluteFilePath = path.resolve(filePath);
2822
- return absoluteFilePath.startsWith(currentWorkingDir);
2823
- }
2824
- function folderExists(folderPath) {
2825
- try {
2826
- const absolutePath = path.resolve(folderPath);
2827
- if (fs.existsSync(absolutePath)) {
2828
- const stats = fs.statSync(absolutePath);
2829
- return stats.isDirectory();
2830
- }
2831
- else {
2832
- return false;
2833
- }
2834
- }
2835
- catch (err) {
2836
- console.error('Error checking if folder exists:', err);
2837
- return false;
2838
- }
2839
- }
2840
- function createArchive(folder) {
2841
- return new Promise((resolve, reject) => {
2842
- if (!folderExists(folder)) {
2843
- reject(`The folder ${folder} does not exist`);
2844
- }
2845
- const archive = archiver('tar', {
2846
- gzip: true, // Use gzip compression
2847
- zlib: { level: 9 } // Sets the compression level.
2848
- });
2849
- archive.on('error', (err) => {
2850
- reject(err);
2851
- });
2852
- const buffers = [];
2853
- const bufferStream = new PassThrough();
2854
- bufferStream.on('data', (data) => buffers.push(data));
2855
- bufferStream.on('end', () => {
2856
- const res = Buffer.concat(buffers);
2857
- console.log(`${folder} have been compressed successfully into a buffer.`);
2858
- resolve(res); // Resolve the promise with the final buffer
2859
- });
2860
- archive.pipe(bufferStream);
2861
- fg(path.join(folder, '**', '*'))
2862
- .then((paths) => {
2863
- for (let filepath of paths) {
2864
- if (fs.statSync(filepath).isFile()) {
2865
- const relativePath = path.relative(folder, filepath);
2866
- archive.file(filepath, { name: relativePath });
2867
- }
2868
- }
2869
- archive.finalize();
2870
- })
2871
- .catch((err) => reject(err));
2872
- });
2873
- }
2874
- async function sendPlugin(manifest, client, metadata) {
2875
- console.log('Sending the plugin to the server');
2876
- const stream = client.uploadPlugin({ meta: metadata });
2877
- const lookup = {};
2878
- async function send(filePath, imgOpts, fileContent) {
2879
- if (!filePath || lookup[filePath]) {
2880
- return;
2881
- }
2882
- if (!isPathSafe(filePath)) {
2883
- throw new Error(`The file path is not safe: ${filePath}. It must be contained inside the manifest folder. Invalid manifest`);
2884
- }
2885
- if (!fs.existsSync(filePath)) {
2886
- throw new Error(`The path does not exists: ${filePath}. Invalid manifest`);
2887
- }
2888
- // If image file, we need to compress it
2889
- let buffer;
2890
- if (imgOpts) {
2891
- buffer = await resize(filePath, imgOpts[0], imgOpts[1]);
2892
- console.log(`Compressed: ${filePath} to ${imgOpts[0]}x${imgOpts[1]} size`);
2893
- }
2894
- else if (fileContent) {
2895
- buffer = fileContent;
2896
- }
2897
- else {
2898
- buffer = fs.readFileSync(filePath);
2899
- }
2900
- console.log(`Sending: ${filePath}`);
2901
- const message = {
2902
- data: {
2903
- oneofKind: 'file',
2904
- file: {
2905
- data: buffer,
2906
- path: filePath
2907
- }
2908
- }
2909
- };
2910
- // The idea here is that we will have an RPC error if the server has returned an error
2911
- await Promise.race([stream.requests.send(message), stream.status]);
2912
- lookup[filePath] = true;
2913
- }
2914
- // The first message must be the manifest
2915
- // All the other messages must be files and must be described in the manifest
2916
- const request = {
2917
- data: {
2918
- oneofKind: 'manifest',
2919
- manifest: manifest
2920
- }
2921
- };
2922
- await stream.requests.send(request);
2923
- await send('README.md');
2924
- await send('LICENSE.md');
2925
- await send(manifest.executors);
2926
- await send(manifest.configurators);
2927
- await send(manifest.logo, [80, 80]);
2928
- // Send everything inside the asset directory as assets
2929
- if (manifest.assets && fs.existsSync(manifest.assets)) {
2930
- const assets = await createArchive(manifest.assets);
2931
- await send(manifest.assets, undefined, assets);
2932
- }
2933
- // Send everything inside the cdn directory as cdn files
2934
- if (manifest.cdn && fs.existsSync(manifest.cdn)) {
2935
- const cdn = await createArchive(manifest.cdn);
2936
- await send(manifest.cdn, undefined, cdn);
2937
- }
2938
- // Send everything related to the vertices. Logos, schemas and configs
2939
- for (let vertex of manifest.vertices) {
2940
- await send(vertex.logo, [40, 40]);
2941
- await send(vertex.metadata);
2942
- if (vertex.config) {
2943
- await send(vertex.config);
2944
- }
2945
- }
2946
- await stream.requests.complete();
2947
- printRpcSuccess(await stream.status, await stream.headers, await stream.trailers);
2948
- }
2949
- async function emulate(manifest, host) {
2950
- const transport = new GrpcTransport({
2951
- host,
2952
- channelCredentials: ChannelCredentials.createInsecure(),
2953
- 'grpc.default_compression_algorithm': 2,
2954
- 'grpc.default_compression_level': 2,
2955
- 'grpc.max_send_message_length': 16 * 1024 * 1024
2956
- });
2957
- const client = new PluginServiceClient(transport);
2958
- try {
2959
- await sendPlugin(manifest, client);
2960
- }
2961
- catch (e) {
2962
- if (e instanceof RpcError) {
2963
- printRpcError(e);
2964
- }
2965
- else {
2966
- console.error(e);
2967
- }
2968
- console.log(`For more information, use: ${chalk.blue('adaptkit help emulate')}`);
2969
- }
2970
- }
2971
- async function publish(manifest, host, accessToken, insecure) {
2972
- const transport = new GrpcTransport({
2973
- host,
2974
- channelCredentials: insecure
2975
- ? ChannelCredentials.createSsl(undefined, undefined, undefined, {
2976
- checkServerIdentity: () => undefined
2977
- })
2978
- : ChannelCredentials.createSsl(),
2979
- 'grpc.default_compression_algorithm': 2,
2980
- 'grpc.default_compression_level': 2,
2981
- 'grpc.max_send_message_length': 16 * 1024 * 1024
2982
- });
2983
- const client = new PluginServiceClient(transport);
2984
- const metadata = { authorization: `Bearer ${accessToken}` };
2985
- try {
2986
- await sendPlugin(manifest, client, metadata);
2987
- }
2988
- catch (e) {
2989
- if (e instanceof RpcError) {
2990
- printRpcError(e);
2991
- }
2992
- else {
2993
- console.error(e);
2994
- }
2995
- console.log(`For more information, use: ${chalk.blue('adaptkit help publish')}`);
2996
- }
2997
- }
2998
- function printRpcSuccess(status, headers, trailers) {
2999
- const line = chalk.green('==================================================');
3000
- const title = chalk.bgGreen.black.bold(' RPC Success Details ');
3001
- const statusCode = chalk.bold.white('Status Code: ') + chalk.greenBright.bold(status.code);
3002
- const statusDetail = status.detail
3003
- ? chalk.bold.white('Details: ') + chalk.greenBright(status.detail)
3004
- : chalk.gray(' No Details Provided');
3005
- const headerInfo = chalk.bold.white('Headers:\n') +
3006
- (headers
3007
- ? chalk.blue(JSON.stringify(headers, null, 2))
3008
- : chalk.gray(' No Metadata'));
3009
- const trailerInfo = chalk.bold.white('Trailers:\n') +
3010
- (trailers
3011
- ? chalk.blue(JSON.stringify(trailers, null, 2))
3012
- : chalk.gray(' No Trailers'));
3013
- console.log(line);
3014
- console.log(title);
3015
- console.log(line);
3016
- console.log(statusCode);
3017
- console.log(statusDetail);
3018
- console.log(line);
3019
- console.log(headerInfo);
3020
- console.log(line);
3021
- console.log(trailerInfo);
3022
- console.log(line);
3023
- console.log(chalk.bgGreen.black.bold(' SUCCESS '));
3024
- console.log(line);
3025
- }
3026
- function printRpcError(error) {
3027
- const line = chalk.red('==================================================');
3028
- const title = chalk.bgRed.white.bold(' RPC Error Details ');
3029
- const name = chalk.bold.white('Name: ') + chalk.redBright.bold(error.name);
3030
- const message = chalk.bold.white('Message: ') + chalk.redBright(error.message);
3031
- const code = chalk.bold.white('Code: ') + chalk.redBright.bold(error.code);
3032
- const methodName = error.methodName
3033
- ? chalk.bold.white('Method Name: ') + chalk.yellowBright(error.methodName)
3034
- : chalk.gray('No Method Name');
3035
- const serviceName = error.serviceName
3036
- ? chalk.bold.white('Service Name: ') + chalk.yellowBright(error.serviceName)
3037
- : chalk.gray('No Service Name');
3038
- const meta = chalk.bold.white('Metadata:\n') +
3039
- (error.meta
3040
- ? chalk.blue(JSON.stringify(error.meta, null, 2))
3041
- : chalk.gray(' No Metadata'));
3042
- console.error(line);
3043
- console.error(title);
3044
- console.error(line);
3045
- console.error(name);
3046
- console.error(message);
3047
- console.error(code);
3048
- console.error(line);
3049
- if (methodName)
3050
- console.error(methodName);
3051
- if (serviceName)
3052
- console.error(serviceName);
3053
- console.error(line);
3054
- console.error(meta);
3055
- console.error(line);
3056
- console.error(chalk.bgRed.white.bold(' ERROR '));
3057
- console.error(line);
3058
- }
3059
-
3060
- // Copyright 2023, mochabug AB
3061
- //
3062
- // Licensed under the Apache License, Version 2.0 (the "License");
3063
- // you may not use this file except in compliance with the License.
3064
- // You may obtain a copy of the License at
3065
- //
3066
- // http://www.apache.org/licenses/LICENSE-2.0
3067
- //
3068
- // Unless required by applicable law or agreed to in writing, software
3069
- // distributed under the License is distributed on an "AS IS" BASIS,
3070
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3071
- // See the License for the specific language governing permissions and
3072
- // limitations under the License.
3073
- async function isValidUrl(urlString) {
3074
- try {
3075
- new URL(urlString);
3076
- return true;
3077
- }
3078
- catch (error) {
3079
- return false;
3080
- }
3081
- }
3082
- function isValidPort(port) {
3083
- const portNumber = parseInt(port, 10);
3084
- return portNumber > 0 && portNumber <= 65535;
3085
- }
3086
- function isValidHostWithPort(hostWithPort) {
3087
- const [hostname, port] = hostWithPort.split(':');
3088
- if (!isValidHostname(hostname)) {
3089
- return { isValid: false, hostname };
3090
- }
3091
- if (port !== undefined) {
3092
- if (!isValidPort(port)) {
3093
- return { isValid: false, hostname, port: parseInt(port, 10) };
3094
- }
3095
- return { isValid: true, hostname, port: parseInt(port, 10) };
3096
- }
3097
- return { isValid: true, hostname };
3098
- }
3099
- function banner() {
3100
- return chalk.yellowBright(figlet.textSync('Adaptkit'));
3101
- }
3102
- async function handleInit(dir, cmd) {
3103
- // Check for unexpected arguments
3104
- if (cmd.args.length >= 1) {
3105
- console.error(chalk.red(`Error: Invalid sub-command or arguments provided.`));
3106
- console.log(`For more information, use: ${chalk.blue('adaptkit help init')}`);
3107
- process.exit(1);
3108
- }
3109
- // Continue with the usual logic if no unexpected arguments are found
3110
- await init(dir);
3111
- }
3112
- async function handleAdd(cmd) {
3113
- if (cmd.args.length >= 1) {
3114
- console.error(chalk.red(`Error: Invalid sub-command or arguments provided.`));
3115
- console.log(`For more information, use: ${chalk.blue('adaptkit help add')}`);
3116
- process.exit(1);
3117
- }
3118
- const manifest = readManifest('manifest.json');
3119
- if (!manifest) {
3120
- console.log(`For more information, use: ${chalk.blue('adaptkit help add')}`);
3121
- process.exit(1);
3122
- }
3123
- await add(manifest);
3124
- }
3125
- async function handlePublish(host, authUrl, client, insecure, errorUrl, cmd) {
3126
- if (!(await isValidUrl(authUrl))) {
3127
- console.error(chalk.red(`Error: The provided authority url is not a valid URL: ${authUrl}`));
3128
- console.log(`For more information, use: ${chalk.blue('adaptkit help publish')}`);
3129
- process.exit(1);
3130
- }
3131
- const { isValid, hostname, port } = isValidHostWithPort(host);
3132
- if (!isValid) {
3133
- console.error(chalk.red(`Error: The provided host or port is not valid: ${hostname}${port ? ':' + port : ''}`));
3134
- console.log(`For more information, use: ${chalk.blue('adaptkit help emulate')}`);
3135
- process.exit(1);
3136
- }
3137
- if (cmd.args.length >= 1) {
3138
- console.error(chalk.red(`Error: Invalid sub-command or arguments provided.`));
3139
- console.log(`For more information, use: ${chalk.blue('adaptkit help publish')}`);
3140
- process.exit(1);
3141
- }
3142
- const manifest = readManifest('manifest.json');
3143
- if (!manifest) {
3144
- console.log(`For more information, use: ${chalk.blue('adaptkit help publish')}`);
3145
- process.exit(1);
3146
- }
3147
- if (insecure) {
3148
- process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
3149
- }
3150
- const accessToken = await waitForConsent(authUrl, errorUrl, client);
3151
- if (!accessToken) {
3152
- console.log('Could not fetch the acccess token. Terminating...');
3153
- process.exit(1);
3154
- }
3155
- await publish(manifest, host, accessToken, insecure);
3156
- }
3157
- async function handleEmulate(host, cmd) {
3158
- const { isValid, hostname, port } = isValidHostWithPort(host);
3159
- if (!isValid) {
3160
- console.error(chalk.red(`Error: The provided host or port is not valid: ${hostname}${port ? ':' + port : ''}`));
3161
- console.log(`For more information, use: ${chalk.blue('adaptkit help emulate')}`);
3162
- process.exit(1);
3163
- }
3164
- if (cmd.args.length >= 1) {
3165
- console.error(chalk.red(`Error: Invalid sub-command or arguments provided.`));
3166
- console.log(`For more information, use: ${chalk.blue('adaptkit help emulate')}`);
3167
- process.exit(1);
3168
- }
3169
- const manifest = readManifest('manifest.json');
3170
- if (!manifest) {
3171
- console.log(`For more information, use: ${chalk.blue('adaptkit help emulate')}`);
3172
- process.exit(1);
3173
- }
3174
- await emulate(manifest, host);
3175
- }
3176
- function handleVersion(bump, cmd) {
3177
- if (cmd.args.length >= 1) {
3178
- console.error(chalk.red(`Error: Invalid sub-command or arguments provided.`));
3179
- console.log(`For more information, use: ${chalk.blue('adaptkit help version')}`);
3180
- process.exit(1);
3181
- }
3182
- const manifest = readManifest('manifest.json');
3183
- if (!manifest) {
3184
- console.log(`For more information, use: ${chalk.blue('adaptkit help version')}`);
3185
- process.exit(1);
3186
- }
3187
- const manVer = semver.parse(manifest.version);
3188
- if (!manVer) {
3189
- console.error(chalk.red(`Error: The version in the manifest is not a valid semver version: ${manifest.version}`));
3190
- console.log(`For more information, use: ${chalk.blue('adaptkit help version')}`);
3191
- process.exit(1);
3192
- }
3193
- if (bump === null) {
3194
- console.error(chalk.red('You must provide either --patch --minor or --major to bump the version.'));
3195
- console.log(`For more information, use: ${chalk.blue('adaptkit help version')}`);
3196
- process.exit(1);
3197
- }
3198
- const prevVersion = manifest.version;
3199
- manifest.version = manVer.inc(bump).toString();
3200
- fs.writeFileSync(path.join(process.cwd(), 'manifest.json'), Manifest.toJsonString(manifest, {
3201
- enumAsInteger: false,
3202
- prettySpaces: 2,
3203
- emitDefaultValues: false
3204
- }));
3205
- console.log(chalk.green(`Bumped the version from ${prevVersion} to ${manifest.version}`));
3206
- }
3207
- async function main() {
3208
- const notifier = updateNotifier({
3209
- pkg: JSON.parse('{"name":"@mochabug/adaptkit","version":"0.14.6"}')
3210
- });
3211
- notifier.notify({ isGlobal: true, defer: false });
3212
- program
3213
- .name('Adaptkit')
3214
- .version('1.0.0')
3215
- .description('Unleash the power of seamless plugin development with Adaptkit, your premier CLI companion for Mochabug Adapt. Effortlessly create, manage and deploy plugins with finesse. Explore the full potential of Adaptkit at ' +
3216
- chalk.underline.blue('https://www.mochabug.com'))
3217
- .configureHelp({
3218
- sortSubcommands: true,
3219
- sortOptions: true,
3220
- showGlobalOptions: true,
3221
- helpWidth: 140
3222
- });
3223
- const DEFAULT_INIT_DIRECTORY = './';
3224
- program
3225
- .command('init')
3226
- .option('-d, --dir <dir>', `Choose the directory to initiate your plugin's journey. Default: '${DEFAULT_INIT_DIRECTORY}'`, DEFAULT_INIT_DIRECTORY)
3227
- .description('Kickstart your plugin adventure. This command scaffolds a ready-to-go project structure.')
3228
- .action(({ dir }, cmd) => handleInit(dir, cmd));
3229
- program
3230
- .command('add')
3231
- .description("Expand your plugin's capabilities")
3232
- .action((_, cmd) => handleAdd(cmd));
3233
- program
3234
- .command('publish')
3235
- .option('-h, --host <host>', chalk.yellow('Warning: Primarily for development purposes'), 'adapt-grpc-dev.mochabugapis.com')
3236
- .option('-a, --authority <authority>', chalk.yellow('Warning: Primarily for development purposes'), 'https://auth-dev.mochabugapis.com')
3237
- .option('-c, --client <client>', chalk.yellow('Warning: Primarily for development purposes'), '2d711bbb-4b57-4ad5-8bf0-f2269de5b71d')
3238
- .option('-e, --error-url <errorUrl>', chalk.yellow('Warning: Primarily for development purposes'), 'https://accounts-dev.mochabug.com/services/error')
3239
- .option('--insecure', chalk.red('Ignore SSL certificate errors (insecure)'))
3240
- .description('Ready for liftoff? Publish your plugin to your organization with this command.')
3241
- .action(({ host, authority, client, insecure, errorUrl }, cmd) => handlePublish(host, authority, client, insecure, errorUrl, cmd));
3242
- program
3243
- .command('emulate')
3244
- .option('-h, --host <host>', 'Specify the URL to test your plugin in the emulator. Ideal for custom port configurations.', 'localhost:51001')
3245
- .description('Take your plugin for a test drive. Best used in conjunction with your build pipeline.')
3246
- .action(({ host }, cmd) => handleEmulate(host, cmd));
3247
- program
3248
- .command('version')
3249
- .option('--patch', 'Bump the manifest version to the next patch version')
3250
- .option('--minor', 'Bump the manifest version to the next minor version')
3251
- .option('--major', 'Bump the manifest version to the next major version')
3252
- .description('The version command can manipulate the version of the plugin manifest.')
3253
- .action(({ major, minor, patch }, cmd) => handleVersion(major ? 'major' : minor ? 'minor' : patch ? 'patch' : null, cmd));
3254
- // Set a custom help action
3255
- program.addHelpText('beforeAll', banner() + '\n');
3256
- program.showHelpAfterError();
3257
- try {
3258
- await program.parseAsync(process.argv);
3259
- }
3260
- catch (error) {
3261
- console.error(error);
3262
- console.error('An error occurred:', error.message);
3263
- }
3264
- }
3265
- main();
25
+ };`}async function Ro(e){let n=await Wa({message:"Type a new unused vertex name",transformer:i=>i.trim(),validate:i=>(i=i.trim(),e.vertices.filter(r=>r.name===i).length>0?!1:/^[_a-z][_a-z0-9]*$/.test(i))}),t=await xo({message:"Choose your vertex type",choices:[{name:"action",value:"action",description:"An action is a vertex that performs a task, such as sending an email or updating a database."},{name:"browser",value:"browser",description:"A browser is a vertex that interacts with a web browser, such as navigating to a page or clicking a button."},{name:"cron-trigger",value:"cron-trigger",description:"A cron trigger is a vertex that triggers at a specific time, such as every day at 3:00 PM."},{name:"external-trigger",value:"external-trigger",description:"An external trigger is a vertex that triggers from an external event, such as a webhook or a message queue."}]}),o=await Ja({message:"Need a configurator for the vertex?"}),s;(o||t==="browser")&&(s=await xo({message:"Choose frontend library",choices:[{name:"React",value:"react",description:"React with TypeScript"},{name:"None",value:"none",description:"I do it myself"}]})),console.log(zn.magenta("Creating new vertex templates..."));let a=De(".",n,t,o,e.vertices.map(i=>Jn(Mn,i)),s);e.vertices.push(Rn(Mn,a)),!e.configurators&&a.configurator&&(e.configurators="dist/configurators.js"),console.log(zn.magenta("Updating manifest...")),xa.writeFileSync("manifest.json",Me(ne,e,{enumAsInteger:!1,prettySpaces:2})),console.log(zn.bgGreen("Success"))}import{confirm as Ra,input as Fo,select as Eo}from"@inquirer/prompts";import Yo from"chalk";import{execSync as No}from"child_process";import Fa from"fs";import{mkdirp as Mo}from"mkdirp";import E from"path";async function Ho(e){let n=await Fo({message:"Type plugin name",transformer:u=>u.trim().toLowerCase(),validate:u=>/^[_a-z][_a-z0-9]*$/.test(u)}),t=await Eo({message:"Choose your vertex type",choices:[{name:"action",value:"action",description:"An action is a vertex that performs a task, such as sending an email or updating a database."},{name:"browser",value:"browser",description:"A browser is a vertex that interacts with a web browser, such as navigating to a page or clicking a button."},{name:"cron-trigger",value:"cron-trigger",description:"A cron trigger is a vertex that triggers at a specific time, such as every day at 3:00 PM."},{name:"external-trigger",value:"external-trigger",description:"An external trigger is a vertex that triggers from an external event, such as a webhook or a message queue."}]}),o=await Fo({message:"Type a new unused vertex name",transformer:u=>u.trim().toLowerCase(),validate:u=>/^[_a-z][_a-z0-9]*$/.test(u)}),s=await Ra({message:"Need a configurator for the vertex?"}),a;(s||t==="browser")&&(a=await Eo({message:"Choose frontend library",choices:[{name:"React",value:"react",description:"React with TypeScript"},{name:"None",value:"none",description:"I do it myself"}]})),Mo.sync(e);let i=E.isAbsolute(e)?e:E.join(process.cwd(),e);h(E.join(i,".gitignore"),y("gitignore"));let r={name:n,version:"",private:!0,type:"module",scripts:{"build-client":`node -e "if(require('fs').existsSync('build-client.js')) require('child_process').execSync('node build-client.js', { stdio: 'inherit' })"`,"build-common":"rimraf dist && npm run build-client && node build.js","build-dev":"export PLUGINS_CDN=https://cdn-dev.mochabug.com/adapt/plugins && npm run build-common","build-prod":"export PLUGINS_CDN=https://cdn.mochabug.com/adapt/plugins && npm run build-common","build-emulate":"export PLUGINS_CDN=http://localhost:51002 && npm run build-common",build:"npm run build-dev",emulate:"npm run build-emulate && adaptkit emulate",add:"adaptkit add"},devDependencies:{unenv:"npm:unenv-nightly@*"}};h(E.join(i,"package.json"),JSON.stringify(r,null,2)),h(E.join(i,"README.md"),y("readme.md")),h(E.join(i,"LICENSE.md"),y("license.md")),No("npm install --save-dev @mochabug/adapt-plugin-typings typescript @cloudflare/unenv-preset @types/node esbuild rimraf glob",{cwd:i,stdio:"inherit"}),No("npm install @mochabug/adapt-plugin-toolkit",{cwd:i,stdio:"inherit"}),h(E.join(i,"global.d.ts"),y("global.d.ts")),h(E.join(i,"tsconfig.json"),y("tsconf.json")),h(E.join(i,"build.js"),y("build.js")),h(E.join(i,"inject.js"),y("inject.js"));let l=De(i,o,t,s,[],a);console.log(Yo.magenta("Creating manifest..."));let d={name:n,organization:"00000000-0000-0000-0000-000000000000",version:"0.1.0",label:ke(n),description:`A nice description of what ${n} does`,author:"John Doe",bugs:"bugs@foobar.com",homepage:"https://www.foobar.com",repository:"https://github.com",vertices:[l],executors:"dist/executors.js",pluginVariables:[],pluginOauth2:[],pluginMtls:[]};if(a==="react"&&(Mo.sync(E.join(e,"cdn")),d.cdn="cdn"),!l.metadata)throw new Error("This cannot happen");l.configurator&&(d.configurators="dist/configurators.js"),Fa.writeFileSync(E.join(i,"manifest.json"),JSON.stringify(d,null,2)),console.log(Yo.bgGreen("Success"))}import zo from"chalk";import{randomBytes as Ea}from"crypto";import Ya from"express";import Na from"node-fetch";import Ma from"open";import Ha from"pkce-challenge";var za=51421,Ka=5,La="https://www.mochabugapis.com/auth/adapt/plugins.upload",wa="https://adapt-dev.mochabugapis.com";function va({clientId:e,redirectUri:n,scope:t,state:o,authUrl:s,codeChallenge:a,audience:i}){let r=new URL(s);return r.searchParams.set("response_type","code"),r.searchParams.set("client_id",e),r.searchParams.set("audience",i),r.searchParams.set("redirect_uri",n),r.searchParams.set("scope",t),r.searchParams.set("state",o),r.searchParams.set("code_challenge",a),r.searchParams.set("code_challenge_method","S256"),r.toString()}function Ua({redirectUri:e,codeVerifier:n,clientId:t,code:o}){let s=new URLSearchParams;return s.set("grant_type","authorization_code"),s.set("code_verifier",n),s.set("client_id",t),s.set("code",o),s.set("redirect_uri",e),s.toString()}function Ko(e,n=0){return new Promise((t,o)=>{let s=za+n,a=e.listen(s,()=>{console.log(zo.green.bold(`Server running on http://localhost:${s} to listen to OAuth2 callbacks`)),t({server:a,port:s})});a.on("error",i=>{i.code==="EADDRINUSE"&&n<Ka-1?(console.log(zo.yellow.bold(`Port ${s} is in use, trying next available port.`)),a.close(),t(Ko(e,n+1))):o(i)})})}var Z="[waitForConsent]";async function Lo(e,n,t){console.info(`${Z} Starting OAuth2 consent workflow for client: ${t}`);let o=`${e}/oauth2/auth`,s=`${e}/oauth2/token`;console.info(`${Z} Authorization URL: ${o}`),console.info(`${Z} Token URL: ${s}`);let a=Ya(),i=Ea(32).toString("hex");console.info(`${Z} Generated state for CSRF protection`);let r={base:"",redirect:""},{code_verifier:l,code_challenge:d}=await Ha();console.info(`${Z} PKCE Challenge generated`);let u,I,W,x=new Promise((G,R)=>{u=G,I=R});a.get("/",async(G,R)=>{let Qe=va({authUrl:o,clientId:t,redirectUri:r.redirect,scope:La,state:i,codeChallenge:d,audience:wa});console.info(`${Z} Redirecting to code URL for user consent`),R.redirect(Qe)}),a.get("/callback",async(G,R)=>{if("error"in G.query){console.error(`${Z} OAuth Error: error in callback`);let z=G.url.split("?")[1];R.redirect(`${n}?${z}`),I();return}if(G.query.state!==i){console.error(`${Z} OAuth Error: Invalid state. Received state does not match.`);let z=encodeURIComponent("Invalid state parameter.");R.redirect(`${n}?error=invalid_request&error_description=${z}`),I();return}console.info(`${Z} OAuth state validated`);let Qe=Ua({clientId:t,redirectUri:r.redirect,codeVerifier:l,code:G.query.code});try{console.info(`${Z} Exchanging code for token`);let z=await Na(s,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:Qe});if(!z.ok){console.error(`${Z} OAuth Error: could not exchange code for token`);let _o=z.url.split("?")[1];R.redirect(`${n}?${_o}`),I();return}let pe=await z.json();console.info(`${Z} Token exchange successful`),console.info(`${Z} Token exchange successful. Details: `,{expires_in:pe.expires_in,scope:pe.scope,type:pe.token_type,token:"<secret>"}),W=pe.access_token,R.redirect("/success")}catch(z){console.error(`${Z} Error exchanging token: ${z}`),R.redirect(`${n}?error=unkown&error_description=${encodeURIComponent("Unknown error during token exchange")}`),I()}}),a.get("/success",(G,R)=>{R.send(y("success_page.html")),W||(console.error("Token is undefined"),I()),u()});let v;try{console.info(`${Z} Starting local server to handle callbacks`);let G=await Ko(a);v=G.server,r.base=`http://localhost:${G.port}`,r.redirect=`${r.base}/callback`,console.info(`${Z} Server started on ${r.base}`)}catch(G){console.error(`${Z} Error starting server: ${G}`);return}try{return console.info(`${Z} Opening user consent page`),await Ma(r.base),console.info(`${Z} Waiting for user consent...`),await x,console.info(`${Z} OAuth consent workflow completed successfully`),W||console.error("Token is undefined"),W}catch(G){console.error(`${Z} Error in OAuth2 flow: ${G}`);return}finally{console.info(`${Z} Closing the server...`),v.closeAllConnections(),v.close(),console.info(`${Z} Server closed`)}}import{ConnectError as vo,createClient as Uo}from"@connectrpc/connect";import{createGrpcTransport as ko}from"@connectrpc/connect-node";import ka from"archiver";import m from"chalk";import Da from"fast-glob";import k from"fs";import te from"path";import be from"sharp";import{PassThrough as Qa}from"stream";async function Ta(e,n,t){switch(te.extname(e)){case".avif":return await be(e).resize(n,t).avif().toBuffer();case".gif":return await be(e).resize(n,t).gif().toBuffer();case".jpg":case".jpeg":case".jfif":case".pjpeg":case".pjp":return await be(e).resize(n,t).jpeg().toBuffer();case".png":return await be(e).resize(n,t).png().toBuffer();case".svg":return k.readFileSync(e);case".webp":return await be(e).resize(n,t).webp().toBuffer()}throw new Error("Invalid logotype")}function Pa(e){let n=te.resolve(".");return te.resolve(e).startsWith(n)}function _a(e){try{let n=te.resolve(e);return k.existsSync(n)?k.statSync(n).isDirectory():!1}catch(n){return console.error("Error checking if folder exists:",n),!1}}function wo(e){return new Promise((n,t)=>{_a(e)||t(`The folder ${e} does not exist`);let o=ka("tar",{gzip:!0,zlib:{level:9}});o.on("error",i=>{t(i)});let s=[],a=new Qa;a.on("data",i=>s.push(i)),a.on("end",()=>{let i=Buffer.concat(s);console.log(`${e} have been compressed successfully into a buffer.`),n(i)}),o.pipe(a),Da(te.join(e,"**","*")).then(i=>{for(let r of i)if(k.statSync(r).isFile()){let l=te.relative(e,r);o.file(r,{name:l})}o.finalize()}).catch(i=>t(i))})}async function Do(e,n,t){let o={};async function s(r,l,d){if(!r||o[r])return;if(!Pa(r))throw new Error(`The file path is not safe: ${r}. It must be contained inside the manifest folder. Invalid manifest`);if(!k.existsSync(r))throw new Error(`The path does not exists: ${r}. Invalid manifest`);let u;return l?(u=await Ta(r,l[0],l[1]),console.log(`Compressed: ${r} to ${l[0]}x${l[1]} size`)):d?u=d:u=k.readFileSync(r),o[r]=!0,B(Nn,{data:{case:"file",value:{data:u,path:r}}})}let a=new Headers,i=new Headers;await n.uploadPlugin(async function*(){yield B(Nn,{data:{case:"manifest",value:e}});let r=[s("README.md"),s("LICENSE.md"),s(e.executors),s(e.configurators),s(e.logo,[80,80])];e.assets&&k.existsSync(e.assets)&&r.push(s(e.assets,void 0,await wo(e.assets))),e.cdn&&k.existsSync(e.cdn)&&r.push(s(e.cdn,void 0,await wo(e.cdn)));for(let l of e.vertices)r.push(s(l.logo,[40,40])),r.push(s(l.metadata)),l.config&&r.push(s(l.config));for await(let l of r)l&&(yield l)}(),{headers:t,onHeader:r=>{i=r},onTrailer:r=>{a=r}}),Oa(i,a)}async function Qo(e,n){let t=Uo(Hn,ko({baseUrl:n}));try{await Do(e,t)}catch(o){o instanceof vo?Po(o):console.error(o),console.log(`For more information, use: ${m.blue("adaptkit help emulate")}`)}}async function To(e,n,t,o){let s=Uo(Hn,ko({baseUrl:n})),a=new Headers({authorization:`Bearer ${t}`});try{await Do(e,s,a)}catch(i){i instanceof vo?Po(i):console.error(i),console.log(`For more information, use: ${m.blue("adaptkit help publish")}`)}}function Oa(e,n){let t=m.green("=================================================="),o=m.bgGreen.black.bold(" RPC Success Details "),s=m.bold.white("Status Code: ")+m.greenBright.bold("OK"),a=m.bold.white("Details: ")+m.greenBright("The upload was successful"),i=m.bold.white(`Headers:
26
+ `)+(e?m.blue(JSON.stringify(e,null,2)):m.gray(" No Metadata")),r=m.bold.white(`Trailers:
27
+ `)+(n?m.blue(JSON.stringify(n,null,2)):m.gray(" No Trailers"));console.log(t),console.log(o),console.log(t),console.log(s),console.log(a),console.log(t),console.log(i),console.log(t),console.log(r),console.log(t),console.log(m.bgGreen.black.bold(" SUCCESS ")),console.log(t)}function Po(e){let n=m.red("=================================================="),t=m.bgRed.white.bold(" RPC Error Details "),o=m.bold.white("Name: ")+m.redBright.bold(e.name),s=m.bold.white("Message: ")+m.redBright(e.message),a=m.bold.white("Code: ")+m.redBright.bold(e.code),i=e.methodName?m.bold.white("Method Name: ")+m.yellowBright(e.methodName):m.gray("No Method Name"),r=e.serviceName?m.bold.white("Service Name: ")+m.yellowBright(e.serviceName):m.gray("No Service Name"),l=m.bold.white(`Metadata:
28
+ `)+(e.metadata?m.blue(JSON.stringify([...e.metadata.entries()],null,2)):m.gray(" No Metadata"));console.error(n),console.error(t),console.error(n),console.error(o),console.error(s),console.error(a),console.error(n),i&&console.error(i),r&&console.error(r),console.error(n),console.error(l),console.error(n);let d=e.details;if(console.error(m.bold.white("Error Details:")),d.length===0)console.error(m.gray(" No error details"));else for(let u of d)console.error(m.red(JSON.stringify(u,null,2)));console.error(n),console.error(m.bgRed.white.bold(" ERROR ")),console.error(n)}async function Kn(e){try{return new URL(e),!0}catch{return!1}}function ti(){return b.yellowBright(ja.textSync("Adaptkit"))}async function oi(e,n){n.args.length>=1&&(console.error(b.red("Error: Invalid sub-command or arguments provided.")),console.log(`For more information, use: ${b.blue("adaptkit help init")}`),process.exit(1)),await Ho(e)}async function si(e){e.args.length>=1&&(console.error(b.red("Error: Invalid sub-command or arguments provided.")),console.log(`For more information, use: ${b.blue("adaptkit help add")}`),process.exit(1));let n=ge("manifest.json");n||(console.log(`For more information, use: ${b.blue("adaptkit help add")}`),process.exit(1)),await Ro(n)}async function ai(e,n,t,o,s,a){await Kn(n)||(console.error(b.red(`Error: The provided authority url is not a valid URL: ${n}`)),console.log(`For more information, use: ${b.blue("adaptkit help publish")}`),process.exit(1)),await Kn(e)||(console.error(b.red(`Error: The provided endpoint is not valid: ${e}`)),console.log(`For more information, use: ${b.blue("adaptkit help publish")}`),process.exit(1)),a.args.length>=1&&(console.error(b.red("Error: Invalid sub-command or arguments provided.")),console.log(`For more information, use: ${b.blue("adaptkit help publish")}`),process.exit(1));let i=ge("manifest.json");i||(console.log(`For more information, use: ${b.blue("adaptkit help publish")}`),process.exit(1)),o&&(process.env.NODE_TLS_REJECT_UNAUTHORIZED="0");let r=await Lo(n,s,t);r||(console.log("Could not fetch the acccess token. Terminating..."),process.exit(1)),await To(i,e,r,o)}async function ii(e,n){await Kn(e)||(console.error(b.red(`Error: The provided endpoint is not valid: ${e}`)),console.log(`For more information, use: ${b.blue("adaptkit help emulate")}`),process.exit(1)),n.args.length>=1&&(console.error(b.red("Error: Invalid sub-command or arguments provided.")),console.log(`For more information, use: ${b.blue("adaptkit help emulate")}`),process.exit(1));let t=ge("manifest.json");t||(console.log(`For more information, use: ${b.blue("adaptkit help emulate")}`),process.exit(1)),await Qo(t,e)}function ri(e,n){n.args.length>=1&&(console.error(b.red("Error: Invalid sub-command or arguments provided.")),console.log(`For more information, use: ${b.blue("adaptkit help version")}`),process.exit(1));let t=ge("manifest.json");t||(console.log(`For more information, use: ${b.blue("adaptkit help version")}`),process.exit(1));let o=ei.parse(t.version);o||(console.error(b.red(`Error: The version in the manifest is not a valid semver version: ${t.version}`)),console.log(`For more information, use: ${b.blue("adaptkit help version")}`),process.exit(1)),e===null&&(console.error(b.red("You must provide either --patch --minor or --major to bump the version.")),console.log(`For more information, use: ${b.blue("adaptkit help version")}`),process.exit(1));let s=t.version;t.version=o.inc(e).toString(),$a.writeFileSync(qa.join(process.cwd(),"manifest.json"),Me(ne,t,{enumAsInteger:!1,prettySpaces:2})),console.log(b.green(`Bumped the version from ${s} to ${t.version}`))}async function ci(){ni({pkg:g}).notify({isGlobal:!0,defer:!1}),w.name("Adaptkit").version("1.0.0").description("Unleash the power of seamless plugin development with Adaptkit, your premier CLI companion for Mochabug Adapt. Effortlessly create, manage and deploy plugins with finesse. Explore the full potential of Adaptkit at "+b.underline.blue("https://www.mochabug.com")).configureHelp({sortSubcommands:!0,sortOptions:!0,showGlobalOptions:!0,helpWidth:140});let n="./";w.command("init").option("-d, --dir <dir>",`Choose the directory to initiate your plugin's journey. Default: '${n}'`,n).description("Kickstart your plugin adventure. This command scaffolds a ready-to-go project structure.").action(({dir:t},o)=>oi(t,o)),w.command("add").description("Expand your plugin's capabilities").action((t,o)=>si(o)),w.command("publish").option("-e, --endpoint <url>","URL of the gRPC server (including protocol)","https://adapt-grpc-dev.mochabugapis.com").option("-a, --authority <authority>",b.yellow("Warning: Primarily for development purposes"),"https://auth-dev.mochabugapis.com").option("-c, --client <client>",b.yellow("Warning: Primarily for development purposes"),"2d711bbb-4b57-4ad5-8bf0-f2269de5b71d").option("--error-url <errorUrl>",b.yellow("Warning: Primarily for development purposes"),"https://accounts-dev.mochabug.com/services/error").option("--insecure",b.red("Ignore SSL certificate errors (insecure)")).description("Ready for liftoff? Publish your plugin to your organization with this command.").action(({endpoint:t,authority:o,client:s,insecure:a,errorUrl:i},r)=>ai(t,o,s,a,i,r)),w.command("emulate").option("-e, --endpoint <url>","URL of the emulator server (including protocol)","http://localhost:51001").description("Take your plugin for a test drive. Best used in conjunction with your build pipeline.").action(({endpoint:t},o)=>ii(t,o)),w.command("version").option("--patch","Bump the manifest version to the next patch version").option("--minor","Bump the manifest version to the next minor version").option("--major","Bump the manifest version to the next major version").description("The version command can manipulate the version of the plugin manifest.").action(({major:t,minor:o,patch:s},a)=>ri(t?"major":o?"minor":s?"patch":null,a)),w.addHelpText("beforeAll",ti()+`
29
+ `),w.showHelpAfterError();try{await w.parseAsync(process.argv)}catch(t){console.error(t),console.error("An error occurred:",t.message)}}ci();
30
+ //# sourceMappingURL=index.js.map