@discordeno/rest 19.0.0-next.f072d12 → 19.0.0-next.f15ef49

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.
package/dist/manager.js CHANGED
@@ -1,2 +1,1416 @@
1
- import{InteractionResponseTypes as e}from"@discordeno/types";import{calculateBits as t,camelize as s,camelToSnakeCase as a,delay as i,findFiles as n,getBotIdFromToken as o,isGetMessagesAfter as r,isGetMessagesAround as l,isGetMessagesBefore as d,isGetMessagesLimit as u,logger as c,processReactionString as m,urlToBase64 as g}from"@discordeno/utils";import{createInvalidRequestBucket as p}from"./invalidBucket.js";import{Queue as h}from"./queue.js";export function createRestManager(w){if(!w.token)throw Error("You must provide a valid token.");let y={token:w.token,applicationId:w.applicationId?BigInt(w.applicationId):o(w.token),version:w.version??10,baseUrl:w.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,deleteQueueDelay:6e4,queues:new Map,rateLimitedPaths:new Map,invalidBucket:p({}),routes:{webhooks:{id:e=>`/webhooks/${e}`,message:(e,t,s,a)=>{let i=`/webhooks/${e}/${t}/messages/${s}?`;return a&&a.threadId&&(i+=`thread_id=${a.threadId}`),i},original:(e,t,s)=>{let a=`/webhooks/${e}/${t}/messages/@original?`;return s&&s.threadId&&(a+=`thread_id=${s.threadId}`),a},webhook:(e,t,s)=>{let a=`/webhooks/${e}/${t}?`;return s&&(s?.wait!==void 0&&(a+=`wait=${s.wait.toString()}`),s.threadId&&(a+=`thread_id=${s.threadId}`)),a}},sessionInfo:()=>y.routes.gatewayBot(),channels:{bulk:e=>`/channels/${e}/messages/bulk-delete`,dm:()=>"/users/@me/channels",pin:(e,t)=>`/channels/${e}/pins/${t}`,pins:e=>`/channels/${e}/pins`,reactions:{bot:(e,t,s)=>`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}/@me`,user:(e,t,s,a)=>`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}/${a}`,all:(e,t)=>`/channels/${e}/messages/${t}/reactions`,emoji:(e,t,s,a)=>{let i=`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}?`;return a&&(a.after&&(i+=`after=${a.after}`),a.limit&&(i+=`&limit=${a.limit}`)),i},message:(e,t,s,a)=>{let i=`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}?`;return a&&(a.after&&(i+=`after=${a.after}`),a.limit&&(i+=`&limit=${a.limit}`)),i}},webhooks:e=>`/channels/${e}/webhooks`,channel:e=>`/channels/${e}`,follow:e=>`/channels/${e}/followers`,forum:e=>`/channels/${e}/threads?has_message=true`,invites:e=>`/channels/${e}/invites`,message:(e,t)=>`/channels/${e}/messages/${t}`,messages:(e,t)=>{let s=`/channels/${e}/messages?`;return t&&(r(t)&&t.after&&(s+=`after=${t.after}`),d(t)&&t.before&&(s+=`&before=${t.before}`),l(t)&&t.around&&(s+=`&around=${t.around}`),u(t)&&t.limit&&(s+=`&limit=${t.limit}`)),s},overwrite:(e,t)=>`/channels/${e}/permissions/${t}`,crosspost:(e,t)=>`/channels/${e}/messages/${t}/crosspost`,stages:()=>"/stage-instances",stage:e=>`/stage-instances/${e}`,threads:{message:(e,t)=>`/channels/${e}/messages/${t}/threads`,all:e=>`/channels/${e}/threads`,active:e=>`/guilds/${e}/threads/active`,members:e=>`/channels/${e}/thread-members`,me:e=>`/channels/${e}/thread-members/@me`,user:(e,t)=>`/channels/${e}/thread-members/${t}`,archived:e=>`/channels/${e}/threads/archived`,public:(e,t)=>{let s=`/channels/${e}/threads/archived/public?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s},private:(e,t)=>{let s=`/channels/${e}/threads/archived/private?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s},joined:(e,t)=>{let s=`/channels/${e}/users/@me/threads/archived/private?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s}},typing:e=>`/channels/${e}/typing`},guilds:{all:()=>"/guilds",auditlogs:(e,t)=>{let s=`/guilds/${e}/audit-logs?`;return t&&(t.actionType&&(s+=`action_type=${t.actionType}`),t.before&&(s+=`&before=${t.before}`),t.limit&&(s+=`&limit=${t.limit}`),t.userId&&(s+=`&user_id=${t.userId}`)),s},automod:{rule:(e,t)=>`/guilds/${e}/auto-moderation/rules/${t}`,rules:e=>`/guilds/${e}/auto-moderation/rules`},channels:e=>`/guilds/${e}/channels`,emoji:(e,t)=>`/guilds/${e}/emojis/${t}`,emojis:e=>`/guilds/${e}/emojis`,events:{events:(e,t)=>{let s=`/guilds/${e}/scheduled-events?`;return void 0!==t&&(s+=`with_user_count=${t.toString()}`),s},event:(e,t,s)=>{let a=`/guilds/${e}/scheduled-events/${t}`;return void 0!==s&&(a+=`with_user_count=${s.toString()}`),a},users:(e,t,s)=>{let a=`/guilds/${e}/scheduled-events/${t}/users?`;return s&&(void 0!==s.limit&&(a+=`limit=${s.limit}`),void 0!==s.withMember&&(a+=`&with_member=${s.withMember.toString()}`),void 0!==s.after&&(a+=`&after=${s.after}`),void 0!==s.before&&(a+=`&before=${s.before}`)),a}},guild(e,t){let s=`/guilds/${e}?`;return void 0!==t&&(s+=`with_counts=${t.toString()}`),s},integration:(e,t)=>`/guilds/${e}/integrations/${t}`,integrations:e=>`/guilds/${e}/integrations?include_applications=true`,invite(e,t){let s=`/invites/${e}?`;return t&&(void 0!==t.withCounts&&(s+=`with_counts=${t.withCounts.toString()}`),void 0!==t.withExpiration&&(s+=`&with_expiration=${t.withExpiration.toString()}`),t.scheduledEventId&&(s+=`&guild_scheduled_event_id=${t.scheduledEventId}`)),s},invites:e=>`/guilds/${e}/invites`,leave:e=>`/users/@me/guilds/${e}`,members:{ban:(e,t)=>`/guilds/${e}/bans/${t}`,bans:(e,t)=>{let s=`/guilds/${e}/bans?`;return t&&(t.limit&&(s+=`limit=${t.limit}`),t.after&&(s+=`&after=${t.after}`),t.before&&(s+=`&before=${t.before}`)),s},bot:e=>`/guilds/${e}/members/@me`,member:(e,t)=>`/guilds/${e}/members/${t}`,members:(e,t)=>{let s=`/guilds/${e}/members?`;return void 0!==t&&(t.limit&&(s+=`limit=${t.limit}`),t.after&&(s+=`&after=${t.after}`)),s},search:(e,t,s)=>{let a=`/guilds/${e}/members/search?query=${encodeURIComponent(t)}`;return s&&void 0!==s.limit&&(a+=`&limit=${s.limit}`),a},prune:(e,t)=>{let s=`/guilds/${e}/prune?`;return t&&(t.days&&(s+=`days=${t.days}`),Array.isArray(t.includeRoles)?s+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(s+=`&include_roles=${t.includeRoles}`)),s}},mfa:e=>`/guilds/${e}/mfa`,preview:e=>`/guilds/${e}/preview`,prune:(e,t)=>{let s=`/guilds/${e}/prune?`;return t&&(t.days&&(s+=`days=${t.days}`),Array.isArray(t.includeRoles)?s+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(s+=`&include_roles=${t.includeRoles}`)),s},roles:{one:(e,t)=>`/guilds/${e}/roles/${t}`,all:e=>`/guilds/${e}/roles`,member:(e,t,s)=>`/guilds/${e}/members/${t}/roles/${s}`},stickers:e=>`/guilds/${e}/stickers`,sticker:(e,t)=>`/guilds/${e}/stickers/${t}`,voice:(e,t)=>`/guilds/${e}/voice-states/${t??"@me"}`,templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},vanity:e=>`/guilds/${e}/vanity-url`,regions:e=>`/guilds/${e}/regions`,webhooks:e=>`/guilds/${e}/webhooks`,welcome:e=>`/guilds/${e}/welcome-screen`,widget:e=>`/guilds/${e}/widget`,widgetJson:e=>`/guilds/${e}/widget.json`},sticker:e=>`/stickers/${e}`,regions:()=>"/voice/regions",interactions:{commands:{commands:e=>`/applications/${e}/commands`,guilds:{all:(e,t)=>`/applications/${e}/guilds/${t}/commands`,one(e,t,s,a){let i=`/applications/${e}/guilds/${t}/commands/${s}?`;return void 0!==a&&(i+=`with_localizations=${a.toString()}`),i}},permissions:(e,t)=>`/applications/${e}/guilds/${t}/commands/permissions`,permission:(e,t,s)=>`/applications/${e}/guilds/${t}/commands/${s}/permissions`,command:(e,t,s)=>{let a=`/applications/${e}/commands/${t}?`;return void 0!==s&&(a+=`withLocalizations=${s.toString()}`),a}},responses:{callback:(e,t)=>`/interactions/${e}/${t}/callback`,original:(e,t)=>`/webhooks/${e}/${t}/messages/@original`,message:(e,t,s)=>`/webhooks/${e}/${t}/messages/${s}`}},user:e=>`/users/${e}`,userBot:()=>"/users/@me",oauth2Application:()=>"oauth2/applications/@me",gatewayBot:()=>"/gateway/bot",nitroStickerPacks:()=>"/sticker-packs"},checkRateLimits(e){let t=y.rateLimitedPaths.get(e),s=y.rateLimitedPaths.get("global"),a=Date.now();return t&&a<t.resetTimestamp?t.resetTimestamp-a:!!s&&a<s.resetTimestamp&&s.resetTimestamp-a},changeToDiscordFormat(e){if(null===e)return null;if("object"==typeof e){if(Array.isArray(e))return e.map(e=>y.changeToDiscordFormat(e));let s={};for(let i of Object.keys(e)){if(["permissions","allow","deny"].includes(i)){s[i]=t(e[i]);continue}if("defaultMemberPermissions"===i){s.default_member_permissions=t(e[i]);continue}s[a(i)]=y.changeToDiscordFormat(e[i])}return s}return"bigint"==typeof e?e.toString():e},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${y.token}`),e.headers)for(let s in e.headers)t[s.toLowerCase()]=e.headers[s];if("GET"===e.method&&(e.body=void 0),e.body?.reason&&(t["X-Audit-Log-Reason"]=encodeURIComponent(e.body.reason),e.body.reason=void 0),e.body){let{file:a}=e.body;if(a){let i=n(a),o=new FormData;if(e.url?.endsWith("/stickers")&&"POST"===e.method)o.append("file",i[0].blob,i[0].name),o.append("name",e.body.name),o.append("description",e.body.description),o.append("tags",e.body.tags);else{for(let r=0;r<i.length;r++)o.append(`file${r}`,i[r].blob,i[r].name);a&&(e.body.file=void 0),o.append("payload_json",JSON.stringify(y.changeToDiscordFormat(e.body)))}e.body.file=o}else e.body&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json")}return{headers:t,body:e.body?.file??JSON.stringify(y.changeToDiscordFormat(e.body)),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,s]of y.rateLimitedPaths.entries())s.resetTimestamp>e||(y.rateLimitedPaths.delete(t),"global"!==t||(y.globallyRateLimited=!1));0===y.rateLimitedPaths.size?y.processingRateLimitedPaths=!1:(y.processingRateLimitedPaths=!0,setTimeout(()=>{y.processRateLimitedPaths()},1e3))},processHeaders(e,t){let s=!1,a=t.get("x-ratelimit-remaining"),i=t.get("x-ratelimit-reset-after"),n=Date.now()+1e3*Number(i),o=t.get("x-ratelimit-global"),r=t.get("x-ratelimit-bucket")??void 0,l=t.get("x-ratelimit-limit");if(y.queues.get(e)?.handleCompletedRequest({remaining:a?Number(a):void 0,interval:i?1e3*Number(i):void 0,max:l?Number(l):void 0}),"0"===a&&(s=!0,y.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&y.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),u=Date.now()+1e3*Number(d);y.globallyRateLimited=!0,s=!0,setTimeout(()=>{y.globallyRateLimited=!1},u),y.rateLimitedPaths.set("global",{url:"global",resetTimestamp:u,bucketId:r}),r&&y.rateLimitedPaths.set(r,{url:"global",resetTimestamp:u,bucketId:r})}return s&&!y.processingRateLimitedPaths&&y.processRateLimitedPaths(),s?r:void 0},async sendRequest(e){let t=e.url.startsWith("https://")?e.url:`${y.baseUrl}/v${y.version}${e.url}`,s=y.createRequest({method:e.method,url:e.url,body:e.body,...e.options});c.debug(`sending request to ${t}`,"with payload:",{...s,headers:{...s.headers,authorization:"Bot tokenhere"}});let a=await fetch(t,s);c.debug(`request fetched from ${t} with status ${a.status} & ${a.statusText}`);let n=y.processHeaders(y.simplifyUrl(e.url,e.method),a.headers);if(n&&(e.bucketId=n),a.status<200||a.status>=400){if(c.debug(`Request to ${t} failed.`),429===a.status){if(c.debug(`Request to ${t} was ratelimited.`),e.retryCount++>=y.maxRetryCount)return c.debug(`Request to ${t} exceeded the maximum allowed retries.`,"with payload:",s),e.reject({ok:!1,status:a.status,error:"The options was rate limited and it maxed out the retries limit."});y.invalidBucket.handleCompletedRequest(a.status,"shared"===a.headers.get("X-RateLimit-Scope"));let o=a.headers.get("x-ratelimit-reset-after");return o&&await i(1e3*Number(o)),await a.json(),await e.retryRequest?.(e)}return e.reject({ok:!1,status:a.status,body:JSON.stringify(await a.json())})}let r=204===a.status,l=r?void 0:await a.json();return e.resolve({ok:!0,status:a.status,body:JSON.stringify(l)})},simplifyUrl(e,t){let s=e.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g,function(e,t){return["channels","guilds"].includes(t)?e:`/${t}/x`}).replace(/\/reactions\/[^/]+/g,"/reactions/x");return s.includes("/reactions")&&(s=s.substring(0,s.indexOf("/reactions")+10)),"DELETE"===t&&s.endsWith("/messages/x")&&(s=t+s),s},processRequest(e){let t=e.url.substring(e.url.indexOf("api/")),s=t.split("/");s.shift(),s[0]?.startsWith("v")&&s.shift(),e.url=`${y.baseUrl}/v${y.version}/${s.join("/")}`;let a=y.simplifyUrl(e.url,e.method),i=y.queues.get(a);if(void 0!==i)i.makeRequest(e);else{let n=new h(y,{url:a,deleteQueueDelay:y.deleteQueueDelay});n.makeRequest(e),y.queues.set(a,n)}},makeRequest:async(e,t,s,a)=>await new Promise((i,n)=>{let o={url:t,method:e,body:s,retryCount:0,retryRequest:async function(e){y.processRequest(o)},resolve:e=>i(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:n,options:a};y.processRequest(o)}),get:async e=>s(await y.makeRequest("GET",e)),post:async(e,t)=>s(await y.makeRequest("POST",e,t)),delete:async(e,t)=>s(await y.makeRequest("DELETE",e,t)),patch:async(e,t)=>s(await y.makeRequest("PATCH",e,t)),put:async(e,t,a)=>s(await y.makeRequest("PUT",e,t,a)),addReaction:async(e,t,s)=>await y.put(y.routes.channels.reactions.bot(e,t,s=m(s))),async addReactions(e,t,s,a=!1){if(!a){await Promise.all(s.map(async s=>await y.addReaction(e,t,s)));return}for(let i of s)await y.addReaction(e,t,i)},addRole:async(e,t,s,a)=>await y.put(y.routes.guilds.roles.member(e,t,s),{reason:a}),addThreadMember:async(e,t)=>await y.put(y.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await y.post(y.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await y.post(y.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await y.post(y.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await y.post(y.routes.interactions.commands.commands(y.applicationId),e),createGuild:async e=>await y.post(y.routes.guilds.all(),e),createGuildApplicationCommand:async(e,t)=>await y.post(y.routes.interactions.commands.guilds.all(y.applicationId,t),e),createGuildFromTemplate:async(e,t)=>(t.icon&&(t.icon=await g(t.icon)),await y.post(y.routes.guilds.templates.code(e),t)),createGuildSticker:async(e,t)=>await y.post(y.routes.guilds.stickers(e),t),createGuildTemplate:async(e,t)=>await y.post(y.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await y.post(y.routes.channels.forum(e),t),createInvite:async(e,t={})=>await y.post(y.routes.channels.invites(e),t),createRole:async(e,t,s)=>await y.post(y.routes.guilds.roles.all(e),{...t,reason:s}),createScheduledEvent:async(e,t)=>await y.post(y.routes.guilds.events.events(e),t),createStageInstance:async e=>await y.post(y.routes.channels.stages(),e),createWebhook:async(e,t)=>await y.post(y.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await g(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,s)=>await y.delete(y.routes.guilds.automod.rule(e,t),{reason:s}),deleteChannel:async(e,t)=>await y.delete(y.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,s)=>await y.delete(y.routes.channels.overwrite(e,t),s?{reason:s}:void 0),deleteEmoji:async(e,t,s)=>await y.delete(y.routes.guilds.emoji(e,t),{reason:s}),deleteFollowupMessage:async(e,t)=>await y.delete(y.routes.interactions.responses.message(y.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await y.delete(y.routes.interactions.commands.command(y.applicationId,e)),deleteGuild:async e=>await y.delete(y.routes.guilds.guild(e)),deleteGuildApplicationCommand:async(e,t)=>await y.delete(y.routes.interactions.commands.guilds.one(y.applicationId,t,e)),deleteGuildSticker:async(e,t,s)=>await y.delete(y.routes.guilds.sticker(e,t),s?{reason:s}:void 0),deleteGuildTemplate:async(e,t)=>await y.delete(y.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await y.delete(y.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await y.delete(y.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,s)=>await y.delete(y.routes.channels.message(e,t),{reason:s}),deleteMessages:async(e,t,s)=>await y.post(y.routes.channels.bulk(e),{messages:t.slice(0,100).map(e=>e.toString()),reason:s}),deleteOriginalInteractionResponse:async e=>await y.delete(y.routes.interactions.responses.original(y.applicationId,e)),deleteOwnReaction:async(e,t,s)=>await y.delete(y.routes.channels.reactions.bot(e,t,s=m(s))),deleteReactionsAll:async(e,t)=>await y.delete(y.routes.channels.reactions.all(e,t)),deleteReactionsEmoji:async(e,t,s)=>await y.delete(y.routes.channels.reactions.emoji(e,t,s=m(s))),deleteRole:async(e,t)=>await y.delete(y.routes.guilds.roles.one(e,t)),deleteScheduledEvent:async(e,t)=>await y.delete(y.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await y.delete(y.routes.channels.stage(e),t?{reason:t}:void 0),deleteUserReaction:async(e,t,s,a)=>await y.delete(y.routes.channels.reactions.user(e,t,a=m(a),s)),deleteWebhook:async(e,t)=>await y.delete(y.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,s,a)=>await y.delete(y.routes.webhooks.message(e,t,s,a)),deleteWebhookWithToken:async(e,t)=>await y.delete(y.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,s,a)=>await y.put(y.routes.interactions.commands.permission(y.applicationId,e,t),{permissions:a},{headers:{authorization:`Bearer ${s}`}}),editAutomodRule:async(e,t,s)=>await y.patch(y.routes.guilds.automod.rule(e,t),s),async editBotProfile(e){let t=e?.botAvatarURL?await g(e?.botAvatarURL):e?.botAvatarURL;return await y.patch(y.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await y.patch(y.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await y.put(y.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await y.patch(y.routes.guilds.channels(e),t),editEmoji:async(e,t,s)=>await y.patch(y.routes.guilds.emoji(e,t),s),editFollowupMessage:async(e,t,s)=>await y.patch(y.routes.interactions.responses.message(y.applicationId,e,t),s),editGlobalApplicationCommand:async(e,t)=>await y.patch(y.routes.interactions.commands.command(y.applicationId,e),t),editGuild:async(e,t)=>await y.patch(y.routes.guilds.guild(e),t),editGuildApplicationCommand:async(e,t,s)=>await y.patch(y.routes.interactions.commands.guilds.one(y.applicationId,t,e),s),editGuildMfaLevel:async(e,t,s)=>await y.post(y.routes.guilds.mfa(e),{level:t,reason:s}),editGuildSticker:async(e,t,s)=>await y.patch(y.routes.guilds.sticker(e,t),s),editGuildTemplate:async(e,t,s)=>await y.patch(y.routes.guilds.templates.guild(e,t),s),editMessage:async(e,t,s)=>await y.patch(y.routes.channels.message(e,t),s),editOriginalInteractionResponse:async(e,t)=>await y.patch(y.routes.interactions.responses.original(y.applicationId,e),t),editOriginalWebhookMessage:async(t,s,a)=>await y.patch(y.routes.webhooks.original(t,s,a),{type:e.UpdateMessage,data:a}),editOwnVoiceState:async(e,t)=>await y.patch(y.routes.guilds.voice(e),{channel_id:t.channelId,suppress:t.suppress,request_to_speak_timestamp:t.requestToSpeakTimestamp?new Date(t.requestToSpeakTimestamp).toISOString():t.requestToSpeakTimestamp}),editScheduledEvent:async(e,t,s)=>await y.patch(y.routes.guilds.events.event(e,t),s),editRole:async(e,t,s)=>await y.patch(y.routes.guilds.roles.one(e,t),s),editRolePositions:async(e,t)=>await y.patch(y.routes.guilds.roles.all(e),t),editStageInstance:async(e,t)=>await y.patch(y.routes.channels.stage(e),{topic:t.topic}),editUserVoiceState:async(e,t)=>await y.patch(y.routes.guilds.voice(e,t.userId),{channel_id:t.channelId,suppress:t.suppress,user_id:t.userId}),editWebhook:async(e,t)=>await y.patch(y.routes.webhooks.id(e),t),editWebhookMessage:async(e,t,s,a)=>await y.patch(y.routes.webhooks.message(e,t,s,a),a),editWebhookWithToken:async(e,t,s)=>await y.patch(y.routes.webhooks.webhook(e,t),s),editWelcomeScreen:async(e,t)=>await y.patch(y.routes.guilds.welcome(e),t),editWidgetSettings:async(e,t)=>await y.patch(y.routes.guilds.widget(e),t),executeWebhook:async(e,t,s)=>await y.post(y.routes.webhooks.webhook(e,t,s),s),followAnnouncement:async(e,t)=>await y.post(y.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await y.get(y.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await y.get(y.routes.interactions.commands.permission(y.applicationId,e,t)),getApplicationCommandPermissions:async e=>await y.get(y.routes.interactions.commands.permissions(y.applicationId,e)),getApplicationInfo:async()=>await y.get(y.routes.oauth2Application()),getAuditLog:async(e,t)=>await y.get(y.routes.guilds.auditlogs(e,t)),getAutomodRule:async(e,t)=>await y.get(y.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await y.get(y.routes.guilds.automod.rules(e)),getAvailableVoiceRegions:async()=>await y.get(y.routes.regions()),getBan:async(e,t)=>await y.get(y.routes.guilds.members.ban(e,t)),getBans:async(e,t)=>await y.get(y.routes.guilds.members.bans(e,t)),getChannel:async e=>await y.get(y.routes.channels.channel(e)),getChannelInvites:async e=>await y.get(y.routes.channels.invites(e)),getChannels:async e=>await y.get(y.routes.guilds.channels(e)),getChannelWebhooks:async e=>await y.get(y.routes.channels.webhooks(e)),getDmChannel:async e=>await y.post(y.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await y.get(y.routes.guilds.emoji(e,t)),getEmojis:async e=>await y.get(y.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await y.get(y.routes.interactions.responses.message(y.applicationId,e,t)),getGatewayBot:async()=>await y.get(y.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await y.get(y.routes.interactions.commands.command(y.applicationId,e)),getGlobalApplicationCommands:async()=>await y.get(y.routes.interactions.commands.commands(y.applicationId)),getGuild:async(e,t={counts:!0})=>await y.get(y.routes.guilds.guild(e,t.counts)),getGuildApplicationCommand:async(e,t)=>await y.get(y.routes.interactions.commands.guilds.one(y.applicationId,t,e)),getGuildApplicationCommands:async e=>await y.get(y.routes.interactions.commands.guilds.all(y.applicationId,e)),getGuildPreview:async e=>await y.get(y.routes.guilds.preview(e)),getGuildTemplate:async e=>await y.get(y.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await y.get(y.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await y.get(y.routes.guilds.webhooks(e)),getIntegrations:async e=>await y.get(y.routes.guilds.integrations(e)),getInvite:async(e,t)=>await y.get(y.routes.guilds.invite(e,t)),getInvites:async e=>await y.get(y.routes.guilds.invites(e)),getMessage:async(e,t)=>await y.get(y.routes.channels.message(e,t)),getMessages:async(e,t)=>await y.get(y.routes.channels.messages(e,t)),getNitroStickerPacks:async()=>await y.get(y.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await y.get(y.routes.interactions.responses.original(y.applicationId,e)),getPinnedMessages:async e=>await y.get(y.routes.channels.pins(e)),getPrivateArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.joined(e,t)),getPruneCount:async(e,t)=>await y.get(y.routes.guilds.prune(e,t)),getPublicArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.public(e,t)),getRoles:async e=>await y.get(y.routes.guilds.roles.all(e)),getScheduledEvent:async(e,t,s)=>await y.get(y.routes.guilds.events.event(e,t,s?.withUserCount)),getScheduledEvents:async(e,t)=>await y.get(y.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,s)=>await y.get(y.routes.guilds.events.users(e,t,s)),getSessionInfo:async()=>await y.getGatewayBot(),getStageInstance:async e=>await y.get(y.routes.channels.stage(e)),getSticker:async e=>await y.get(y.routes.sticker(e)),getGuildSticker:async(e,t)=>await y.get(y.routes.guilds.sticker(e,t)),getGuildStickers:async e=>await y.get(y.routes.guilds.stickers(e)),getThreadMember:async(e,t)=>await y.get(y.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await y.get(y.routes.channels.threads.members(e)),getReactions:async(e,t,s,a)=>await y.get(y.routes.channels.reactions.message(e,t,s,a)),getUser:async e=>await y.get(y.routes.user(e)),getVanityUrl:async e=>await y.get(y.routes.guilds.vanity(e)),getVoiceRegions:async e=>await y.get(y.routes.guilds.regions(e)),getWebhook:async e=>await y.get(y.routes.webhooks.id(e)),getWebhookMessage:async(e,t,s,a)=>await y.get(y.routes.webhooks.message(e,t,s,a)),getWebhookWithToken:async(e,t)=>await y.get(y.routes.webhooks.webhook(e,t)),getWelcomeScreen:async e=>await y.get(y.routes.guilds.welcome(e)),getWidget:async e=>await y.get(y.routes.guilds.widgetJson(e)),getWidgetSettings:async e=>await y.get(y.routes.guilds.widget(e)),joinThread:async e=>await y.put(y.routes.channels.threads.me(e)),leaveGuild:async e=>await y.delete(y.routes.guilds.leave(e)),leaveThread:async e=>await y.delete(y.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await y.post(y.routes.channels.crosspost(e,t)),removeRole:async(e,t,s,a)=>await y.delete(y.routes.guilds.roles.member(e,t,s),{reason:a}),removeThreadMember:async(e,t)=>await y.delete(y.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((s,a)=>{y.sendRequest({url:y.routes.webhooks.webhook(y.applicationId,e),method:"POST",body:t,retryCount:0,retryRequest:async function(e){await y.sendRequest(e)},resolve:e=>s(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:a})}),sendInteractionResponse:async(e,t,s)=>await new Promise((a,i)=>{y.sendRequest({url:y.routes.interactions.responses.callback(e,t),method:"POST",body:s,retryCount:0,retryRequest:async function(e){await y.sendRequest(e)},resolve:e=>a(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:i})}),sendMessage:async(e,t)=>await y.post(y.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,s)=>await y.post(y.routes.channels.threads.message(e,t),s),startThreadWithoutMessage:async(e,t)=>await y.post(y.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await y.put(y.routes.guilds.templates.all(e)),banMember:async(e,t,s)=>await y.put(y.routes.guilds.members.ban(e,t),s),editBotMember:async(e,t)=>await y.patch(y.routes.guilds.members.bot(e),t),editMember:async(e,t,s)=>await y.patch(y.routes.guilds.members.member(e,t),s),getMember:async(e,t)=>await y.get(y.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await y.get(y.routes.guilds.members.members(e,t)),kickMember:async(e,t,s)=>await y.delete(y.routes.guilds.members.member(e,t),{reason:s}),pinMessage:async(e,t,s)=>await y.put(y.routes.channels.pin(e,t),s?{reason:s}:void 0),pruneMembers:async(e,t)=>await y.post(y.routes.guilds.members.prune(e),t),searchMembers:async(e,t,s)=>await y.get(y.routes.guilds.members.search(e,t,s)),unbanMember:async(e,t)=>await y.delete(y.routes.guilds.members.ban(e,t)),unpinMessage:async(e,t,s)=>await y.delete(y.routes.channels.pin(e,t),s?{reason:s}:void 0),triggerTypingIndicator:async e=>await y.post(y.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await y.put(y.routes.interactions.commands.commands(y.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await y.put(y.routes.interactions.commands.guilds.all(y.applicationId,e),t)};return y}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3QtYXNzaWduICovXG5pbXBvcnQgeyBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUJpdHMsXG4gIGNhbWVsaXplLFxuICBjYW1lbFRvU25ha2VDYXNlLFxuICBkZWxheSxcbiAgZmluZEZpbGVzLFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgaXNHZXRNZXNzYWdlc0FmdGVyLFxuICBpc0dldE1lc3NhZ2VzQXJvdW5kLFxuICBpc0dldE1lc3NhZ2VzQmVmb3JlLFxuICBpc0dldE1lc3NhZ2VzTGltaXQsXG4gIGxvZ2dlcixcbiAgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLFxuICB1cmxUb0Jhc2U2NCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5cbmltcG9ydCB7IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IH0gZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIEJpZ1N0cmluZyxcbiAgQ2FtZWxpemUsXG4gIERpc2NvcmRBcHBsaWNhdGlvbixcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRDaGFubmVsLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRGb2xsb3dBbm5vdW5jZW1lbnRDaGFubmVsLFxuICBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEd1aWxkLFxuICBEaXNjb3JkR3VpbGRQcmV2aWV3LFxuICBEaXNjb3JkR3VpbGRXaWRnZXQsXG4gIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICBEaXNjb3JkSW50ZWdyYXRpb24sXG4gIERpc2NvcmRJbnZpdGUsXG4gIERpc2NvcmRJbnZpdGVNZXRhZGF0YSxcbiAgRGlzY29yZExpc3RBY3RpdmVUaHJlYWRzLFxuICBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgRGlzY29yZE1lbWJlcixcbiAgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICBEaXNjb3JkTWVzc2FnZSxcbiAgRGlzY29yZFBydW5lZENvdW50LFxuICBEaXNjb3JkUm9sZSxcbiAgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgRGlzY29yZFN0aWNrZXIsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFZhbml0eVVybCxcbiAgRGlzY29yZFZvaWNlUmVnaW9uLFxuICBEaXNjb3JkV2ViaG9vayxcbiAgRGlzY29yZFdlbGNvbWVTY3JlZW4sXG4gIEdldE1lc3NhZ2VzT3B0aW9ucyxcbiAgR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgTWZhTGV2ZWxzLFxuICBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zLCBSZXN0TWFuYWdlciwgU2VuZFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcy5qcydcblxuLy8gVE9ETzogbWFrZSBkeW5hbWljIGJhc2VkIG9uIHBhY2thZ2UuanNvbiBmaWxlXG5jb25zdCB2ZXJzaW9uID0gJzE5LjAuMC1hbHBoYS4xJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICAvLyBGYWxzeSB0b2tlbiBzdHJpbmcgY2hlY2tcbiAgaWYgKCFvcHRpb25zLnRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCB0b2tlbi4nKVxuXG4gIGNvbnN0IHJlc3Q6IFJlc3RNYW5hZ2VyID0ge1xuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIGFwcGxpY2F0aW9uSWQ6IG9wdGlvbnMuYXBwbGljYXRpb25JZCA/IEJpZ0ludChvcHRpb25zLmFwcGxpY2F0aW9uSWQpIDogZ2V0Qm90SWRGcm9tVG9rZW4ob3B0aW9ucy50b2tlbiksXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGJhc2VVcmw6IG9wdGlvbnMuYmFzZVVybCA/PyAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknLFxuICAgIG1heFJldHJ5Q291bnQ6IEluZmluaXR5LFxuICAgIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGZhbHNlLFxuICAgIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBmYWxzZSxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBxdWV1ZXM6IG5ldyBNYXAoKSxcbiAgICByYXRlTGltaXRlZFBhdGhzOiBuZXcgTWFwKCksXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoe30pLFxuXG4gICAgcm91dGVzOiB7XG4gICAgICB3ZWJob29rczoge1xuICAgICAgICBpZDogKHdlYmhvb2tJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfWBcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZTogKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luYWw6ICh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbD9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rOiAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LndhaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGB3YWl0PSR7b3B0aW9ucy53YWl0LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gTWlzY2VsbGFuZW91cyBFbmRwb2ludHNcbiAgICAgIHNlc3Npb25JbmZvOiAoKSA9PiByZXN0LnJvdXRlcy5nYXRld2F5Qm90KCksXG5cbiAgICAgIC8vIENoYW5uZWwgRW5kcG9pbnRzXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBidWxrOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzL2J1bGstZGVsZXRlYFxuICAgICAgICB9LFxuICAgICAgICBkbTogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3VzZXJzL0BtZS9jaGFubmVscydcbiAgICAgICAgfSxcbiAgICAgICAgcGluOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGlucy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIHBpbnM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGluc2BcbiAgICAgICAgfSxcbiAgICAgICAgcmVhY3Rpb25zOiB7XG4gICAgICAgICAgYm90OiAoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGVtb2ppKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3JlYWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChlbW9qaSl9L0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgZW1vamksIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfS8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbW9qaTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBlbW9qaSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBlbW9qaSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2tzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3dlYmhvb2tzYFxuICAgICAgICB9LFxuXG4gICAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9sbG93OiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L2ZvbGxvd2Vyc2BcbiAgICAgICAgfSxcblxuICAgICAgICBmb3J1bTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzP2hhc19tZXNzYWdlPXRydWVgXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW52aXRlczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVzc2FnZXM6IChjaGFubmVsSWQsIG9wdGlvbnM/OiBHZXRNZXNzYWdlc09wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXM/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpc0dldE1lc3NhZ2VzQWZ0ZXIob3B0aW9ucykgJiYgb3B0aW9ucy5hZnRlcikge1xuICAgICAgICAgICAgICB1cmwgKz0gYGFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0JlZm9yZShvcHRpb25zKSAmJiBvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0Fyb3VuZChvcHRpb25zKSAmJiBvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYCZhcm91bmQ9JHtvcHRpb25zLmFyb3VuZH1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0xpbWl0KG9wdGlvbnMpICYmIG9wdGlvbnMubGltaXQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG5cbiAgICAgICAgb3ZlcndyaXRlOiAoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9wZXJtaXNzaW9ucy8ke292ZXJ3cml0ZUlkfWBcbiAgICAgICAgfSxcblxuICAgICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vY3Jvc3Nwb3N0YFxuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlczogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3N0YWdlLWluc3RhbmNlcydcbiAgICAgICAgfSxcblxuICAgICAgICBzdGFnZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3N0YWdlLWluc3RhbmNlcy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhyZWFkIEVuZHBvaW50c1xuICAgICAgICB0aHJlYWRzOiB7XG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGhyZWFkcy9hY3RpdmVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFyY2hpdmVkOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHVibGljP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3VzZXJzL0BtZS90aHJlYWRzL2FyY2hpdmVkL3ByaXZhdGU/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICB0eXBpbmc6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdHlwaW5nYFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gR3VpbGQgRW5kcG9pbnRzXG4gICAgICBndWlsZHM6IHtcbiAgICAgICAgYWxsOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvZ3VpbGRzJ1xuICAgICAgICB9LFxuICAgICAgICBhdWRpdGxvZ3M6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXVkaXQtbG9ncz9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWN0aW9uVHlwZSkgdXJsICs9IGBhY3Rpb25fdHlwZT0ke29wdGlvbnMuYWN0aW9uVHlwZX1gXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudXNlcklkKSB1cmwgKz0gYCZ1c2VyX2lkPSR7b3B0aW9ucy51c2VySWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b21vZDoge1xuICAgICAgICAgIHJ1bGU6IChndWlsZElkLCBydWxlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlcy8ke3J1bGVJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydWxlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjaGFubmVsczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2BcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamk6IChndWlsZElkLCBlbW9qaUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vZW1vamlzLyR7ZW1vamlJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGVtb2ppczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXNgXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGV2ZW50czogKGd1aWxkSWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzP2BcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudDogKGd1aWxkSWQsIGV2ZW50SWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH1gXG5cbiAgICAgICAgICAgIGlmICh3aXRoVXNlckNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX3VzZXJfY291bnQ9JHt3aXRoVXNlckNvdW50LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VyczogKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aE1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJndpdGhfbWVtYmVyPSR7b3B0aW9ucy53aXRoTWVtYmVyLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZ3VpbGQoZ3VpbGRJZCwgd2l0aENvdW50cykge1xuICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9P2BcblxuICAgICAgICAgIGlmICh3aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVybCArPSBgd2l0aF9jb3VudHM9JHt3aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2ludGVncmF0aW9ucy8ke2ludGVncmF0aW9uSWR9YFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zP2luY2x1ZGVfYXBwbGljYXRpb25zPXRydWVgXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvaW52aXRlcy8ke2ludml0ZUNvZGV9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfY291bnRzPSR7b3B0aW9ucy53aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aEV4cGlyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJndpdGhfZXhwaXJhdGlvbj0ke29wdGlvbnMud2l0aEV4cGlyYXRpb24udG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZWRFdmVudElkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmZ3VpbGRfc2NoZWR1bGVkX2V2ZW50X2lkPSR7b3B0aW9ucy5zY2hlZHVsZWRFdmVudElkfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZXM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcbiAgICAgICAgbGVhdmU6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvdXNlcnMvQG1lL2d1aWxkcy8ke2d1aWxkSWR9YFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgYmFuOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJhbnM6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib3Q6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcjogKGd1aWxkSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoZ3VpbGRJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWFyY2g6IChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy9zZWFyY2g/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWBcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJ1bmU6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9wcnVuZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF5cykgdXJsICs9IGBkYXlzPSR7b3B0aW9ucy5kYXlzfWBcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlUm9sZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlcy5qb2luKCcsJyl9YFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlc31gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1mYTogKGd1aWxkSWQpID0+IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWZhYCxcbiAgICAgICAgcHJldmlldzogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9wcmV2aWV3YFxuICAgICAgICB9LFxuICAgICAgICBwcnVuZTogKGd1aWxkSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9wcnVuZT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF5cykgdXJsICs9IGBkYXlzPSR7b3B0aW9ucy5kYXlzfWBcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZVJvbGVzKSkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlcy5qb2luKCcsJyl9YFxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVSb2xlcykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlc31gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICByb2xlczoge1xuICAgICAgICAgIG9uZTogKGd1aWxkSWQsIHJvbGVJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXMvJHtyb2xlSWR9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWxsOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXI6IChndWlsZElkLCBtZW1iZXJJZCwgcm9sZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7bWVtYmVySWR9L3JvbGVzLyR7cm9sZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdGlja2VyczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9zdGlja2Vyc2BcbiAgICAgICAgfSxcbiAgICAgICAgc3RpY2tlcjogKGd1aWxkSWQsIHN0aWNrZXJJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3N0aWNrZXJzLyR7c3RpY2tlcklkfWBcbiAgICAgICAgfSxcbiAgICAgICAgdm9pY2U6IChndWlsZElkLCB1c2VySWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS92b2ljZS1zdGF0ZXMvJHt1c2VySWQgPz8gJ0BtZSd9YFxuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgICBjb2RlOiAoY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzL3RlbXBsYXRlcy8ke2NvZGV9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ3VpbGQ6IChndWlsZElkLCBjb2RlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90ZW1wbGF0ZXMvJHtjb2RlfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbDogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3RlbXBsYXRlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB2YW5pdHk6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdmFuaXR5LXVybGBcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaW9uczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9yZWdpb25zYFxuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93ZWJob29rc2BcbiAgICAgICAgfSxcbiAgICAgICAgd2VsY29tZTogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93ZWxjb21lLXNjcmVlbmBcbiAgICAgICAgfSxcbiAgICAgICAgd2lkZ2V0OiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3dpZGdldGBcbiAgICAgICAgfSxcbiAgICAgICAgd2lkZ2V0SnNvbjogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93aWRnZXQuanNvbmBcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHN0aWNrZXI6IChzdGlja2VySWQ6IEJpZ1N0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYC9zdGlja2Vycy8ke3N0aWNrZXJJZH1gXG4gICAgICB9LFxuXG4gICAgICByZWdpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnL3ZvaWNlL3JlZ2lvbnMnXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcmFjdGlvbiBFbmRwb2ludHNcbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vY29tbWFuZHNgXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGd1aWxkczoge1xuICAgICAgICAgICAgYWxsKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmUoYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkLCB3aXRoTG9jYWxpemF0aW9ucykge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX2xvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzL3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbjogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9L3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfT9gXG5cbiAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aExvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICAgICAgY2FsbGJhY2s6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvaW50ZXJhY3Rpb25zLyR7aW50ZXJhY3Rpb25JZH0vJHt0b2tlbn0vY2FsbGJhY2tgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQsIHRva2VuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2FwcGxpY2F0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gVXNlciBlbmRwb2ludHNcbiAgICAgIHVzZXIodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBgL3VzZXJzLyR7dXNlcklkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVzZXJCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL3VzZXJzL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIG9hdXRoMkFwcGxpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ29hdXRoMi9hcHBsaWNhdGlvbnMvQG1lJ1xuICAgICAgfSxcblxuICAgICAgZ2F0ZXdheUJvdCgpIHtcbiAgICAgICAgcmV0dXJuICcvZ2F0ZXdheS9ib3QnXG4gICAgICB9LFxuXG4gICAgICBuaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgICAgcmV0dXJuICcvc3RpY2tlci1wYWNrcydcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCh1cmwpXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGNoYW5nZVRvRGlzY29yZEZvcm1hdChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgICAgLy8gS2V5cyB0aGF0IGRvbnQgcmVxdWlyZSBzbmFrZSBjYXNpbmdcbiAgICAgICAgICBpZiAoWydwZXJtaXNzaW9ucycsICdhbGxvdycsICdkZW55J10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBjYWxjdWxhdGVCaXRzKG9ialtrZXldKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJykge1xuICAgICAgICAgICAgbmV3T2JqLmRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zID0gY2FsY3VsYXRlQml0cyhvYmpba2V5XSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdPYmpbY2FtZWxUb1NuYWtlQ2FzZShrZXkpXSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9ialtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld09ialxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKVxuXG4gICAgICByZXR1cm4gb2JqXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7dmVyc2lvbn0pYCxcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnVuYXV0aG9yaXplZCkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25zLmhlYWRlcnNba2V5XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdFVCBNRVRIT0RTIFNIT1VMRCBOT1QgSEFWRSBBIEJPRFlcbiAgICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucy5ib2R5Py5yZWFzb24pIHtcbiAgICAgICAgaGVhZGVyc1snWC1BdWRpdC1Mb2ctUmVhc29uJ10gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5ib2R5LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICAgIG9wdGlvbnMuYm9keS5yZWFzb24gPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuYm9keSkge1xuICAgICAgICBjb25zdCB7IGZpbGUgfSA9IG9wdGlvbnMuYm9keVxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gZmluZEZpbGVzKGZpbGUpXG4gICAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgICAvLyBXSEVOIENSRUFUSU5HIEEgU1RJQ0tFUiwgRElTQ09SRCBXQU5UUyBGT1JNIERBVEEgT05MWVxuICAgICAgICAgIGlmIChvcHRpb25zLnVybD8uZW5kc1dpdGgoJy9zdGlja2VycycpICYmIG9wdGlvbnMubWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgZmlsZXNbMF0uYmxvYiwgZmlsZXNbMF0ubmFtZSlcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5ib2R5Lm5hbWUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ2Rlc2NyaXB0aW9uJywgb3B0aW9ucy5ib2R5LmRlc2NyaXB0aW9uIGFzIHN0cmluZylcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCd0YWdzJywgb3B0aW9ucy5ib2R5LnRhZ3MgYXMgc3RyaW5nKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlJHtpfWAsIGZpbGVzW2ldLmJsb2IsIGZpbGVzW2ldLm5hbWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWxlKSBvcHRpb25zLmJvZHkuZmlsZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ3BheWxvYWRfanNvbicsIEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG9wdGlvbnMuYm9keS5maWxlID0gZm9ybVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYm9keSAmJiAhWydHRVQnLCAnREVMRVRFJ10uaW5jbHVkZXMob3B0aW9ucy5tZXRob2QpKSB7XG4gICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiAob3B0aW9ucy5ib2R5Py5maWxlID8/IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpKSBhcyBGb3JtRGF0YSB8IHN0cmluZyxcbiAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBmb3Igb2YgbG9vcC4gJHtcbiAgICAgICAgLy8gICB2YWx1ZS5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgICAvLyB9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgaGFzIG5vdCByZWFjaGVkIGNhbmNlbFxuICAgICAgICBpZiAodmFsdWUucmVzZXRUaW1lc3RhbXAgPiBub3cpIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSlcbiAgICAgICAgLy8gSWYgaXQgd2FzIGdsb2JhbCwgYWxzbyBtYXJrIHRoZSBnbG9iYWwgdmFsdWUgYXMgZmFsc2VcbiAgICAgICAgaWYgKGtleSA9PT0gJ2dsb2JhbCcpIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIEFMTCBQQVRIUyBBUkUgQ0xFQVJFRCBDQU4gQ0FOQ0VMIE9VVCFcbiAgICAgIGlmIChyZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlXG4gICAgICAgIC8vIFJFQ0hFQ0sgSU4gMSBTRUNPTkRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZygnW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBzZXRUaW1lb3V0LicpXG4gICAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICAgIH0sIDEwMDApXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEdFVCBBTEwgTkVDRVNTQVJZIEhFQURFUlNcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZW1haW5pbmcnKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcicpXG4gICAgICBjb25zdCByZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtZ2xvYmFsJylcbiAgICAgIC8vIHVuZGVmaW5lZCBvdmVycmlkZSBudWxsIG5lZWRlZCBmb3IgdHlwaW5nc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtYnVja2V0JykgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1saW1pdCcpXG5cbiAgICAgIHJlc3QucXVldWVzLmdldCh1cmwpPy5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHtcbiAgICAgICAgcmVtYWluaW5nOiByZW1haW5pbmcgPyBOdW1iZXIocmVtYWluaW5nKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJ2YWw6IHJldHJ5QWZ0ZXIgPyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwIDogdW5kZWZpbmVkLFxuICAgICAgICBtYXg6IGxpbWl0ID8gTnVtYmVyKGxpbWl0KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIFVSTCBBUyBMSU1JVEVELCBJTVBPUlRBTlQgRk9SIE5FVyBSRVFVRVNUUyBCWSBVU0VSIFdJVEhPVVQgQlVDS0VUXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQodXJsLCB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTQVZFIFRIRSBCVUNLRVQgQVMgTElNSVRFRCBTSU5DRSBESUZGRVJFTlQgVVJMUyBNQVkgU0hBUkUgQSBCVUNLRVRcbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChidWNrZXRJZCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJylcbiAgICAgICAgY29uc3QgZ2xvYmFsUmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCA9IEdsb2JhbGx5IFJhdGUgTGltaXRlZF0gVVJMOiAke3VybH0gfCBHbG9iYWwgUmVzdDogJHtnbG9iYWxSZXNldH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSB0cnVlXG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICAgIH0sIGdsb2JhbFJlc2V0KVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoJ2dsb2JhbCcsIHtcbiAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGJ1Y2tldElkLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBvcHRpb25zLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpID8gb3B0aW9ucy51cmwgOiBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMudXJsfWBcbiAgICAgIGNvbnN0IHBheWxvYWQgPSByZXN0LmNyZWF0ZVJlcXVlc3QoeyBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLCB1cmw6IG9wdGlvbnMudXJsLCBib2R5OiBvcHRpb25zLmJvZHksIC4uLm9wdGlvbnMub3B0aW9ucyB9KVxuXG4gICAgICBsb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogeyAuLi5wYXlsb2FkLmhlYWRlcnMsIGF1dGhvcml6YXRpb246ICdCb3QgdG9rZW5oZXJlJyB9IH0pXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZClcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaGVkIGZyb20gJHt1cmx9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfSAmICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnVybCwgb3B0aW9ucy5tZXRob2QpLCByZXNwb25zZS5oZWFkZXJzKVxuICAgICAgaWYgKGJ1Y2tldElkKSBvcHRpb25zLmJ1Y2tldElkID0gYnVja2V0SWRcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYClcbiAgICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCsrID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCwgJ3dpdGggcGF5bG9hZDonLCBwYXlsb2FkKVxuICAgICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gcXVldWUgdG8gcHJldmVudCByZXRyeVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdUaGUgb3B0aW9ucyB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmF0ZSBsaW1pdGVkLCBhZGQgYmFjayB0byBxdWV1ZVxuICAgICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVNjb3BlJykgPT09ICdzaGFyZWQnKVxuXG4gICAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcicpXG4gICAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG4gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgdG8gcHJldmVudCBtZW0gbGVha1xuICAgICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLnJlamVjdCh7IG9rOiBmYWxzZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXMyMDQgPSByZXNwb25zZS5zdGF0dXMgPT09IDIwNFxuICAgICAgY29uc3QganNvbiA9IGlzMjA0ID8gdW5kZWZpbmVkIDogYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAvLyBEaXNjb3JkIHNvbWV0aW1lcyBzZW5kcyBubyByZXNwb25zZSB3aXRoIDIwNCBjb2RlXG4gICAgICByZXR1cm4gb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiBKU09OLnN0cmluZ2lmeShqc29uKSB9KVxuICAgIH0sXG5cbiAgICAvLyBDcmVkaXRzOiBnaXRodWIuY29tL2FiYWxhYmFoYWhhL2VyaXMgbGliL3Jlc3QvUmVxdWVzdEhhbmRsZXIuanMjTDM5N1xuICAgIC8vIE1vZGlmaWVkIGZvciBvdXIgdXNlLWNhc2VcbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgbGV0IHJvdXRlID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKC9cXC8oW2Etei1dKylcXC8oPzpbMC05XXsxNywxOX0pL2csIGZ1bmN0aW9uIChtYXRjaCwgcDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFsnY2hhbm5lbHMnLCAnZ3VpbGRzJ10uaW5jbHVkZXMocCkgPyBtYXRjaCA6IGAvJHtwfS94YFxuICAgICAgICB9KVxuICAgICAgICAucmVwbGFjZSgvXFwvcmVhY3Rpb25zXFwvW14vXSsvZywgJy9yZWFjdGlvbnMveCcpXG5cbiAgICAgIC8vIEdFTkVSQUwgL3JlYWN0aW9ucyBhbmQgL3JlYWN0aW9ucy9lbW9qaS9AbWUgc2hhcmUgdGhlIGJ1Y2tldHNcbiAgICAgIGlmIChyb3V0ZS5pbmNsdWRlcygnL3JlYWN0aW9ucycpKSB7XG4gICAgICAgIHJvdXRlID0gcm91dGUuc3Vic3RyaW5nKDAsIHJvdXRlLmluZGV4T2YoJy9yZWFjdGlvbnMnKSArICcvcmVhY3Rpb25zJy5sZW5ndGgpXG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSBNZXNzYWdlIGVuZHBvaW50IGhhcyBpdHMgb3duIHJhdGUgbGltaXRcbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIHJvdXRlID0gbWV0aG9kICsgcm91dGVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlXG4gICAgfSxcblxuICAgIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3Qgcm91dGUgPSByZXF1ZXN0LnVybC5zdWJzdHJpbmcocmVxdWVzdC51cmwuaW5kZXhPZignYXBpLycpKVxuICAgICAgY29uc3QgcGFydHMgPSByb3V0ZS5zcGxpdCgnLycpXG4gICAgICAvLyBSZW1vdmUgdGhlIGFwaS9cbiAgICAgIHBhcnRzLnNoaWZ0KClcbiAgICAgIC8vIFJlbW92ZXMgdGhlIC92Iy9cbiAgICAgIGlmIChwYXJ0c1swXT8uc3RhcnRzV2l0aCgndicpKSBwYXJ0cy5zaGlmdCgpXG4gICAgICAvLyBTZXQgdGhlIGZ1bGwgdXJsIHRvIGRpc2NvcmQgYXBpIGluIGNhc2UgaXQgd2FzIHJlY2lldmVkIGluIGEgcHJveHkgcmVzdFxuICAgICAgcmVxdWVzdC51cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0vJHtwYXJ0cy5qb2luKCcvJyl9YFxuXG4gICAgICBjb25zdCB1cmwgPSByZXN0LnNpbXBsaWZ5VXJsKHJlcXVlc3QudXJsLCByZXF1ZXN0Lm1ldGhvZClcbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KHVybClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSB9KVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KHVybCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiAoZGF0YSkgPT4gcmVzb2x2ZShkYXRhLnN0YXR1cyAhPT0gMjA0ID8gSlNPTi5wYXJzZShkYXRhLmJvZHkgPz8gJ3t9JykgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5LCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBdXRvbW9kUnVsZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCBjb21tYW5kKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmFsbCgpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmQpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlKHRlbXBsYXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuaWNvbikge1xuICAgICAgICBvcHRpb25zLmljb24gPSBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmljb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSwge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGF2YXRhcjogb3B0aW9ucy5hdmF0YXIgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmF2YXRhcikgOiB1bmRlZmluZWQsXG4gICAgICAgIHJlYXNvbjogb3B0aW9ucy5yZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgcmVhc29uID8geyByZWFzb24gfSA6IHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgcmVhc29uID8geyByZWFzb24gfSA6IHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZXMoY2hhbm5lbElkLCBtZXNzYWdlSWRzLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlSWRzLnNsaWNlKDAsIDEwMCkubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5hbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlckJvdCgpLCB7XG4gICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgIGF2YXRhcixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG9wdGlvbnMuaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRNZmFMZXZlbChndWlsZElkOiBCaWdTdHJpbmcsIG1mYUxldmVsOiBNZmFMZXZlbHMsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5ndWlsZHMubWZhKGd1aWxkSWQpLCB7IGxldmVsOiBtZmFMZXZlbCwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm9yaWdpbmFsKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpLCB7XG4gICAgICAgIGNoYW5uZWxfaWQ6IG9wdGlvbnMuY2hhbm5lbElkLFxuICAgICAgICBzdXBwcmVzczogb3B0aW9ucy5zdXBwcmVzcyxcbiAgICAgICAgcmVxdWVzdF90b19zcGVha190aW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICA/IG5ldyBEYXRlKG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXApLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlUG9zaXRpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgZGF0YSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgdG9waWM6IGRhdGEudG9waWMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCBvcHRpb25zLnVzZXJJZCksIHtcbiAgICAgICAgY2hhbm5lbF9pZDogb3B0aW9ucy5jaGFubmVsSWQsXG4gICAgICAgIHN1cHByZXNzOiBvcHRpb25zLnN1cHByZXNzLFxuICAgICAgICB1c2VyX2lkOiBvcHRpb25zLnVzZXJJZCxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2VsY29tZVNjcmVlbihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIHdlYmhvb2tfY2hhbm5lbF9pZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgfSBhcyBEaXNjb3JkRm9sbG93QW5ub3VuY2VtZW50Q2hhbm5lbClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMkFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1ZGl0TG9nKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXVkaXRMb2c+KHJlc3Qucm91dGVzLmd1aWxkcy5hdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLnJlZ2lvbnMoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIHJlY2lwaWVudF9pZDogdXNlcklkLnRvU3RyaW5nKCksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXROaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMubml0cm9TdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBydW5lQ291bnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQcnVuZWRDb3VudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnBydW5lKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlcihzdGlja2VySWQ6IEJpZ1N0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5zdGlja2VyKHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXIoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZvaWNlUmVnaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yZWdpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldEpzb24oZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldFNldHRpbmdzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5sZWF2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2hhbmdlIHRvIHJlcHJvY2VzcyBxdWV1ZSBpdGVtXG4gICAgICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiAoZGF0YSkgPT4gcmVzb2x2ZShkYXRhLnN0YXR1cyAhPT0gMjA0ID8gSlNPTi5wYXJzZShkYXRhLmJvZHkgPz8gJ3t9JykgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICB1cmw6IHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyBKU09OLnBhcnNlKGRhdGEuYm9keSA/PyAne30nKSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5waW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhjb21tYW5kcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIGNvbW1hbmRzKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmRzKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuIl0sIm5hbWVzIjpbIkludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyIsImNhbGN1bGF0ZUJpdHMiLCJjYW1lbGl6ZSIsImNhbWVsVG9TbmFrZUNhc2UiLCJkZWxheSIsImZpbmRGaWxlcyIsImdldEJvdElkRnJvbVRva2VuIiwiaXNHZXRNZXNzYWdlc0FmdGVyIiwiaXNHZXRNZXNzYWdlc0Fyb3VuZCIsImlzR2V0TWVzc2FnZXNCZWZvcmUiLCJpc0dldE1lc3NhZ2VzTGltaXQiLCJsb2dnZXIiLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSZXN0TWFuYWdlciIsIm9wdGlvbnMiLCJ0b2tlbiIsIkVycm9yIiwicmVzdCIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ2ZXJzaW9uIiwiYmFzZVVybCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsImRlbGV0ZVF1ZXVlRGVsYXkiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwiaW52YWxpZEJ1Y2tldCIsInJvdXRlcyIsIndlYmhvb2tzIiwiaWQiLCJ3ZWJob29rSWQiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwidXJsIiwidGhyZWFkSWQiLCJvcmlnaW5hbCIsIndlYmhvb2siLCJ3YWl0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzZXNzaW9uSW5mbyIsImdhdGV3YXlCb3QiLCJjaGFubmVscyIsImJ1bGsiLCJjaGFubmVsSWQiLCJkbSIsInBpbiIsInBpbnMiLCJyZWFjdGlvbnMiLCJib3QiLCJlbW9qaSIsImVuY29kZVVSSUNvbXBvbmVudCIsInVzZXIiLCJ1c2VySWQiLCJhbGwiLCJhZnRlciIsImxpbWl0IiwiY2hhbm5lbCIsImZvbGxvdyIsImZvcnVtIiwiaW52aXRlcyIsIm1lc3NhZ2VzIiwiYmVmb3JlIiwiYXJvdW5kIiwib3ZlcndyaXRlIiwib3ZlcndyaXRlSWQiLCJjcm9zc3Bvc3QiLCJzdGFnZXMiLCJzdGFnZSIsInRocmVhZHMiLCJhY3RpdmUiLCJndWlsZElkIiwibWVtYmVycyIsIm1lIiwiYXJjaGl2ZWQiLCJwdWJsaWMiLCJEYXRlIiwidG9JU09TdHJpbmciLCJwcml2YXRlIiwiam9pbmVkIiwidHlwaW5nIiwiZ3VpbGRzIiwiYXVkaXRsb2dzIiwiYWN0aW9uVHlwZSIsImF1dG9tb2QiLCJydWxlIiwicnVsZUlkIiwicnVsZXMiLCJlbW9qaUlkIiwiZW1vamlzIiwiZXZlbnRzIiwid2l0aFVzZXJDb3VudCIsImV2ZW50IiwiZXZlbnRJZCIsInVzZXJzIiwid2l0aE1lbWJlciIsImd1aWxkIiwid2l0aENvdW50cyIsImludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9ucyIsImludml0ZSIsImludml0ZUNvZGUiLCJ3aXRoRXhwaXJhdGlvbiIsInNjaGVkdWxlZEV2ZW50SWQiLCJsZWF2ZSIsImJhbiIsImJhbnMiLCJtZW1iZXIiLCJzZWFyY2giLCJxdWVyeSIsInBydW5lIiwiZGF5cyIsIkFycmF5IiwiaXNBcnJheSIsImluY2x1ZGVSb2xlcyIsImpvaW4iLCJtZmEiLCJwcmV2aWV3Iiwicm9sZXMiLCJvbmUiLCJyb2xlSWQiLCJtZW1iZXJJZCIsInN0aWNrZXJzIiwic3RpY2tlciIsInN0aWNrZXJJZCIsInZvaWNlIiwidGVtcGxhdGVzIiwiY29kZSIsInZhbml0eSIsInJlZ2lvbnMiLCJ3ZWxjb21lIiwid2lkZ2V0Iiwid2lkZ2V0SnNvbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY29tbWFuZElkIiwid2l0aExvY2FsaXphdGlvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJjb21tYW5kIiwicmVzcG9uc2VzIiwiY2FsbGJhY2siLCJpbnRlcmFjdGlvbklkIiwidXNlckJvdCIsIm9hdXRoMkFwcGxpY2F0aW9uIiwibml0cm9TdGlja2VyUGFja3MiLCJjaGVja1JhdGVMaW1pdHMiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsInJlc2V0VGltZXN0YW1wIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwibWFwIiwiaXRlbSIsIm5ld09iaiIsImtleSIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsImRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zIiwiY3JlYXRlUmVxdWVzdCIsImhlYWRlcnMiLCJ1bmF1dGhvcml6ZWQiLCJhdXRob3JpemF0aW9uIiwidG9Mb3dlckNhc2UiLCJtZXRob2QiLCJib2R5IiwicmVhc29uIiwiZmlsZSIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiZW5kc1dpdGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImRlc2NyaXB0aW9uIiwidGFncyIsImkiLCJsZW5ndGgiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJ2YWx1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJzaXplIiwic2V0VGltZW91dCIsInByb2Nlc3NIZWFkZXJzIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJidWNrZXRJZCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJpbnRlcnZhbCIsIm1heCIsInNldCIsImdsb2JhbFJlc2V0Iiwic2VuZFJlcXVlc3QiLCJzdGFydHNXaXRoIiwicGF5bG9hZCIsImRlYnVnIiwicmVzcG9uc2UiLCJmZXRjaCIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJzaW1wbGlmeVVybCIsInJldHJ5Q291bnQiLCJyZWplY3QiLCJvayIsImVycm9yIiwicmVzZXRBZnRlciIsImpzb24iLCJyZXRyeVJlcXVlc3QiLCJpczIwNCIsInJlc29sdmUiLCJyb3V0ZSIsInJlcGxhY2UiLCJtYXRjaCIsInAiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwicHJvY2Vzc1JlcXVlc3QiLCJyZXF1ZXN0IiwicGFydHMiLCJzcGxpdCIsInNoaWZ0IiwicXVldWUiLCJtYWtlUmVxdWVzdCIsImJ1Y2tldFF1ZXVlIiwiUHJvbWlzZSIsImRhdGEiLCJwYXJzZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwicmVhY3Rpb24iLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWRkUm9sZSIsImFkZFRocmVhZE1lbWJlciIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiaWNvbiIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJjcmVhdGVGb3J1bVRocmVhZCIsImNyZWF0ZUludml0ZSIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJjcmVhdGVXZWJob29rIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJkZWxldGVDaGFubmVsIiwiZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZSIsImRlbGV0ZUVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZGVsZXRlR3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImRlbGV0ZUd1aWxkU3RpY2tlciIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImRlbGV0ZUludml0ZSIsImRlbGV0ZU1lc3NhZ2UiLCJkZWxldGVNZXNzYWdlcyIsIm1lc3NhZ2VJZHMiLCJzbGljZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImRlbGV0ZU93blJlYWN0aW9uIiwiZGVsZXRlUmVhY3Rpb25zQWxsIiwiZGVsZXRlUmVhY3Rpb25zRW1vamkiLCJkZWxldGVSb2xlIiwiZGVsZXRlU2NoZWR1bGVkRXZlbnQiLCJkZWxldGVTdGFnZUluc3RhbmNlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsImVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImJlYXJlclRva2VuIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJ1c2VybmFtZSIsInRyaW0iLCJlZGl0Q2hhbm5lbCIsImVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyIsImVkaXRDaGFubmVsUG9zaXRpb25zIiwiY2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkTWZhTGV2ZWwiLCJtZmFMZXZlbCIsImxldmVsIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2UiLCJ0eXBlIiwiVXBkYXRlTWVzc2FnZSIsImVkaXRPd25Wb2ljZVN0YXRlIiwiY2hhbm5lbF9pZCIsInN1cHByZXNzIiwicmVxdWVzdF90b19zcGVha190aW1lc3RhbXAiLCJyZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCIsImVkaXRTY2hlZHVsZWRFdmVudCIsImVkaXRSb2xlIiwiZWRpdFJvbGVQb3NpdGlvbnMiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsInRvcGljIiwiZWRpdFVzZXJWb2ljZVN0YXRlIiwidXNlcl9pZCIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsImVkaXRXaWRnZXRTZXR0aW5ncyIsImV4ZWN1dGVXZWJob29rIiwiZm9sbG93QW5ub3VuY2VtZW50Iiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwid2ViaG9va19jaGFubmVsX2lkIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEFwcGxpY2F0aW9uSW5mbyIsImdldEF1ZGl0TG9nIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMiLCJnZXRCYW4iLCJnZXRCYW5zIiwiZ2V0Q2hhbm5lbCIsImdldENoYW5uZWxJbnZpdGVzIiwiZ2V0Q2hhbm5lbHMiLCJnZXRDaGFubmVsV2ViaG9va3MiLCJnZXREbUNoYW5uZWwiLCJyZWNpcGllbnRfaWQiLCJnZXRFbW9qaSIsImdldEVtb2ppcyIsImdldEZvbGxvd3VwTWVzc2FnZSIsImdldEdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkUHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwiZ2V0Tml0cm9TdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRQaW5uZWRNZXNzYWdlcyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0UHJ1bmVDb3VudCIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsImdldFJvbGVzIiwiZ2V0U2NoZWR1bGVkRXZlbnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwiZ2V0U2Vzc2lvbkluZm8iLCJnZXRTdGFnZUluc3RhbmNlIiwiZ2V0U3RpY2tlciIsImdldEd1aWxkU3RpY2tlciIsImdldEd1aWxkU3RpY2tlcnMiLCJnZXRUaHJlYWRNZW1iZXIiLCJnZXRUaHJlYWRNZW1iZXJzIiwiZ2V0UmVhY3Rpb25zIiwiZ2V0VXNlciIsImdldFZhbml0eVVybCIsImdldFZvaWNlUmVnaW9ucyIsImdldFdlYmhvb2siLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJnZXRXZWxjb21lU2NyZWVuIiwiZ2V0V2lkZ2V0IiwiZ2V0V2lkZ2V0U2V0dGluZ3MiLCJqb2luVGhyZWFkIiwibGVhdmVHdWlsZCIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwic2VuZE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSIsInN5bmNHdWlsZFRlbXBsYXRlIiwiYmFuTWVtYmVyIiwiZWRpdEJvdE1lbWJlciIsImVkaXRNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXRNZW1iZXJzIiwia2lja01lbWJlciIsInBpbk1lc3NhZ2UiLCJwcnVuZU1lbWJlcnMiLCJzZWFyY2hNZW1iZXJzIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBU0EsNEJBQUFBLENBQXdCLEtBQVEsbUJBQW1CLEFBQzVELFFBQ0VDLGlCQUFBQSxDQUFhLENBQ2JDLFlBQUFBLENBQVEsQ0FDUkMsb0JBQUFBLENBQWdCLENBQ2hCQyxTQUFBQSxDQUFLLENBQ0xDLGFBQUFBLENBQVMsQ0FDVEMscUJBQUFBLENB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
1
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { InteractionResponseTypes } from '@discordeno/types';
2
+ import { calculateBits, camelize, camelToSnakeCase, delay, findFiles, getBotIdFromToken, isGetMessagesAfter, isGetMessagesAround, isGetMessagesBefore, isGetMessagesLimit, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
3
+ import { createInvalidRequestBucket } from './invalidBucket.js';
4
+ import { Queue } from './queue.js';
5
+ // TODO: make dynamic based on package.json file
6
+ const version = '19.0.0-alpha.1';
7
+ export function createRestManager(options) {
8
+ // Falsy token string check
9
+ if (!options.token) throw new Error('You must provide a valid token.');
10
+ const rest = {
11
+ token: options.token,
12
+ applicationId: options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token),
13
+ version: options.version ?? 10,
14
+ baseUrl: options.baseUrl ?? 'https://discord.com/api',
15
+ maxRetryCount: Infinity,
16
+ globallyRateLimited: false,
17
+ processingRateLimitedPaths: false,
18
+ deleteQueueDelay: 60000,
19
+ queues: new Map(),
20
+ rateLimitedPaths: new Map(),
21
+ invalidBucket: createInvalidRequestBucket({}),
22
+ routes: {
23
+ webhooks: {
24
+ id: (webhookId)=>{
25
+ return `/webhooks/${webhookId}`;
26
+ },
27
+ message: (webhookId, token, messageId, options)=>{
28
+ let url = `/webhooks/${webhookId}/${token}/messages/${messageId}?`;
29
+ if (options) {
30
+ if (options.threadId) url += `thread_id=${options.threadId}`;
31
+ }
32
+ return url;
33
+ },
34
+ original: (webhookId, token, options)=>{
35
+ let url = `/webhooks/${webhookId}/${token}/messages/@original?`;
36
+ if (options) {
37
+ if (options.threadId) url += `thread_id=${options.threadId}`;
38
+ }
39
+ return url;
40
+ },
41
+ webhook: (webhookId, token, options)=>{
42
+ let url = `/webhooks/${webhookId}/${token}?`;
43
+ if (options) {
44
+ if (options?.wait !== undefined) url += `wait=${options.wait.toString()}`;
45
+ if (options.threadId) url += `thread_id=${options.threadId}`;
46
+ }
47
+ return url;
48
+ }
49
+ },
50
+ // Miscellaneous Endpoints
51
+ sessionInfo: ()=>rest.routes.gatewayBot(),
52
+ // Channel Endpoints
53
+ channels: {
54
+ bulk: (channelId)=>{
55
+ return `/channels/${channelId}/messages/bulk-delete`;
56
+ },
57
+ dm: ()=>{
58
+ return '/users/@me/channels';
59
+ },
60
+ pin: (channelId, messageId)=>{
61
+ return `/channels/${channelId}/pins/${messageId}`;
62
+ },
63
+ pins: (channelId)=>{
64
+ return `/channels/${channelId}/pins`;
65
+ },
66
+ reactions: {
67
+ bot: (channelId, messageId, emoji)=>{
68
+ return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`;
69
+ },
70
+ user: (channelId, messageId, emoji, userId)=>{
71
+ return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/${userId}`;
72
+ },
73
+ all: (channelId, messageId)=>{
74
+ return `/channels/${channelId}/messages/${messageId}/reactions`;
75
+ },
76
+ emoji: (channelId, messageId, emoji, options)=>{
77
+ let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
78
+ if (options) {
79
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
80
+ if (options.after) url += `after=${options.after}`;
81
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
82
+ if (options.limit) url += `&limit=${options.limit}`;
83
+ }
84
+ return url;
85
+ },
86
+ message: (channelId, messageId, emoji, options)=>{
87
+ let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
88
+ if (options) {
89
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
90
+ if (options.after) url += `after=${options.after}`;
91
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
92
+ if (options.limit) url += `&limit=${options.limit}`;
93
+ }
94
+ return url;
95
+ }
96
+ },
97
+ webhooks: (channelId)=>{
98
+ return `/channels/${channelId}/webhooks`;
99
+ },
100
+ channel: (channelId)=>{
101
+ return `/channels/${channelId}`;
102
+ },
103
+ follow: (channelId)=>{
104
+ return `/channels/${channelId}/followers`;
105
+ },
106
+ forum: (channelId)=>{
107
+ return `/channels/${channelId}/threads?has_message=true`;
108
+ },
109
+ invites: (channelId)=>{
110
+ return `/channels/${channelId}/invites`;
111
+ },
112
+ message: (channelId, messageId)=>{
113
+ return `/channels/${channelId}/messages/${messageId}`;
114
+ },
115
+ messages: (channelId, options)=>{
116
+ let url = `/channels/${channelId}/messages?`;
117
+ if (options) {
118
+ if (isGetMessagesAfter(options) && options.after) {
119
+ url += `after=${options.after}`;
120
+ }
121
+ if (isGetMessagesBefore(options) && options.before) {
122
+ url += `&before=${options.before}`;
123
+ }
124
+ if (isGetMessagesAround(options) && options.around) {
125
+ url += `&around=${options.around}`;
126
+ }
127
+ if (isGetMessagesLimit(options) && options.limit) {
128
+ url += `&limit=${options.limit}`;
129
+ }
130
+ }
131
+ return url;
132
+ },
133
+ overwrite: (channelId, overwriteId)=>{
134
+ return `/channels/${channelId}/permissions/${overwriteId}`;
135
+ },
136
+ crosspost: (channelId, messageId)=>{
137
+ return `/channels/${channelId}/messages/${messageId}/crosspost`;
138
+ },
139
+ stages: ()=>{
140
+ return '/stage-instances';
141
+ },
142
+ stage: (channelId)=>{
143
+ return `/stage-instances/${channelId}`;
144
+ },
145
+ // Thread Endpoints
146
+ threads: {
147
+ message: (channelId, messageId)=>{
148
+ return `/channels/${channelId}/messages/${messageId}/threads`;
149
+ },
150
+ all: (channelId)=>{
151
+ return `/channels/${channelId}/threads`;
152
+ },
153
+ active: (guildId)=>{
154
+ return `/guilds/${guildId}/threads/active`;
155
+ },
156
+ members: (channelId)=>{
157
+ return `/channels/${channelId}/thread-members`;
158
+ },
159
+ me: (channelId)=>{
160
+ return `/channels/${channelId}/thread-members/@me`;
161
+ },
162
+ user: (channelId, userId)=>{
163
+ return `/channels/${channelId}/thread-members/${userId}`;
164
+ },
165
+ archived: (channelId)=>{
166
+ return `/channels/${channelId}/threads/archived`;
167
+ },
168
+ public: (channelId, options)=>{
169
+ let url = `/channels/${channelId}/threads/archived/public?`;
170
+ if (options) {
171
+ if (options.before) {
172
+ url += `before=${new Date(options.before).toISOString()}`;
173
+ }
174
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
175
+ if (options.limit) url += `&limit=${options.limit}`;
176
+ }
177
+ return url;
178
+ },
179
+ private: (channelId, options)=>{
180
+ let url = `/channels/${channelId}/threads/archived/private?`;
181
+ if (options) {
182
+ if (options.before) {
183
+ url += `before=${new Date(options.before).toISOString()}`;
184
+ }
185
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
186
+ if (options.limit) url += `&limit=${options.limit}`;
187
+ }
188
+ return url;
189
+ },
190
+ joined: (channelId, options)=>{
191
+ let url = `/channels/${channelId}/users/@me/threads/archived/private?`;
192
+ if (options) {
193
+ if (options.before) {
194
+ url += `before=${new Date(options.before).toISOString()}`;
195
+ }
196
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
197
+ if (options.limit) url += `&limit=${options.limit}`;
198
+ }
199
+ return url;
200
+ }
201
+ },
202
+ typing: (channelId)=>{
203
+ return `/channels/${channelId}/typing`;
204
+ }
205
+ },
206
+ // Guild Endpoints
207
+ guilds: {
208
+ all: ()=>{
209
+ return '/guilds';
210
+ },
211
+ auditlogs: (guildId, options)=>{
212
+ let url = `/guilds/${guildId}/audit-logs?`;
213
+ if (options) {
214
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
215
+ if (options.actionType) url += `action_type=${options.actionType}`;
216
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
217
+ if (options.before) url += `&before=${options.before}`;
218
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
219
+ if (options.limit) url += `&limit=${options.limit}`;
220
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
221
+ if (options.userId) url += `&user_id=${options.userId}`;
222
+ }
223
+ return url;
224
+ },
225
+ automod: {
226
+ rule: (guildId, ruleId)=>{
227
+ return `/guilds/${guildId}/auto-moderation/rules/${ruleId}`;
228
+ },
229
+ rules: (guildId)=>{
230
+ return `/guilds/${guildId}/auto-moderation/rules`;
231
+ }
232
+ },
233
+ channels: (guildId)=>{
234
+ return `/guilds/${guildId}/channels`;
235
+ },
236
+ emoji: (guildId, emojiId)=>{
237
+ return `/guilds/${guildId}/emojis/${emojiId}`;
238
+ },
239
+ emojis: (guildId)=>{
240
+ return `/guilds/${guildId}/emojis`;
241
+ },
242
+ events: {
243
+ events: (guildId, withUserCount)=>{
244
+ let url = `/guilds/${guildId}/scheduled-events?`;
245
+ if (withUserCount !== undefined) {
246
+ url += `with_user_count=${withUserCount.toString()}`;
247
+ }
248
+ return url;
249
+ },
250
+ event: (guildId, eventId, withUserCount)=>{
251
+ let url = `/guilds/${guildId}/scheduled-events/${eventId}`;
252
+ if (withUserCount !== undefined) {
253
+ url += `with_user_count=${withUserCount.toString()}`;
254
+ }
255
+ return url;
256
+ },
257
+ users: (guildId, eventId, options)=>{
258
+ let url = `/guilds/${guildId}/scheduled-events/${eventId}/users?`;
259
+ if (options) {
260
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
261
+ if (options.limit !== undefined) url += `limit=${options.limit}`;
262
+ if (options.withMember !== undefined) {
263
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
264
+ url += `&with_member=${options.withMember.toString()}`;
265
+ }
266
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
267
+ if (options.after !== undefined) url += `&after=${options.after}`;
268
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
269
+ if (options.before !== undefined) url += `&before=${options.before}`;
270
+ }
271
+ return url;
272
+ }
273
+ },
274
+ guild (guildId, withCounts) {
275
+ let url = `/guilds/${guildId}?`;
276
+ if (withCounts !== undefined) {
277
+ url += `with_counts=${withCounts.toString()}`;
278
+ }
279
+ return url;
280
+ },
281
+ integration (guildId, integrationId) {
282
+ return `/guilds/${guildId}/integrations/${integrationId}`;
283
+ },
284
+ integrations: (guildId)=>{
285
+ return `/guilds/${guildId}/integrations?include_applications=true`;
286
+ },
287
+ invite (inviteCode, options) {
288
+ let url = `/invites/${inviteCode}?`;
289
+ if (options) {
290
+ if (options.withCounts !== undefined) {
291
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
292
+ url += `with_counts=${options.withCounts.toString()}`;
293
+ }
294
+ if (options.withExpiration !== undefined) {
295
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
296
+ url += `&with_expiration=${options.withExpiration.toString()}`;
297
+ }
298
+ if (options.scheduledEventId) {
299
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
300
+ url += `&guild_scheduled_event_id=${options.scheduledEventId}`;
301
+ }
302
+ }
303
+ return url;
304
+ },
305
+ invites: (guildId)=>{
306
+ return `/guilds/${guildId}/invites`;
307
+ },
308
+ leave: (guildId)=>{
309
+ return `/users/@me/guilds/${guildId}`;
310
+ },
311
+ members: {
312
+ ban: (guildId, userId)=>{
313
+ return `/guilds/${guildId}/bans/${userId}`;
314
+ },
315
+ bans: (guildId, options)=>{
316
+ let url = `/guilds/${guildId}/bans?`;
317
+ if (options) {
318
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
319
+ if (options.limit) url += `limit=${options.limit}`;
320
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
321
+ if (options.after) url += `&after=${options.after}`;
322
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
323
+ if (options.before) url += `&before=${options.before}`;
324
+ }
325
+ return url;
326
+ },
327
+ bot: (guildId)=>{
328
+ return `/guilds/${guildId}/members/@me`;
329
+ },
330
+ member: (guildId, userId)=>{
331
+ return `/guilds/${guildId}/members/${userId}`;
332
+ },
333
+ members: (guildId, options)=>{
334
+ let url = `/guilds/${guildId}/members?`;
335
+ if (options !== undefined) {
336
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
337
+ if (options.limit) url += `limit=${options.limit}`;
338
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
339
+ if (options.after) url += `&after=${options.after}`;
340
+ }
341
+ return url;
342
+ },
343
+ search: (guildId, query, options)=>{
344
+ let url = `/guilds/${guildId}/members/search?query=${encodeURIComponent(query)}`;
345
+ if (options) {
346
+ if (options.limit !== undefined) url += `&limit=${options.limit}`;
347
+ }
348
+ return url;
349
+ },
350
+ prune: (guildId, options)=>{
351
+ let url = `/guilds/${guildId}/prune?`;
352
+ if (options) {
353
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
354
+ if (options.days) url += `days=${options.days}`;
355
+ if (Array.isArray(options.includeRoles)) {
356
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
357
+ url += `&include_roles=${options.includeRoles.join(',')}`;
358
+ } else if (options.includeRoles) {
359
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
360
+ url += `&include_roles=${options.includeRoles}`;
361
+ }
362
+ }
363
+ return url;
364
+ }
365
+ },
366
+ mfa: (guildId)=>`/guilds/${guildId}/mfa`,
367
+ preview: (guildId)=>{
368
+ return `/guilds/${guildId}/preview`;
369
+ },
370
+ prune: (guildId, options)=>{
371
+ let url = `/guilds/${guildId}/prune?`;
372
+ if (options) {
373
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
374
+ if (options.days) url += `days=${options.days}`;
375
+ if (Array.isArray(options.includeRoles)) {
376
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
377
+ url += `&include_roles=${options.includeRoles.join(',')}`;
378
+ } else if (options.includeRoles) {
379
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
380
+ url += `&include_roles=${options.includeRoles}`;
381
+ }
382
+ }
383
+ return url;
384
+ },
385
+ roles: {
386
+ one: (guildId, roleId)=>{
387
+ return `/guilds/${guildId}/roles/${roleId}`;
388
+ },
389
+ all: (guildId)=>{
390
+ return `/guilds/${guildId}/roles`;
391
+ },
392
+ member: (guildId, memberId, roleId)=>{
393
+ return `/guilds/${guildId}/members/${memberId}/roles/${roleId}`;
394
+ }
395
+ },
396
+ stickers: (guildId)=>{
397
+ return `/guilds/${guildId}/stickers`;
398
+ },
399
+ sticker: (guildId, stickerId)=>{
400
+ return `/guilds/${guildId}/stickers/${stickerId}`;
401
+ },
402
+ voice: (guildId, userId)=>{
403
+ return `/guilds/${guildId}/voice-states/${userId ?? '@me'}`;
404
+ },
405
+ templates: {
406
+ code: (code)=>{
407
+ return `/guilds/templates/${code}`;
408
+ },
409
+ guild: (guildId, code)=>{
410
+ return `/guilds/${guildId}/templates/${code}`;
411
+ },
412
+ all: (guildId)=>{
413
+ return `/guilds/${guildId}/templates`;
414
+ }
415
+ },
416
+ vanity: (guildId)=>{
417
+ return `/guilds/${guildId}/vanity-url`;
418
+ },
419
+ regions: (guildId)=>{
420
+ return `/guilds/${guildId}/regions`;
421
+ },
422
+ webhooks: (guildId)=>{
423
+ return `/guilds/${guildId}/webhooks`;
424
+ },
425
+ welcome: (guildId)=>{
426
+ return `/guilds/${guildId}/welcome-screen`;
427
+ },
428
+ widget: (guildId)=>{
429
+ return `/guilds/${guildId}/widget`;
430
+ },
431
+ widgetJson: (guildId)=>{
432
+ return `/guilds/${guildId}/widget.json`;
433
+ }
434
+ },
435
+ sticker: (stickerId)=>{
436
+ return `/stickers/${stickerId}`;
437
+ },
438
+ regions: ()=>{
439
+ return '/voice/regions';
440
+ },
441
+ // Interaction Endpoints
442
+ interactions: {
443
+ commands: {
444
+ // Application Endpoints
445
+ commands: (applicationId)=>{
446
+ return `/applications/${applicationId}/commands`;
447
+ },
448
+ guilds: {
449
+ all (applicationId, guildId) {
450
+ return `/applications/${applicationId}/guilds/${guildId}/commands`;
451
+ },
452
+ one (applicationId, guildId, commandId, withLocalizations) {
453
+ let url = `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}?`;
454
+ if (withLocalizations !== undefined) {
455
+ url += `with_localizations=${withLocalizations.toString()}`;
456
+ }
457
+ return url;
458
+ }
459
+ },
460
+ permissions: (applicationId, guildId)=>{
461
+ return `/applications/${applicationId}/guilds/${guildId}/commands/permissions`;
462
+ },
463
+ permission: (applicationId, guildId, commandId)=>{
464
+ return `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}/permissions`;
465
+ },
466
+ command: (applicationId, commandId, withLocalizations)=>{
467
+ let url = `/applications/${applicationId}/commands/${commandId}?`;
468
+ if (withLocalizations !== undefined) {
469
+ url += `withLocalizations=${withLocalizations.toString()}`;
470
+ }
471
+ return url;
472
+ }
473
+ },
474
+ responses: {
475
+ // Interaction Endpoints
476
+ callback: (interactionId, token)=>{
477
+ return `/interactions/${interactionId}/${token}/callback`;
478
+ },
479
+ original: (interactionId, token)=>{
480
+ return `/webhooks/${interactionId}/${token}/messages/@original`;
481
+ },
482
+ message: (applicationId, token, messageId)=>{
483
+ return `/webhooks/${applicationId}/${token}/messages/${messageId}`;
484
+ }
485
+ }
486
+ },
487
+ // User endpoints
488
+ user (userId) {
489
+ return `/users/${userId}`;
490
+ },
491
+ userBot () {
492
+ return '/users/@me';
493
+ },
494
+ oauth2Application () {
495
+ return 'oauth2/applications/@me';
496
+ },
497
+ gatewayBot () {
498
+ return '/gateway/bot';
499
+ },
500
+ nitroStickerPacks () {
501
+ return '/sticker-packs';
502
+ }
503
+ },
504
+ checkRateLimits (url) {
505
+ const ratelimited = rest.rateLimitedPaths.get(url);
506
+ const global = rest.rateLimitedPaths.get('global');
507
+ const now = Date.now();
508
+ if (ratelimited && now < ratelimited.resetTimestamp) {
509
+ return ratelimited.resetTimestamp - now;
510
+ }
511
+ if (global && now < global.resetTimestamp) {
512
+ return global.resetTimestamp - now;
513
+ }
514
+ return false;
515
+ },
516
+ changeToDiscordFormat (obj) {
517
+ if (obj === null) return null;
518
+ if (typeof obj === 'object') {
519
+ if (Array.isArray(obj)) {
520
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
521
+ }
522
+ const newObj = {};
523
+ for (const key of Object.keys(obj)){
524
+ // Keys that dont require snake casing
525
+ if ([
526
+ 'permissions',
527
+ 'allow',
528
+ 'deny'
529
+ ].includes(key)) {
530
+ newObj[key] = calculateBits(obj[key]);
531
+ continue;
532
+ }
533
+ if (key === 'defaultMemberPermissions') {
534
+ newObj.default_member_permissions = calculateBits(obj[key]);
535
+ continue;
536
+ }
537
+ newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(obj[key]);
538
+ }
539
+ return newObj;
540
+ }
541
+ if (typeof obj === 'bigint') return obj.toString();
542
+ return obj;
543
+ },
544
+ createRequest (options) {
545
+ const headers = {
546
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
547
+ };
548
+ if (!options.unauthorized) headers.authorization = `Bot ${rest.token}`;
549
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
550
+ if (options.headers) {
551
+ for(const key in options.headers){
552
+ headers[key.toLowerCase()] = options.headers[key];
553
+ }
554
+ }
555
+ // GET METHODS SHOULD NOT HAVE A BODY
556
+ if (options.method === 'GET') {
557
+ options.body = undefined;
558
+ }
559
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
560
+ if (options.body?.reason) {
561
+ headers['X-Audit-Log-Reason'] = encodeURIComponent(options.body.reason);
562
+ options.body.reason = undefined;
563
+ }
564
+ if (options.body) {
565
+ const { file } = options.body;
566
+ if (file) {
567
+ const files = findFiles(file);
568
+ const form = new FormData();
569
+ // WHEN CREATING A STICKER, DISCORD WANTS FORM DATA ONLY
570
+ if (options.url?.endsWith('/stickers') && options.method === 'POST') {
571
+ form.append('file', files[0].blob, files[0].name);
572
+ form.append('name', options.body.name);
573
+ form.append('description', options.body.description);
574
+ form.append('tags', options.body.tags);
575
+ } else {
576
+ for(let i = 0; i < files.length; i++){
577
+ form.append(`file${i}`, files[i].blob, files[i].name);
578
+ }
579
+ if (file) options.body.file = undefined;
580
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat(options.body)));
581
+ }
582
+ options.body.file = form;
583
+ } else if (options.body && ![
584
+ 'GET',
585
+ 'DELETE'
586
+ ].includes(options.method)) {
587
+ headers['Content-Type'] = 'application/json';
588
+ }
589
+ }
590
+ return {
591
+ headers,
592
+ body: options.body?.file ?? JSON.stringify(rest.changeToDiscordFormat(options.body)),
593
+ method: options.method
594
+ };
595
+ },
596
+ processRateLimitedPaths () {
597
+ const now = Date.now();
598
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
599
+ // rest.debug(
600
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
601
+ // value.resetTimestamp - now
602
+ // }`
603
+ // )
604
+ // If the time has not reached cancel
605
+ if (value.resetTimestamp > now) continue;
606
+ // Rate limit is over, delete the rate limiter
607
+ rest.rateLimitedPaths.delete(key);
608
+ // If it was global, also mark the global value as false
609
+ if (key === 'global') rest.globallyRateLimited = false;
610
+ }
611
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
612
+ if (rest.rateLimitedPaths.size === 0) {
613
+ rest.processingRateLimitedPaths = false;
614
+ } else {
615
+ rest.processingRateLimitedPaths = true;
616
+ // RECHECK IN 1 SECOND
617
+ setTimeout(()=>{
618
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
619
+ rest.processRateLimitedPaths();
620
+ }, 1000);
621
+ }
622
+ },
623
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
624
+ let rateLimited = false;
625
+ // GET ALL NECESSARY HEADERS
626
+ const remaining = headers.get('x-ratelimit-remaining');
627
+ const retryAfter = headers.get('x-ratelimit-reset-after');
628
+ const reset = Date.now() + Number(retryAfter) * 1000;
629
+ const global = headers.get('x-ratelimit-global');
630
+ // undefined override null needed for typings
631
+ const bucketId = headers.get('x-ratelimit-bucket') ?? undefined;
632
+ const limit = headers.get('x-ratelimit-limit');
633
+ rest.queues.get(url)?.handleCompletedRequest({
634
+ remaining: remaining ? Number(remaining) : undefined,
635
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
636
+ max: limit ? Number(limit) : undefined
637
+ });
638
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
639
+ if (remaining === '0') {
640
+ rateLimited = true;
641
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
642
+ rest.rateLimitedPaths.set(url, {
643
+ url,
644
+ resetTimestamp: reset,
645
+ bucketId
646
+ });
647
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
648
+ if (bucketId) {
649
+ rest.rateLimitedPaths.set(bucketId, {
650
+ url,
651
+ resetTimestamp: reset,
652
+ bucketId
653
+ });
654
+ }
655
+ }
656
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
657
+ if (global) {
658
+ const retryAfter1 = headers.get('retry-after');
659
+ const globalReset = Date.now() + Number(retryAfter1) * 1000;
660
+ // rest.debug(
661
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
662
+ // )
663
+ rest.globallyRateLimited = true;
664
+ rateLimited = true;
665
+ setTimeout(()=>{
666
+ rest.globallyRateLimited = false;
667
+ }, globalReset);
668
+ rest.rateLimitedPaths.set('global', {
669
+ url: 'global',
670
+ resetTimestamp: globalReset,
671
+ bucketId
672
+ });
673
+ if (bucketId) {
674
+ rest.rateLimitedPaths.set(bucketId, {
675
+ url: 'global',
676
+ resetTimestamp: globalReset,
677
+ bucketId
678
+ });
679
+ }
680
+ }
681
+ if (rateLimited && !rest.processingRateLimitedPaths) {
682
+ rest.processRateLimitedPaths();
683
+ }
684
+ return rateLimited ? bucketId : undefined;
685
+ },
686
+ async sendRequest (options) {
687
+ const url = options.url.startsWith('https://') ? options.url : `${rest.baseUrl}/v${rest.version}${options.url}`;
688
+ const payload = rest.createRequest({
689
+ method: options.method,
690
+ url: options.url,
691
+ body: options.body,
692
+ ...options.options
693
+ });
694
+ logger.debug(`sending request to ${url}`, 'with payload:', {
695
+ ...payload,
696
+ headers: {
697
+ ...payload.headers,
698
+ authorization: 'Bot tokenhere'
699
+ }
700
+ });
701
+ const response = await fetch(url, payload);
702
+ logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
703
+ // Set the bucket id if it was available on the headers
704
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.url, options.method), response.headers);
705
+ if (bucketId) options.bucketId = bucketId;
706
+ if (response.status < 200 || response.status >= 400) {
707
+ logger.debug(`Request to ${url} failed.`);
708
+ if (response.status === 429) {
709
+ logger.debug(`Request to ${url} was ratelimited.`);
710
+ // Too many attempts, get rid of request from queue.
711
+ if (options.retryCount++ >= rest.maxRetryCount) {
712
+ logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
713
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
714
+ // Remove item from queue to prevent retry
715
+ return options.reject({
716
+ ok: false,
717
+ status: response.status,
718
+ error: 'The options was rate limited and it maxed out the retries limit.'
719
+ });
720
+ }
721
+ // Rate limited, add back to queue
722
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get('X-RateLimit-Scope') === 'shared');
723
+ const resetAfter = response.headers.get('x-ratelimit-reset-after');
724
+ if (resetAfter) await delay(Number(resetAfter) * 1000);
725
+ // process the response to prevent mem leak
726
+ await response.json();
727
+ return await options.retryRequest?.(options);
728
+ }
729
+ return options.reject({
730
+ ok: false,
731
+ status: response.status,
732
+ body: JSON.stringify(await response.json())
733
+ });
734
+ }
735
+ const is204 = response.status === 204;
736
+ const json = is204 ? undefined : await response.json();
737
+ // Discord sometimes sends no response with 204 code
738
+ return options.resolve({
739
+ ok: true,
740
+ status: response.status,
741
+ body: JSON.stringify(json)
742
+ });
743
+ },
744
+ // Credits: github.com/abalabahaha/eris lib/rest/RequestHandler.js#L397
745
+ // Modified for our use-case
746
+ simplifyUrl (url, method) {
747
+ let route = url.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g, function(match, p) {
748
+ return [
749
+ 'channels',
750
+ 'guilds'
751
+ ].includes(p) ? match : `/${p}/x`;
752
+ }).replace(/\/reactions\/[^/]+/g, '/reactions/x');
753
+ // GENERAL /reactions and /reactions/emoji/@me share the buckets
754
+ if (route.includes('/reactions')) {
755
+ route = route.substring(0, route.indexOf('/reactions') + '/reactions'.length);
756
+ }
757
+ // Delete Message endpoint has its own rate limit
758
+ if (method === 'DELETE' && route.endsWith('/messages/x')) {
759
+ route = method + route;
760
+ }
761
+ return route;
762
+ },
763
+ processRequest (request) {
764
+ const route = request.url.substring(request.url.indexOf('api/'));
765
+ const parts = route.split('/');
766
+ // Remove the api/
767
+ parts.shift();
768
+ // Removes the /v#/
769
+ if (parts[0]?.startsWith('v')) parts.shift();
770
+ // Set the full url to discord api in case it was recieved in a proxy rest
771
+ request.url = `${rest.baseUrl}/v${rest.version}/${parts.join('/')}`;
772
+ const url = rest.simplifyUrl(request.url, request.method);
773
+ const queue = rest.queues.get(url);
774
+ if (queue !== undefined) {
775
+ queue.makeRequest(request);
776
+ } else {
777
+ // CREATES A NEW QUEUE
778
+ const bucketQueue = new Queue(rest, {
779
+ url,
780
+ deleteQueueDelay: rest.deleteQueueDelay
781
+ });
782
+ // Add request to queue
783
+ bucketQueue.makeRequest(request);
784
+ // Save queue
785
+ rest.queues.set(url, bucketQueue);
786
+ }
787
+ },
788
+ async makeRequest (method, url, body, options) {
789
+ return await new Promise((resolve, reject)=>{
790
+ const payload = {
791
+ url,
792
+ method,
793
+ body,
794
+ retryCount: 0,
795
+ retryRequest: async function(options) {
796
+ rest.processRequest(payload);
797
+ },
798
+ resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
799
+ reject,
800
+ options
801
+ };
802
+ rest.processRequest(payload);
803
+ });
804
+ },
805
+ async get (url) {
806
+ return camelize(await rest.makeRequest('GET', url));
807
+ },
808
+ async post (url, body) {
809
+ return camelize(await rest.makeRequest('POST', url, body));
810
+ },
811
+ async delete (url, body) {
812
+ return camelize(await rest.makeRequest('DELETE', url, body));
813
+ },
814
+ async patch (url, body) {
815
+ return camelize(await rest.makeRequest('PATCH', url, body));
816
+ },
817
+ async put (url, body, options) {
818
+ return camelize(await rest.makeRequest('PUT', url, body, options));
819
+ },
820
+ async addReaction (channelId, messageId, reaction) {
821
+ reaction = processReactionString(reaction);
822
+ return await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
823
+ },
824
+ async addReactions (channelId, messageId, reactions, ordered = false) {
825
+ if (!ordered) {
826
+ await Promise.all(reactions.map(async (reaction)=>await rest.addReaction(channelId, messageId, reaction)));
827
+ return;
828
+ }
829
+ for (const reaction of reactions){
830
+ await rest.addReaction(channelId, messageId, reaction);
831
+ }
832
+ },
833
+ async addRole (guildId, userId, roleId, reason) {
834
+ return await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
835
+ reason
836
+ });
837
+ },
838
+ async addThreadMember (channelId, userId) {
839
+ return await rest.put(rest.routes.channels.threads.user(channelId, userId));
840
+ },
841
+ async createAutomodRule (guildId, options) {
842
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), options);
843
+ },
844
+ async createChannel (guildId, options) {
845
+ return await rest.post(rest.routes.guilds.channels(guildId), options);
846
+ },
847
+ async createEmoji (guildId, options) {
848
+ return await rest.post(rest.routes.guilds.emojis(guildId), options);
849
+ },
850
+ async createGlobalApplicationCommand (command) {
851
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), command);
852
+ },
853
+ async createGuild (options) {
854
+ return await rest.post(rest.routes.guilds.all(), options);
855
+ },
856
+ async createGuildApplicationCommand (command, guildId) {
857
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), command);
858
+ },
859
+ async createGuildFromTemplate (templateCode, options) {
860
+ if (options.icon) {
861
+ options.icon = await urlToBase64(options.icon);
862
+ }
863
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), options);
864
+ },
865
+ async createGuildSticker (guildId, options) {
866
+ return await rest.post(rest.routes.guilds.stickers(guildId), options);
867
+ },
868
+ async createGuildTemplate (guildId, options) {
869
+ return await rest.post(rest.routes.guilds.templates.all(guildId), options);
870
+ },
871
+ async createForumThread (channelId, options) {
872
+ return await rest.post(rest.routes.channels.forum(channelId), options);
873
+ },
874
+ async createInvite (channelId, options = {}) {
875
+ return await rest.post(rest.routes.channels.invites(channelId), options);
876
+ },
877
+ async createRole (guildId, options, reason) {
878
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
879
+ ...options,
880
+ reason
881
+ });
882
+ },
883
+ async createScheduledEvent (guildId, options) {
884
+ return await rest.post(rest.routes.guilds.events.events(guildId), options);
885
+ },
886
+ async createStageInstance (options) {
887
+ return await rest.post(rest.routes.channels.stages(), options);
888
+ },
889
+ async createWebhook (channelId, options) {
890
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
891
+ name: options.name,
892
+ avatar: options.avatar ? await urlToBase64(options.avatar) : undefined,
893
+ reason: options.reason
894
+ });
895
+ },
896
+ async deleteAutomodRule (guildId, ruleId, reason) {
897
+ return await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
898
+ reason
899
+ });
900
+ },
901
+ async deleteChannel (channelId, reason) {
902
+ return await rest.delete(rest.routes.channels.channel(channelId), {
903
+ reason
904
+ });
905
+ },
906
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
907
+ return await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), reason ? {
908
+ reason
909
+ } : undefined);
910
+ },
911
+ async deleteEmoji (guildId, id, reason) {
912
+ return await rest.delete(rest.routes.guilds.emoji(guildId, id), {
913
+ reason
914
+ });
915
+ },
916
+ async deleteFollowupMessage (token, messageId) {
917
+ return await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
918
+ },
919
+ async deleteGlobalApplicationCommand (commandId) {
920
+ return await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
921
+ },
922
+ async deleteGuild (guildId) {
923
+ return await rest.delete(rest.routes.guilds.guild(guildId));
924
+ },
925
+ async deleteGuildApplicationCommand (commandId, guildId) {
926
+ return await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
927
+ },
928
+ async deleteGuildSticker (guildId, stickerId, reason) {
929
+ return await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), reason ? {
930
+ reason
931
+ } : undefined);
932
+ },
933
+ async deleteGuildTemplate (guildId, templateCode) {
934
+ return await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
935
+ },
936
+ async deleteIntegration (guildId, integrationId) {
937
+ return await rest.delete(rest.routes.guilds.integration(guildId, integrationId));
938
+ },
939
+ async deleteInvite (inviteCode, reason) {
940
+ return await rest.delete(rest.routes.guilds.invite(inviteCode), reason ? {
941
+ reason
942
+ } : undefined);
943
+ },
944
+ async deleteMessage (channelId, messageId, reason) {
945
+ return await rest.delete(rest.routes.channels.message(channelId, messageId), {
946
+ reason
947
+ });
948
+ },
949
+ async deleteMessages (channelId, messageIds, reason) {
950
+ return await rest.post(rest.routes.channels.bulk(channelId), {
951
+ messages: messageIds.slice(0, 100).map((id)=>id.toString()),
952
+ reason
953
+ });
954
+ },
955
+ async deleteOriginalInteractionResponse (token) {
956
+ return await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token));
957
+ },
958
+ async deleteOwnReaction (channelId, messageId, reaction) {
959
+ reaction = processReactionString(reaction);
960
+ return await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
961
+ },
962
+ async deleteReactionsAll (channelId, messageId) {
963
+ return await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
964
+ },
965
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
966
+ reaction = processReactionString(reaction);
967
+ return await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
968
+ },
969
+ async deleteRole (guildId, roleId) {
970
+ return await rest.delete(rest.routes.guilds.roles.one(guildId, roleId));
971
+ },
972
+ async deleteScheduledEvent (guildId, eventId) {
973
+ return await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
974
+ },
975
+ async deleteStageInstance (channelId, reason) {
976
+ return await rest.delete(rest.routes.channels.stage(channelId), reason ? {
977
+ reason
978
+ } : undefined);
979
+ },
980
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
981
+ reaction = processReactionString(reaction);
982
+ return await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
983
+ },
984
+ async deleteWebhook (webhookId, reason) {
985
+ return await rest.delete(rest.routes.webhooks.id(webhookId), {
986
+ reason
987
+ });
988
+ },
989
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
990
+ return await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
991
+ },
992
+ async deleteWebhookWithToken (webhookId, token) {
993
+ return await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
994
+ },
995
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, options) {
996
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
997
+ permissions: options
998
+ }, {
999
+ headers: {
1000
+ authorization: `Bearer ${bearerToken}`
1001
+ }
1002
+ });
1003
+ },
1004
+ async editAutomodRule (guildId, ruleId, options) {
1005
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), options);
1006
+ },
1007
+ async editBotProfile (options) {
1008
+ const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
1009
+ return await rest.patch(rest.routes.userBot(), {
1010
+ username: options.username?.trim(),
1011
+ avatar
1012
+ });
1013
+ },
1014
+ async editChannel (channelId, options) {
1015
+ return await rest.patch(rest.routes.channels.channel(channelId), options);
1016
+ },
1017
+ async editChannelPermissionOverrides (channelId, options) {
1018
+ return await rest.put(rest.routes.channels.overwrite(channelId, options.id), options);
1019
+ },
1020
+ async editChannelPositions (guildId, channelPositions) {
1021
+ return await rest.patch(rest.routes.guilds.channels(guildId), channelPositions);
1022
+ },
1023
+ async editEmoji (guildId, id, options) {
1024
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), options);
1025
+ },
1026
+ async editFollowupMessage (token, messageId, options) {
1027
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), options);
1028
+ },
1029
+ async editGlobalApplicationCommand (commandId, options) {
1030
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), options);
1031
+ },
1032
+ async editGuild (guildId, options) {
1033
+ return await rest.patch(rest.routes.guilds.guild(guildId), options);
1034
+ },
1035
+ async editGuildApplicationCommand (commandId, guildId, options) {
1036
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), options);
1037
+ },
1038
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
1039
+ return await rest.post(rest.routes.guilds.mfa(guildId), {
1040
+ level: mfaLevel,
1041
+ reason
1042
+ });
1043
+ },
1044
+ async editGuildSticker (guildId, stickerId, options) {
1045
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), options);
1046
+ },
1047
+ async editGuildTemplate (guildId, templateCode, options) {
1048
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), options);
1049
+ },
1050
+ async editMessage (channelId, messageId, options) {
1051
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), options);
1052
+ },
1053
+ async editOriginalInteractionResponse (token, options) {
1054
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), options);
1055
+ },
1056
+ async editOriginalWebhookMessage (webhookId, token, options) {
1057
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
1058
+ type: InteractionResponseTypes.UpdateMessage,
1059
+ data: options
1060
+ });
1061
+ },
1062
+ async editOwnVoiceState (guildId, options) {
1063
+ return await rest.patch(rest.routes.guilds.voice(guildId), {
1064
+ channel_id: options.channelId,
1065
+ suppress: options.suppress,
1066
+ request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
1067
+ });
1068
+ },
1069
+ async editScheduledEvent (guildId, eventId, options) {
1070
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), options);
1071
+ },
1072
+ async editRole (guildId, roleId, options) {
1073
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), options);
1074
+ },
1075
+ async editRolePositions (guildId, options) {
1076
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), options);
1077
+ },
1078
+ async editStageInstance (channelId, data) {
1079
+ return await rest.patch(rest.routes.channels.stage(channelId), {
1080
+ topic: data.topic
1081
+ });
1082
+ },
1083
+ async editUserVoiceState (guildId, options) {
1084
+ return await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
1085
+ channel_id: options.channelId,
1086
+ suppress: options.suppress,
1087
+ user_id: options.userId
1088
+ });
1089
+ },
1090
+ async editWebhook (webhookId, options) {
1091
+ return await rest.patch(rest.routes.webhooks.id(webhookId), options);
1092
+ },
1093
+ async editWebhookMessage (webhookId, token, messageId, options) {
1094
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), options);
1095
+ },
1096
+ async editWebhookWithToken (webhookId, token, options) {
1097
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), options);
1098
+ },
1099
+ async editWelcomeScreen (guildId, options) {
1100
+ return await rest.patch(rest.routes.guilds.welcome(guildId), options);
1101
+ },
1102
+ async editWidgetSettings (guildId, options) {
1103
+ return await rest.patch(rest.routes.guilds.widget(guildId), options);
1104
+ },
1105
+ async executeWebhook (webhookId, token, options) {
1106
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), options);
1107
+ },
1108
+ async followAnnouncement (sourceChannelId, targetChannelId) {
1109
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
1110
+ webhook_channel_id: targetChannelId
1111
+ });
1112
+ },
1113
+ async getActiveThreads (guildId) {
1114
+ return await rest.get(rest.routes.channels.threads.active(guildId));
1115
+ },
1116
+ async getApplicationCommandPermission (guildId, commandId) {
1117
+ return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
1118
+ },
1119
+ async getApplicationCommandPermissions (guildId) {
1120
+ return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
1121
+ },
1122
+ async getApplicationInfo () {
1123
+ return await rest.get(rest.routes.oauth2Application());
1124
+ },
1125
+ async getAuditLog (guildId, options) {
1126
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
1127
+ },
1128
+ async getAutomodRule (guildId, ruleId) {
1129
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
1130
+ },
1131
+ async getAutomodRules (guildId) {
1132
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
1133
+ },
1134
+ async getAvailableVoiceRegions () {
1135
+ return await rest.get(rest.routes.regions());
1136
+ },
1137
+ async getBan (guildId, userId) {
1138
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
1139
+ },
1140
+ async getBans (guildId, options) {
1141
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1142
+ },
1143
+ async getChannel (id) {
1144
+ return await rest.get(rest.routes.channels.channel(id));
1145
+ },
1146
+ async getChannelInvites (channelId) {
1147
+ return await rest.get(rest.routes.channels.invites(channelId));
1148
+ },
1149
+ async getChannels (guildId) {
1150
+ return await rest.get(rest.routes.guilds.channels(guildId));
1151
+ },
1152
+ async getChannelWebhooks (channelId) {
1153
+ return await rest.get(rest.routes.channels.webhooks(channelId));
1154
+ },
1155
+ async getDmChannel (userId) {
1156
+ return await rest.post(rest.routes.channels.dm(), {
1157
+ recipient_id: userId.toString()
1158
+ });
1159
+ },
1160
+ async getEmoji (guildId, emojiId) {
1161
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1162
+ },
1163
+ async getEmojis (guildId) {
1164
+ return await rest.get(rest.routes.guilds.emojis(guildId));
1165
+ },
1166
+ async getFollowupMessage (token, messageId) {
1167
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
1168
+ },
1169
+ async getGatewayBot () {
1170
+ return await rest.get(rest.routes.gatewayBot());
1171
+ },
1172
+ async getGlobalApplicationCommand (commandId) {
1173
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1174
+ },
1175
+ async getGlobalApplicationCommands () {
1176
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
1177
+ },
1178
+ async getGuild (guildId, options = {
1179
+ counts: true
1180
+ }) {
1181
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1182
+ },
1183
+ async getGuildApplicationCommand (commandId, guildId) {
1184
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1185
+ },
1186
+ async getGuildApplicationCommands (guildId) {
1187
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
1188
+ },
1189
+ async getGuildPreview (guildId) {
1190
+ return await rest.get(rest.routes.guilds.preview(guildId));
1191
+ },
1192
+ async getGuildTemplate (templateCode) {
1193
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1194
+ },
1195
+ async getGuildTemplates (guildId) {
1196
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1197
+ },
1198
+ async getGuildWebhooks (guildId) {
1199
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1200
+ },
1201
+ async getIntegrations (guildId) {
1202
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1203
+ },
1204
+ async getInvite (inviteCode, options) {
1205
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1206
+ },
1207
+ async getInvites (guildId) {
1208
+ return await rest.get(rest.routes.guilds.invites(guildId));
1209
+ },
1210
+ async getMessage (channelId, messageId) {
1211
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1212
+ },
1213
+ async getMessages (channelId, options) {
1214
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1215
+ },
1216
+ async getNitroStickerPacks () {
1217
+ return await rest.get(rest.routes.nitroStickerPacks());
1218
+ },
1219
+ async getOriginalInteractionResponse (token) {
1220
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token));
1221
+ },
1222
+ async getPinnedMessages (channelId) {
1223
+ return await rest.get(rest.routes.channels.pins(channelId));
1224
+ },
1225
+ async getPrivateArchivedThreads (channelId, options) {
1226
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1227
+ },
1228
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1229
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1230
+ },
1231
+ async getPruneCount (guildId, options) {
1232
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1233
+ },
1234
+ async getPublicArchivedThreads (channelId, options) {
1235
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1236
+ },
1237
+ async getRoles (guildId) {
1238
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1239
+ },
1240
+ async getScheduledEvent (guildId, eventId, options) {
1241
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1242
+ },
1243
+ async getScheduledEvents (guildId, options) {
1244
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1245
+ },
1246
+ async getScheduledEventUsers (guildId, eventId, options) {
1247
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1248
+ },
1249
+ async getSessionInfo () {
1250
+ return await rest.getGatewayBot();
1251
+ },
1252
+ async getStageInstance (channelId) {
1253
+ return await rest.get(rest.routes.channels.stage(channelId));
1254
+ },
1255
+ async getSticker (stickerId) {
1256
+ return await rest.get(rest.routes.sticker(stickerId));
1257
+ },
1258
+ async getGuildSticker (guildId, stickerId) {
1259
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1260
+ },
1261
+ async getGuildStickers (guildId) {
1262
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1263
+ },
1264
+ async getThreadMember (channelId, userId) {
1265
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1266
+ },
1267
+ async getThreadMembers (channelId) {
1268
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1269
+ },
1270
+ async getReactions (channelId, messageId, reaction, options) {
1271
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1272
+ },
1273
+ async getUser (id) {
1274
+ return await rest.get(rest.routes.user(id));
1275
+ },
1276
+ async getVanityUrl (guildId) {
1277
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1278
+ },
1279
+ async getVoiceRegions (guildId) {
1280
+ return await rest.get(rest.routes.guilds.regions(guildId));
1281
+ },
1282
+ async getWebhook (webhookId) {
1283
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1284
+ },
1285
+ async getWebhookMessage (webhookId, token, messageId, options) {
1286
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
1287
+ },
1288
+ async getWebhookWithToken (webhookId, token) {
1289
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
1290
+ },
1291
+ async getWelcomeScreen (guildId) {
1292
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1293
+ },
1294
+ async getWidget (guildId) {
1295
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1296
+ },
1297
+ async getWidgetSettings (guildId) {
1298
+ return await rest.get(rest.routes.guilds.widget(guildId));
1299
+ },
1300
+ async joinThread (channelId) {
1301
+ return await rest.put(rest.routes.channels.threads.me(channelId));
1302
+ },
1303
+ async leaveGuild (guildId) {
1304
+ return await rest.delete(rest.routes.guilds.leave(guildId));
1305
+ },
1306
+ async leaveThread (channelId) {
1307
+ return await rest.delete(rest.routes.channels.threads.me(channelId));
1308
+ },
1309
+ async publishMessage (channelId, messageId) {
1310
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1311
+ },
1312
+ async removeRole (guildId, userId, roleId, reason) {
1313
+ return await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1314
+ reason
1315
+ });
1316
+ },
1317
+ async removeThreadMember (channelId, userId) {
1318
+ return await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1319
+ },
1320
+ async sendFollowupMessage (token, options) {
1321
+ return await new Promise((resolve, reject)=>{
1322
+ rest.sendRequest({
1323
+ url: rest.routes.webhooks.webhook(rest.applicationId, token),
1324
+ method: 'POST',
1325
+ body: options,
1326
+ retryCount: 0,
1327
+ retryRequest: async function(options) {
1328
+ // TODO: should change to reprocess queue item
1329
+ await rest.sendRequest(options);
1330
+ },
1331
+ resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
1332
+ reject
1333
+ });
1334
+ });
1335
+ },
1336
+ async sendInteractionResponse (interactionId, token, options) {
1337
+ return await new Promise((resolve, reject)=>{
1338
+ rest.sendRequest({
1339
+ url: rest.routes.interactions.responses.callback(interactionId, token),
1340
+ method: 'POST',
1341
+ body: options,
1342
+ retryCount: 0,
1343
+ retryRequest: async function(options) {
1344
+ // TODO: should change to reprocess queue item
1345
+ await rest.sendRequest(options);
1346
+ },
1347
+ resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
1348
+ reject
1349
+ });
1350
+ });
1351
+ },
1352
+ async sendMessage (channelId, options) {
1353
+ return await rest.post(rest.routes.channels.messages(channelId), options);
1354
+ },
1355
+ async startThreadWithMessage (channelId, messageId, options) {
1356
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), options);
1357
+ },
1358
+ async startThreadWithoutMessage (channelId, options) {
1359
+ return await rest.post(rest.routes.channels.threads.all(channelId), options);
1360
+ },
1361
+ async syncGuildTemplate (guildId) {
1362
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1363
+ },
1364
+ async banMember (guildId, userId, options) {
1365
+ return await rest.put(rest.routes.guilds.members.ban(guildId, userId), options);
1366
+ },
1367
+ async editBotMember (guildId, options) {
1368
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), options);
1369
+ },
1370
+ async editMember (guildId, userId, options) {
1371
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), options);
1372
+ },
1373
+ async getMember (guildId, userId) {
1374
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1375
+ },
1376
+ async getMembers (guildId, options) {
1377
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1378
+ },
1379
+ async kickMember (guildId, userId, reason) {
1380
+ return await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1381
+ reason
1382
+ });
1383
+ },
1384
+ async pinMessage (channelId, messageId, reason) {
1385
+ return await rest.put(rest.routes.channels.pin(channelId, messageId), reason ? {
1386
+ reason
1387
+ } : undefined);
1388
+ },
1389
+ async pruneMembers (guildId, options) {
1390
+ return await rest.post(rest.routes.guilds.members.prune(guildId), options);
1391
+ },
1392
+ async searchMembers (guildId, query, options) {
1393
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1394
+ },
1395
+ async unbanMember (guildId, userId) {
1396
+ return await rest.delete(rest.routes.guilds.members.ban(guildId, userId));
1397
+ },
1398
+ async unpinMessage (channelId, messageId, reason) {
1399
+ return await rest.delete(rest.routes.channels.pin(channelId, messageId), reason ? {
1400
+ reason
1401
+ } : undefined);
1402
+ },
1403
+ async triggerTypingIndicator (channelId) {
1404
+ return await rest.post(rest.routes.channels.typing(channelId));
1405
+ },
1406
+ async upsertGlobalApplicationCommands (commands) {
1407
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), commands);
1408
+ },
1409
+ async upsertGuildApplicationCommands (guildId, commands) {
1410
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), commands);
1411
+ }
1412
+ };
1413
+ return rest;
1414
+ }
1415
+
1416
+ //# sourceMappingURL=manager.js.map