@discordeno/gateway 19.0.0-next.e2d86ea → 19.0.0-next.e33b44e

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.
@@ -0,0 +1,303 @@
1
+ /* eslint-disable @typescript-eslint/no-confusing-void-expression */ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createGatewayManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createGatewayManager;
9
+ }
10
+ });
11
+ const _types = require("@discordeno/types");
12
+ const _utils = require("@discordeno/utils");
13
+ const _Shard = /*#__PURE__*/ _interop_require_default(require("./Shard.cjs"));
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ function createGatewayManager(options) {
20
+ const connectionOptions = options.connection ?? {
21
+ url: 'wss://gateway.discord.gg',
22
+ shards: 1,
23
+ sessionStartLimit: {
24
+ maxConcurrency: 1,
25
+ remaining: 1000,
26
+ total: 1000,
27
+ resetAfter: 1000 * 60 * 60 * 24
28
+ }
29
+ };
30
+ const gateway = {
31
+ events: options.events ?? {},
32
+ compress: options.compress ?? false,
33
+ intents: options.intents ?? 0,
34
+ properties: {
35
+ os: options.properties?.os ?? process.platform,
36
+ browser: options.properties?.browser ?? 'Discordeno',
37
+ device: options.properties?.device ?? 'Discordeno'
38
+ },
39
+ token: options.token,
40
+ url: options.url ?? connectionOptions.url ?? 'wss://gateway.discord.gg',
41
+ version: options.version ?? 10,
42
+ connection: connectionOptions,
43
+ totalShards: options.totalShards ?? connectionOptions.shards ?? 1,
44
+ lastShardId: options.lastShardId ?? (options.totalShards ? options.totalShards - 1 : connectionOptions ? connectionOptions.shards - 1 : 0),
45
+ firstShardId: options.firstShardId ?? 0,
46
+ totalWorkers: options.totalWorkers ?? 4,
47
+ shardsPerWorker: options.shardsPerWorker ?? 25,
48
+ spawnShardDelay: options.spawnShardDelay ?? 5300,
49
+ preferSnakeCase: options.preferSnakeCase ?? false,
50
+ shards: new Map(),
51
+ buckets: new Map(),
52
+ cache: {
53
+ requestMembers: {
54
+ enabled: options.cache?.requestMembers?.enabled ?? false,
55
+ pending: new _utils.Collection()
56
+ }
57
+ },
58
+ logger: options.logger ?? _utils.logger,
59
+ calculateTotalShards () {
60
+ // Bots under 100k servers do not have access to total shards.
61
+ if (gateway.totalShards < 100) {
62
+ gateway.logger.debug(`[Gateway] Calculating total shards: ${gateway.totalShards}`);
63
+ return gateway.totalShards;
64
+ }
65
+ gateway.logger.debug(`[Gateway] Calculating total shards`, gateway.totalShards, gateway.connection.sessionStartLimit.maxConcurrency);
66
+ // Calculate a multiple of `maxConcurrency` which can be used to connect to the gateway.
67
+ return Math.ceil(gateway.totalShards / // If `maxConcurrency` is 1 we can safely use 16.
68
+ (gateway.connection.sessionStartLimit.maxConcurrency === 1 ? 16 : gateway.connection.sessionStartLimit.maxConcurrency)) * gateway.connection.sessionStartLimit.maxConcurrency;
69
+ },
70
+ calculateWorkerId (shardId) {
71
+ const workerId = Math.min(shardId % gateway.shardsPerWorker, gateway.totalWorkers - 1);
72
+ gateway.logger.debug(`[Gateway] Calculating workerId: Shard: ${shardId} -> Worker: ${workerId} -> Per Worker: ${gateway.shardsPerWorker} -> Total: ${gateway.totalWorkers}`);
73
+ return workerId;
74
+ },
75
+ prepareBuckets () {
76
+ for(let i = 0; i < gateway.connection.sessionStartLimit.maxConcurrency; ++i){
77
+ gateway.logger.debug(`[Gateway] Preparing buckets for concurrency: ${i}`);
78
+ gateway.buckets.set(i, {
79
+ workers: [],
80
+ identifyRequests: []
81
+ });
82
+ }
83
+ // ORGANIZE ALL SHARDS INTO THEIR OWN BUCKETS
84
+ for(let shardId = gateway.firstShardId; shardId <= gateway.lastShardId; ++shardId){
85
+ gateway.logger.debug(`[Gateway] Preparing buckets for shard: ${shardId}`);
86
+ if (shardId >= gateway.totalShards) {
87
+ throw new Error(`Shard (id: ${shardId}) is bigger or equal to the used amount of used shards which is ${gateway.totalShards}`);
88
+ }
89
+ const bucketId = shardId % gateway.connection.sessionStartLimit.maxConcurrency;
90
+ const bucket = gateway.buckets.get(bucketId);
91
+ if (!bucket) {
92
+ throw new Error(`Shard (id: ${shardId}) got assigned to an illegal bucket id: ${bucketId}, expected a bucket id between 0 and ${gateway.connection.sessionStartLimit.maxConcurrency - 1}`);
93
+ }
94
+ // FIND A QUEUE IN THIS BUCKET THAT HAS SPACE
95
+ // const worker = bucket.workers.find((w) => w.queue.length < gateway.shardsPerWorker);
96
+ const workerId = gateway.calculateWorkerId(shardId);
97
+ const worker = bucket.workers.find((w)=>w.id === workerId);
98
+ if (worker) {
99
+ // IF THE QUEUE HAS SPACE JUST ADD IT TO THIS QUEUE
100
+ worker.queue.push(shardId);
101
+ } else {
102
+ bucket.workers.push({
103
+ id: workerId,
104
+ queue: [
105
+ shardId
106
+ ]
107
+ });
108
+ }
109
+ }
110
+ for (const bucket of gateway.buckets.values()){
111
+ for (const worker of bucket.workers.values()){
112
+ // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
113
+ worker.queue = worker.queue.sort((a, b)=>a - b);
114
+ }
115
+ }
116
+ },
117
+ async spawnShards () {
118
+ // PREPARES ALL SHARDS IN SPECIFIC BUCKETS
119
+ gateway.prepareBuckets();
120
+ // Prefer concurrency of forEach instead of forof
121
+ await Promise.all([
122
+ ...gateway.buckets.entries()
123
+ ].map(async ([bucketId, bucket])=>{
124
+ for (const worker of bucket.workers){
125
+ for (const shardId of worker.queue){
126
+ await gateway.tellWorkerToIdentify(worker.id, shardId, bucketId);
127
+ }
128
+ }
129
+ }));
130
+ },
131
+ async shutdown (code, reason) {
132
+ gateway.shards.forEach((shard)=>shard.close(code, reason));
133
+ await (0, _utils.delay)(5000);
134
+ },
135
+ async sendPayload (shardId, payload) {
136
+ const shard = gateway.shards.get(shardId);
137
+ if (!shard) {
138
+ throw new Error(`Shard (id: ${shardId} not found`);
139
+ }
140
+ await shard.send(payload);
141
+ },
142
+ async tellWorkerToIdentify (workerId, shardId, bucketId) {
143
+ gateway.logger.debug(`[Gateway] tell worker to identify (${workerId}, ${shardId}, ${bucketId})`);
144
+ await gateway.identify(shardId);
145
+ },
146
+ async identify (shardId) {
147
+ let shard = this.shards.get(shardId);
148
+ gateway.logger.debug(`[Gateway] identifying ${shard ? 'existing' : 'new'} shard (${shardId})`);
149
+ if (!shard) {
150
+ shard = new _Shard.default({
151
+ id: shardId,
152
+ connection: {
153
+ compress: this.compress,
154
+ intents: this.intents,
155
+ properties: this.properties,
156
+ token: this.token,
157
+ totalShards: this.totalShards,
158
+ url: this.url,
159
+ version: this.version
160
+ },
161
+ events: options.events ?? {},
162
+ logger: this.logger,
163
+ requestIdentify: async ()=>{
164
+ await gateway.identify(shardId);
165
+ },
166
+ shardIsReady: async ()=>{
167
+ gateway.logger.debug(`[Shard] Shard #${shardId} is ready`);
168
+ await (0, _utils.delay)(gateway.spawnShardDelay);
169
+ gateway.logger.debug(`[Shard] Resolving shard identify request`);
170
+ gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency).identifyRequests.shift()?.();
171
+ }
172
+ });
173
+ if (this.preferSnakeCase) {
174
+ shard.forwardToBot = async (payload)=>{
175
+ shard.events.message?.(shard, payload);
176
+ };
177
+ }
178
+ this.shards.set(shardId, shard);
179
+ }
180
+ const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency);
181
+ if (!bucket) return;
182
+ return await new Promise((resolve)=>{
183
+ // Mark that we are making an identify request so another is not made.
184
+ bucket.identifyRequests.push(resolve);
185
+ gateway.logger.debug(`[Gateway] identifying shard #(${shardId}).`);
186
+ // This will trigger identify and when READY is received it will resolve the above request.
187
+ shard?.identify();
188
+ });
189
+ },
190
+ async kill (shardId) {
191
+ const shard = this.shards.get(shardId);
192
+ if (!shard) {
193
+ return gateway.logger.debug(`[Gateway] kill shard but not found (${shardId})`);
194
+ }
195
+ gateway.logger.debug(`[Gateway] kill shard (${shardId})`);
196
+ this.shards.delete(shardId);
197
+ await shard.shutdown();
198
+ },
199
+ async requestIdentify (shardId) {
200
+ gateway.logger.debug(`[Gateway] requesting identify`);
201
+ // const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency)
202
+ // if (!bucket) return
203
+ // return await new Promise((resolve) => {
204
+ // bucket.identifyRequests.push(resolve)
205
+ // })
206
+ },
207
+ // Helpers methods below this
208
+ calculateShardId (guildId, totalShards) {
209
+ // If none is provided, use the total shards number from gateway object.
210
+ if (!totalShards) totalShards = gateway.totalShards;
211
+ // If it is only 1 shard, it will always be shard id 0
212
+ if (totalShards === 1) {
213
+ gateway.logger.debug(`[Gateway] calculateShardId (1 shard)`);
214
+ return 0;
215
+ }
216
+ gateway.logger.debug(`[Gateway] calculateShardId (guildId: ${guildId}, totalShards: ${totalShards})`);
217
+ return Number((BigInt(guildId) >> 22n) % BigInt(totalShards));
218
+ },
219
+ async joinVoiceChannel (guildId, channelId, options) {
220
+ const shardId = gateway.calculateShardId(guildId);
221
+ gateway.logger.debug(`[Gateway] joinVoiceChannel guildId: ${guildId} channelId: ${channelId}`);
222
+ await gateway.sendPayload(shardId, {
223
+ op: _types.GatewayOpcodes.VoiceStateUpdate,
224
+ d: {
225
+ guild_id: guildId.toString(),
226
+ channel_id: channelId.toString(),
227
+ self_mute: options?.selfMute ?? false,
228
+ self_deaf: options?.selfDeaf ?? true
229
+ }
230
+ });
231
+ },
232
+ async editBotStatus (data) {
233
+ gateway.logger.debug(`[Gateway] editBotStatus data: ${JSON.stringify(data)}`);
234
+ await Promise.all([
235
+ ...gateway.shards.values()
236
+ ].map(async (shard)=>{
237
+ gateway.editShardStatus(shard.id, data);
238
+ }));
239
+ },
240
+ async editShardStatus (shardId, data) {
241
+ gateway.logger.debug(`[Gateway] editShardStatus shardId: ${shardId} -> data: ${JSON.stringify(data)}`);
242
+ await gateway.sendPayload(shardId, {
243
+ op: _types.GatewayOpcodes.PresenceUpdate,
244
+ d: {
245
+ since: null,
246
+ afk: false,
247
+ activities: data.activities,
248
+ status: data.status
249
+ }
250
+ });
251
+ },
252
+ async requestMembers (guildId, options) {
253
+ const shardId = gateway.calculateShardId(guildId);
254
+ if (gateway.intents && (!options?.limit || options.limit > 1) && !(gateway.intents & _types.GatewayIntents.GuildMembers)) throw new Error('Cannot fetch more then 1 member without the GUILD_MEMBERS intent');
255
+ gateway.logger.debug(`[Gateway] requestMembers guildId: ${guildId} -> data: ${JSON.stringify(options)}`);
256
+ if (options?.userIds?.length) {
257
+ gateway.logger.debug(`[Gateway] requestMembers guildId: ${guildId} -> setting user limit based on userIds length: ${options.userIds.length}`);
258
+ options.limit = options.userIds.length;
259
+ }
260
+ const members = !gateway.cache.requestMembers.enabled || !options?.nonce ? [] : new Promise((resolve, reject)=>{
261
+ // Should never happen.
262
+ if (!gateway.cache.requestMembers.enabled || !options?.nonce) {
263
+ reject(new Error("Can't request the members without the nonce or with the feature disabled."));
264
+ return;
265
+ }
266
+ gateway.cache.requestMembers.pending.set(options.nonce, {
267
+ nonce: options.nonce,
268
+ resolve,
269
+ members: []
270
+ });
271
+ });
272
+ await gateway.sendPayload(shardId, {
273
+ op: _types.GatewayOpcodes.RequestGuildMembers,
274
+ d: {
275
+ guild_id: guildId.toString(),
276
+ // If a query is provided use it, OR if a limit is NOT provided use ""
277
+ query: options?.query ?? (options?.limit ? undefined : ''),
278
+ limit: options?.limit ?? 0,
279
+ presences: options?.presences ?? false,
280
+ user_ids: options?.userIds?.map((id)=>id.toString()),
281
+ nonce: options?.nonce
282
+ }
283
+ });
284
+ return await members;
285
+ },
286
+ async leaveVoiceChannel (guildId) {
287
+ const shardId = gateway.calculateShardId(guildId);
288
+ gateway.logger.debug(`[Gateway] leaveVoiceChannel guildId: ${guildId} Shard ${shardId}`);
289
+ await gateway.sendPayload(shardId, {
290
+ op: _types.GatewayOpcodes.VoiceStateUpdate,
291
+ d: {
292
+ guild_id: guildId.toString(),
293
+ channel_id: null,
294
+ self_mute: false,
295
+ self_deaf: false
296
+ }
297
+ });
298
+ }
299
+ };
300
+ return gateway;
301
+ }
302
+
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1jb25mdXNpbmctdm9pZC1leHByZXNzaW9uICovXG5pbXBvcnQge1xuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgQXRMZWFzdE9uZSxcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEdldEdhdGV3YXlCb3QsXG4gIHR5cGUgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICB0eXBlIFJlcXVlc3RHdWlsZE1lbWJlcnMsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IFNoYXJkIGZyb20gJy4vU2hhcmQuanMnXG5pbXBvcnQgdHlwZSB7IFNoYXJkRXZlbnRzLCBTaGFyZFNvY2tldFJlcXVlc3QsIFN0YXR1c1VwZGF0ZSwgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgaW50ZW50czogb3B0aW9ucy5pbnRlbnRzID8/IDAsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgb3M6IG9wdGlvbnMucHJvcGVydGllcz8ub3MgPz8gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGJyb3dzZXI6IG9wdGlvbnMucHJvcGVydGllcz8uYnJvd3NlciA/PyAnRGlzY29yZGVubycsXG4gICAgICBkZXZpY2U6IG9wdGlvbnMucHJvcGVydGllcz8uZGV2aWNlID8/ICdEaXNjb3JkZW5vJyxcbiAgICB9LFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHVybDogb3B0aW9ucy51cmwgPz8gY29ubmVjdGlvbk9wdGlvbnMudXJsID8/ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAxMCxcbiAgICBjb25uZWN0aW9uOiBjb25uZWN0aW9uT3B0aW9ucyxcbiAgICB0b3RhbFNoYXJkczogb3B0aW9ucy50b3RhbFNoYXJkcyA/PyBjb25uZWN0aW9uT3B0aW9ucy5zaGFyZHMgPz8gMSxcbiAgICBsYXN0U2hhcmRJZDogb3B0aW9ucy5sYXN0U2hhcmRJZCA/PyAob3B0aW9ucy50b3RhbFNoYXJkcyA/IG9wdGlvbnMudG90YWxTaGFyZHMgLSAxIDogY29ubmVjdGlvbk9wdGlvbnMgPyBjb25uZWN0aW9uT3B0aW9ucy5zaGFyZHMgLSAxIDogMCksXG4gICAgZmlyc3RTaGFyZElkOiBvcHRpb25zLmZpcnN0U2hhcmRJZCA/PyAwLFxuICAgIHRvdGFsV29ya2Vyczogb3B0aW9ucy50b3RhbFdvcmtlcnMgPz8gNCxcbiAgICBzaGFyZHNQZXJXb3JrZXI6IG9wdGlvbnMuc2hhcmRzUGVyV29ya2VyID8/IDI1LFxuICAgIHNwYXduU2hhcmREZWxheTogb3B0aW9ucy5zcGF3blNoYXJkRGVsYXkgPz8gNTMwMCxcbiAgICBwcmVmZXJTbmFrZUNhc2U6IG9wdGlvbnMucHJlZmVyU25ha2VDYXNlID8/IGZhbHNlLFxuICAgIHNoYXJkczogbmV3IE1hcCgpLFxuICAgIGJ1Y2tldHM6IG5ldyBNYXAoKSxcbiAgICBjYWNoZToge1xuICAgICAgcmVxdWVzdE1lbWJlcnM6IHtcbiAgICAgICAgZW5hYmxlZDogb3B0aW9ucy5jYWNoZT8ucmVxdWVzdE1lbWJlcnM/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIHBlbmRpbmc6IG5ldyBDb2xsZWN0aW9uKCksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXIsXG5cbiAgICBjYWxjdWxhdGVUb3RhbFNoYXJkcygpIHtcbiAgICAgIC8vIEJvdHMgdW5kZXIgMTAwayBzZXJ2ZXJzIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0b3RhbCBzaGFyZHMuXG4gICAgICBpZiAoZ2F0ZXdheS50b3RhbFNoYXJkcyA8IDEwMCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIHJldHVybiBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgLy8gQ2FsY3VsYXRlIGEgbXVsdGlwbGUgb2YgYG1heENvbmN1cnJlbmN5YCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBnYXRld2F5LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgL1xuICAgICAgICAgICAgLy8gSWYgYG1heENvbmN1cnJlbmN5YCBpcyAxIHdlIGNhbiBzYWZlbHkgdXNlIDE2LlxuICAgICAgICAgICAgKGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSA9PT0gMSA/IDE2IDogZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KSxcbiAgICAgICAgKSAqIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeVxuICAgICAgKVxuICAgIH0sXG4gICAgY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZCkge1xuICAgICAgY29uc3Qgd29ya2VySWQgPSBNYXRoLm1pbihzaGFyZElkICUgZ2F0ZXdheS5zaGFyZHNQZXJXb3JrZXIsIGdhdGV3YXkudG90YWxXb3JrZXJzIC0gMSlcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gd29ya2VySWRcbiAgICB9LFxuICAgIHByZXBhcmVCdWNrZXRzKCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7ICsraSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBjb25jdXJyZW5jeTogJHtpfWApXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGlkZW50aWZ5UmVxdWVzdHM6IFtdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBPUkdBTklaRSBBTEwgU0hBUkRTIElOVE8gVEhFSVIgT1dOIEJVQ0tFVFNcbiAgICAgIGZvciAobGV0IHNoYXJkSWQgPSBnYXRld2F5LmZpcnN0U2hhcmRJZDsgc2hhcmRJZCA8PSBnYXRld2F5Lmxhc3RTaGFyZElkOyArK3NoYXJkSWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3Igc2hhcmQ6ICR7c2hhcmRJZH1gKVxuICAgICAgICBpZiAoc2hhcmRJZCA+PSBnYXRld2F5LnRvdGFsU2hhcmRzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZCAoaWQ6ICR7c2hhcmRJZH0pIGlzIGJpZ2dlciBvciBlcXVhbCB0byB0aGUgdXNlZCBhbW91bnQgb2YgdXNlZCBzaGFyZHMgd2hpY2ggaXMgJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRJZCA9IHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3lcbiAgICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChidWNrZXRJZClcbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBnb3QgYXNzaWduZWQgdG8gYW4gaWxsZWdhbCBidWNrZXQgaWQ6ICR7YnVja2V0SWR9LCBleHBlY3RlZCBhIGJ1Y2tldCBpZCBiZXR3ZWVuIDAgYW5kICR7XG4gICAgICAgICAgICAgIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSAtIDFcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJTkQgQSBRVUVVRSBJTiBUSElTIEJVQ0tFVCBUSEFUIEhBUyBTUEFDRVxuICAgICAgICAvLyBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LnF1ZXVlLmxlbmd0aCA8IGdhdGV3YXkuc2hhcmRzUGVyV29ya2VyKTtcbiAgICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LmNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IGJ1Y2tldC53b3JrZXJzLmZpbmQoKHcpID0+IHcuaWQgPT09IHdvcmtlcklkKVxuICAgICAgICBpZiAod29ya2VyKSB7XG4gICAgICAgICAgLy8gSUYgVEhFIFFVRVVFIEhBUyBTUEFDRSBKVVNUIEFERCBJVCBUTyBUSElTIFFVRVVFXG4gICAgICAgICAgd29ya2VyLnF1ZXVlLnB1c2goc2hhcmRJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud29ya2Vycy5wdXNoKHsgaWQ6IHdvcmtlcklkLCBxdWV1ZTogW3NoYXJkSWRdIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBidWNrZXQgb2YgZ2F0ZXdheS5idWNrZXRzLnZhbHVlcygpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIGJ1Y2tldC53b3JrZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWFycmF5LXNvcnQtY29tcGFyZVxuICAgICAgICAgIHdvcmtlci5xdWV1ZSA9IHdvcmtlci5xdWV1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc3Bhd25TaGFyZHMoKSB7XG4gICAgICAvLyBQUkVQQVJFUyBBTEwgU0hBUkRTIElOIFNQRUNJRklDIEJVQ0tFVFNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKVxuXG4gICAgICAvLyBQcmVmZXIgY29uY3VycmVuY3kgb2YgZm9yRWFjaCBpbnN0ZWFkIG9mIGZvcm9mXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLmdhdGV3YXkuYnVja2V0cy5lbnRyaWVzKCldLm1hcChhc3luYyAoW2J1Y2tldElkLCBidWNrZXRdKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS50ZWxsV29ya2VyVG9JZGVudGlmeSh3b3JrZXIuaWQsIHNoYXJkSWQsIGJ1Y2tldElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSxcbiAgICBhc3luYyBzaHV0ZG93bihjb2RlLCByZWFzb24pIHtcbiAgICAgIGdhdGV3YXkuc2hhcmRzLmZvckVhY2goKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKVxuXG4gICAgICBhd2FpdCBkZWxheSg1MDAwKVxuICAgIH0sXG4gICAgYXN5bmMgc2VuZFBheWxvYWQoc2hhcmRJZCwgcGF5bG9hZCkge1xuICAgICAgY29uc3Qgc2hhcmQgPSBnYXRld2F5LnNoYXJkcy5nZXQoc2hhcmRJZClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSBub3QgZm91bmRgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBzaGFyZC5zZW5kKHBheWxvYWQpXG4gICAgfSxcbiAgICBhc3luYyB0ZWxsV29ya2VyVG9JZGVudGlmeSh3b3JrZXJJZCwgc2hhcmRJZCwgYnVja2V0SWQpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gdGVsbCB3b3JrZXIgdG8gaWRlbnRpZnkgKCR7d29ya2VySWR9LCAke3NoYXJkSWR9LCAke2J1Y2tldElkfSlgKVxuICAgICAgYXdhaXQgZ2F0ZXdheS5pZGVudGlmeShzaGFyZElkKVxuICAgIH0sXG4gICAgYXN5bmMgaWRlbnRpZnkoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBsZXQgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gaWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3MsXG4gICAgICAgICAgICBpbnRlbnRzOiB0aGlzLmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogdGhpcy50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiB0aGlzLnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkuaWRlbnRpZnkoc2hhcmRJZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNoYXJkSXNSZWFkeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7c2hhcmRJZH0gaXMgcmVhZHlgKVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoZ2F0ZXdheS5zcGF3blNoYXJkRGVsYXkpXG4gICAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXNvbHZpbmcgc2hhcmQgaWRlbnRpZnkgcmVxdWVzdGApXG4gICAgICAgICAgICBnYXRld2F5LmJ1Y2tldHMuZ2V0KHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpIS5pZGVudGlmeVJlcXVlc3RzLnNoaWZ0KCk/LigpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5wcmVmZXJTbmFrZUNhc2UpIHtcbiAgICAgICAgICBzaGFyZC5mb3J3YXJkVG9Cb3QgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgc2hhcmQhLmV2ZW50cy5tZXNzYWdlPy4oc2hhcmQhLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZClcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgaWYgKCFidWNrZXQpIHJldHVyblxuXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgLy8gTWFyayB0aGF0IHdlIGFyZSBtYWtpbmcgYW4gaWRlbnRpZnkgcmVxdWVzdCBzbyBhbm90aGVyIGlzIG5vdCBtYWRlLlxuICAgICAgICBidWNrZXQuaWRlbnRpZnlSZXF1ZXN0cy5wdXNoKHJlc29sdmUpXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gaWRlbnRpZnlpbmcgc2hhcmQgIygke3NoYXJkSWR9KS5gKVxuICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBpZGVudGlmeSBhbmQgd2hlbiBSRUFEWSBpcyByZWNlaXZlZCBpdCB3aWxsIHJlc29sdmUgdGhlIGFib3ZlIHJlcXVlc3QuXG4gICAgICAgIHNoYXJkPy5pZGVudGlmeSgpXG4gICAgICB9KVxuICAgIH0sXG4gICAgYXN5bmMga2lsbChzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gdGhpcy5zaGFyZHMuZ2V0KHNoYXJkSWQpXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHJldHVybiBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGtpbGwgc2hhcmQgYnV0IG5vdCBmb3VuZCAoJHtzaGFyZElkfSlgKVxuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGtpbGwgc2hhcmQgKCR7c2hhcmRJZH0pYClcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKVxuICAgICAgYXdhaXQgc2hhcmQuc2h1dGRvd24oKVxuICAgIH0sXG4gICAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KHNoYXJkSWQ6IG51bWJlcikge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0aW5nIGlkZW50aWZ5YClcbiAgICAgIC8vIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIC8vIGlmICghYnVja2V0KSByZXR1cm5cblxuICAgICAgLy8gcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyAgIGJ1Y2tldC5pZGVudGlmeVJlcXVlc3RzLnB1c2gocmVzb2x2ZSlcbiAgICAgIC8vIH0pXG4gICAgfSxcblxuICAgIC8vIEhlbHBlcnMgbWV0aG9kcyBiZWxvdyB0aGlzXG5cbiAgICBjYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQsIHRvdGFsU2hhcmRzKSB7XG4gICAgICAvLyBJZiBub25lIGlzIHByb3ZpZGVkLCB1c2UgdGhlIHRvdGFsIHNoYXJkcyBudW1iZXIgZnJvbSBnYXRld2F5IG9iamVjdC5cbiAgICAgIGlmICghdG90YWxTaGFyZHMpIHRvdGFsU2hhcmRzID0gZ2F0ZXdheS50b3RhbFNoYXJkc1xuICAgICAgLy8gSWYgaXQgaXMgb25seSAxIHNoYXJkLCBpdCB3aWxsIGFsd2F5cyBiZSBzaGFyZCBpZCAwXG4gICAgICBpZiAodG90YWxTaGFyZHMgPT09IDEpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBjYWxjdWxhdGVTaGFyZElkICgxIHNoYXJkKWApXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoZ3VpbGRJZDogJHtndWlsZElkfSwgdG90YWxTaGFyZHM6ICR7dG90YWxTaGFyZHN9KWApXG4gICAgICByZXR1cm4gTnVtYmVyKChCaWdJbnQoZ3VpbGRJZCkgPj4gMjJuKSAlIEJpZ0ludCh0b3RhbFNoYXJkcykpXG4gICAgfSxcblxuICAgIGFzeW5jIGpvaW5Wb2ljZUNoYW5uZWwoZ3VpbGRJZCwgY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gam9pblZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IGNoYW5uZWxJZDogJHtjaGFubmVsSWR9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBzZWxmX211dGU6IG9wdGlvbnM/LnNlbGZNdXRlID8/IGZhbHNlLFxuICAgICAgICAgIHNlbGZfZGVhZjogb3B0aW9ucz8uc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RTdGF0dXMoZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0Qm90U3RhdHVzIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YClcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5nYXRld2F5LnNoYXJkcy52YWx1ZXMoKV0ubWFwKGFzeW5jIChzaGFyZCkgPT4ge1xuICAgICAgICAgIGdhdGV3YXkuZWRpdFNoYXJkU3RhdHVzKHNoYXJkLmlkLCBkYXRhKVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNoYXJkU3RhdHVzKHNoYXJkSWQsIGRhdGEpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gZWRpdFNoYXJkU3RhdHVzIHNoYXJkSWQ6ICR7c2hhcmRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlByZXNlbmNlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgc2luY2U6IG51bGwsXG4gICAgICAgICAgYWZrOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpdml0aWVzOiBkYXRhLmFjdGl2aXRpZXMsXG4gICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgaWYgKGdhdGV3YXkuaW50ZW50cyAmJiAoIW9wdGlvbnM/LmxpbWl0IHx8IG9wdGlvbnMubGltaXQgPiAxKSAmJiAhKGdhdGV3YXkuaW50ZW50cyAmIEdhdGV3YXlJbnRlbnRzLkd1aWxkTWVtYmVycykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIG1vcmUgdGhlbiAxIG1lbWJlciB3aXRob3V0IHRoZSBHVUlMRF9NRU1CRVJTIGludGVudCcpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gcmVxdWVzdE1lbWJlcnMgZ3VpbGRJZDogJHtndWlsZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApXG5cbiAgICAgIGlmIChvcHRpb25zPy51c2VySWRzPy5sZW5ndGgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0TWVtYmVycyBndWlsZElkOiAke2d1aWxkSWR9IC0+IHNldHRpbmcgdXNlciBsaW1pdCBiYXNlZCBvbiB1c2VySWRzIGxlbmd0aDogJHtvcHRpb25zLnVzZXJJZHMubGVuZ3RofWApXG5cbiAgICAgICAgb3B0aW9ucy5saW1pdCA9IG9wdGlvbnMudXNlcklkcy5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVtYmVycyA9XG4gICAgICAgICFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gICAgICAgICAgICAgIGlmICghZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkIHx8ICFvcHRpb25zPy5ub25jZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5wZW5kaW5nLnNldChvcHRpb25zLm5vbmNlLCB7XG4gICAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdEd1aWxkTWVtYmVycyxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgLy8gSWYgYSBxdWVyeSBpcyBwcm92aWRlZCB1c2UgaXQsIE9SIGlmIGEgbGltaXQgaXMgTk9UIHByb3ZpZGVkIHVzZSBcIlwiXG4gICAgICAgICAgcXVlcnk6IG9wdGlvbnM/LnF1ZXJ5ID8/IChvcHRpb25zPy5saW1pdCA/IHVuZGVmaW5lZCA6ICcnKSxcbiAgICAgICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gMCxcbiAgICAgICAgICBwcmVzZW5jZXM6IG9wdGlvbnM/LnByZXNlbmNlcyA/PyBmYWxzZSxcbiAgICAgICAgICB1c2VyX2lkczogb3B0aW9ucz8udXNlcklkcz8ubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgICAgbm9uY2U6IG9wdGlvbnM/Lm5vbmNlLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IG1lbWJlcnNcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVWb2ljZUNoYW5uZWwoZ3VpbGRJZCkge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGxlYXZlVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gU2hhcmQgJHtzaGFyZElkfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogbnVsbCxcbiAgICAgICAgICBzZWxmX211dGU6IGZhbHNlLFxuICAgICAgICAgIHNlbGZfZGVhZjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gZ2F0ZXdheVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgZmlyc3QgU2hhcmQgd2hpY2ggc2hvdWxkIGdldCBjb250cm9sbGVkIGJ5IHRoaXMgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgZmlyc3RTaGFyZElkPzogbnVtYmVyXG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgbGFzdCBTaGFyZCB3aGljaCBzaG91bGQgZ2V0IGNvbnRyb2xsZWQgYnkgdGhpcyBtYW5hZ2VyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBsYXN0U2hhcmRJZD86IG51bWJlclxuICAvKipcbiAgICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNwYXduaW5nIG5leHQgc2hhcmQuIE9QVElNQUwgSVMgQUJPVkUgNTEwMC4gWU9VIERPTidUIFdBTlQgVE8gSElUIFRIRSBSQVRFIExJTUlUISEhXG4gICAqIEBkZWZhdWx0IDUzMDBcbiAgICovXG4gIHNwYXduU2hhcmREZWxheT86IG51bWJlclxuICAvKipcbiAgICogV2hldGhlciB0byBzZW5kIHRoZSBkaXNjb3JkIHBhY2tldHMgaW4gc25ha2UgY2FzZSBmb3JtLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcHJlZmVyU25ha2VDYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogVG90YWwgYW1vdW50IG9mIHNoYXJkcyB5b3VyIGJvdCB1c2VzLiBVc2VmdWwgZm9yIHplcm8tZG93bnRpbWUgdXBkYXRlcyBvciByZXNoYXJkaW5nLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICB0b3RhbFNoYXJkcz86IG51bWJlclxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBzaGFyZHMgdG8gbG9hZCBwZXIgd29ya2VyLlxuICAgKiBAZGVmYXVsdCAyNVxuICAgKi9cbiAgc2hhcmRzUGVyV29ya2VyPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIHdvcmtlcnMgdG8gdXNlIGZvciB5b3VyIGJvdC5cbiAgICogQGRlZmF1bHQgNFxuICAgKi9cbiAgdG90YWxXb3JrZXJzPzogbnVtYmVyXG4gIC8qKiBJbXBvcnRhbnQgZGF0YSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBtYW5hZ2VyIHRvIGNvbm5lY3Qgc2hhcmRzIHRvIHRoZSBnYXRld2F5LiAqL1xuICBjb25uZWN0aW9uPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+XG4gIC8qKiBXaGV0aGVyIGluY29taW5nIHBheWxvYWRzIGFyZSBjb21wcmVzc2VkIHVzaW5nIHpsaWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzcz86IGJvb2xlYW5cbiAgLyoqIFRoZSBjYWxjdWxhdGVkIGludGVudCB2YWx1ZSBvZiB0aGUgZXZlbnRzIHdoaWNoIHRoZSBzaGFyZCBzaG91bGQgcmVjZWl2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgaW50ZW50cz86IG51bWJlclxuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllcz86IHtcbiAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSB0aGUgc2hhcmQgcnVucyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZGFyd2luXCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIlxuICAgICAqL1xuICAgIG9zOiBzdHJpbmdcbiAgICAvKiogVGhlIFwiYnJvd3NlclwiIHdoZXJlIHRoaXMgc2hhcmQgaXMgcnVubmluZyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgYnJvd3Nlcjogc3RyaW5nXG4gICAgLyoqIFRoZSBkZXZpY2Ugb24gd2hpY2ggdGhlIHNoYXJkIGlzIHJ1bm5pbmcuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGRldmljZTogc3RyaW5nXG4gIH1cbiAgLyoqIEJvdCB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZCAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKiBUaGUgVVJMIG9mIHRoZSBnYXRld2F5IHdoaWNoIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwid3NzOi8vZ2F0ZXdheS5kaXNjb3JkLmdnXCJcbiAgICovXG4gIHVybD86IHN0cmluZ1xuICAvKiogVGhlIGdhdGV3YXkgdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHZlcnNpb24/OiBudW1iZXJcbiAgLyoqIFRoZSBldmVudHMgaGFuZGxlcnMgKi9cbiAgZXZlbnRzPzogU2hhcmRFdmVudHNcbiAgLyoqIFRoaXMgbWFuYWdlcnMgY2FjaGUgcmVsYXRlZCBzZXR0aW5ncy4gKi9cbiAgY2FjaGU/OiB7XG4gICAgcmVxdWVzdE1lbWJlcnM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGxvZ2dlciB0aGF0IHRoZSBnYXRld2F5IG1hbmFnZXIgd2lsbCB1c2VcbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+XG4gICAgICAvKiogUmVxdWVzdHMgdG8gaWRlbnRpZnkgc2hhcmRzIGFyZSBtYWRlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYXZhaWxhYmxlIHRvIGJlIG1hZGUuICovXG4gICAgICBpZGVudGlmeVJlcXVlc3RzOiBBcnJheTwodmFsdWU6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPikgPT4gdm9pZD5cbiAgICB9XG4gID5cbiAgLyoqIFRoZSBzaGFyZHMgdGhhdCBhcmUgY3JlYXRlZC4gKi9cbiAgc2hhcmRzOiBNYXA8bnVtYmVyLCBTaGFyZD5cbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIERldGVybWluZSBtYXggbnVtYmVyIG9mIHNoYXJkcyB0byB1c2UgYmFzZWQgdXBvbiB0aGUgbWF4IGNvbmN1cnJlbmN5LiAqL1xuICBjYWxjdWxhdGVUb3RhbFNoYXJkczogKCkgPT4gbnVtYmVyXG4gIC8qKiBEZXRlcm1pbmUgdGhlIGlkIG9mIHRoZSB3b3JrZXIgd2hpY2ggaXMgaGFuZGxpbmcgYSBzaGFyZC4gKi9cbiAgY2FsY3VsYXRlV29ya2VySWQ6IChzaGFyZElkOiBudW1iZXIpID0+IG51bWJlclxuICAvKiogUHJlcGFyZXMgYWxsIHRoZSBidWNrZXRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgaWRlbnRpZnlpbmcgdGhlIHNoYXJkcy4gKi9cbiAgcHJlcGFyZUJ1Y2tldHM6ICgpID0+IHZvaWRcbiAgLyoqIFN0YXJ0IGlkZW50aWZ5aW5nIGFsbCB0aGUgc2hhcmRzLiAqL1xuICBzcGF3blNoYXJkczogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogU2h1dGRvd24gYWxsIHNoYXJkcy4gKi9cbiAgc2h1dGRvd246IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEFsbG93cyB1c2VycyB0byBob29rIGluIGFuZCBjaGFuZ2UgdG8gY29tbXVuaWNhdGUgdG8gZGlmZmVyZW50IHdvcmtlcnMgYWNyb3NzIGRpZmZlcmVudCBzZXJ2ZXJzIG9yIGFueXRoaW5nIHRoZXkgbGlrZS4gRm9yIGV4YW1wbGUgdXNpbmcgcmVkaXMgcHVic3ViIHRvIHRhbGsgdG8gb3RoZXIgc2VydmVycy4gKi9cbiAgdGVsbFdvcmtlclRvSWRlbnRpZnk6ICh3b3JrZXJJZDogbnVtYmVyLCBzaGFyZElkOiBudW1iZXIsIGJ1Y2tldElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRlbGwgdGhlIG1hbmFnZXIgdG8gaWRlbnRpZnkgYSBTaGFyZC4gSWYgdGhpcyBTaGFyZCBpcyBub3QgYWxyZWFkeSBtYW5hZ2VkIHRoaXMgd2lsbCBhbHNvIGFkZCB0aGUgU2hhcmQgdG8gdGhlIG1hbmFnZXIuICovXG4gIGlkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBLaWxsIGEgc2hhcmQuIENsb3NlIGEgc2hhcmRzIGNvbm5lY3Rpb24gdG8gRGlzY29yZCdzIGdhdGV3YXkgKGlmIGFueSkgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBtYW5hZ2VyLiAqL1xuICBraWxsOiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgYnVja2V0IGlzIGFsbG93ZWQgdG8gbWFrZSB0aGUgbmV4dCBpZGVudGlmeSByZXF1ZXN0LiAqL1xuICByZXF1ZXN0SWRlbnRpZnk6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBzaGFyZHMgYmFzZWQgb24gdGhlIGd1aWxkIGlkIGFuZCB0b3RhbCBzaGFyZHMuICovXG4gIGNhbGN1bGF0ZVNoYXJkSWQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRvdGFsU2hhcmRzPzogbnVtYmVyKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIENvbm5lY3RzIHRoZSBib3QgdXNlciB0byBhIHZvaWNlIG9yIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIF9VcGRhdGUgVm9pY2UgU3RhdGVfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIHZvaWNlIGNoYW5uZWwgdG8gbGVhdmUgaXMgaW4uXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgeW91IHdhbnQgdG8gam9pbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBDT05ORUNUYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9Wb2ljZSBTdGF0ZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3VwZGF0ZS12b2ljZS1zdGF0ZX1cbiAgICovXG4gIGpvaW5Wb2ljZUNoYW5uZWw6IChndWlsZElkOiBCaWdTdHJpbmcsIGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQXRMZWFzdE9uZTxPbWl0PFVwZGF0ZVZvaWNlU3RhdGUsICdndWlsZElkJyB8ICdjaGFubmVsSWQnPj4pID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3Qgc3RhdHVzIGluIGFsbCBzaGFyZHMgdGhhdCB0aGlzIGdhdGV3YXkgbWFuYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIFByb21pc2U8dm9pZD5cbiAgICovXG4gIGVkaXRCb3RTdGF0dXM6IChkYXRhOiBTdGF0dXNVcGRhdGUpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3QncyBzdGF0dXMgb24gb25lIHNoYXJkLlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcmRJZCBUaGUgc2hhcmQgaWQgdG8gZWRpdCB0aGUgc3RhdHVzIGZvci5cbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIFByb21pc2U8dm9pZD5cbiAgICovXG4gIGVkaXRTaGFyZFN0YXR1czogKHNoYXJkSWQ6IG51bWJlciwgZGF0YTogU3RhdHVzVXBkYXRlKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIG1lbWJlcnMgZm9yIGEgZ3VpbGQgb3ZlciB0aGUgZ2F0ZXdheS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiByZXF1ZXN0aW5nIHRoZSBlbnRpcmUgbWVtYmVyIGxpc3Q6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBHVUlMRF9NRU1CRVJTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgcHJlc2VuY2VzICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5wcmVzZW5jZXMgfCBwcmVzZW5jZXN9IHNldCB0byBgdHJ1ZWApOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfUFJFU0VOQ0VTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSBwcmVmaXggKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnF1ZXJ5IHwgcXVlcnl9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSB1c2VycyBieSBJRCAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMudXNlcklkcyB8IHVzZXJJZHN9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlcnMgQ2h1bmtfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IDEwMDAgbWVtYmVycyBmZXRjaGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqL1xuICByZXF1ZXN0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IE9taXQ8UmVxdWVzdEd1aWxkTWVtYmVycywgJ2d1aWxkSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gIC8qKlxuICAgKiBMZWF2ZXMgdGhlIHZvaWNlIGNoYW5uZWwgdGhlIGJvdCB1c2VyIGlzIGN1cnJlbnRseSBpbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBsZWF2ZVZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZToge1xuICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkOiBib29sZWFuXG4gICAgICAvKiogVGhlIHBlbmRpbmcgcmVxdWVzdHMuICovXG4gICAgICBwZW5kaW5nOiBDb2xsZWN0aW9uPHN0cmluZywgUmVxdWVzdE1lbWJlclJlcXVlc3Q+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE1lbWJlclJlcXVlc3Qge1xuICAvKiogVGhlIHVuaXF1ZSBub25jZSBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBub25jZTogc3RyaW5nXG4gIC8qKiBUaGUgcmVzb2x2ZXIgaGFuZGxlciB0byBydW4gd2hlbiBhbGwgbWVtYmVycyBhcnJpdmUuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogQ2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+IHwgUHJvbWlzZUxpa2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PikgPT4gdm9pZFxuICAvKiogVGhlIG1lbWJlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXJyaXZlZCBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBtZW1iZXJzOiBEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUdhdGV3YXlNYW5hZ2VyIiwib3B0aW9ucyIsImNvbm5lY3Rpb25PcHRpb25zIiwiY29ubmVjdGlvbiIsInVybCIsInNoYXJkcyIsInNlc3Npb25TdGFydExpbWl0IiwibWF4Q29uY3VycmVuY3kiLCJyZW1haW5pbmciLCJ0b3RhbCIsInJlc2V0QWZ0ZXIiLCJnYXRld2F5IiwiZXZlbnRzIiwiY29tcHJlc3MiLCJpbnRlbnRzIiwicHJvcGVydGllcyIsIm9zIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYnJvd3NlciIsImRldmljZSIsInRva2VuIiwidmVyc2lvbiIsInRvdGFsU2hhcmRzIiwibGFzdFNoYXJkSWQiLCJmaXJzdFNoYXJkSWQiLCJ0b3RhbFdvcmtlcnMiLCJzaGFyZHNQZXJXb3JrZXIiLCJzcGF3blNoYXJkRGVsYXkiLCJwcmVmZXJTbmFrZUNhc2UiLCJNYXAiLCJidWNrZXRzIiwiY2FjaGUiLCJyZXF1ZXN0TWVtYmVycyIsImVuYWJsZWQiLCJwZW5kaW5nIiwiQ29sbGVjdGlvbiIsImxvZ2dlciIsImNhbGN1bGF0ZVRvdGFsU2hhcmRzIiwiZGVidWciLCJNYXRoIiwiY2VpbCIsImNhbGN1bGF0ZVdvcmtlcklkIiwic2hhcmRJZCIsIndvcmtlcklkIiwibWluIiwicHJlcGFyZUJ1Y2tldHMiLCJpIiwic2V0Iiwid29ya2VycyIsImlkZW50aWZ5UmVxdWVzdHMiLCJFcnJvciIsImJ1Y2tldElkIiwiYnVja2V0IiwiZ2V0Iiwid29ya2VyIiwiZmluZCIsInciLCJpZCIsInF1ZXVlIiwicHVzaCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsInNwYXduU2hhcmRzIiwiUHJvbWlzZSIsImFsbCIsImVudHJpZXMiLCJtYXAiLCJ0ZWxsV29ya2VyVG9JZGVudGlmeSIsInNodXRkb3duIiwiY29kZSIsInJlYXNvbiIsImZvckVhY2giLCJzaGFyZCIsImNsb3NlIiwiZGVsYXkiLCJzZW5kUGF5bG9hZCIsInBheWxvYWQiLCJzZW5kIiwiaWRlbnRpZnkiLCJTaGFyZCIsInJlcXVlc3RJZGVudGlmeSIsInNoYXJkSXNSZWFkeSIsInNoaWZ0IiwiZm9yd2FyZFRvQm90IiwibWVzc2FnZSIsInJlc29sdmUiLCJraWxsIiwiZGVsZXRlIiwiY2FsY3VsYXRlU2hhcmRJZCIsImd1aWxkSWQiLCJOdW1iZXIiLCJCaWdJbnQiLCJqb2luVm9pY2VDaGFubmVsIiwiY2hhbm5lbElkIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIlZvaWNlU3RhdGVVcGRhdGUiLCJkIiwiZ3VpbGRfaWQiLCJ0b1N0cmluZyIsImNoYW5uZWxfaWQiLCJzZWxmX211dGUiLCJzZWxmTXV0ZSIsInNlbGZfZGVhZiIsInNlbGZEZWFmIiwiZWRpdEJvdFN0YXR1cyIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZWRpdFNoYXJkU3RhdHVzIiwiUHJlc2VuY2VVcGRhdGUiLCJzaW5jZSIsImFmayIsImFjdGl2aXRpZXMiLCJzdGF0dXMiLCJsaW1pdCIsIkdhdGV3YXlJbnRlbnRzIiwiR3VpbGRNZW1iZXJzIiwidXNlcklkcyIsImxlbmd0aCIsIm1lbWJlcnMiLCJub25jZSIsInJlamVjdCIsIlJlcXVlc3RHdWlsZE1lbWJlcnMiLCJxdWVyeSIsInVuZGVmaW5lZCIsInByZXNlbmNlcyIsInVzZXJfaWRzIiwibGVhdmVWb2ljZUNoYW5uZWwiXSwibWFwcGluZ3MiOiJBQUFBLGtFQUFrRTs7OzsrQkFlbERBOzs7ZUFBQUE7Ozt1QkFMVDt1QkFDbUM7OERBQ3hCOzs7Ozs7QUFHWCxTQUFTQSxxQkFBcUJDLE9BQW9DO0lBQ3ZFLE1BQU1DLG9CQUFvQkQsUUFBUUUsVUFBVSxJQUFJO1FBQzlDQyxLQUFLO1FBQ0xDLFFBQVE7UUFDUkMsbUJBQW1CO1lBQ2pCQyxnQkFBZ0I7WUFDaEJDLFdBQVc7WUFDWEMsT0FBTztZQUNQQyxZQUFZLE9BQU8sS0FBSyxLQUFLO1FBQy9CO0lBQ0Y7SUFFQSxNQUFNQyxVQUEwQjtRQUM5QkMsUUFBUVgsUUFBUVcsTUFBTSxJQUFJLENBQUM7UUFD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
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ ShardSocketCloseCodes: function() {
13
+ return ShardSocketCloseCodes;
14
+ },
15
+ ShardState: function() {
16
+ return ShardState;
17
+ }
18
+ });
19
+ var ShardState;
20
+ (function(ShardState) {
21
+ /** Shard is fully connected to the gateway and receiving events from Discord. */ ShardState[ShardState["Connected"] = 0] = "Connected";
22
+ /** Shard started to connect to the gateway. This is only used if the shard is not currently trying to identify or resume. */ ShardState[ShardState["Connecting"] = 1] = "Connecting";
23
+ /** Shard got disconnected and reconnection actions have been started. */ ShardState[ShardState["Disconnected"] = 2] = "Disconnected";
24
+ /** The shard is connected to the gateway but only heartbeating. At this state the shard has not been identified with discord. */ ShardState[ShardState["Unidentified"] = 3] = "Unidentified";
25
+ /** Shard is trying to identify with the gateway to create a new session. */ ShardState[ShardState["Identifying"] = 4] = "Identifying";
26
+ /** Shard is trying to resume a session with the gateway. */ ShardState[ShardState["Resuming"] = 5] = "Resuming";
27
+ /** Shard got shut down studied or due to a not (self) fixable error and may not attempt to reconnect on its own. */ ShardState[ShardState["Offline"] = 6] = "Offline";
28
+ })(ShardState || (ShardState = {}));
29
+ var ShardSocketCloseCodes;
30
+ (function(ShardSocketCloseCodes) {
31
+ /** A regular Shard shutdown. */ ShardSocketCloseCodes[ShardSocketCloseCodes["Shutdown"] = 3000] = "Shutdown";
32
+ /** A resume has been requested and therefore the old connection needs to be closed. */ ShardSocketCloseCodes[ShardSocketCloseCodes["ResumeClosingOldConnection"] = 3024] = "ResumeClosingOldConnection";
33
+ /** Did not receive a heartbeat ACK in time.
34
+ * Closing the shard and creating a new session.
35
+ */ ShardSocketCloseCodes[ShardSocketCloseCodes["ZombiedConnection"] = 3010] = "ZombiedConnection";
36
+ /** Discordeno's gateway tests hae been finished, therefore the Shard can be turned off. */ ShardSocketCloseCodes[ShardSocketCloseCodes["TestingFinished"] = 3064] = "TestingFinished";
37
+ /** Special close code reserved for Discordeno's zero-downtime resharding system. */ ShardSocketCloseCodes[ShardSocketCloseCodes["Resharded"] = 3065] = "Resharded";
38
+ /** Shard is re-identifying therefore the old connection needs to be closed. */ ShardSocketCloseCodes[ShardSocketCloseCodes["ReIdentifying"] = 3066] = "ReIdentifying";
39
+ })(ShardSocketCloseCodes || (ShardSocketCloseCodes = {}));
40
+
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGl2aXR5VHlwZXMsIENhbWVsaXplLCBEaXNjb3JkQWN0aXZpdHksIERpc2NvcmRHYXRld2F5UGF5bG9hZCwgR2F0ZXdheU9wY29kZXMsIFByZXNlbmNlU3RhdHVzIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgdHlwZSBTaGFyZCBmcm9tICcuL1NoYXJkLmpzJ1xuXG5leHBvcnQgZW51bSBTaGFyZFN0YXRlIHtcbiAgLyoqIFNoYXJkIGlzIGZ1bGx5IGNvbm5lY3RlZCB0byB0aGUgZ2F0ZXdheSBhbmQgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIERpc2NvcmQuICovXG4gIENvbm5lY3RlZCA9IDAsXG4gIC8qKiBTaGFyZCBzdGFydGVkIHRvIGNvbm5lY3QgdG8gdGhlIGdhdGV3YXkuIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBzaGFyZCBpcyBub3QgY3VycmVudGx5IHRyeWluZyB0byBpZGVudGlmeSBvciByZXN1bWUuICovXG4gIENvbm5lY3RpbmcgPSAxLFxuICAvKiogU2hhcmQgZ290IGRpc2Nvbm5lY3RlZCBhbmQgcmVjb25uZWN0aW9uIGFjdGlvbnMgaGF2ZSBiZWVuIHN0YXJ0ZWQuICovXG4gIERpc2Nvbm5lY3RlZCA9IDIsXG4gIC8qKiBUaGUgc2hhcmQgaXMgY29ubmVjdGVkIHRvIHRoZSBnYXRld2F5IGJ1dCBvbmx5IGhlYXJ0YmVhdGluZy4gQXQgdGhpcyBzdGF0ZSB0aGUgc2hhcmQgaGFzIG5vdCBiZWVuIGlkZW50aWZpZWQgd2l0aCBkaXNjb3JkLiAqL1xuICBVbmlkZW50aWZpZWQgPSAzLFxuICAvKiogU2hhcmQgaXMgdHJ5aW5nIHRvIGlkZW50aWZ5IHdpdGggdGhlIGdhdGV3YXkgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24uICovXG4gIElkZW50aWZ5aW5nID0gNCxcbiAgLyoqIFNoYXJkIGlzIHRyeWluZyB0byByZXN1bWUgYSBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIFJlc3VtaW5nID0gNSxcbiAgLyoqIFNoYXJkIGdvdCBzaHV0IGRvd24gc3R1ZGllZCBvciBkdWUgdG8gYSBub3QgKHNlbGYpIGZpeGFibGUgZXJyb3IgYW5kIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgb24gaXRzIG93bi4gKi9cbiAgT2ZmbGluZSA9IDYsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgaW5jb21pbmcgcGF5bG9hZHMgYXJlIGNvbXByZXNzZWQgdXNpbmcgemxpYi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGNvbXByZXNzOiBib29sZWFuXG4gIC8qKiBUaGUgY2FsY3VsYXRlZCBpbnRlbnQgdmFsdWUgb2YgdGhlIGV2ZW50cyB3aGljaCB0aGUgc2hhcmQgc2hvdWxkIHJlY2VpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGludGVudHM6IG51bWJlclxuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllczoge1xuICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHRoZSBzaGFyZCBydW5zIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJkYXJ3aW5cIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiXG4gICAgICovXG4gICAgb3M6IHN0cmluZ1xuICAgIC8qKiBUaGUgXCJicm93c2VyXCIgd2hlcmUgdGhpcyBzaGFyZCBpcyBydW5uaW5nIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBicm93c2VyOiBzdHJpbmdcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmdcbiAgfVxuICAvKiogQm90IHRva2VuIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsOiBzdHJpbmdcbiAgLyoqIFRoZSBnYXRld2F5IHZlcnNpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uOiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzIHRvIGNvbm5lY3QgdG8gYWNyb3NzIHRoZSBlbnRpcmUgYm90LlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICB0b3RhbFNoYXJkczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRIZWFydCB7XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgaGVhcnRiZWF0IHdhcyBhY2tub3dsZWRnZWQgYnkgRGlzY29yZCBpbiB0aW1lLiAqL1xuICBhY2tub3dsZWRnZWQ6IGJvb2xlYW5cbiAgLyoqIEludGVydmFsIGJldHdlZW4gaGVhcnRiZWF0cyByZXF1ZXN0ZWQgYnkgRGlzY29yZC4gKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogSWQgb2YgdGhlIGludGVydmFsLCB3aGljaCBpcyB1c2VkIGZvciBzZW5kaW5nIHRoZSBoZWFydGJlYXRzLiAqL1xuICBpbnRlcnZhbElkPzogTm9kZUpTLlRpbWVvdXRcbiAgLyoqIFVuaXggKGluIG1pbGxpc2Vjb25kcykgdGltZXN0YW1wIHdoZW4gdGhlIGxhc3QgaGVhcnRiZWF0IEFDSyB3YXMgcmVjZWl2ZWQgZnJvbSBEaXNjb3JkLiAqL1xuICBsYXN0QWNrPzogbnVtYmVyXG4gIC8qKiBVbml4IHRpbWVzdGFtcCAoaW4gbWlsbGlzZWNvbmRzKSB3aGVuIHRoZSBsYXN0IGhlYXJ0YmVhdCB3YXMgc2VudC4gKi9cbiAgbGFzdEJlYXQ/OiBudW1iZXJcbiAgLyoqIFJvdW5kIHRyaXAgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmcm9tIFNoYXJkIHRvIERpc2NvcmQgYW5kIGJhY2suXG4gICAqIENhbGN1bGF0ZWQgdXNpbmcgdGhlIGhlYXJ0YmVhdCBzeXN0ZW0uXG4gICAqIE5vdGU6IHRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBoZWFydGJlYXQgdG8gRGlzY29yZCBoYXMgaGFwcGVuZWQuXG4gICAqL1xuICBydHQ/OiBudW1iZXJcbiAgLyoqIElkIG9mIHRoZSB0aW1lb3V0IHdoaWNoIGlzIHVzZWQgZm9yIHNlbmRpbmcgdGhlIGZpcnN0IGhlYXJ0YmVhdCB0byBEaXNjb3JkIHNpbmNlIGl0J3MgXCJzcGVjaWFsXCIuICovXG4gIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRFdmVudHMge1xuICAvKiogQSBoZWFydGJlYXQgaGFzIGJlZW4gc2VuZC4gKi9cbiAgaGVhcnRiZWF0PzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogQSBoZWFydGJlYXQgQUNLIHdhcyByZWNlaXZlZC4gKi9cbiAgaGVhcnRiZWF0QWNrPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogU2hhcmQgaGFzIHJlY2VpdmVkIGEgSGVsbG8gcGF5bG9hZC4gKi9cbiAgaGVsbG8/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgU2hhcmRzIHNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICovXG4gIGludmFsaWRTZXNzaW9uPzogKHNoYXJkOiBTaGFyZCwgcmVzdW1hYmxlOiBib29sZWFuKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHN0YXJ0ZWQgYSByZXN1bWUgYWN0aW9uLiAqL1xuICByZXN1bWluZz86IChzaGFyZDogU2hhcmQpID0+IHVua25vd25cbiAgLyoqIFRoZSBzaGFyZCBoYXMgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgYW4gb2xkIHNlc3Npb24uICovXG4gIHJlc3VtZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBEaXNjb3JkIGhhcyByZXF1ZXN0ZWQgdGhlIFNoYXJkIHRvIHJlY29ubmVjdC4gKi9cbiAgcmVxdWVzdGVkUmVjb25uZWN0PzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIHN0YXJ0ZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkJ3MgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGluZz86IChzaGFyZDogU2hhcmQpID0+IHVua25vd25cbiAgLyoqIFRoZSBzaGFyZCBpcyBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGVkPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBmcm9tIERpc2NvcmQncyBnYXRld2F5LiAqL1xuICBkaXNjb25uZWN0ZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHN0YXJ0ZWQgdG8gaWRlbnRpZnkgaXRzZWxmIHRvIERpc2NvcmQuICovXG4gIGlkZW50aWZ5aW5nPzogKHNoYXJkOiBTaGFyZCkgPT4gdW5rbm93blxuICAvKiogVGhlIHNoYXJkIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpZGVudGlmaWVkIGl0c2VsZiB3aXRoIERpc2NvcmQuICovXG4gIGlkZW50aWZpZWQ/OiAoc2hhcmQ6IFNoYXJkKSA9PiB1bmtub3duXG4gIC8qKiBUaGUgc2hhcmQgaGFzIHJlY2VpdmVkIGEgbWVzc2FnZSBmcm9tIERpc2NvcmQuICovXG4gIG1lc3NhZ2U/OiAoc2hhcmQ6IFNoYXJkLCBwYXlsb2FkOiBDYW1lbGl6ZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQ+KSA9PiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFNoYXJkU29ja2V0Q2xvc2VDb2RlcyB7XG4gIC8qKiBBIHJlZ3VsYXIgU2hhcmQgc2h1dGRvd24uICovXG4gIFNodXRkb3duID0gMzAwMCxcbiAgLyoqIEEgcmVzdW1lIGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlcmVmb3JlIHRoZSBvbGQgY29ubmVjdGlvbiBuZWVkcyB0byBiZSBjbG9zZWQuICovXG4gIFJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uID0gMzAyNCxcbiAgLyoqIERpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS5cbiAgICogQ2xvc2luZyB0aGUgc2hhcmQgYW5kIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24uXG4gICAqL1xuICBab21iaWVkQ29ubmVjdGlvbiA9IDMwMTAsXG4gIC8qKiBEaXNjb3JkZW5vJ3MgZ2F0ZXdheSB0ZXN0cyBoYWUgYmVlbiBmaW5pc2hlZCwgdGhlcmVmb3JlIHRoZSBTaGFyZCBjYW4gYmUgdHVybmVkIG9mZi4gKi9cbiAgVGVzdGluZ0ZpbmlzaGVkID0gMzA2NCxcbiAgLyoqIFNwZWNpYWwgY2xvc2UgY29kZSByZXNlcnZlZCBmb3IgRGlzY29yZGVubydzIHplcm8tZG93bnRpbWUgcmVzaGFyZGluZyBzeXN0ZW0uICovXG4gIFJlc2hhcmRlZCA9IDMwNjUsXG4gIC8qKiBTaGFyZCBpcyByZS1pZGVudGlmeWluZyB0aGVyZWZvcmUgdGhlIG9sZCBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIGNsb3NlZC4gKi9cbiAgUmVJZGVudGlmeWluZyA9IDMwNjYsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRTb2NrZXRSZXF1ZXN0IHtcbiAgLyoqIFRoZSBPUC1Db2RlIGZvciB0aGUgcGF5bG9hZCB0byBzZW5kLiAqL1xuICBvcDogR2F0ZXdheU9wY29kZXNcbiAgLyoqIFBheWxvYWQgZGF0YS4gKi9cbiAgZDogdW5rbm93blxufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI3VwZGF0ZS1wcmVzZW5jZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCb3RTdGF0dXNVcGRhdGUge1xuICAvLyAvKiogVW5peCB0aW1lIChpbiBtaWxsaXNlY29uZHMpIG9mIHdoZW4gdGhlIGNsaWVudCB3ZW50IGlkbGUsIG9yIG51bGwgaWYgdGhlIGNsaWVudCBpcyBub3QgaWRsZSAqL1xuICBzaW5jZTogbnVtYmVyIHwgbnVsbFxuICAvKiogVGhlIHVzZXIncyBhY3Rpdml0aWVzICovXG4gIGFjdGl2aXRpZXM6IEJvdEFjdGl2aXR5W11cbiAgLyoqIFRoZSB1c2VyJ3MgbmV3IHN0YXR1cyAqL1xuICBzdGF0dXM6IGtleW9mIHR5cGVvZiBQcmVzZW5jZVN0YXR1c1xufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI2FjdGl2aXR5LW9iamVjdCAqL1xuZXhwb3J0IGludGVyZmFjZSBCb3RBY3Rpdml0eSB7XG4gIG5hbWU6IHN0cmluZ1xuICB0eXBlOiBBY3Rpdml0eVR5cGVzXG4gIHVybD86IHN0cmluZ1xufVxuXG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZvaWNlU3RhdGUge1xuICAvKiogaWQgb2YgdGhlIGd1aWxkICovXG4gIGd1aWxkSWQ6IHN0cmluZ1xuICAvKiogaWQgb2YgdGhlIHZvaWNlIGNoYW5uZWwgY2xpZW50IHdhbnRzIHRvIGpvaW4gKG51bGwgaWYgZGlzY29ubmVjdGluZykgKi9cbiAgY2hhbm5lbElkOiBzdHJpbmcgfCBudWxsXG4gIC8qKiBJcyB0aGUgY2xpZW50IG11dGVkICovXG4gIHNlbGZNdXRlOiBib29sZWFuXG4gIC8qKiBJcyB0aGUgY2xpZW50IGRlYWZlbmVkICovXG4gIHNlbGZEZWFmOiBib29sZWFuXG59XG5cbi8qKiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheS1ldmVudHMjdXBkYXRlLXByZXNlbmNlICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c1VwZGF0ZSB7XG4gIC8vIC8qKiBVbml4IHRpbWUgKGluIG1pbGxpc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2xpZW50IHdlbnQgaWRsZSwgb3IgbnVsbCBpZiB0aGUgY2xpZW50IGlzIG5vdCBpZGxlICovXG4gIC8vIHNpbmNlOiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIHVzZXIncyBhY3Rpdml0aWVzICovXG4gIGFjdGl2aXRpZXM/OiBDYW1lbGl6ZTxBcnJheTxPbWl0PERpc2NvcmRBY3Rpdml0eSwgJ2NyZWF0ZWRfYXQnPj4+XG4gIC8qKiBUaGUgdXNlcidzIG5ldyBzdGF0dXMgKi9cbiAgc3RhdHVzOiBrZXlvZiB0eXBlb2YgUHJlc2VuY2VTdGF0dXNcbiAgLy8gLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBjbGllbnQgaXMgYWZrICovXG4gIC8vIGFmazogYm9vbGVhbjtcbn1cbiJdLCJuYW1lcyI6WyJTaGFyZFN0YXRlIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBR1lBO0lBQ1YsK0VBQStFO0lBRS9FLDJIQUEySDtJQUUzSCx1RUFBdUU7SUFFdkUsK0hBQStIO0lBRS9ILDBFQUEwRTtJQUUxRSwwREFBMEQ7SUFFMUQsa0hBQWtIO0dBYnhHQSxlQUFBQTs7VUFrSEFDO0lBQ1YsOEJBQThCO0lBRTlCLHFGQUFxRjtJQUVyRjs7R0FFQztJQUVELHlGQUF5RjtJQUV6RixrRkFBa0Y7SUFFbEYsNkVBQTZFO0dBYm5FQSwwQkFBQUEifQ==