@discordeno/rest 19.0.0-next.1bbee2f → 19.0.0-next.1c8442e
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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -0
- package/dist/invalidBucket.d.ts +6 -7
- package/dist/invalidBucket.d.ts.map +1 -1
- package/dist/invalidBucket.js +82 -2
- package/dist/invalidBucket.js.map +1 -0
- package/dist/manager.d.ts +10 -3572
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +1139 -2
- package/dist/manager.js.map +1 -0
- package/dist/queue.d.ts +7 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +153 -2
- package/dist/queue.js.map +1 -0
- package/dist/routes.d.ts +3 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +487 -0
- package/dist/routes.js.map +1 -0
- package/dist/types.d.ts +2482 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/typings/routes.d.ts +236 -0
- package/dist/typings/routes.d.ts.map +1 -0
- package/dist/typings/routes.js +3 -0
- package/dist/typings/routes.js.map +1 -0
- package/package.json +15 -15
package/dist/manager.js
CHANGED
|
@@ -1,2 +1,1139 @@
|
|
|
1
|
-
import{InteractionResponseTypes as e}from"@discordeno/types";import{camelize as t,delay as a,getBotIdFromToken as s,urlToBase64 as i}from"@discordeno/utils";import{createInvalidRequestBucket as n}from"./invalidBucket.js";import{Queue as o}from"./queue.js";export function createRestManager(r){if(!r.token)throw Error("You must provide a valid token.");let l={token:r.token,applicationId:r.applicationId?BigInt(r.applicationId):s(r.token),version:r.version??10,baseUrl:r.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,queues:new Map,rateLimitedPaths:new Map,invalidBucket:n({}),routes:{webhooks:{id:e=>`/webhooks/${e}`,message:(e,t,a,s)=>{let i=`/webhooks/${e}/${t}/messages/${a}?`;return s&&s.threadId&&(i+=`thread_id=${s.threadId}`),i},original:(e,t,a)=>{let s=`/webhooks/${e}/${t}/messages/@original?`;return a&&a.threadId&&(s+=`thread_id=${a.threadId}`),s},webhook:(e,t,a)=>{let s=`/webhooks/${e}/${t}?`;return a&&(a?.wait!==void 0&&(s+=`wait=${a.wait.toString()}`),a.threadId&&(s+=`thread_id=${a.threadId}`)),s}},sessionInfo:()=>l.routes.gatewayBot(),channels:{dm:()=>"/users/@me/channels",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 a=`/channels/${e}/messages?`;return a},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 a=`/channels/${e}/threads/archived/public?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},private:(e,t)=>{let a=`/channels/${e}/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},joined:(e,t)=>{let a=`/channels/${e}/users/@me/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a}},typing:e=>`/channels/${e}/typing`},guilds:{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 a=`/guilds/${e}/scheduled-events?`;return void 0!==t&&(a+=`with_user_count=${t.toString()}`),a},event:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}`;return void 0!==a&&(s+=`with_user_count=${a.toString()}`),s},users:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}/users?`;return a&&(void 0!==a.limit&&(s+=`limit=${a.limit}`),void 0!==a.withMember&&(s+=`&with_member=${a.withMember.toString()}`),void 0!==a.after&&(s+=`&after=${a.after}`),void 0!==a.before&&(s+=`&before=${a.before}`)),s}},integration:(e,t)=>`/guilds/${e}/integrations/${t}`,integrations:e=>`/guilds/${e}/integrations?include_applications=true`,invite(e,t){let a=`/invites/${e}?`;return t&&(void 0!==t.withCounts&&(a+=`with_counts=${t.withCounts.toString()}`),void 0!==t.withExpiration&&(a+=`&with_expiration=${t.withExpiration.toString()}`),t.scheduledEventId&&(a+=`&guild_scheduled_event_id=${t.scheduledEventId}`)),a},invites:e=>`/guilds/${e}/invites`,members:{ban:(e,t)=>`/guilds/${e}/bans/${t}`,bot:e=>`/guilds/${e}/members/@me`,member:(e,t)=>`/guilds/${e}/members/${t}`,members:(e,t)=>{let a=`/guilds/${e}/members?`;return void 0!==t&&(t.limit&&(a+=`limit=${t.limit}`),t.after&&(a+=`&after=${t.after}`)),a},search:(e,t,a)=>{let s=`/guilds/${e}/members/search?query=${encodeURIComponent(t)}`;return a&&void 0!==a.limit&&(s+=`&limit=${a.limit}`),s},prune:(e,t)=>{let a=`/guilds/${e}/prune?`;return t&&(t.days&&(a+=`days=${t.days}`),Array.isArray(t.includeRoles)?a+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(a+=`&include_roles=${t.includeRoles}`)),a}},templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},webhooks:e=>`/guilds/${e}/webhooks`},interactions:{commands:{commands:e=>`/applications/${e}/commands`,guilds:{all:(e,t)=>`/applications/${e}/guilds/${t}/commands`,one(e,t,a,s){let i=`/applications/${e}/guilds/${t}/commands/${a}?`;return void 0!==s&&(i+=`with_localizations=${s.toString()}`),i}},permissions:(e,t)=>`/applications/${e}/guilds/${t}/commands/permissions`,permission:(e,t,a)=>`/applications/${e}/guilds/${t}/commands/${a}/permissions`,command:(e,t,a)=>{let s=`/applications/${e}/commands/${t}?`;return void 0!==a&&(s+=`withLocalizations=${a.toString()}`),s}},responses:{callback:(e,t)=>`/interactions/${e}/${t}/callback`,original:(e,t)=>`/webhooks/${e}/${t}/messages/@original`,message:(e,t,a)=>`/webhooks/${e}/${t}/messages/${a}`}},user:e=>`/users/${e}`,userBot:()=>"/users/@me",oauth2Application:()=>"oauth2/applications/@me",gatewayBot:()=>"/gateway/bot",nitroStickerPacks:()=>"/sticker-packs"},checkRateLimits(e){let t=l.rateLimitedPaths.get(e),a=l.rateLimitedPaths.get("global"),s=Date.now();return t&&s<t.resetTimestamp?t.resetTimestamp-s:!!a&&s<a.resetTimestamp&&a.resetTimestamp-s},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${l.token}`),e.headers)for(let a in e.headers)t[a.toLowerCase()]=e.headers[a];return"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&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json"),{headers:t,body:e.body?.file??JSON.stringify(e.body),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,a]of l.rateLimitedPaths.entries())a.resetTimestamp>e||(l.rateLimitedPaths.delete(t),"global"!==t||(l.globallyRateLimited=!1));0===l.rateLimitedPaths.size?l.processingRateLimitedPaths=!1:(l.processingRateLimitedPaths=!0,setTimeout(()=>{l.processRateLimitedPaths()},1e3))},processHeaders(e,t){let a=!1,s=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,c=t.get("x-ratelimit-limit");if(l.queues.get(e)?.handleCompletedRequest({remaining:s?Number(s):void 0,interval:i?1e3*Number(i):void 0,max:c?Number(c):void 0}),"0"===s&&(a=!0,l.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),u=Date.now()+1e3*Number(d);l.globallyRateLimited=!0,a=!0,setTimeout(()=>{l.globallyRateLimited=!1},u),l.rateLimitedPaths.set("global",{url:"global",resetTimestamp:u,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:"global",resetTimestamp:u,bucketId:r})}return a&&!l.processingRateLimitedPaths&&l.processRateLimitedPaths(),a?r:void 0},async sendRequest(e){let t=await fetch(e.url,l.createRequest({method:e.method,url:e.url,body:e.body,...e.options})),s=l.processHeaders(l.simplifyUrl(e.url,e.method),t.headers);if(s&&(e.bucketId=s),(t.status<200||t.status>=400)&&429===t.status){if(e.retryCount++>=l.maxRetryCount)return e.reject?.({ok:!1,status:t.status,error:"The options was rate limited and it maxed out the retries limit."});l.invalidBucket.handleCompletedRequest(t.status,"shared"===t.headers.get("X-RateLimit-Scope"));let i=t.headers.get("x-ratelimit-reset-after");return i&&await a(1e3*Number(i)),await e.retryRequest?.(e)}e.resolve(await t.json())},simplifyUrl(e,t){let a=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 a.includes("/reactions")&&(a=a.substring(0,a.indexOf("/reactions")+10)),"DELETE"===t&&a.endsWith("/messages/x")&&(a=t+a),a},processRequest(e){let t=e.url.substring(e.url.indexOf("api/")),a=t.split("/");a.shift(),a[0]?.startsWith("v")&&a.shift(),e.url=`${l.baseUrl}/v${l.version}/${a.join("/")}`;let s=l.simplifyUrl(e.url,e.method),i=l.queues.get(s);if(void 0!==i)i.makeRequest(e);else{let n=new o(l,{url:s});n.makeRequest(e),l.queues.set(s,n)}},makeRequest:async(e,t,a,s)=>await new Promise((i,n)=>{l.processRequest({url:t,method:e,body:a,retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:i,reject:n,options:s})}),get:async e=>t(await l.makeRequest("GET",e)),post:async(e,a)=>t(await l.makeRequest("POST",e,a)),delete:async(e,a)=>t(await l.makeRequest("DELETE",e,a)),patch:async(e,a)=>t(await l.makeRequest("PATCH",e,a)),put:async(e,a,s)=>t(await l.makeRequest("PUT",e,a,s)),channels:{messages:{delete:async(e,t,a)=>await l.deleteMessage(e,t,a),edit:async(e,t,a)=>await l.editMessage(e,t,a),send:async(e,t)=>await l.sendMessage(e,t),publish:async(e,t)=>await l.publishMessage(e,t)},get:async e=>await l.getChannel(e),create:async(e,t)=>await l.createChannel(e,t),delete:async(e,t)=>await l.deleteChannel(e,t),edit:async(e,t)=>await l.editChannel(e,t),follow:async(e,t)=>await l.followAnnouncement(e,t),forums:{post:async(e,t)=>await l.createForumThread(e,t)},permissions:{edit:async(e,t)=>await l.editChannelPermissionOverrides(e,t),delete:async(e,t)=>await l.deleteChannelPermissionOverride(e,t)},positions:async(e,t)=>await l.editChannelPositions(e,t),invites:async e=>await l.getChannelInvites(e),stages:{create:async e=>await l.createStageInstance(e),delete:async(e,t)=>await l.deleteStageInstance(e,t),edit:async(e,t)=>await l.editStageInstance(e,t),get:async e=>await l.getStageInstance(e)},threads:{create:{with:{message:async(e,t,a)=>await l.startThreadWithMessage(e,t,a)},without:{message:async(e,t)=>await l.startThreadWithoutMessage(e,t)}},get:{active:async e=>await l.getActiveThreads(e),archived:{private:async(e,t)=>await l.getPrivateArchivedThreads(e,t),joined:async(e,t)=>await l.getPrivateJoinedArchivedThreads(e,t),public:async(e,t)=>await l.getPublicArchivedThreads(e,t)},member:async(e,t)=>await l.getThreadMember(e,t),members:async e=>await l.getThreadMembers(e)},join:async e=>await l.joinThread(e),leave:async e=>await l.leaveThread(e),kick:async(e,t)=>await l.removeThreadMember(e,t)},typing:async e=>await l.triggerTypingIndicator(e)},emojis:{create:async(e,t)=>await l.createEmoji(e,t),delete:async(e,t,a)=>await l.deleteEmoji(e,t,a),edit:async(e,t,a)=>await l.editEmoji(e,t,a),get:async(e,t)=>await l.getEmoji(e,t)},guilds:{automod:{create:async(e,t)=>await l.createAutomodRule(e,t),delete:async(e,t)=>await l.deleteAutomodRule(e,t),edit:async(e,t,a)=>await l.editAutomodRule(e,t,a),get:{rule:async(e,t)=>await l.getAutomodRule(e,t),rules:async e=>await l.getAutomodRules(e)}},channels:async e=>await l.getChannels(e),emojis:async e=>await l.getEmojis(e),events:{create:async(e,t)=>await l.createScheduledEvent(e,t),delete:async(e,t)=>await l.deleteScheduledEvent(e,t),edit:async(e,t,a)=>await l.editScheduledEvent(e,t,a),get:{event:async(e,t,a)=>await l.getScheduledEvent(e,t,a),events:async(e,t)=>await l.getScheduledEvents(e,t),users:async(e,t,a)=>await l.getScheduledEventUsers(e,t,a)}},integrations:{get:async e=>await l.getIntegrations(e),delete:async(e,t)=>await l.deleteIntegration(e,t)},invites:{create:async(e,t)=>await l.createInvite(e,t),delete:async(e,t)=>await l.deleteInvite(e,t),get:async(e,t)=>await l.getInvite(e,t),list:async e=>await l.getInvites(e)},templates:{create:async(e,t)=>await l.createGuildTemplate(e,t),delete:async(e,t)=>await l.deleteGuildTemplate(e,t),edit:async(e,t,a)=>await l.editGuildTemplate(e,t,a),get:async e=>await l.getGuildTemplate(e),list:async e=>await l.getGuildTemplates(e),sync:async e=>await l.syncGuildTemplate(e)},members:{ban:async(e,t,a)=>await l.banMember(e,t,a),edit:async(e,t,a)=>await l.editMember(e,t,a),editSelf:async(e,t)=>await l.editBotMember(e,t),get:async(e,t)=>await l.getMember(e,t),dm:async e=>await l.getDmChannel(e),kick:async(e,t,a)=>await l.kickMember(e,t,a),list:async(e,t)=>await l.getMembers(e,t),prune:async(e,t)=>await l.pruneMembers(e,t),search:async(e,t,a)=>await l.searchMembers(e,t,a),unban:async(e,t)=>await l.unbanMember(e,t)},interactions:{commands:{create:{global:async e=>await l.createGlobalApplicationCommand(e),guild:async(e,t)=>await l.createGuildApplicationCommand(e,t)},delete:{global:async e=>await l.deleteGlobalApplicationCommand(e),guild:async(e,t)=>await l.deleteGuildApplicationCommand(e,t)},edit:{global:async(e,t)=>await l.editGlobalApplicationCommand(e,t),guild:async(e,t,a)=>await l.editGuildApplicationCommand(e,t,a),permissions:async(e,t,a,s)=>await l.editApplicationCommandPermissions(e,t,a,s)},get:{global:{all:async()=>await l.getGlobalApplicationCommands(),one:async e=>await l.getGlobalApplicationCommand(e)},guilds:{all:async e=>await l.getGuildApplicationCommands(e),one:async(e,t)=>await l.getGuildApplicationCommand(e,t)},permission:async(e,t)=>await l.getApplicationCommandPermission(e,t),permissions:async e=>await l.getApplicationCommandPermissions(e)},replace:{global:async e=>await l.upsertGlobalApplicationCommands(e),guild:async(e,t)=>await l.upsertGuildApplicationCommands(e,t)}},responses:{create:{followup:async(e,t)=>await l.sendFollowupMessage(e,t),original:async(e,t,a)=>await l.sendInteractionResponse(e,t,a)},delete:{followup:async(e,t)=>await l.deleteFollowupMessage(e,t),original:async e=>await l.deleteOriginalInteractionResponse(e)},edit:{followup:async(e,t,a)=>await l.editFollowupMessage(e,t,a),original:async(e,t)=>await l.editOriginalInteractionResponse(e,t)},get:{followup:async(e,t)=>await l.getFollowupMessage(e,t),original:async e=>await l.getOriginalInteractionResponse(e)}}}},users:{channel:async e=>await l.getDmChannel(e)},webhooks:{create:async(e,t)=>await l.createWebhook(e,t),delete:{with:{id:async(e,t)=>await l.deleteWebhook(e,t),token:async(e,t)=>await l.deleteWebhookWithToken(e,t)}},edit:{with:{id:async(e,t)=>await l.editWebhook(e,t),token:async(e,t,a)=>await l.editWebhookWithToken(e,t,a)}},execute:async(e,t,a)=>await l.executeWebhook(e,t,a),get:{channel:async e=>await l.getChannelWebhooks(e),guild:async e=>await l.getGuildWebhooks(e),message:async(e,t,a,s)=>await l.getWebhookMessage(e,t,a,s),with:{id:async e=>await l.getWebhook(e),token:async(e,t)=>await l.getWebhookWithToken(e,t)}},messages:{delete:async(e,t,a,s)=>await l.deleteWebhookMessage(e,t,a,s),edit:Object.assign(async(e,t,a,s)=>await l.editWebhookMessage(e,t,a,s),{original:async(e,t,a)=>await l.editOriginalWebhookMessage(e,t,a)})}},addThreadMember:async(e,t)=>await l.put(l.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await l.post(l.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await l.post(l.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await l.post(l.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await l.post(l.routes.interactions.commands.commands(l.applicationId),e),createGuildApplicationCommand:async(e,t)=>await l.post(l.routes.interactions.commands.guilds.all(l.applicationId,t),e),createGuildTemplate:async(e,t)=>await l.post(l.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await l.post(l.routes.channels.forum(e),t),createInvite:async(e,t={})=>await l.post(l.routes.channels.invites(e),t),createScheduledEvent:async(e,t)=>await l.post(l.routes.guilds.events.events(e),t),createStageInstance:async e=>await l.post(l.routes.channels.stages(),e),createWebhook:async(e,t)=>await l.post(l.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await i(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,a)=>await l.delete(l.routes.guilds.automod.rule(e,t),{reason:a}),deleteChannel:async(e,t)=>await l.delete(l.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,a)=>await l.delete(l.routes.channels.overwrite(e,t),a?{reason:a}:void 0),deleteEmoji:async(e,t,a)=>await l.delete(l.routes.guilds.emoji(e,t),{reason:a}),deleteFollowupMessage:async(e,t)=>await l.delete(l.routes.interactions.responses.message(l.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await l.delete(l.routes.interactions.commands.command(l.applicationId,e)),deleteGuildApplicationCommand:async(e,t)=>await l.delete(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),deleteGuildTemplate:async(e,t)=>await l.delete(l.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await l.delete(l.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await l.delete(l.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,a)=>await l.delete(l.routes.channels.message(e,t),{reason:a}),deleteOriginalInteractionResponse:async e=>await l.delete(l.routes.interactions.responses.original(l.applicationId,e)),deleteScheduledEvent:async(e,t)=>await l.delete(l.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await l.delete(l.routes.channels.stage(e),t?{reason:t}:void 0),deleteWebhook:async(e,t)=>await l.delete(l.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,a,s)=>await l.delete(l.routes.webhooks.message(e,t,a,s)),deleteWebhookWithToken:async(e,t)=>await l.delete(l.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,a,s)=>await l.put(l.routes.interactions.commands.permission(l.applicationId,e,t),{permissions:s},{headers:{authorization:`Bearer ${a}`}}),editAutomodRule:async(e,t,a)=>await l.patch(l.routes.guilds.automod.rule(e,t),a),async editBotProfile(e){let t=e?.botAvatarURL?await i(e?.botAvatarURL):e?.botAvatarURL;return await l.patch(l.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await l.patch(l.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await l.put(l.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await l.patch(l.routes.guilds.channels(e),t),editEmoji:async(e,t,a)=>await l.patch(l.routes.guilds.emoji(e,t),a),editFollowupMessage:async(e,t,a)=>await l.patch(l.routes.interactions.responses.message(l.applicationId,e,t),a),editGlobalApplicationCommand:async(e,t)=>await l.patch(l.routes.interactions.commands.command(l.applicationId,e),t),editGuildApplicationCommand:async(e,t,a)=>await l.patch(l.routes.interactions.commands.guilds.one(l.applicationId,t,e),a),editGuildTemplate:async(e,t,a)=>await l.patch(l.routes.guilds.templates.guild(e,t),a),editMessage:async(e,t,a)=>await l.patch(l.routes.channels.message(e,t),a),editOriginalInteractionResponse:async(e,t)=>await l.patch(l.routes.interactions.responses.original(l.applicationId,e),t),editOriginalWebhookMessage:async(t,a,s)=>await l.patch(l.routes.webhooks.original(t,a,s),{type:e.UpdateMessage,data:s}),editScheduledEvent:async(e,t,a)=>await l.patch(l.routes.guilds.events.event(e,t),a),editStageInstance:async(e,t)=>await l.patch(l.routes.channels.stage(e),{topic:t.topic}),editWebhook:async(e,t)=>await l.patch(l.routes.webhooks.id(e),t),editWebhookMessage:async(t,a,s,i)=>await l.patch(l.routes.webhooks.message(t,a,s,i),{type:e.UpdateMessage,data:i}),editWebhookWithToken:async(e,t,a)=>await l.patch(l.routes.webhooks.webhook(e,t),a),executeWebhook:async(e,t,a)=>await l.post(l.routes.webhooks.webhook(e,t,a),a),followAnnouncement:async(e,t)=>await l.post(l.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await l.get(l.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await l.get(l.routes.interactions.commands.permission(l.applicationId,e,t)),getApplicationCommandPermissions:async e=>await l.get(l.routes.interactions.commands.permissions(l.applicationId,e)),getApplicationInfo:async()=>await l.get(l.routes.oauth2Application()),getAutomodRule:async(e,t)=>await l.get(l.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await l.get(l.routes.guilds.automod.rules(e)),getChannel:async e=>await l.get(l.routes.channels.channel(e)),getChannelInvites:async e=>await l.get(l.routes.channels.invites(e)),getChannels:async e=>await l.get(l.routes.guilds.channels(e)),getChannelWebhooks:async e=>await l.get(l.routes.channels.webhooks(e)),getDmChannel:async e=>await l.post(l.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await l.get(l.routes.guilds.emoji(e,t)),getEmojis:async e=>await l.get(l.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await l.get(l.routes.interactions.responses.message(l.applicationId,e,t)),getGatewayBot:async()=>await l.get(l.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await l.get(l.routes.interactions.commands.command(l.applicationId,e)),getGlobalApplicationCommands:async()=>await l.get(l.routes.interactions.commands.commands(l.applicationId)),getGuildApplicationCommand:async(e,t)=>await l.get(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),getGuildApplicationCommands:async e=>await l.get(l.routes.interactions.commands.guilds.all(l.applicationId,e)),getGuildTemplate:async e=>await l.get(l.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await l.get(l.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await l.get(l.routes.guilds.webhooks(e)),getIntegrations:async e=>await l.get(l.routes.guilds.integrations(e)),getInvite:async(e,t)=>await l.get(l.routes.guilds.invite(e,t)),getInvites:async e=>await l.get(l.routes.guilds.invites(e)),getNitroStickerPacks:async()=>await l.get(l.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await l.get(l.routes.interactions.responses.original(l.applicationId,e)),getPrivateArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.joined(e,t)),getPublicArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.public(e,t)),getScheduledEvent:async(e,t,a)=>await l.get(l.routes.guilds.events.event(e,t,a?.withUserCount)),getScheduledEvents:async(e,t)=>await l.get(l.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,a)=>await l.get(l.routes.guilds.events.users(e,t,a)),getSessionInfo:async()=>await l.getGatewayBot(),getStageInstance:async e=>await l.get(l.routes.channels.stage(e)),getThreadMember:async(e,t)=>await l.get(l.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await l.get(l.routes.channels.threads.members(e)),getUser:async e=>await l.get(l.routes.user(e)),getWebhook:async e=>await l.get(l.routes.webhooks.id(e)),getWebhookMessage:async(e,t,a,s)=>await l.get(l.routes.webhooks.message(e,t,a,s)),getWebhookWithToken:async(e,t)=>await l.get(l.routes.webhooks.webhook(e,t)),joinThread:async e=>await l.put(l.routes.channels.threads.me(e)),leaveThread:async e=>await l.delete(l.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await l.post(l.routes.channels.crosspost(e,t)),removeThreadMember:async(e,t)=>await l.delete(l.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((a,s)=>{l.sendRequest({url:l.routes.webhooks.webhook(l.applicationId,e),method:"POST",body:l.createRequest({method:"POST",body:{...t},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:a,reject:s})}),sendInteractionResponse:async(e,t,a)=>await new Promise((s,i)=>{l.sendRequest({url:l.routes.interactions.responses.callback(e,t),method:"POST",body:l.createRequest({method:"POST",body:{...a},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:s,reject:i})}),sendMessage:async(e,t)=>await l.post(l.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,a)=>await l.post(l.routes.channels.threads.message(e,t),a),startThreadWithoutMessage:async(e,t)=>await l.post(l.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await l.put(l.routes.guilds.templates.all(e)),banMember:async(e,t,a)=>await l.put(l.routes.guilds.members.ban(e,t),a),editBotMember:async(e,t)=>await l.patch(l.routes.guilds.members.bot(e),t),editMember:async(e,t,a)=>await l.patch(l.routes.guilds.members.member(e,t),a),getMember:async(e,t)=>await l.get(l.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await l.get(l.routes.guilds.members.members(e,t)),kickMember:async(e,t,a)=>await l.delete(l.routes.guilds.members.member(e,t),{reason:a}),pruneMembers:async(e,t)=>await l.post(l.routes.guilds.members.prune(e),t),searchMembers:async(e,t,a)=>await l.get(l.routes.guilds.members.search(e,t,a)),unbanMember:async(e,t)=>await l.delete(l.routes.guilds.members.ban(e,t)),triggerTypingIndicator:async e=>await l.post(l.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await l.put(l.routes.interactions.commands.commands(l.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await l.put(l.routes.interactions.commands.guilds.all(l.applicationId,e),t)};return l}
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FtZWxpemUsIGRlbGF5LCBnZXRCb3RJZEZyb21Ub2tlbiwgdXJsVG9CYXNlNjQgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMsXG4gIEJpZ1N0cmluZyxcbiAgQ2FtZWxpemUsXG4gIENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgQ3JlYXRlQXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucyxcbiAgQ3JlYXRlQ2hhbm5lbEludml0ZSxcbiAgQ3JlYXRlRm9ydW1Qb3N0V2l0aE1lc3NhZ2UsXG4gIENyZWF0ZUd1aWxkQ2hhbm5lbCxcbiAgQ3JlYXRlR3VpbGRFbW9qaSxcbiAgQ3JlYXRlTWVzc2FnZU9wdGlvbnMsXG4gIENyZWF0ZVNjaGVkdWxlZEV2ZW50LFxuICBDcmVhdGVTdGFnZUluc3RhbmNlLFxuICBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMsXG4gIERpc2NvcmRBY3RpdmVUaHJlYWRzLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEFyY2hpdmVkVGhyZWFkcyxcbiAgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZSxcbiAgRGlzY29yZENoYW5uZWwsXG4gIERpc2NvcmRDcmVhdGVXZWJob29rLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRGb2xsb3dBbm5vdW5jZW1lbnRDaGFubmVsLFxuICBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRNZW1iZXIsXG4gIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgRGlzY29yZE1lc3NhZ2UsXG4gIERpc2NvcmRTY2hlZHVsZWRFdmVudCxcbiAgRGlzY29yZFN0YWdlSW5zdGFuY2UsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFdlYmhvb2ssXG4gIEVkaXRBdXRvTW9kZXJhdGlvblJ1bGVPcHRpb25zLFxuICBFZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXNPcHRpb25zLFxuICBFZGl0TWVzc2FnZSxcbiAgRWRpdFNjaGVkdWxlZEV2ZW50LFxuICBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMsXG4gIEV4ZWN1dGVXZWJob29rLFxuICBHZXRHdWlsZFBydW5lQ291bnRRdWVyeSxcbiAgR2V0SW52aXRlLFxuICBHZXRNZXNzYWdlc09wdGlvbnMsXG4gIEdldFNjaGVkdWxlZEV2ZW50cyxcbiAgR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSxcbiAgSW50ZXJhY3Rpb25SZXNwb25zZSxcbiAgTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgTGlzdEd1aWxkTWVtYmVycyxcbiAgTW9kaWZ5Q2hhbm5lbCxcbiAgTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zLFxuICBNb2RpZnlHdWlsZEVtb2ppLFxuICBNb2RpZnlXZWJob29rLFxuICBTZWFyY2hNZW1iZXJzLFxuICBTdGFydFRocmVhZFdpdGhNZXNzYWdlLFxuICBTdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlLFxuICBXaXRoUmVhc29uLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB0eXBlIHsgSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAtYWxwaGEuMSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyk6IFJlc3RNYW5hZ2VyIHtcbiAgLy8gRmFsc3kgdG9rZW4gc3RyaW5nIGNoZWNrXG4gIGlmICghb3B0aW9ucy50b2tlbikgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgdG9rZW4uJylcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICBhcHBsaWNhdGlvbklkOiBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAxMCxcbiAgICBiYXNlVXJsOiBvcHRpb25zLmJhc2VVcmwgPz8gJ2h0dHBzOi8vZGlzY29yZC5jb20vYXBpJyxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIGludmFsaWRCdWNrZXQ6IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0KHt9KSxcblxuICAgIHJvdXRlczoge1xuICAgICAgd2ViaG9va3M6IHtcbiAgICAgICAgaWQ6ICh3ZWJob29rSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke3dlYmhvb2tJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0vbWVzc2FnZXMvJHttZXNzYWdlSWR9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIG9yaWdpbmFsOiAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWw/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9vazogKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy53YWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgd2FpdD0ke29wdGlvbnMud2FpdC50b1N0cmluZygpfWBcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIE1pc2NlbGxhbmVvdXMgRW5kcG9pbnRzXG4gICAgICBzZXNzaW9uSW5mbzogKCkgPT4gcmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpLFxuXG4gICAgICAvLyBDaGFubmVsIEVuZHBvaW50c1xuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgZG06ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gJy91c2Vycy9AbWUvY2hhbm5lbHMnXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2tzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3dlYmhvb2tzYFxuICAgICAgICB9LFxuXG4gICAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9sbG93OiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L2ZvbGxvd2Vyc2BcbiAgICAgICAgfSxcblxuICAgICAgICBmb3J1bTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzP2hhc19tZXNzYWdlPXRydWVgXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW52aXRlczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVzc2FnZXM6IChjaGFubmVsSWQsIG9wdGlvbnM/OiBHZXRNZXNzYWdlc09wdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcz9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gaWYgKGlzR2V0TWVzc2FnZXNBZnRlcihvcHRpb25zKSAmJiBvcHRpb25zLmFmdGVyKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQmVmb3JlKG9wdGlvbnMpICYmIG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQXJvdW5kKG9wdGlvbnMpICYmIG9wdGlvbnMuYXJvdW5kKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgJmFyb3VuZD0ke29wdGlvbnMuYXJvdW5kfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzTGltaXQob3B0aW9ucykgJiYgb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcblxuICAgICAgICBvdmVyd3JpdGU6IChjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3Blcm1pc3Npb25zLyR7b3ZlcndyaXRlSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIGNyb3NzcG9zdDogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9jcm9zc3Bvc3RgXG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RhZ2VzOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvc3RhZ2UtaW5zdGFuY2VzJ1xuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvc3RhZ2UtaW5zdGFuY2VzLyR7Y2hhbm5lbElkfWBcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBUaHJlYWQgRW5kcG9pbnRzXG4gICAgICAgIHRocmVhZHM6IHtcbiAgICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vdGhyZWFkc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbDogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhY3RpdmU6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90aHJlYWRzL2FjdGl2ZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcnM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWQtbWVtYmVyc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnMvQG1lYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlcjogKGNoYW5uZWxJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnMvJHt1c2VySWR9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXJjaGl2ZWQ6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzL2FyY2hpdmVkYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHVibGljOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZC9wdWJsaWM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcml2YXRlOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZC9wcml2YXRlP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgam9pbmVkOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdXNlcnMvQG1lL3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIHR5cGluZzogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90eXBpbmdgXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBHdWlsZCBFbmRwb2ludHNcbiAgICAgIGd1aWxkczoge1xuICAgICAgICBhdXRvbW9kOiB7XG4gICAgICAgICAgcnVsZTogKGd1aWxkSWQsIHJ1bGVJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXV0by1tb2RlcmF0aW9uL3J1bGVzLyR7cnVsZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1bGVzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXV0by1tb2RlcmF0aW9uL3J1bGVzYFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5uZWxzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzYFxuICAgICAgICB9LFxuICAgICAgICBlbW9qaTogKGd1aWxkSWQsIGVtb2ppSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXMvJHtlbW9qaUlkfWBcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamlzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2Vtb2ppc2BcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgZXZlbnRzOiAoZ3VpbGRJZCwgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHM/YFxuXG4gICAgICAgICAgICBpZiAod2l0aFVzZXJDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aF91c2VyX2NvdW50PSR7d2l0aFVzZXJDb3VudC50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50OiAoZ3VpbGRJZCwgZXZlbnRJZCwgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHMvJHtldmVudElkfWBcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXJzOiAoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50VXNlcnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHMvJHtldmVudElkfS91c2Vycz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoTWVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmd2l0aF9tZW1iZXI9JHtvcHRpb25zLndpdGhNZW1iZXIudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlciAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zLyR7aW50ZWdyYXRpb25JZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0aW9uczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9pbnRlZ3JhdGlvbnM/aW5jbHVkZV9hcHBsaWNhdGlvbnM9dHJ1ZWBcbiAgICAgICAgfSxcbiAgICAgICAgaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9pbnZpdGVzLyR7aW52aXRlQ29kZX0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLndpdGhDb3VudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aF9jb3VudHM9JHtvcHRpb25zLndpdGhDb3VudHMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoRXhwaXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmd2l0aF9leHBpcmF0aW9uPSR7b3B0aW9ucy53aXRoRXhwaXJhdGlvbi50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNjaGVkdWxlZEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYCZndWlsZF9zY2hlZHVsZWRfZXZlbnRfaWQ9JHtvcHRpb25zLnNjaGVkdWxlZEV2ZW50SWR9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgaW52aXRlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgYmFuOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvdDogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvQG1lYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtYmVyOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcnM6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYGxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgJmFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlYXJjaDogKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL3NlYXJjaD9xdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcnVuZTogKGd1aWxkSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3BydW5lP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kYXlzKSB1cmwgKz0gYGRheXM9JHtvcHRpb25zLmRheXN9YFxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGVSb2xlcykpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmaW5jbHVkZV9yb2xlcz0ke29wdGlvbnMuaW5jbHVkZVJvbGVzLmpvaW4oJywnKX1gXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUm9sZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmaW5jbHVkZV9yb2xlcz0ke29wdGlvbnMuaW5jbHVkZVJvbGVzfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgY29kZTogKGNvZGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy90ZW1wbGF0ZXMvJHtjb2RlfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGd1aWxkOiAoZ3VpbGRJZCwgY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGVtcGxhdGVzLyR7Y29kZX1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90ZW1wbGF0ZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9va3M6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vd2ViaG9va3NgXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcmFjdGlvbiBFbmRwb2ludHNcbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vY29tbWFuZHNgXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGd1aWxkczoge1xuICAgICAgICAgICAgYWxsKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmUoYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkLCB3aXRoTG9jYWxpemF0aW9ucykge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX2xvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzL3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbjogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9L3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfT9gXG5cbiAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aExvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICAgICAgY2FsbGJhY2s6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvaW50ZXJhY3Rpb25zLyR7aW50ZXJhY3Rpb25JZH0vJHt0b2tlbn0vY2FsbGJhY2tgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQsIHRva2VuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2FwcGxpY2F0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gVXNlciBlbmRwb2ludHNcbiAgICAgIHVzZXIodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBgL3VzZXJzLyR7dXNlcklkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVzZXJCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL3VzZXJzL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIG9hdXRoMkFwcGxpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ29hdXRoMi9hcHBsaWNhdGlvbnMvQG1lJ1xuICAgICAgfSxcblxuICAgICAgZ2F0ZXdheUJvdCgpIHtcbiAgICAgICAgcmV0dXJuICcvZ2F0ZXdheS9ib3QnXG4gICAgICB9LFxuXG4gICAgICBuaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgICAgcmV0dXJuICcvc3RpY2tlci1wYWNrcydcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCh1cmwpXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7dmVyc2lvbn0pYCxcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnVuYXV0aG9yaXplZCkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25zLmhlYWRlcnNba2V5XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdFVCBNRVRIT0RTIFNIT1VMRCBOT1QgSEFWRSBBIEJPRFlcbiAgICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucy5ib2R5Py5yZWFzb24pIHtcbiAgICAgICAgaGVhZGVyc1snWC1BdWRpdC1Mb2ctUmVhc29uJ10gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5ib2R5LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICAgIG9wdGlvbnMuYm9keS5yZWFzb24gPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuYm9keSAmJiAhWydHRVQnLCAnREVMRVRFJ10uaW5jbHVkZXMob3B0aW9ucy5tZXRob2QpKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IChvcHRpb25zLmJvZHk/LmZpbGUgPz8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSkgYXMgRm9ybURhdGEgfCBzdHJpbmcsXG4gICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgZm9yIG9mIGxvb3AuICR7XG4gICAgICAgIC8vICAgdmFsdWUucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgICAgLy8gfWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIGhhcyBub3QgcmVhY2hlZCBjYW5jZWxcbiAgICAgICAgaWYgKHZhbHVlLnJlc2V0VGltZXN0YW1wID4gbm93KSBjb250aW51ZVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXQgaXMgb3ZlciwgZGVsZXRlIHRoZSByYXRlIGxpbWl0ZXJcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmRlbGV0ZShrZXkpXG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBBTEwgUEFUSFMgQVJFIENMRUFSRUQgQ0FOIENBTkNFTCBPVVQhXG4gICAgICBpZiAocmVzdC5yYXRlTGltaXRlZFBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gdHJ1ZVxuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgICB9LCAxMDAwKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gICAgcHJvY2Vzc0hlYWRlcnModXJsLCBoZWFkZXJzKSB7XG4gICAgICBsZXQgcmF0ZUxpbWl0ZWQgPSBmYWxzZVxuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJylcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQtYWZ0ZXInKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWdsb2JhbCcpXG4gICAgICAvLyB1bmRlZmluZWQgb3ZlcnJpZGUgbnVsbCBuZWVkZWQgZm9yIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWJ1Y2tldCcpID8/IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtbGltaXQnKVxuXG4gICAgICByZXN0LnF1ZXVlcy5nZXQodXJsKT8uaGFuZGxlQ29tcGxldGVkUmVxdWVzdCh7XG4gICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nID8gTnVtYmVyKHJlbWFpbmluZykgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVydmFsOiByZXRyeUFmdGVyID8gTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4OiBsaW1pdCA/IE51bWJlcihsaW1pdCkgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgUkFURSBMSU1JVCwgTUFSSyBJVCBBUyBSQVRFIExJTUlURURcbiAgICAgIGlmIChyZW1haW5pbmcgPT09ICcwJykge1xuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KHVybCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgQlVDS0VUIEFTIExJTUlURUQgU0lOQ0UgRElGRkVSRU5UIFVSTFMgTUFZIFNIQVJFIEEgQlVDS0VUXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYnVja2V0SWQsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIEdMT0JBTCBMSU1JVCwgTUFSSyBJVCBSQVRFIExJTUlURUQgR0xPQkFMTFlcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpXG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgPSBHbG9iYWxseSBSYXRlIExpbWl0ZWRdIFVSTDogJHt1cmx9IHwgR2xvYmFsIFJlc3Q6ICR7Z2xvYmFsUmVzZXR9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gdHJ1ZVxuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgICB9LCBnbG9iYWxSZXNldClcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChidWNrZXRJZCwge1xuICAgICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhdGVMaW1pdGVkICYmICFyZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3NlbmRpbmcgcmVxdWVzdCcsIG9wdGlvbnMudXJsLCByZXN0LmNyZWF0ZVJlcXVlc3QoeyBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLCB1cmw6IG9wdGlvbnMudXJsLCBib2R5OiBvcHRpb25zLmJvZHkgfSkpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBvcHRpb25zLnVybCxcbiAgICAgICAgcmVzdC5jcmVhdGVSZXF1ZXN0KHsgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCwgdXJsOiBvcHRpb25zLnVybCwgYm9keTogb3B0aW9ucy5ib2R5LCAuLi5vcHRpb25zLm9wdGlvbnMgfSksXG4gICAgICApXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMudXJsLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgLy8gSWYgTk9UIHJhdGUgbGltaXRlZCByZW1vdmUgZnJvbSBxdWV1ZVxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCsrID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gcXVldWUgdG8gcHJldmVudCByZXRyeVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVqZWN0Py4oe1xuICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICBlcnJvcjogJ1RoZSBvcHRpb25zIHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSYXRlIGxpbWl0ZWQsIGFkZCBiYWNrIHRvIHF1ZXVlXG4gICAgICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtU2NvcGUnKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgICAgICBjb25zdCByZXNldEFmdGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJylcbiAgICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcblxuICAgICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5yZXNvbHZlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSlcbiAgICB9LFxuXG4gICAgLy8gQ3JlZGl0czogZ2l0aHViLmNvbS9hYmFsYWJhaGFoYS9lcmlzIGxpYi9yZXN0L1JlcXVlc3RIYW5kbGVyLmpzI0wzOTdcbiAgICAvLyBNb2RpZmllZCBmb3Igb3VyIHVzZS1jYXNlXG4gICAgc2ltcGxpZnlVcmwodXJsLCBtZXRob2QpIHtcbiAgICAgIGxldCByb3V0ZSA9IHVybFxuICAgICAgICAucmVwbGFjZSgvXFwvKFthLXotXSspXFwvKD86WzAtOV17MTcsMTl9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHA6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBbJ2NoYW5uZWxzJywgJ2d1aWxkcyddLmluY2x1ZGVzKHApID8gbWF0Y2ggOiBgLyR7cH0veGBcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoL1xcL3JlYWN0aW9uc1xcL1teL10rL2csICcvcmVhY3Rpb25zL3gnKVxuXG4gICAgICAvLyBHRU5FUkFMIC9yZWFjdGlvbnMgYW5kIC9yZWFjdGlvbnMvZW1vamkvQG1lIHNoYXJlIHRoZSBidWNrZXRzXG4gICAgICBpZiAocm91dGUuaW5jbHVkZXMoJy9yZWFjdGlvbnMnKSkge1xuICAgICAgICByb3V0ZSA9IHJvdXRlLnN1YnN0cmluZygwLCByb3V0ZS5pbmRleE9mKCcvcmVhY3Rpb25zJykgKyAnL3JlYWN0aW9ucycubGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgTWVzc2FnZSBlbmRwb2ludCBoYXMgaXRzIG93biByYXRlIGxpbWl0XG4gICAgICBpZiAobWV0aG9kID09PSAnREVMRVRFJyAmJiByb3V0ZS5lbmRzV2l0aCgnL21lc3NhZ2VzL3gnKSkge1xuICAgICAgICByb3V0ZSA9IG1ldGhvZCArIHJvdXRlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJvdXRlID0gcmVxdWVzdC51cmwuc3Vic3RyaW5nKHJlcXVlc3QudXJsLmluZGV4T2YoJ2FwaS8nKSlcbiAgICAgIGNvbnN0IHBhcnRzID0gcm91dGUuc3BsaXQoJy8nKVxuICAgICAgLy8gUmVtb3ZlIHRoZSBhcGkvXG4gICAgICBwYXJ0cy5zaGlmdCgpXG4gICAgICAvLyBSZW1vdmVzIHRoZSAvdiMvXG4gICAgICBpZiAocGFydHNbMF0/LnN0YXJ0c1dpdGgoJ3YnKSkgcGFydHMuc2hpZnQoKVxuICAgICAgLy8gU2V0IHRoZSBmdWxsIHVybCB0byBkaXNjb3JkIGFwaSBpbiBjYXNlIGl0IHdhcyByZWNpZXZlZCBpbiBhIHByb3h5IHJlc3RcbiAgICAgIHJlcXVlc3QudXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259LyR7cGFydHMuam9pbignLycpfWBcblxuICAgICAgY29uc3QgdXJsID0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnVybCwgcmVxdWVzdC5tZXRob2QpXG4gICAgICBjb25zdCBxdWV1ZSA9IHJlc3QucXVldWVzLmdldCh1cmwpXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsIH0pXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KHVybCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnByb2Nlc3NSZXF1ZXN0KHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgYm9keSkpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGJvZHkpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHksIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBjaGFubmVsczoge1xuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgYXN5bmMgZGVsZXRlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24/KSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kTWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcHVibGlzaChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWwoaWQpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVDaGFubmVsKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVDaGFubmVsKGlkLCByZWFzb24pXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBlZGl0KGlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsKGlkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZm9sbG93KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZClcbiAgICAgIH0sXG5cbiAgICAgIGZvcnVtczoge1xuICAgICAgICBhc3luYyBwb3N0KGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGFzeW5jIGVkaXQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoY2hhbm5lbElkLCBpZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBpZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBpbnZpdGVzKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWxJbnZpdGVzKGlkKVxuICAgICAgfSxcblxuICAgICAgc3RhZ2VzOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlU3RhZ2VJbnN0YW5jZShvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChjaGFubmVsSWQsIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIGRhdGEpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0KGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgdGhyZWFkczoge1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2l0aG91dDoge1xuICAgICAgICAgICAgYXN5bmMgbWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgYXN5bmMgYWN0aXZlKGd1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXJjaGl2ZWQ6IHtcbiAgICAgICAgICAgIGFzeW5jIHByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIG1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBtZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBqb2luKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmpvaW5UaHJlYWQoY2hhbm5lbElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxlYXZlKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmxlYXZlVGhyZWFkKGNoYW5uZWxJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBraWNrKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgdHlwaW5nKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LnRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoaWQpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBlbW9qaXM6IHtcbiAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0RW1vamkoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBnZXQoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgZ3VpbGRzOiB7XG4gICAgICBhdXRvbW9kOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGV2ZW50SWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldDoge1xuICAgICAgICAgIGFzeW5jIHJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEF1dG9tb2RSdWxlcyhndWlsZElkKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjaGFubmVscyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVscyhpZClcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGVtb2ppcyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaXMoaWQpXG4gICAgICB9LFxuXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShndWlsZElkLCBldmVudElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBhc3luYyBldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBldmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgIGFzeW5jIGdldChndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIGludGVncmF0aW9uSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVJbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgaW52aXRlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbilcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXQoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxpc3QoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEludml0ZXMoZ3VpbGRJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0KHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsaXN0KGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzeW5jKGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbWVtYmVyczoge1xuICAgICAgICBhc3luYyBiYW4oZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0U2VsZihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldChndWlsZElkLCB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRtKHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldERtQ2hhbm5lbCh1c2VySWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMga2ljayhndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbGlzdChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHBydW5lKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHVuYmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChjb21tYW5kLCBndWlsZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGdsb2JhbChjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIGd1aWxkKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBnbG9iYWwoY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgZ3VpbGQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBwZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgICAgYXN5bmMgYWxsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKVxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGFzeW5jIG9uZShjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgICAgIGFzeW5jIGFsbChndWlsZElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgYXN5bmMgb25lKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgcGVybWlzc2lvbnMoZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcmVwbGFjZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChndWlsZElkLCBjb21tYW5kcykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC51cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgb3JpZ2luYWwoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIG9yaWdpbmFsKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBnZXQ6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB1c2Vyczoge1xuICAgICAgYXN5bmMgY2hhbm5lbCh1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0RG1DaGFubmVsKHVzZXJJZClcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHdlYmhvb2tzOiB7XG4gICAgICBhc3luYyBjcmVhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgZGVsZXRlOiB7XG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBhc3luYyBpZChpZCwgcmVhc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVXZWJob29rKGlkLCByZWFzb24pXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHRva2VuKGlkLCB0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlV2ViaG9va1dpdGhUb2tlbihpZCwgdG9rZW4pXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGVkaXQ6IHtcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGFzeW5jIGlkKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFdlYmhvb2sod2ViaG9va0lkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyB0b2tlbihpZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRXZWJob29rV2l0aFRva2VuKGlkLCB0b2tlbiwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZXhlY3V0ZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBnZXQ6IHtcbiAgICAgICAgYXN5bmMgY2hhbm5lbChjaGFubmVsSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGd1aWxkKGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFdlYmhvb2tzKGd1aWxkSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGFzeW5jIGlkKHdlYmhvb2tJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0V2ViaG9vayh3ZWJob29rSWQpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbilcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgYXN5bmMgZGVsZXRlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBqcyBoYWNrIG1ha2luZyBpdCBwb3NzaWJsZSB0byBkbyB3ZWJob29rcy5tZXNzYWdlcy5lZGl0KCkgYXMgd2VsbCBhcyB3ZWJob29rcy5tZXNzYWdlcy5lZGl0Lm9yaWdpbmFsKClcbiAgICAgICAgZWRpdDogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAvLyBUaGUgYmFzZSBmdW5jdGlvbiBmb3Igd2ViaG9va3MubWVzc2FnZXMuZWRpdCgpXG4gICAgICAgICAgKGFzeW5jICh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSkgYXMgV2ViaG9va01lc3NhZ2VFZGl0b3IsXG4gICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgdGhhdCB3ZWJob29rcy5tZXNzYWdlcy5lZGl0Lnh4eCB3aWxsIGhhdmUgYXJlIGxpc3RlZCBpbiB0aGlzIG9iamVjdFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9yaWdpbmFsOiBhc3luYyAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIFdlYmhvb2tNZXNzYWdlRWRpdG9yLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgY29tbWFuZClcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCBjb21tYW5kKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBvcHRpb25zID0ge30pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2Uob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgIH0gYXMgRGlzY29yZENyZWF0ZVdlYmhvb2spXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlckJvdCgpLCB7XG4gICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgIGF2YXRhcixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG9wdGlvbnMuaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAqXG4gICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgKi9cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mub3JpZ2luYWwod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIGRhdGEpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IHRvcGljOiBkYXRhLnRvcGljIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIHdlYmhvb2tfY2hhbm5lbF9pZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgfSBhcyBEaXNjb3JkRm9sbG93QW5ub3VuY2VtZW50Q2hhbm5lbClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMkFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsSW52aXRlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVscyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWxbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RG1DaGFubmVsKHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICByZWNpcGllbnRfaWQ6IHVzZXJJZC50b1N0cmluZygpLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2F0ZXdheUJvdCgpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0R2F0ZXdheUJvdD4ocmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXROaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMubml0cm9TdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxBcnJheTx7IHVzZXI6IERpc2NvcmRVc2VyOyBtZW1iZXI/OiBEaXNjb3JkTWVtYmVyIH0+PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLnVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTZXNzaW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdhdGV3YXlCb3QoKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVzdC5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgdXJsOiByZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IHJlc3QuY3JlYXRlUmVxdWVzdCh7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IHsgLi4ub3B0aW9ucyB9LFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246ICcnIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiksXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogcmVzdC5jcmVhdGVSZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogeyAuLi5vcHRpb25zIH0sXG4gICAgICAgICAgICAvLyByZW1vdmUgYXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogJycgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgZnVuY3Rpb24gKG9wdGlvbnM6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGNoYW5nZSB0byByZXByb2Nlc3MgcXVldWUgaXRlbVxuICAgICAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChvcHRpb25zKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFsbChjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJvdChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVycyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBydW5lTWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnNlYXJjaChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhjb21tYW5kcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIGNvbW1hbmRzKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmRzKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyB7XG4gIC8qKiBUaGUgYm90IHRva2VuIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLiAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKlxuICAgKiBGb3Igb2xkIGJvdHMgdGhhdCBoYXZlIGEgZGlmZmVyZW50IGJvdCBpZCBhbmQgYXBwbGljYXRpb24gaWQuXG4gICAqIEBkZWZhdWx0IGJvdCBpZCBmcm9tIHRva2VuXG4gICAqL1xuICBhcHBsaWNhdGlvbklkPzogQmlnU3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgYmFzZSB1cmwgdG8gY29ubmVjdCB0by4gSWYgeW91IGNyZWF0ZSBhIHByb3h5IHJlc3QsIHRoYXQgdXJsIHdvdWxkIGdvIGhlcmUuXG4gICAqIElUIFNIT1VMRCBOT1QgRU5EIFdJVEggQSAvXG4gICAqIEBkZWZhdWx0IGh0dHBzOi8vZGlzY29yZC5jb20vYXBpXG4gICAqL1xuICBiYXNlVXJsPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgYXBpIHZlcnNpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1ha2UgcmVxdWVzdHMuXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uPzogQXBpVmVyc2lvbnNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN0TWFuYWdlciB7XG4gIC8qKiBUaGUgYm90IHRva2VuIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLiAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKiBUaGUgYXBwbGljYXRpb24gaWQuIE5vcm1hbGx5IHRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciByZWNlbnQgYm90cyBidXQgb2xkIGJvdCdzIGFwcGxpY2F0aW9uIGlkIGlzIHNvbWV0aW1lcyBkaWZmZXJlbnQgZnJvbSB0aGUgYm90IGlkIHNvIGl0IGlzIHJlcXVpcmVkIGZvciB0aG9zZSBib3RzLiAqL1xuICBhcHBsaWNhdGlvbklkOiBiaWdpbnRcbiAgLyoqIFRoZSBhcGkgdmVyc2lvbiB0byB1c2Ugd2hlbiBtYWtpbmcgcmVxdWVzdHMuIE9ubHkgdGhlIGxhdGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiB3aWxsIGJlIHRlc3RlZC4gKi9cbiAgdmVyc2lvbjogQXBpVmVyc2lvbnNcbiAgLyoqXG4gICAqIFRoZSBiYXNlIHVybCB0byBjb25uZWN0IHRvLiBJZiB5b3UgY3JlYXRlIGEgcHJveHkgcmVzdCwgdGhhdCB1cmwgd291bGQgZ28gaGVyZS5cbiAgICogSVQgU0hPVUxEIE5PVCBFTkQgV0lUSCBBIC9cbiAgICogQGRlZmF1bHQgaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGlcbiAgICovXG4gIGJhc2VVcmw6IHN0cmluZ1xuICAvKiogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWVzIGEgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZC4gRGVmYXVsdHMgdG8gSW5maW5pdHkgKi9cbiAgbWF4UmV0cnlDb3VudDogbnVtYmVyXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgbWFuYWdlciBpcyByYXRlIGxpbWl0ZWQgZ2xvYmFsbHkgYWNyb3NzIGFsbCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGJvb2xlYW5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSByYXRlIGxpbWl0ZWQgcGF0aHMgYXJlIGJlaW5nIHByb2Nlc3NlZCB0byBhbGxvdyByZXF1ZXN0cyB0byBiZSBtYWRlIG9uY2UgdGltZSBpcyB1cC4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBib29sZWFuXG4gIC8qKiBUaGUgcXVldWVzIHRoYXQgaG9sZCBhbGwgdGhlIHJlcXVlc3RzIHRvIGJlIHByb2Nlc3NlZC4gKi9cbiAgcXVldWVzOiBNYXA8c3RyaW5nLCBRdWV1ZT5cbiAgLyoqIFRoZSBwYXRocyB0aGF0IGFyZSBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkLiAqL1xuICByYXRlTGltaXRlZFBhdGhzOiBNYXA8c3RyaW5nLCBSZXN0UmF0ZUxpbWl0ZWRQYXRoPlxuICAvKiogVGhlIGJ1Y2tldCBmb3IgaGFuZGxpbmcgYW55IGludmFsaWQgcmVxdWVzdHMuICAqL1xuICBpbnZhbGlkQnVja2V0OiBJbnZhbGlkUmVxdWVzdEJ1Y2tldFxuICAvKiogVGhlIHJvdXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgbWFuYWdlci4gKi9cbiAgcm91dGVzOiB7XG4gICAgLyoqIFJvdXRlIHRvIGdldCBhIGJvdHMgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIHNlc3Npb25JbmZvOiAoKSA9PiBzdHJpbmdcbiAgICAvKiogQSBzcGVjaWZpYyB1c2VyIHJvdXRlLiAqL1xuICAgIHVzZXI6IChpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAvKiogQ3VycmVudCBib3QgdXNlciByb3V0ZS4gKi9cbiAgICB1c2VyQm90OiAoKSA9PiBzdHJpbmdcbiAgICAvLyBPQXV0aDJcbiAgICBvYXV0aDJBcHBsaWNhdGlvbjogKCkgPT4gc3RyaW5nXG4gICAgLy8gR2F0ZXdheSBCb3RcbiAgICBnYXRld2F5Qm90OiAoKSA9PiBzdHJpbmdcbiAgICAvLyBOaXRybyBTdGlja2VyIFBhY2tzXG4gICAgbml0cm9TdGlja2VyUGFja3M6ICgpID0+IHN0cmluZ1xuICAgIC8qKiBSb3V0ZXMgZm9yIHdlYmhvb2sgcmVsYXRlZCByb3V0ZXMuICovXG4gICAgd2ViaG9va3M6IHtcbiAgICAgIC8qKiBSb3V0ZSBmb3IgbWFuYWdpbmcgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugc2VudCBieSBhIHdlYmhvb2suICovXG4gICAgICBvcmlnaW5hbDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zPzogeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3Igd2ViaG9vayB3aXRoIGEgaWQuICovXG4gICAgICBpZDogKHdlYmhvb2tJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSB3ZWJob29rIHdpdGggYSB0b2tlbi4gKi9cbiAgICAgIHdlYmhvb2s6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW47IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCB0aHJvdWdoIGEgd2ViaG9vay4gKi9cbiAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IHN0cmluZ1xuICAgIH1cbiAgICAvKiogUm91dGVzIGZvciBjaGFubmVsIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgIGNoYW5uZWxzOiB7XG4gICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBkbSBjaGFubmVsLiAqL1xuICAgICAgZG06ICgpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgd2ViaG9vayBpbiBhIGNoYW5uZWwuICovXG4gICAgICB3ZWJob29rczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBjaGFubmVsLiAqL1xuICAgICAgY2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgZm9sbG93aW5nIGEgc3BlY2lmaWMgY2hhbm5lbC4gKi9cbiAgICAgIGZvbGxvdzogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgbWFuYWdpbmcgYSBmb3J1bSB3aXRoIGEgbWVzc2FnZS4gKi9cbiAgICAgIGZvcnVtOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNoYW5uZWwncyBpbnZpdGVzLiAqL1xuICAgICAgaW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBtZXNzYWdlICovXG4gICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIGlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgbWVzc2FnZXMuICovXG4gICAgICBtZXNzYWdlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0TWVzc2FnZXNPcHRpb25zKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBvdmVyd3JpdGUuICovXG4gICAgICBvdmVyd3JpdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3ZlcndyaXRlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGNyb3NzcG9zdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UuICovXG4gICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgc3RhZ2VzICovXG4gICAgICBzdGFnZXM6ICgpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIHN0YWdlICovXG4gICAgICBzdGFnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIHRocmVhZCByZWxhdGVkIHRvIGEgY2hhbm5lbC4gKi9cbiAgICAgIHRocmVhZHM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciB0aHJlYWQgYSBzcGVjaWZpYyBtZXNzYWdlLiAqL1xuICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciB0aHJlYWQgd2l0aG91dCBhIG1lc3NhZ2UuICovXG4gICAgICAgIGFsbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhY3RpdmUgdGhyZWFkcy4gKi9cbiAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBtZW1iZXJzIGluIGEgdGhyZWFkLiAqL1xuICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIHRoZSBib3QgbWVtYmVyIGluIGEgdGhyZWFkLiAqL1xuICAgICAgICBtZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIG1lbWJlciBpbiBhIHRocmVhZC4gKi9cbiAgICAgICAgdXNlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgYXJjaGl2ZWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHVibGljYWxseSBhcmNoaXZlZCB0aHJlYWRzLiAqL1xuICAgICAgICBwdWJsaWM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIHRoYXQgdGhlIGJvdCBoYXMgam9pbmVkLiAqL1xuICAgICAgICBqb2luZWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyB0eXBpbmcgaW5kaWNhdG9ycyBpbiBhIGPCq2hhbm5lbC4gKi9cbiAgICAgIHR5cGluZzogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICB9XG4gICAgLyoqIFJvdXRlcyBmb3IgZ3VpbGQgcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgZ3VpbGRzOiB7XG4gICAgICAvKiogUm91dGVzIGZvciBhIGd1aWxkcyBhdXRvbW9kZXJhdGlvbi4gKi9cbiAgICAgIGF1dG9tb2Q6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgYXV0b21vZGVyYXRpb24uICovXG4gICAgICAgIHJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGF1dG9tb2RlcmF0aW9uIHJ1bGUgZ3VpbGQncyAqL1xuICAgICAgICBydWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3Mgc2NoZWR1bGVkIGV2ZW50cy4gKi9cbiAgICAgIGV2ZW50czoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBzY2hlZHVsZWQgZXZlbnQuICovXG4gICAgICAgIGV2ZW50czogKGd1aWxkSWQ6IEJpZ1N0cmluZywgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgc2NoZWR1bGVkIGV2ZW50LiAqL1xuICAgICAgICBldmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCB3aXRoVXNlckNvdW50PzogYm9vbGVhbikgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzY2hlZHVsZWQgZXZlbnQgdXNlcnMuICovXG4gICAgICAgIHVzZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGNoYW5uZWxzIGluIGEgZ3VpbGQgKi9cbiAgICAgIGNoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBlbW9qaS4gKi9cbiAgICAgIGVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGVtb2ppcy4gKi9cbiAgICAgIGVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgaW50ZWdyYXRpb24uICovXG4gICAgICBpbnRlZ3JhdGlvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaW50ZWdyYXRpb25JZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGludGVncmF0aW9ucy4gKi9cbiAgICAgIGludGVncmF0aW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgaW52aXRlLiAqL1xuICAgICAgaW52aXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGludml0ZXMgaW4gYSBndWlsZC4gKi9cbiAgICAgIGludml0ZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgd2ViaG9va3MgaW4gYSBndWlsZCAqL1xuICAgICAgd2ViaG9va3M6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlcyBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIG1lbWJlcnMuICovXG4gICAgICBtZW1iZXJzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCBtZW1iZXIncyBiYW4uICovXG4gICAgICAgIGJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgdGhlIGJvdCBndWlsZCBtZW1iZXIuICovXG4gICAgICAgIGJvdDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCBtZW1iZXIuICovXG4gICAgICAgIG1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBndWlsZCBtZW1iZXJzLiAqL1xuICAgICAgICBtZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEd1aWxkTWVtYmVycykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbWVtYmVyIHNlYXJjaGluZyBpbiBhIGd1aWxkLiAqL1xuICAgICAgICBzZWFyY2g6IChndWlsZElkOiBCaWdTdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyIH0pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHBydW5pbmcgZ3VpbGQgbWVtYmVycy4gKi9cbiAgICAgICAgcHJ1bmU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRHdWlsZFBydW5lQ291bnRRdWVyeSkgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgdGVtcGxhdGVzLiAqL1xuICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZjIGd1aWxkJ3MgdGVtcGxhdGVzIHdpdGggYSBjb2RlIG9ubHkuICovXG4gICAgICAgIGNvZGU6IChjb2RlOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQncyB0ZW1wbGF0ZSB3aXRoIGEgZ3VpbGQgaWQgYW5kIGNvZGUuICovXG4gICAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb2RlOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICAgICAgYWxsOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgaW50ZXJhY3Rpb25zOiB7XG4gICAgICAvKiogUm91dGVzIGZvciBpbnRlcmFjdGlvbiBjb21tYW5kIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgY29tbWFuZHMuICovXG4gICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBndWlsZCByZWxhdGVkIGNvbW1hbmRzLiAqL1xuICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBndWlsZCBjb21tYW5kcy4gKi9cbiAgICAgICAgICBhbGw6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGd1aWxkIGNvbW1hbmQuICovXG4gICAgICAgICAgb25lOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nLCB3aXRoTG9jYWxpemF0aW9ucz86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIGNvbW1hbmQgcGVybWlzc2lvbnMuICovXG4gICAgICAgIHBlcm1pc3Npb25zOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY29tbWFuZCdzIHBlcm1pc3Npb24uICovXG4gICAgICAgIHBlcm1pc3Npb246IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY29tbWFuZC4gKi9cbiAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcsIHdpdGhMb2NhbGl6YXRpb25zPzogYm9vbGVhbikgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBpbnRlcmFjdGlvbiByZXNwb25zZSByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgY2FsbGJhY2sgcmVzcG9uc2Ugd2l0aCBpZCBhbmQgdG9rZW4uICovXG4gICAgICAgIGNhbGxiYWNrOiAoaW50ZXJhY3Rpb25JZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgdXNpbmcgaWQgYW5kIHRva2VuLiAqL1xuICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBmb2xsb3d1cCBtZXNzYWdlIGZyb20gYSBpbnRlcmFjdGlvbiByZXNwb25zZS4gKi9cbiAgICAgICAgbWVzc2FnZTogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiogQ2hlY2sgdGhlIHJhdGUgbGltaXRzIGZvciBhIHVybCBvciBhIGJ1Y2tldC4gKi9cbiAgY2hlY2tSYXRlTGltaXRzOiAodXJsOiBzdHJpbmcpID0+IG51bWJlciB8IGZhbHNlXG4gIC8qKiBDcmVhdGVzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGhlYWRlcnMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHNlbmQgYSByZXF1ZXN0LiBXaWxsIGhhbmRsZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kcyBhbmQgZXZlcnl0aGluZyBuZWNlc3NhcnkgZm9yIGRpc2NvcmQuICovXG4gIGNyZWF0ZVJlcXVlc3Q6IChvcHRpb25zOiBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMpID0+IFJlcXVlc3RCb2R5XG4gIC8qKiBUaGlzIHdpbGwgY3JlYXRlIGEgaW5maW5pdGUgbG9vcCBydW5uaW5nIGluIDEgc2Vjb25kcyB1c2luZyB0YWlsIHJlY3Vyc2lvbiB0byBrZWVwIHJhdGUgbGltaXRzIGNsZWFuLiBXaGVuIGEgcmF0ZSBsaW1pdCByZXNldHMsIHRoaXMgd2lsbCByZW1vdmUgaXQgc28gdGhlIHF1ZXVlIGNhbiBwcm9jZWVkLiAqL1xuICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoczogKCkgPT4gdm9pZFxuICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gIHByb2Nlc3NIZWFkZXJzOiAodXJsOiBzdHJpbmcsIGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IHVuZGVmaW5lZFxuICAvKiogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBhcGkuICovXG4gIHNlbmRSZXF1ZXN0OiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBTcGxpdCBhIHVybCB0byBzZXBhcmF0ZSByYXRlIGxpbWl0IGJ1Y2tldHMgYmFzZWQgb24gbWFqb3IvbWlub3IgcGFyYW1ldGVycy4gKi9cbiAgc2ltcGxpZnlVcmw6ICh1cmw6IHN0cmluZywgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcykgPT4gc3RyaW5nXG4gIC8qKiBNYWtlIGEgcmVxdWVzdCB0byBiZSBzZW50IHRvIHRoZSBhcGkuICovXG4gIG1ha2VSZXF1ZXN0OiA8VCA9IHVua25vd24+KG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8VD5cbiAgLyoqIFRha2VzIGEgcmVxdWVzdCBhbmQgcHJvY2Vzc2VzIGl0IGludG8gYSBxdWV1ZS4gKi9cbiAgcHJvY2Vzc1JlcXVlc3Q6IChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHZvaWRcbiAgLyoqIE1ha2UgYSBnZXQgcmVxdWVzdCB0byB0aGUgYXBpICovXG4gIGdldDogPFQgPSB2b2lkPih1cmw6IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxUPj5cbiAgLyoqIE1ha2UgYSBwb3N0IHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgcG9zdDogPFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBNYWtlIGEgcHV0IHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgcHV0OiA8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBNYWtlIGEgZGVsZXRlIHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgZGVsZXRlOiAodXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBNYWtlIGEgcGF0Y2ggcmVxdWVzdCB0byB0aGUgYXBpLiAqL1xuICBwYXRjaDogPFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGNoYW5uZWxzICovXG4gIGNoYW5uZWxzOiB7XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBtZXNzYWdlcyBpbiBhIGNoYW5uZWwgKi9cbiAgICBtZXNzYWdlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVzc2FnZSBpbi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGJvdCB1c2VyIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyB0byBiZSBzZW50IGluLlxuICAgICAgICpcbiAgICAgICAqIElmIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGEgZ3VpbGQgY2hhbm5lbDpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIElmIHNlbmRpbmcgYSBUVFMgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX1RUU19NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSBhcyBhIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICAgICAqIC0gVGhlIG1lc3NhZ2UgYmVpbmcgcmVwbGllZCB0byBjYW5ub3QgYmUgYSBzeXN0ZW0gbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiDimqDvuI8gVGhlIG1heGltdW0gc2l6ZSBvZiBhIHJlcXVlc3QgKGFjY291bnRpbmcgZm9yIGFueSBhdHRhY2htZW50cyBhbmQgbWVzc2FnZSBjb250ZW50KSBmb3IgYm90IHVzZXJzIGlzIF84IE1pQl8uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIHNlbmQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0IHRoZSBtZXNzYWdlIGluLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRHMgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIGVkaXRpbmcgYW5vdGhlciB1c2VyJ3MgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKiAtIE9ubHkgdGhlIHtAbGluayBFZGl0TWVzc2FnZS5mbGFncyB8IGZsYWdzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgY2FuIGJlIGVkaXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIC8qKlxuICAgICAgICogQ3Jvc3MtcG9zdHMgYSBtZXNzYWdlIHBvc3RlZCBpbiBhbiBhbm5vdW5jZW1lbnQgY2hhbm5lbCB0byBzdWJzY3JpYmVkIGNoYW5uZWxzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBjcm9zcy1wb3N0LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyb3NzLXBvc3RlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBub3QgY3Jvc3MtcG9zdGluZyBvd24gbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50IGluIHRoZSBndWlsZHMgdGhlIHN1YnNjcmliZWQgY2hhbm5lbHMgYXJlIGluLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2Nyb3NzcG9zdC1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBwdWJsaXNoOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIG1lc3NhZ2UgZnJvbSBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUgdGhlIG1lc3NhZ2UgZnJvbS5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIG5vdCBkZWxldGluZyBvd24gbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjaGFubmVsIGJ5IGl0cyBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQsIGEge0BsaW5rIFRocmVhZE1lbWJlcn0gb2JqZWN0IGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtY2hhbm5lbH1cbiAgICAgKi9cbiAgICBnZXQ6IChpZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB3aXRoaW4gYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNoYW5uZWwgd2l0aGluLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2hhbm5lbC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZENoYW5uZWx9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIElmIHNldHRpbmcgcGVybWlzc2lvbiBvdmVyd3JpdGVzLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uIGlzIG9ubHkgcG9zc2libGUgZm9yIGd1aWxkIGFkbWluaXN0cmF0b3JzLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfQ2hhbm5lbCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWNoYW5uZWx9XG4gICAgICovXG4gICAgY3JlYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZENoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBjaGFubmVsIGZyb20gd2l0aGluIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlZCB7QGxpbmsgQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZvciBjb21tdW5pdHkgZ3VpbGRzLCB0aGUgX1J1bGVzXywgX0d1aWRlbGluZXNfIGFuZCBfQ29tbXVuaXR5IFVwZGF0ZV8gY2hhbm5lbHMgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgY2hhbm5lbCBpcyBhIHRocmVhZDpcbiAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAtIEZpcmVzIGEgX1RocmVhZCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBPdGhlcndpc2U6XG4gICAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIC0g4pqg77iPIERlbGV0aW5nIGEgY2F0ZWdvcnkgY2hhbm5lbCBkb2VzIG5vdCBkZWxldGUgaXRzIGNoaWxkIGNoYW5uZWxzLlxuICAgICAqICAgSW5zdGVhZCwgdGhleSB3aWxsIGhhdmUgdGhlaXIgYHBhcmVudF9pZGAgcHJvcGVydHkgcmVtb3ZlZCwgYW5kIGEgYENoYW5uZWwgVXBkYXRlYCBnYXRld2F5IGV2ZW50IHdpbGwgZmlyZSBmb3IgZWFjaCBvZiB0aGVtLlxuICAgICAqXG4gICAgICogLSBGaXJlcyBhIF9DaGFubmVsIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZWNsb3NlLWNoYW5uZWx9XG4gICAgICovXG4gICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKlxuICAgICAqIEVkaXRzIGEgY2hhbm5lbCdzIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjaGFubmVsLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgZWRpdGluZyBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkdyb3VwRG19OlxuICAgICAqIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBJZiBlZGl0aW5nIGEgdGhyZWFkIGNoYW5uZWw6XG4gICAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uIF9fdW5sZXNzX18gaWYgc2V0dGluZyB0aGUgYGFyY2hpdmVkYCBwcm9wZXJ0eSB0byBgZmFsc2VgIHdoZW4gdGhlIGBsb2NrZWRgIHByb3BlcnR5IGlzIGFsc28gYGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbiBpcyByZXF1aXJlZC5cbiAgICAgKlxuICAgICAqIC0gRmlyZXMgYSBfVGhyZWFkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIElmIGVkaXRpbmcgYSBndWlsZCBjaGFubmVsOlxuICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAtIElmIG1vZGlmeWluZyBwZXJtaXNzaW9uIG92ZXJyaWRlczpcbiAgICAgKiAgIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAgIC0gT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIC0gSWYgbW9kaWZ5aW5nIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRDYXRlZ29yeX06XG4gICAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGVhY2ggY2hpbGQgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICAgKiAtIE90aGVyd2lzZTpcbiAgICAgKiAgICAgLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKi9cbiAgICBlZGl0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUNoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgIC8qKlxuICAgICAqIEZvbGxvd3MgYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwsIGFsbG93aW5nIG1lc3NhZ2VzIHBvc3RlZCB3aXRoaW4gaXQgdG8gYmUgY3Jvc3MtcG9zdGVkIGludG8gdGhlIHRhcmdldCBjaGFubmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gZm9sbG93LlxuICAgICAqIEBwYXJhbSB0YXJnZXRDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRhcmdldCBjaGFubmVsIC0gdGhlIGNoYW5uZWwgdG8gY3Jvc3MtcG9zdCB0by5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uIGluIHRoZSBfX3RhcmdldCBjaGFubmVsX18uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNmb2xsb3ctYW5ub3VuY2VtZW50LWNoYW5uZWx9XG4gICAgICovXG4gICAgZm9sbG93OiAoc291cmNlQ2hhbm5lbElkOiBCaWdTdHJpbmcsIHRhcmdldENoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRGb2xsb3dlZENoYW5uZWw+PlxuICAgIC8qKiBGb3J1bSByZWxhdGVkIGhlbHBlcnMgaW4gYSBjaGFubmVsICovXG4gICAgZm9ydW1zOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgZm9ydW0gY2hhbm5lbCwgYW5kIHNlbmRzIGEgbWVzc2FnZSB3aXRoaW4gdGhlIGNyZWF0ZWQgdGhyZWFkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGZvcnVtIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSB0aHJlYWQgd2l0aGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IHdpdGggYSBuZXN0ZWQge0BsaW5rIE1lc3NhZ2V9IG9iamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC1pbi1mb3J1bS1jaGFubmVsfVxuICAgICAgICpcbiAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAqL1xuICAgICAgcG9zdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVGb3J1bVBvc3RXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gICAgfVxuICAgIC8qKiBQZXJtaXNzaW9uIHJlbGF0ZWQgaGVscGVycyBpbiBhIGNoYW5uZWwgKi9cbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbiBvdmVycmlkZXMgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGVzIG9mLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGVybWlzc2lvbiBvdmVycmlkZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LWNoYW5uZWwtcGVybWlzc2lvbnN9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGEgcGVybWlzc2lvbiBvdmVycmlkZSBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIG9mLlxuICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZUlkIC0gVGhlIElEIG9mIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLWNoYW5uZWwtcGVybWlzc2lvbn1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG92ZXJ3cml0ZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICB0aHJlYWRzOiB7XG4gICAgICBnZXQ6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0aHJlYWRzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB0aHJlYWRzIG9mLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFjdGl2ZVRocmVhZHN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXR1cm5zIGJvdGggcHVibGljIGFuZCBwcml2YXRlIHRocmVhZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtYWN0aXZlLWd1aWxkLXRocmVhZHN9XG4gICAgICAgICAqL1xuICAgICAgICBhY3RpdmU6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFjdGl2ZVRocmVhZHM+PlxuICAgICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgYXJjaGl2ZWQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IgYSBjaGFubmVsLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGFyY2hpdmVfdGltZXN0YW1wYCBwcm9wZXJ0eSBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1wcml2YXRlLWFyY2hpdmVkLXRocmVhZHN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyB0aGUgYm90IGlzIGEgbWVtYmVyIG9mIGZvciBhIGNoYW5uZWwuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBcmNoaXZlZFRocmVhZHN9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGlkYCBwcm9wZXJ0eSBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1qb2luZWQtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHB1YmxpYyBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFyY2hpdmVkVGhyZWFkc30uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFRleHR9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICAgICAgICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3N9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsaXN0LXB1YmxpYy1hcmNoaXZlZC10aHJlYWRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHRocmVhZCBtZW1iZXIgYnkgdGhlaXIgdXNlciBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGdldCB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSB0aHJlYWQgbWVtYmVyIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtdGhyZWFkLW1lbWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIG1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdGhyZWFkIG1lbWJlcnMgZm9yIGEgdGhyZWFkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVycyBvZi5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkVGhyZWFkTWVtYmVyfSBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSB0aGUgYEdVSUxEX01FTUJFUlNgIHByaXZpbGVnZWQgaW50ZW50IGVuYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtdGhyZWFkLW1lbWJlcnN9XG4gICAgICAgICAqL1xuICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRocmVhZE1lbWJlcltdPj5cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQWRkcyB0aGUgYm90IHVzZXIgdG8gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGFkZCB0aGUgYm90IHVzZXIgdG8uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNqb2luLXRocmVhZH1cbiAgICAgICAqL1xuICAgICAgam9pbjogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgdGhlIGJvdCB1c2VyIGZyb20gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIHJlbW92ZSB0aGUgYm90IHVzZXIgZnJvbS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xlYXZlLXRocmVhZH1cbiAgICAgICAqL1xuICAgICAgbGVhdmU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVzIGEgbWVtYmVyIGZyb20gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIHJlbW92ZSB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgdGhyZWFkIG1lbWJlciB0byByZW1vdmUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIHRoZSB0aHJlYWQgaXMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0sIHJlcXVpcmVzIHRvIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0aHJlYWQuXG4gICAgICAgKiBPdGhlcndpc2UsIHJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3JlbW92ZS10aHJlYWQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBraWNrOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGNyZWF0aW5nIGEgdGhyZWFkLiAqL1xuICAgICAgY3JlYXRlOiB7XG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhyZWFkLCB1c2luZyBhbiBleGlzdGluZyBtZXNzYWdlIGFzIGl0cyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gdXNlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBDaGFubmVsIHwgVGhyZWFkfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRUZXh0fSwgY3JlYXRlcyBhIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQdWJsaWNUaHJlYWR9LlxuICAgICAgICAgICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c30sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAgICAgICAgICogRG9lcyBub3Qgd29yayBvbiBjaGFubmVscyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRGb3J1bX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIElEIG9mIHRoZSBzb3VyY2UgbWVzc2FnZS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtZnJvbS1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgICAgICB9XG4gICAgICAgIHdpdGhvdXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhyZWFkIHdpdGhvdXQgdXNpbmcgYSBtZXNzYWdlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZENoYW5uZWwgfCBUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBDcmVhdGluZyBhIHByaXZhdGUgdGhyZWFkIHJlcXVpcmVzIHRoZSBzZXJ2ZXIgdG8gYmUgYm9vc3RlZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtd2l0aG91dC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogU3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRWRpdHMgdGhlIHBvc2l0aW9ucyBvZiBhIHNldCBvZiBjaGFubmVscyBpbiBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAgICogQHBhcmFtIGNoYW5uZWxQb3NpdGlvbnMgLSBBIHNldCBvZiBvYmplY3RzIGRlZmluaW5nIHRoZSB1cGRhdGVkIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IGNoYW5uZWwgaW1wYWN0ZWQgaW4gdGhpcyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLWNoYW5uZWwtcG9zaXRpb25zfVxuICAgICAqL1xuICAgIHBvc2l0aW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY2hhbm5lbFBvc2l0aW9uczogTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zW10pID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludml0ZXMgZm9yIGEgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBpbnZpdGVzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfSBvYmplY3RzIGFzc29ydGVkIGJ5IGludml0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIE9ubHkgdXNhYmxlIGZvciBndWlsZCBjaGFubmVscy5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsLWludml0ZXN9XG4gICAgICovXG4gICAgaW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgICAvKiogU3RhZ2UgcmVsYXRlZCBoZWxwZXJzIGZvciBhIGNoYW5uZWwuICovXG4gICAgc3RhZ2VzOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhZ2UgaW5zdGFuY2UuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2NyZWF0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiAob3B0aW9uczogQ3JlYXRlU3RhZ2VJbnN0YW5jZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2RlbGV0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHN0YWdlIGluc3RhbmNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1N0YWdlIEluc3RhbmNlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI21vZGlmeS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBkYXRhOiBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLCBpZiBvbmUgZXhpc3RzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2dldC1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhIHR5cGluZyBpbmRpY2F0b3IgZm9yIHRoZSBib3QgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gdHJpZ2dlciB0aGUgdHlwaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogR2VuZXJhbGx5LCBib3RzIHNob3VsZCBfbm90XyB1c2UgdGhpcyByb3V0ZS5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX1R5cGluZyBTdGFydF8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3RyaWdnZXItdHlwaW5nLWluZGljYXRvcn1cbiAgICAgKi9cbiAgICB0eXBpbmc6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG4gIC8qKiBFbW9qaSByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICBlbW9qaXM6IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtb2ppIGluIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBlbW9qaS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGVtb2ppLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRW1vamlzIGhhdmUgYSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiAyNTYga2lsb2JpdHMuIEF0dGVtcHRpbmcgdG8gdXBsb2FkIGEgbGFyZ2VyIGVtb2ppIHdpbGwgY2F1c2UgdGhlIHJvdXRlIHRvIHJldHVybiA0MDAgQmFkIFJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2NyZWF0ZS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGFuIGVtb2ppIGZyb20gYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgZW1vamkuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBkZWxldGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2RlbGV0ZS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKlxuICAgICAqIEVkaXRzIGFuIGVtb2ppLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIGVtb2ppLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZWRpdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZW1vamkuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHVwZGF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIGBHdWlsZCBFbW9qaXMgVXBkYXRlYCBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI21vZGlmeS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBlbW9qaSBieSBpdHMgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBnZXQgdGhlIGVtb2ppLlxuICAgICAqIEBwYXJhbSBlbW9qaUlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBnZXQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjZ2V0LWd1aWxkLWVtb2ppfVxuICAgICAqL1xuICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZW1vamlJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gIH1cbiAgLyoqIEd1aWxkIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMgKi9cbiAgZ3VpbGRzOiB7XG4gICAgYXV0b21vZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGF1dG9tb2QgcnVsZSBpbiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHJ1bGUgaW4uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHJ1bGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNjcmVhdGUtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNkZWxldGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhbiBhdXRvbW9kIHJ1bGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJ1bGUgaW4uXG4gICAgICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGVkaXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcnVsZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbW9kaWZ5LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogUGFydGlhbDxFZGl0QXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgYXV0b21vZGVyYXRpb24gZGF0YSBpbiBhIGd1aWxkLiAqL1xuICAgICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGFuIGF1dG9tb2QgcnVsZSBieSBpdHMgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHJ1bGUgb2YuXG4gICAgICAgICAqIEBwYXJhbSBydWxlSWQgLSBUaGUgSUQgb2YgdGhlIHJ1bGUgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2dldC1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICAgICAgICovXG4gICAgICAgIHJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBhdXRvbW9kIHJ1bGVzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlcyBmcm9tLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcnVsZSBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbGlzdC1hdXRvLW1vZGVyYXRpb24tcnVsZXMtZm9yLWd1aWxkfVxuICAgICAgICAgKi9cbiAgICAgICAgcnVsZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPj5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3IgYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGNoYW5uZWxzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY2hhbm5lbCBJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXhjbHVkZXMgdGhyZWFkcy5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtY2hhbm5lbHN9XG4gICAgICovXG4gICAgY2hhbm5lbHM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWxbXT4+XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBlbW9qaXMgZm9yIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hpY2ggdG8gZ2V0IHRoZSBlbW9qaXMgb2YuXG4gICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkRW1vaml9IG9iamVjdHMgYXNzb3J0ZWQgYnkgZW1vamkgSUQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbGlzdC1ndWlsZC1lbW9qaXN9XG4gICAgICovXG4gICAgZW1vamlzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaVtdPj5cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyBzY2hlZHVsZWQgZXZlbnRzLiAqL1xuICAgIGV2ZW50czoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIGV2ZW50IGluIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQSBndWlsZCBjYW4gb25seSBoYXZlIGEgbWF4aW11bSBvZiAxMDAgZXZlbnRzIHdpdGggYSBzdGF0dXMgb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLkFjdGl2ZX0gb3Ige0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLlNjaGVkdWxlZH0gKGluY2x1c2l2ZSkuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgU2NoZWR1bGVkIEV2ZW50IENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2NyZWF0ZS1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlU2NoZWR1bGVkRXZlbnQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNkZWxldGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHNjaGVkdWxlZCBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgc2NoZWR1bGVkIGV2ZW50IGluLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBlZGl0LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogVG8gc3RhcnQgb3IgZW5kIGFuIGV2ZW50LCBtb2RpZnkgdGhlIGV2ZW50J3MgYHN0YXR1c2AgcHJvcGVydHkuXG4gICAgICAgKlxuICAgICAgICogVGhlIGBlbnRpdHlfbWV0YWRhdGFgIHByb3BlcnR5IGlzIGRpc2NhcmRlZCBmb3IgZXZlbnRzIHdob3NlIGBlbnRpdHlfdHlwZWAgaXMgbm90IHtAbGluayBTY2hlZHVsZWRFdmVudEVudGl0eVR5cGUuRXh0ZXJuYWx9LlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNtb2RpZnktZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdFNjaGVkdWxlZEV2ZW50PikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuXG4gICAgICBnZXQ6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSBzY2hlZHVsZWQgZXZlbnQgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBldmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogeyB3aXRoVXNlckNvdW50PzogYm9vbGVhbiB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNjaGVkdWxlZCBldmVudHMgZm9yIGEgZ3VpbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHNjaGVkdWxlZCBldmVudHMgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnRzLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fSBvYmplY3RzIGFzc29ydGVkIGJ5IGV2ZW50IElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2xpc3Qtc2NoZWR1bGVkLWV2ZW50cy1mb3ItZ3VpbGR9XG4gICAgICAgICAqL1xuICAgICAgICBldmVudHM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBzdWJzY3JpYmVycyB0byBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIHRvIHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIG9mLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHN1YnNjcmliZXJzLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVzZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBVc2VycyBhcmUgb3JkZXJlZCBieSB0aGVpciBJRHMgaW4gX2FzY2VuZGluZ18gb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZ2V0LWd1aWxkLXNjaGVkdWxlZC1ldmVudC11c2Vyc31cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJzOiAoXG4gICAgICAgICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgICAgICAgIGV2ZW50SWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgICAgICAgKSA9PiBQcm9taXNlPFxuICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgIHVzZXI6IENhbWVsaXplPERpc2NvcmRVc2VyPlxuICAgICAgICAgICAgbWVtYmVyPzogQ2FtZWxpemU8RGlzY29yZE1lbWJlcj5cbiAgICAgICAgICB9PlxuICAgICAgICA+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIGludGVncmF0aW9ucy4gKi9cbiAgICBpbnRlZ3JhdGlvbnM6IHtcbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBmcm9tLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnRlZ3JhdGlvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnRlZ3JhdGlvbiBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1pbnRlZ3JhdGlvbnN9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW50ZWdyYXRpb25bXT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYW4gaW50ZWdyYXRpb24gYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGludGVncmF0aW9uLlxuICAgICAgICogQHBhcmFtIGludGVncmF0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVncmF0aW9uIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRGVsZXRlcyBhbGwgd2ViaG9va3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlZ3JhdGlvbiwgYW5kIGtpY2tzIHRoZSBhc3NvY2lhdGVkIGJvdCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgSW50ZWdyYXRpb25zIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqIEZpcmVzIGEgX0ludGVncmF0aW9uIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLWludGVncmF0aW9ufVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyBpbnZpdGVzLiAqL1xuICAgIGludml0ZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGluIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIGludml0ZSB0by5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW52aXRlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRJbnZpdGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9JTlNUQU5UX0lOVklURWAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfSW52aXRlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVJlbWFya3NcbiAgICAgICAqIFRoZSByZXF1ZXN0IGJvZHkgaXMgbm90IG9wdGlvbmFsLCBhbmQgYW4gZW1wdHkgSlNPTiBvYmplY3QgbXVzdCBiZSBzZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgZmllbGRzIGFyZSBiZWluZyB0cmFuc21pdHRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcmVhdGUtY2hhbm5lbC1pbnZpdGV9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQ3JlYXRlQ2hhbm5lbEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBpbnZpdGVDb2RlIC0gVGhlIGludml0ZSBjb2RlIG9mIHRoZSBpbnZpdGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfSW52aXRlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1pbnZpdGV9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGludml0ZUNvZGU6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBieSBpdHMgaW52aXRlIGNvZGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBnZXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGludml0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkSW52aXRlTWV0YWRhdGF9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZX1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW52aXRlcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBpbnZpdGVzIGZyb20uXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2ludml0ZSNnZXQtaW52aXRlc31cbiAgICAgICAqL1xuICAgICAgbGlzdDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4+XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjY3JlYXRlLWd1aWxkLXRlbXBsYXRlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSB0ZW1wbGF0ZSBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHRlbXBsYXRlJ3Mgc2V0dGluZ3MuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgYSB0ZW1wbGF0ZSBvZi5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNtb2RpZnktZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYSB0ZW1wbGF0ZSBieSBpdHMgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGdldC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGdldDogKHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVGVtcGxhdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdGVtcGxhdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2dldC1ndWlsZC10ZW1wbGF0ZXN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBTeW5jaHJvbmlzZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHN5bmNocm9uaXNlIGEgdGVtcGxhdGUgb2YuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICAgICAqL1xuICAgICAgc3luYzogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgIH1cblxuICAgIC8qIEd1aWxkIE1lbWJlcnMgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICBtZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIEJhbnMgYSB1c2VyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gYmFuIHRoZSB1c2VyIGZyb20uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGJhbiBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmFuLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIEJhbiBBZGRfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1iYW59XG4gICAgICAgKi9cbiAgICAgIGJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBDcmVhdGVHdWlsZEJhbikgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBuaWNrbmFtZSBvZiB0aGUgYm90IHVzZXIgaW4uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbmlja25hbWUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVtYmVyfVxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktY3VycmVudC1tZW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIGVkaXRTZWxmOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0Qm90TWVtYmVyT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBtZW1iZXIncyBwcm9wZXJ0aWVzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBtZW1iZXIgb2YuXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBlZGl0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHVzZXIuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgdmFyaW91cyBwZXJtaXNzaW9ucyBkZXBlbmRpbmcgb24gd2hhdCBpcyBlZGl0ZWQgYWJvdXQgdGhlIG1lbWJlci5cbiAgICAgICAqIFRvIGZpbmQgb3V0IHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGVuYWN0IGEgY2hhbmdlLCByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZW5kcG9pbnQncyB7QGxpbmsgTW9kaWZ5R3VpbGRNZW1iZXIgfCBwYXJhbWV0ZXJzfS5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktZ3VpbGQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRNZW1iZXIpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBjcmVhdGUgdGhlIERNIGNoYW5uZWwgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBDaGFubmVsfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvdXNlciNjcmVhdGUtZG19XG4gICAgICAgKi9cbiAgICAgIGRtOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBtZW1iZXIgb2JqZWN0IGJ5IHVzZXIgSUQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcldpdGhVc2VyfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1lbWJlcnMgZm9yIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcldpdGhVc2VyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgICAgICpcbiAgICAgICAqIOKaoO+4jyBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZW5kcG9pbnQgd2l0aCB2ZXJ5IGxhcmdlIGJvdHMuIEluc3RlYWQsIG9wdCB0byB1c2UgYGZldGNoTWVtYmVycygpYDpcbiAgICAgICAqIFJFU1QgY29tbXVuaWNhdGlvbiBvbmx5IHBlcm1pdHMgNTAgcmVxdWVzdHMgdG8gYmUgbWFkZSBwZXIgc2Vjb25kLCB3aGlsZSBnYXRld2F5cyBhbGxvdyBmb3IgdXAgdG8gMTIwIHJlcXVlc3RzXG4gICAgICAgKiBwZXIgbWludXRlIHBlciBzaGFyZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c30uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c31cbiAgICAgICAqL1xuICAgICAgbGlzdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTGlzdEd1aWxkTWVtYmVycykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gICAgICAvKipcbiAgICAgICAqIEtpY2tzIGEgbWVtYmVyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8ga2ljayB0aGUgbWVtYmVyIGZyb20uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBraWNrIGZyb20gdGhlIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEtJQ0tfTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBraWNrOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIEluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nIGluYWN0aXZlIG1lbWJlcnMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHBydW5lIHRoZSBtZW1iZXJzIG9mLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHBydW5pbmcgb2YgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgbWVtYmVycyB3ZXJlIHBydW5lZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICog4p2XIFJlcXVlc3RzIHRvIHRoaXMgZW5kcG9pbnQgd2lsbCB0aW1lIG91dCBmb3IgbGFyZ2UgZ3VpbGRzLiBUbyBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcsIHNldCB0aGUge0BsaW5rIEJlZ2luR3VpbGRQcnVuZS5jb21wdXRlUHJ1bmVDb3VudH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIHRvIGBmYWxzZWAuIFRoaXMgd2lsbCBiZWdpbiB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nLCBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGB1bmRlZmluZWRgLCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhY3R1YWwgY291bnQgb2YgbWVtYmVycyB0aGF0IGhhdmUgYmVlbiBraWNrZWQuXG4gICAgICAgKlxuICAgICAgICog4pqg77iPIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2VzcyB3aWxsIG5vdCByZW1vdmUgbWVtYmVycyB3aXRoIGEgcm9sZS4gVG8gaW5jbHVkZSB0aGUgbWVtYmVycyB3aG8gaGF2ZSBhIF9wYXJ0aWN1bGFyIHN1YnNldCBvZiByb2xlc18sIHNwZWNpZnkgdGhlIHJvbGUocykgaW4gdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuaW5jbHVkZVJvbGVzIHwgaW5jbHVkZVJvbGVzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgbWVtYmVyIGtpY2tlZC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjYmVnaW4tZ3VpbGQtcHJ1bmV9XG4gICAgICAgKi9cbiAgICAgIHBydW5lOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBCZWdpbkd1aWxkUHJ1bmUpID0+IFByb21pc2U8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZW1iZXJzIHdob3NlIHVzZXJuYW1lcyBvciBuaWNrbmFtZXMgc3RhcnQgd2l0aCBhIHByb3ZpZGVkIHN0cmluZy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gc2VhcmNoIGluLlxuICAgICAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHN0cmluZyB0byBtYXRjaCB1c2VybmFtZXMgb3Igbmlja25hbWVzIGFnYWluc3QuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNzZWFyY2gtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqL1xuICAgICAgc2VhcmNoOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogT21pdDxTZWFyY2hNZW1iZXJzLCAncXVlcnknPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gICAgICAvKipcbiAgICAgICAqIFVuYmFucyBhIHVzZXIgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byB1bmJhbiB0aGUgdXNlciBpbi5cbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gdW5iYW4uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgQkFOX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgQmFuIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLWJhbn1cbiAgICAgICAqL1xuICAgICAgdW5iYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgfVxuICAgIC8qKiBJbnRlcmFjdGlvbiByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgLyoqIENvbW1hbmQgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBjcmVhdGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENyZWF0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCBhY2Nlc3NpYmxlIGdsb2JhbGx5OyBhY3Jvc3MgZGlmZmVyZW50IGd1aWxkcyBhbmQgY2hhbm5lbHMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4pqg77iPIENyZWF0aW5nIGEgY29tbWFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgY29tbWFuZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgb2xkIGNvbW1hbmQuXG4gICAgICAgICAgICog4pqg77iPIEdsb2JhbCBjb21tYW5kcyBvbmNlIGNyZWF0ZWQgYXJlIGNhY2hlZCBmb3IgcGVyaW9kcyBvZiBfX2FuIGhvdXJfXywgc28gY2hhbmdlcyBtYWRlIHRvIGV4aXN0aW5nIGNvbW1hbmRzIHdpbGwgdGFrZSBhbiBob3VyIHRvIHN1cmZhY2UuXG4gICAgICAgICAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2NyZWF0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIG9ubHkgYWNjZXNzaWJsZSBpbiBhIHNwZWNpZmljIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBmb3IuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgICAgICAgICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNjcmVhdGUtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCwgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICB9XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBkZWxldGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGdsb2JhbGx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZGVsZXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdsb2JhbDogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIGNvbW1hbmQgZnJvbS5cbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgZWRpdGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGVkaXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGd1aWxkOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICAgICAgICAgKiBAcGFyYW0gYmVhcmVyVG9rZW4gLSBUaGUgYmVhcmVyIHRva2VuIHRvIHVzZSB0byBtYWtlIHRoZSByZXF1ZXN0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kIHBlcm1pc3Npb25zLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBUaGUgYmVhcmVyIHRva2VuIHJlcXVpcmVzIHRoZSBgYXBwbGljYXRpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zLnVwZGF0ZWAgc2NvcGUgdG8gYmUgZW5hYmxlZCwgYW5kIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBndWlsZCB3aG9zZSBJRCBoYXMgYmVlbiBwcm92aWRlZCBpbiB0aGUgcGFyYW1ldGVycy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNlZGl0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcGVybWlzc2lvbnM6IChcbiAgICAgICAgICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICAgIGNvbW1hbmRJZDogQmlnU3RyaW5nLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHN0cmluZyxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10sXG4gICAgICAgICAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIGdldHRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldC5cbiAgICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG9uZTogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHlvdXIgYm90J3MgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbDogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIH1cbiAgICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQgYnkgaXRzIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG9uZTogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBieSB5b3VyIGJvdCBpbiBhIGd1aWxkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZHMgYXJlIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzc31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWxsOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIG9mIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcGVybWlzc2lvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhbGwgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkIGJ5IHRoZSBJRCBvZiB0aGUgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIG9mLlxuICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPj5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIGNvbW1hbmRzIGluIGJ1bGsuICovXG4gICAgICAgIHJlcGxhY2U6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZS1yZWdpc3RlcnMgdGhlIGxpc3Qgb2YgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLCBvdmVyd3JpdGluZyB0aGUgcHJldmlvdXMgY29tbWFuZHMgY29tcGxldGVseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4p2XIENvbW1hbmRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBgY29tbWFuZHNgIGFycmF5IHdpbGwgYmUgX19kZWxldGVkX18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgaW4gYSBndWlsZCwgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hvc2UgbGlzdCBvZiBjb21tYW5kcyB0byBvdmVyd3JpdGUuXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRzIC0gVGhlIGxpc3Qgb2YgY29tbWFuZHMgdG8gdXNlIHRvIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgbGlzdC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDinZcgQ29tbWFuZHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGBjb21tYW5kc2AgYXJyYXkgd2lsbCBiZSBfX2RlbGV0ZWRfXy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIOKaoO+4jyBDb21tYW5kcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGV4aXN0IHdpbGwgY291bnQgdG93YXJkcyB0aGUgZGFpbHkgbGltaXQgb2YgXzIwMF8gbmV3IGNvbW1hbmRzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqIFJlc3BvbnNlIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gY3JlYXRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2VuZHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBCeSBkZWZhdWx0LCBtZW50aW9ucyBhcmUgc3VwcHJlc3NlZC4gVG8gZW5hYmxlIG1lbnRpb25zLCBwYXNzIGEgbWVudGlvbiBvYmplY3Qgd2l0aCB0aGUgY2FsbGJhY2sgZGF0YS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICAgICAgICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAgICAgICAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvblJlc3BvbnNlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBTZW5kcyBhIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGludGVyYWN0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVyYWN0aW9uIHRvIHJlc3BvbmQgdG8uXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBJbnRlcmFjdGlvbiB0b2tlbnMgYXJlIG9ubHkgdmFsaWQgZm9yIF8xNSBtaW51dGVzXy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEJ5IGRlZmF1bHQsIG1lbnRpb25zIGFyZSBzdXBwcmVzc2VkLiBUbyBlbmFibGUgbWVudGlvbnMsIHBhc3MgYSBtZW50aW9uIG9iamVjdCB3aXRoIHRoZSBjYWxsYmFjayBkYXRhLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVW5saWtlIGBzZW5kTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgICAgICAgICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICAgICAgICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNjcmVhdGUtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBkZWxldGluZyBhIHJlc3BvbnNlLiAqL1xuICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBEZWxldGVzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZGVsZXRlTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmb2xsb3d1cDogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlcyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGRlbGV0ZU1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZGVsZXRlLW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICB9XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgZWRpdDoge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGVkaXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZWRpdC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6ICh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4gfCB1bmRlZmluZWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gZ2V0dGluZyBhIHJlc3BvbnNlLiAqL1xuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24gYnkgdGhlIElEIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0LlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqIFdlYmhvb2sgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgd2ViaG9va3M6IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd2ViaG9vay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSB3ZWJob29rIGluLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIOKaoO+4jyBUaGUgd2ViaG9vayBuYW1lIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnY2x5ZGUnIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2NyZWF0ZS13ZWJob29rfVxuICAgICAqL1xuICAgIGNyZWF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAvKiogTWV0aG9kcyB0byBkZWxldGUgYSB3ZWJob29rLiAqL1xuICAgIGRlbGV0ZToge1xuICAgICAgd2l0aDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVsZXRlcyBhIHdlYmhvb2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgICAgICAgKi9cbiAgICAgICAgaWQ6IChpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZGVsZXRlIHRoZSB3ZWJob29rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2std2l0aC10b2tlbn1cbiAgICAgICAgICovXG4gICAgICAgIHRva2VuOiAoaWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgfVxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgYSB3ZWJob29rLiAqL1xuICAgIGVkaXQ6IHtcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgd2ViaG9vay5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeVdlYmhvb2spID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgYSB3ZWJob29rIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSB3ZWJob29rLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI21vZGlmeS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBPbWl0PE1vZGlmeVdlYmhvb2ssICdjaGFubmVsSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgd2ViaG9vaywgY2F1c2luZyBhIG1lc3NhZ2UgdG8gYmUgcG9zdGVkIGluIHRoZSBjaGFubmVsIGNvbmZpZ3VyZWQgZm9yIHRoZSB3ZWJob29rLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGV4ZWN1dGUgdGhlIHdlYmhvb2suXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LCBvciBgdW5kZWZpbmVkYCBpZiB0aGUge0BsaW5rIEV4ZWN1dGVXZWJob29rLndhaXQgfCB3YWl0fSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSB3ZWJob29rIGNoYW5uZWwgaXMgYSBmb3J1bSBjaGFubmVsLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsdWUgZm9yIGVpdGhlciBgdGhyZWFkSWRgIG9yIGB0aHJlYWROYW1lYC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2V4ZWN1dGUtd2ViaG9va31cbiAgICAgKi9cbiAgICBleGVjdXRlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWN1dGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgd2ViaG9va3MuICovXG4gICAgZ2V0OiB7XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB3aGljaCB0byBnZXQgdGhlIHdlYmhvb2tzIG9mLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtY2hhbm5lbC13ZWJob29rc31cbiAgICAgICAqL1xuICAgICAgY2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtZ3VpbGQtd2ViaG9va3N9XG4gICAgICAgKi9cbiAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGEgd2ViaG9vayBtZXNzYWdlIGJ5IGl0cyBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldCBhIG1lc3NhZ2Ugb2YuXG4gICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBnZXQgd2ViaG9vayBtZXNzYWdlcy5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSB0aGUgSUQgb2YgdGhlIHdlYmhvb2sgbWVzc2FnZSB0byBnZXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRXZWJob29rTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgd2l0aDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHdlYmhvb2sgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rfVxuICAgICAgICAgKi9cbiAgICAgICAgaWQ6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBnZXQgdGhlIHdlYmhvb2suXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBtZXNzYWdlIHNlbnQgYnkgYSB3ZWJob29rLiAqL1xuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUgdGhlIG1lc3NhZ2UgYmVsb25naW5nIHRvLlxuICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gbWFuYWdlIHRoZSB3ZWJob29rLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGVsZXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgICAgICovXG4gICAgICBkZWxldGU6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gZWRpdGluZyBtZXNzYWdlcyBzZW50IGJ5IGEgd2ViaG9vay4gKi9cbiAgICAgIGVkaXQ6IFdlYmhvb2tNZXNzYWdlRWRpdG9yXG4gICAgfVxuICB9XG4gIC8qKiBVc2VyIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gIHVzZXJzOiB7XG4gICAgLyoqXG4gICAgICogR2V0cyBvciBjcmVhdGVzIGEgRE0gY2hhbm5lbCB3aXRoIGEgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy91c2VyI2NyZWF0ZS1kbX1cbiAgICAgKi9cbiAgICBjaGFubmVsOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgbWVtYmVyIHRvIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gYWRkIHRoZSBtZW1iZXIgdG8uXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIGFkZCB0byB0aGUgdGhyZWFkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBzZW5kIG1lc3NhZ2VzIGluIHRoZSB0aHJlYWQuXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2FkZC10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgYWRkVGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGF1dG9tb2QgcnVsZSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBydWxlIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHJ1bGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jY3JlYXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgY3JlYXRlQXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY2hhbm5lbCB3aXRoaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2hhbm5lbC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNldHRpbmcgcGVybWlzc2lvbiBvdmVyd3JpdGVzLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gaXMgb25seSBwb3NzaWJsZSBmb3IgZ3VpbGQgYWRtaW5pc3RyYXRvcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWNoYW5uZWx9XG4gICAqL1xuICBjcmVhdGVDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZENoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbW9qaSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbW9qaS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEVtb2ppcyBoYXZlIGEgbWF4aW11bSBmaWxlIHNpemUgb2YgMjU2IGtpbG9iaXRzLiBBdHRlbXB0aW5nIHRvIHVwbG9hZCBhIGxhcmdlciBlbW9qaSB3aWxsIGNhdXNlIHRoZSByb3V0ZSB0byByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjY3JlYXRlLWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgY3JlYXRlRW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgZm9ydW0gY2hhbm5lbCwgYW5kIHNlbmRzIGEgbWVzc2FnZSB3aXRoaW4gdGhlIGNyZWF0ZWQgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBmb3J1bSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgdGhyZWFkIHdpdGhpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0gd2l0aCBhIG5lc3RlZCB7QGxpbmsgTWVzc2FnZX0gb2JqZWN0LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC1pbi1mb3J1bS1jaGFubmVsfVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjcmVhdGVGb3J1bVRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVGb3J1bVBvc3RXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYWNjZXNzaWJsZSBnbG9iYWxseTsgYWNyb3NzIGRpZmZlcmVudCBndWlsZHMgYW5kIGNoYW5uZWxzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgKiDimqDvuI8gR2xvYmFsIGNvbW1hbmRzIG9uY2UgY3JlYXRlZCBhcmUgY2FjaGVkIGZvciBwZXJpb2RzIG9mIF9fYW4gaG91cl9fLCBzbyBjaGFuZ2VzIG1hZGUgdG8gZXhpc3RpbmcgY29tbWFuZHMgd2lsbCB0YWtlIGFuIGhvdXIgdG8gc3VyZmFjZS5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZDogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIG9ubHkgYWNjZXNzaWJsZSBpbiBhIHNwZWNpZmljIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCwgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2NyZWF0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGNyZWF0ZUd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGludml0ZSB0byBhIGNoYW5uZWwgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIGludml0ZSB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBpbnZpdGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkSW52aXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfSU5TVEFOVF9JTlZJVEVgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9JbnZpdGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVJlbWFya3NcbiAgICogVGhlIHJlcXVlc3QgYm9keSBpcyBub3Qgb3B0aW9uYWwsIGFuZCBhbiBlbXB0eSBKU09OIG9iamVjdCBtdXN0IGJlIHNlbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBmaWVsZHMgYXJlIGJlaW5nIHRyYW5zbWl0dGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcmVhdGUtY2hhbm5lbC1pbnZpdGV9XG4gICAqL1xuICBjcmVhdGVJbnZpdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IENyZWF0ZUNoYW5uZWxJbnZpdGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIGV2ZW50IGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQSBndWlsZCBjYW4gb25seSBoYXZlIGEgbWF4aW11bSBvZiAxMDAgZXZlbnRzIHdpdGggYSBzdGF0dXMgb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLkFjdGl2ZX0gb3Ige0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLlNjaGVkdWxlZH0gKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjY3JlYXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGNyZWF0ZVNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVTY2hlZHVsZWRFdmVudCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhZ2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNjcmVhdGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBjcmVhdGVTdGFnZUluc3RhbmNlOiAob3B0aW9uczogQ3JlYXRlU3RhZ2VJbnN0YW5jZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIHdlYmhvb2sgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIOKaoO+4jyBUaGUgd2ViaG9vayBuYW1lIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnY2x5ZGUnIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNjcmVhdGUtd2ViaG9va31cbiAgICovXG4gIGNyZWF0ZVdlYmhvb2s6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF1dG9tb2QgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgcnVsZSBmcm9tLlxuICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBhdXRvbW9kIHJ1bGUgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNkZWxldGUtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAqL1xuICBkZWxldGVBdXRvbW9kUnVsZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIGNoYW5uZWwgZnJvbSB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVkIHtAbGluayBDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGNvbW11bml0eSBndWlsZHMsIHRoZSBfUnVsZXNfLCBfR3VpZGVsaW5lc18gYW5kIF9Db21tdW5pdHkgVXBkYXRlXyBjaGFubmVscyBjYW5ub3QgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQ6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9UaHJlYWQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBPdGhlcndpc2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIC0g4pqg77iPIERlbGV0aW5nIGEgY2F0ZWdvcnkgY2hhbm5lbCBkb2VzIG5vdCBkZWxldGUgaXRzIGNoaWxkIGNoYW5uZWxzLlxuICAgKiAgIEluc3RlYWQsIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGBwYXJlbnRfaWRgIHByb3BlcnR5IHJlbW92ZWQsIGFuZCBhIGBDaGFubmVsIFVwZGF0ZWAgZ2F0ZXdheSBldmVudCB3aWxsIGZpcmUgZm9yIGVhY2ggb2YgdGhlbS5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9DaGFubmVsIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlY2xvc2UtY2hhbm5lbH1cbiAgICovXG4gIGRlbGV0ZUNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcGVybWlzc2lvbiBvdmVycmlkZSBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZSB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSBvZi5cbiAgICogQHBhcmFtIG92ZXJ3cml0ZUlkIC0gVGhlIElEIG9mIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1wZXJtaXNzaW9ufVxuICAgKi9cbiAgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvdmVyd3JpdGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gZW1vamkgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGVtb2ppIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2RlbGV0ZS1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGRlbGV0ZUVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBnbG9iYWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgY29tbWFuZCBmcm9tLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2RlbGV0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgdGVtcGxhdGUgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGRlbGV0ZUd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGludGVncmF0aW9uIGF0dGFjaGVkIHRvIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgaW50ZWdyYXRpb24uXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlZ3JhdGlvbiB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBEZWxldGVzIGFsbCB3ZWJob29rcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVncmF0aW9uLCBhbmQga2lja3MgdGhlIGFzc29jaWF0ZWQgYm90IGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgSW50ZWdyYXRpb25zIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfSW50ZWdyYXRpb24gRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLWludGVncmF0aW9ufVxuICAgKi9cbiAgZGVsZXRlSW50ZWdyYXRpb246IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gaW52aXRlQ29kZSAtIFRoZSBpbnZpdGUgY29kZSBvZiB0aGUgaW52aXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9JbnZpdGUgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1pbnZpdGV9XG4gICAqL1xuICBkZWxldGVJbnZpdGU6IChpbnZpdGVDb2RlOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIG1lc3NhZ2UgZnJvbSBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGZyb20uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIG5vdCBkZWxldGluZyBvd24gbWVzc2FnZTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1tZXNzYWdlfVxuICAgKi9cbiAgZGVsZXRlTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2U6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgc2NoZWR1bGVkIGV2ZW50IGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGRlbGV0ZVNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgYSBtb2RlcmF0b3Igb2YgdGhlIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEZpcmVzIGEgX1N0YWdlIEluc3RhbmNlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2RlbGV0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGRlbGV0ZVN0YWdlSW5zdGFuY2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgKi9cbiAgZGVsZXRlV2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gbWFuYWdlIHRoZSB3ZWJob29rLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2t9XG4gICAqL1xuICBkZWxldGVXZWJob29rTWVzc2FnZTogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IERlbGV0ZVdlYmhvb2tNZXNzYWdlT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHdlYmhvb2sgbWVzc2FnZSB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZGVsZXRlIHRoZSB3ZWJob29rLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2std2l0aC10b2tlbn1cbiAgICovXG4gIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBlcm1pc3Npb25zIGZvciBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQgdGhlIHBlcm1pc3Npb25zIG9mLlxuICAgKiBAcGFyYW0gYmVhcmVyVG9rZW4gLSBUaGUgYmVhcmVyIHRva2VuIHRvIHVzZSB0byBtYWtlIHRoZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZCBwZXJtaXNzaW9ucy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSBiZWFyZXIgdG9rZW4gcmVxdWlyZXMgdGhlIGBhcHBsaWNhdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMudXBkYXRlYCBzY29wZSB0byBiZSBlbmFibGVkLCBhbmQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGd1aWxkIHdob3NlIElEIGhhcyBiZWVuIHByb3ZpZGVkIGluIHRoZSBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zOiAoXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIGNvbW1hbmRJZDogQmlnU3RyaW5nLFxuICAgIGJlYXJlclRva2VuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXSxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gIC8qKlxuICAgKiBFZGl0cyBhbiBhdXRvbW9kIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBydWxlIGluLlxuICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBydWxlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbW9kaWZ5LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZWRpdEF1dG9tb2RSdWxlOiAoXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIHJ1bGVJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8RWRpdEF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnM+LFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gIC8qKlxuICAgKiBNb2RpZmllcyB0aGUgYm90J3MgdXNlcm5hbWUgb3IgYXZhdGFyLlxuICAgKiBOT1RFOiB1c2VybmFtZTogaWYgY2hhbmdlZCBtYXkgY2F1c2UgdGhlIGJvdCdzIGRpc2NyaW1pbmF0b3IgdG8gYmUgcmFuZG9taXplZC5cbiAgICovXG4gIGVkaXRCb3RQcm9maWxlOiAob3B0aW9uczogeyB1c2VybmFtZT86IHN0cmluZzsgYm90QXZhdGFyVVJMPzogc3RyaW5nIHwgbnVsbCB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRVc2VyPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgY2hhbm5lbCdzIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjaGFubmVsLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIGVkaXRpbmcgYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5Hcm91cERtfTpcbiAgICogLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogSWYgZWRpdGluZyBhIHRocmVhZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24gX191bmxlc3NfXyBpZiBzZXR0aW5nIHRoZSBgYXJjaGl2ZWRgIHByb3BlcnR5IHRvIGBmYWxzZWAgd2hlbiB0aGUgYGxvY2tlZGAgcHJvcGVydHkgaXMgYWxzbyBgZmFsc2VgLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGBTRU5EX01FU1NBR0VTYCBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiAtIEZpcmVzIGEgX1RocmVhZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIElmIGVkaXRpbmcgYSBndWlsZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiAtIElmIG1vZGlmeWluZyBwZXJtaXNzaW9uIG92ZXJyaWRlczpcbiAgICogICAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiAgIC0gT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogLSBJZiBtb2RpZnlpbmcgYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZENhdGVnb3J5fTpcbiAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGVhY2ggY2hpbGQgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICogLSBPdGhlcndpc2U6XG4gICAqICAgICAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKi9cbiAgZWRpdENoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5Q2hhbm5lbCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbiBvdmVycmlkZXMgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0IHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlcyBvZi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGVybWlzc2lvbiBvdmVycmlkZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIE9ubHkgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgb3IgcGFyZW50IGNoYW5uZWwgY2FuIGJlIGFsbG93ZWQvZGVuaWVkIF9fdW5sZXNzX18gdGhlIGJvdCB1c2VyIGhhcyBhIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gb3ZlcnJpZGUgaW4gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LWNoYW5uZWwtcGVybWlzc2lvbnN9XG4gICAqL1xuICBlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBvc2l0aW9ucyBvZiBhIHNldCBvZiBjaGFubmVscyBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gZWRpdCB0aGUgcG9zaXRpb25zIG9mIHRoZSBjaGFubmVscy5cbiAgICogQHBhcmFtIGNoYW5uZWxQb3NpdGlvbnMgLSBBIHNldCBvZiBvYmplY3RzIGRlZmluaW5nIHRoZSB1cGRhdGVkIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZC1jaGFubmVsLXBvc2l0aW9uc31cbiAgICovXG4gIGVkaXRDaGFubmVsUG9zaXRpb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjaGFubmVsUG9zaXRpb25zOiBNb2RpZnlHdWlsZENoYW5uZWxQb3NpdGlvbnNbXSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgYW4gZW1vamkuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBpbiB3aGljaCB0byBlZGl0IHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZW1vamkuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIGBHdWlsZCBFbW9qaXMgVXBkYXRlYCBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbW9kaWZ5LWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgZWRpdEVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGVkaXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZWRpdC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogRWRpdHMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kOiAoXG4gICAgY29tbWFuZElkOiBCaWdTdHJpbmcsXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogRWRpdHMgYSB0ZW1wbGF0ZSdzIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCBhIHRlbXBsYXRlIG9mLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjbW9kaWZ5LWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgZWRpdEd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdCB0aGUgbWVzc2FnZSBpbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRHMgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBlZGl0aW5nIGFub3RoZXIgdXNlcidzIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqIC0gT25seSB0aGUge0BsaW5rIEVkaXRNZXNzYWdlLmZsYWdzIHwgZmxhZ3N9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciBjYW4gYmUgZWRpdGVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+IHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG9yaWdpbmFsIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEgJiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHNjaGVkdWxlZCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBlZGl0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogVG8gc3RhcnQgb3IgZW5kIGFuIGV2ZW50LCBtb2RpZnkgdGhlIGV2ZW50J3MgYHN0YXR1c2AgcHJvcGVydHkuXG4gICAqXG4gICAqIFRoZSBgZW50aXR5X21ldGFkYXRhYCBwcm9wZXJ0eSBpcyBkaXNjYXJkZWQgZm9yIGV2ZW50cyB3aG9zZSBgZW50aXR5X3R5cGVgIGlzIG5vdCB7QGxpbmsgU2NoZWR1bGVkRXZlbnRFbnRpdHlUeXBlLkV4dGVybmFsfS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgU2NoZWR1bGVkIEV2ZW50IFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNtb2RpZnktZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgKi9cbiAgZWRpdFNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdFNjaGVkdWxlZEV2ZW50PikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogRWRpdHMgYSBzdGFnZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgdXBkYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgVXBkYXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI21vZGlmeS1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGVkaXRTdGFnZUluc3RhbmNlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIGRhdGE6IEVkaXRTdGFnZUluc3RhbmNlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2t9XG4gICAqL1xuICBlZGl0V2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgd2ViaG9vayBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGVkaXQgdGhlIG1lc3NhZ2Ugb2YuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9vay1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdFdlYmhvb2tNZXNzYWdlOiAoXG4gICAgd2ViaG9va0lkOiBCaWdTdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBtZXNzYWdlSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSAmIHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNtb2RpZnktd2ViaG9vay13aXRoLXRva2VufVxuICAgKi9cbiAgZWRpdFdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogT21pdDxNb2RpZnlXZWJob29rLCAnY2hhbm5lbElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogRXhlY3V0ZXMgYSB3ZWJob29rLCBjYXVzaW5nIGEgbWVzc2FnZSB0byBiZSBwb3N0ZWQgaW4gdGhlIGNoYW5uZWwgY29uZmlndXJlZCBmb3IgdGhlIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZXhlY3V0ZS5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZXhlY3V0ZSB0aGUgd2ViaG9vay5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHtAbGluayBFeGVjdXRlV2ViaG9vay53YWl0IHwgd2FpdH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIGlzIHNldCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB0aGUgd2ViaG9vayBjaGFubmVsIGlzIGEgZm9ydW0gY2hhbm5lbCwgeW91IG11c3QgcHJvdmlkZSBhIHZhbHVlIGZvciBlaXRoZXIgYHRocmVhZElkYCBvciBgdGhyZWFkTmFtZWAuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2V4ZWN1dGUtd2ViaG9va31cbiAgICovXG4gIGV4ZWN1dGVXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWN1dGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEZvbGxvd3MgYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwsIGFsbG93aW5nIG1lc3NhZ2VzIHBvc3RlZCB3aXRoaW4gaXQgdG8gYmUgY3Jvc3MtcG9zdGVkIGludG8gdGhlIHRhcmdldCBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBhbm5vdW5jZW1lbnQgY2hhbm5lbCB0byBmb2xsb3cuXG4gICAqIEBwYXJhbSB0YXJnZXRDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRhcmdldCBjaGFubmVsIC0gdGhlIGNoYW5uZWwgdG8gY3Jvc3MtcG9zdCB0by5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRGb2xsb3dlZENoYW5uZWx9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbiBpbiB0aGUgX190YXJnZXQgY2hhbm5lbF9fLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2ZvbGxvdy1hbm5vdW5jZW1lbnQtY2hhbm5lbH1cbiAgICovXG4gIGZvbGxvd0Fubm91bmNlbWVudDogKHNvdXJjZUNoYW5uZWxJZDogQmlnU3RyaW5nLCB0YXJnZXRDaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0aHJlYWRzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB0aHJlYWRzIG9mLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFjdGl2ZVRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXR1cm5zIGJvdGggcHVibGljIGFuZCBwcml2YXRlIHRocmVhZHMuXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtYWN0aXZlLWd1aWxkLXRocmVhZHN9XG4gICAqL1xuICBnZXRBY3RpdmVUaHJlYWRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBY3RpdmVUaHJlYWRzPj5cbiAgLyoqIEdldCB0aGUgYXBwbGljYXRpb25zIGluZm8gKi9cbiAgZ2V0QXBwbGljYXRpb25JbmZvOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbj4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIG9mIGFsbCBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQgYnkgdGhlIElEIG9mIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2JqZWN0cyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICovXG4gIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gYXV0b21vZCBydWxlIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZSBvZi5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jZ2V0LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhdXRvbW9kIHJ1bGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlcyBmcm9tLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcnVsZSBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbGlzdC1hdXRvLW1vZGVyYXRpb24tcnVsZXMtZm9yLWd1aWxkfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgY2hhbm5lbCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB0aGUgY2hhbm5lbCBpcyBhIHRocmVhZCwgYSB7QGxpbmsgVGhyZWFkTWVtYmVyfSBvYmplY3QgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LWNoYW5uZWx9XG4gICAqL1xuICBnZXRDaGFubmVsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBpbnZpdGVzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIE9ubHkgdXNhYmxlIGZvciBndWlsZCBjaGFubmVscy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LWNoYW5uZWwtaW52aXRlc31cbiAgICovXG4gIGdldENoYW5uZWxJbnZpdGVzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZU1ldGFkYXRhW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgY2hhbm5lbHMgb2YuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY2hhbm5lbCBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRXhjbHVkZXMgdGhyZWFkcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1jaGFubmVsc31cbiAgICovXG4gIGdldENoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsW10+PlxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2Ygd2ViaG9va3MgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB3aGljaCB0byBnZXQgdGhlIHdlYmhvb2tzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfSBvYmplY3RzIGFzc29ydGVkIGJ5IHdlYmhvb2sgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtY2hhbm5lbC13ZWJob29rc31cbiAgICovXG4gIGdldENoYW5uZWxXZWJob29rczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAvKipcbiAgICogR2V0cyBvciBjcmVhdGVzIGEgRE0gY2hhbm5lbCB3aXRoIGEgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBjcmVhdGUgdGhlIERNIGNoYW5uZWwgd2l0aC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3VzZXIjY3JlYXRlLWRtfVxuICAgKi9cbiAgZ2V0RG1DaGFubmVsOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogR2V0cyBhbiBlbW9qaSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZW1vamkuXG4gICAqIEBwYXJhbSBlbW9qaUlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjZ2V0LWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgZ2V0RW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIGVtb2ppSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamk+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBlbW9qaXMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB3aGljaCB0byBnZXQgdGhlIGVtb2ppcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkRW1vaml9IG9iamVjdHMgYXNzb3J0ZWQgYnkgZW1vamkgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNsaXN0LWd1aWxkLWVtb2ppc31cbiAgICovXG4gIGdldEVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamlbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24gYnkgdGhlIElEIG9mIHRoZSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZ2V0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAqXG4gICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2dldC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgZ2V0Rm9sbG93dXBNZXNzYWdlOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKiogR2V0IHRoZSBib3RzIEdhdGV3YXkgbWV0YWRhdGEgdGhhdCBjYW4gaGVscCBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiBsYXJnZSBvciBzaGFyZGVkIGJvdHMuICovXG4gIGdldEdhdGV3YXlCb3Q6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+PlxuICAvKipcbiAgICogR2V0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHlvdXIgYm90J3MgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICovXG4gIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHM6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gICAqIEdldHMgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGJ5IHlvdXIgYm90IGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZHMgYXJlIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzc31cbiAgICovXG4gIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAvKipcbiAgICogR2V0cyBhIHRlbXBsYXRlIGJ5IGl0cyBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGV9XG4gICAqL1xuICBnZXRHdWlsZFRlbXBsYXRlOiAodGVtcGxhdGVDb2RlOiBzdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVGVtcGxhdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdGVtcGxhdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGVzfVxuICAgKi9cbiAgZ2V0R3VpbGRUZW1wbGF0ZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC1ndWlsZC13ZWJob29rc31cbiAgICovXG4gIGdldEd1aWxkV2ViaG9va3M6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2tbXT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBhdHRhY2hlZCB0byBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBmcm9tLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEludGVncmF0aW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IGludGVncmF0aW9uIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1pbnRlZ3JhdGlvbnN9XG4gICAqL1xuICBnZXRJbnRlZ3JhdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludGVncmF0aW9uW10+PlxuICAvKipcbiAgICogR2V0cyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGJ5IGl0cyBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgaW52aXRlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2ludml0ZSNnZXQtaW52aXRlfVxuICAgKi9cbiAgZ2V0SW52aXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludml0ZXMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGludml0ZXMgZnJvbS5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnZpdGVNZXRhZGF0YSB8IEludml0ZX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZXN9XG4gICAqL1xuICBnZXRJbnZpdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc3RpY2tlciBwYWNrcyBhdmFpbGFibGUgdG8gTml0cm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBib3QgVGhlIGJvdCBpbnN0YW5jZSB0byB1c2UgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBTdGlja2VyUGFja30gb2JqZWN0cyBhc3NvcnRlZCBieSBzdGlja2VyIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNsaXN0LW5pdHJvLXN0aWNrZXItcGFja3N9XG4gICAqL1xuICBnZXROaXRyb1N0aWNrZXJQYWNrczogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlclBhY2tbXT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2U6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgKi9cbiAgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIHRoZSBib3QgaXMgYSBtZW1iZXIgb2YgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhyZWFkcy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBcmNoaXZlZFRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBSZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0uXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1qb2luZWQtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgKi9cbiAgZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHVibGljIGFyY2hpdmVkIHRocmVhZHMgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhyZWFkcy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFyY2hpdmVkVGhyZWFkc30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkVGV4dH0sIHJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQdWJsaWNUaHJlYWR9LlxuICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3N9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBhcmNoaXZlX3RpbWVzdGFtcGAgcHJvcGVydHkgaW5jbHVkZWQgaW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBvYmplY3QgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1wdWJsaWMtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgYSBzY2hlZHVsZWQgZXZlbnQgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAqL1xuICBnZXRTY2hlZHVsZWRFdmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogeyB3aXRoVXNlckNvdW50PzogYm9vbGVhbiB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNjaGVkdWxlZCBldmVudHMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHNjaGVkdWxlZCBldmVudHMgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnRzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fSBvYmplY3RzIGFzc29ydGVkIGJ5IGV2ZW50IElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2xpc3Qtc2NoZWR1bGVkLWV2ZW50cy1mb3ItZ3VpbGR9XG4gICAqL1xuICBnZXRTY2hlZHVsZWRFdmVudHM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBzdWJzY3JpYmVycyB0byBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIHRvIHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIG9mLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHN1YnNjcmliZXJzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVzZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBVc2VycyBhcmUgb3JkZXJlZCBieSB0aGVpciBJRHMgaW4gX2FzY2VuZGluZ18gb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZ2V0LWd1aWxkLXNjaGVkdWxlZC1ldmVudC11c2Vyc31cbiAgICovXG4gIGdldFNjaGVkdWxlZEV2ZW50VXNlcnM6IChcbiAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgZXZlbnRJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzLFxuICApID0+IFByb21pc2U8QXJyYXk8eyB1c2VyOiBDYW1lbGl6ZTxEaXNjb3JkVXNlcj47IG1lbWJlcj86IENhbWVsaXplPERpc2NvcmRNZW1iZXI+IH0+PlxuICAvKiogR2V0IHRoZSBib3RzIEdhdGV3YXkgbWV0YWRhdGEgdGhhdCBjYW4gaGVscCBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiBsYXJnZSBvciBzaGFyZGVkIGJvdHMuICovXG4gIGdldFNlc3Npb25JbmZvOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90Pj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRTdGFnZUluc3RhbmNlfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2dldC1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGdldFN0YWdlSW5zdGFuY2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgdGhyZWFkIG1lbWJlciBieSB0aGVpciB1c2VyIElELlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVyIG9mLlxuICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIHRocmVhZCBtZW1iZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFRocmVhZE1lbWJlcn0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgZ2V0VGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUaHJlYWRNZW1iZXI+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB0aHJlYWQgbWVtYmVycyBmb3IgYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byBnZXQgdGhlIHRocmVhZCBtZW1iZXJzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9IGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiB0byBoYXZlIHRoZSBgR1VJTERfTUVNQkVSU2AgcHJpdmlsZWdlZCBpbnRlbnQgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC10aHJlYWQtbWVtYmVyc31cbiAgICovXG4gIGdldFRocmVhZE1lbWJlcnM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyW10+PlxuICAvKipcbiAgICogR2V0IGEgdXNlcidzIGRhdGEgZnJvbSB0aGUgYXBpXG4gICAqXG4gICAqIEBwYXJhbSBpZCBUaGUgdXNlcidzIGlkXG4gICAqIEByZXR1cm5zIHtDYW1lbGl6ZTxEaXNjb3JkVXNlcj59XG4gICAqL1xuICBnZXRVc2VyOiAoaWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVXNlcj4+XG4gIC8qKlxuICAgKiBHZXRzIGEgd2ViaG9vayBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2t9XG4gICAqL1xuICBnZXRXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgbWVzc2FnZSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0IGEgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHdlYmhvb2sgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSB0aGUgSUQgb2YgdGhlIHdlYmhvb2sgbWVzc2FnZSB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2stbWVzc2FnZX1cbiAgICovXG4gIGdldFdlYmhvb2tNZXNzYWdlOiAoXG4gICAgd2ViaG9va0lkOiBCaWdTdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBtZXNzYWdlSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zPzogR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHRoZSB3ZWJob29rLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay13aXRoLXRva2VufVxuICAgKi9cbiAgZ2V0V2ViaG9va1dpdGhUb2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGJvdCB1c2VyIHRvIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gYWRkIHRoZSBib3QgdXNlciB0by5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjam9pbi10aHJlYWR9XG4gICAqL1xuICBqb2luVGhyZWFkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGJvdCB1c2VyIGZyb20gYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIGJvdCB1c2VyIGZyb20uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xlYXZlLXRocmVhZH1cbiAgICovXG4gIGxlYXZlVGhyZWFkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIENyb3NzLXBvc3RzIGEgbWVzc2FnZSBwb3N0ZWQgaW4gYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gc3Vic2NyaWJlZCBjaGFubmVscy5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgYW5ub3VuY2VtZW50IGNoYW5uZWwuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gY3Jvc3MtcG9zdC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyb3NzLXBvc3RlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogSWYgbm90IGNyb3NzLXBvc3Rpbmcgb3duIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudCBpbiB0aGUgZ3VpbGRzIHRoZSBzdWJzY3JpYmVkIGNoYW5uZWxzIGFyZSBpbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3Jvc3Nwb3N0LW1lc3NhZ2V9XG4gICAqL1xuICBwdWJsaXNoTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbWVtYmVyIGZyb20gYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIHRocmVhZCBtZW1iZXIgb2YuXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgdGhyZWFkIG1lbWJlciB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIHRoZSB0aHJlYWQgaXMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0sIHJlcXVpcmVzIHRvIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0aHJlYWQuXG4gICAqIE90aGVyd2lzZSwgcmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjcmVtb3ZlLXRocmVhZC1tZW1iZXJ9XG4gICAqL1xuICByZW1vdmVUaHJlYWRNZW1iZXI6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVzc2FnZSBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBib3QgdXNlciBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCBpbi5cbiAgICpcbiAgICogSWYgc2VuZGluZyBhIG1lc3NhZ2UgdG8gYSBndWlsZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogSWYgc2VuZGluZyBhIFRUUyBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9UVFNfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNlbmRpbmcgYSBtZXNzYWdlIGFzIGEgcmVwbHkgdG8gYW5vdGhlciBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqIC0gVGhlIG1lc3NhZ2UgYmVpbmcgcmVwbGllZCB0byBjYW5ub3QgYmUgYSBzeXN0ZW0gbWVzc2FnZS5cbiAgICpcbiAgICog4pqg77iPIFRoZSBtYXhpbXVtIHNpemUgb2YgYSByZXF1ZXN0IChhY2NvdW50aW5nIGZvciBhbnkgYXR0YWNobWVudHMgYW5kIG1lc3NhZ2UgY29udGVudCkgZm9yIGJvdCB1c2VycyBpcyBfOCBNaUJfLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLW1lc3NhZ2V9XG4gICAqL1xuICBzZW5kTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVNZXNzYWdlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBTZW5kcyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG1lbnRpb25zIGFyZSBzdXBwcmVzc2VkLiBUbyBlbmFibGUgbWVudGlvbnMsIHBhc3MgYSBtZW50aW9uIG9iamVjdCB3aXRoIHRoZSBjYWxsYmFjayBkYXRhLlxuICAgKlxuICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgc2VuZEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogU2VuZHMgYSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGludGVyYWN0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVyYWN0aW9uIHRvIHJlc3BvbmQgdG8uXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBJbnRlcmFjdGlvbiB0b2tlbnMgYXJlIG9ubHkgdmFsaWQgZm9yIF8xNSBtaW51dGVzXy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAqXG4gICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgc2VuZEludGVyYWN0aW9uUmVzcG9uc2U6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0aHJlYWQsIHVzaW5nIGFuIGV4aXN0aW5nIG1lc3NhZ2UgYXMgaXRzIHBvaW50IG9mIG9yaWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHRocmVhZC5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byB1c2UgYXMgdGhlIHRocmVhZCdzIHBvaW50IG9mIG9yaWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQ2hhbm5lbCB8IFRocmVhZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkVGV4dH0sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzfSwgY3JlYXRlcyBhIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzVGhyZWFkfS5cbiAgICogRG9lcyBub3Qgd29yayBvbiBjaGFubmVscyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRGb3J1bX0uXG4gICAqXG4gICAqIFRoZSBJRCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgSUQgb2YgdGhlIHNvdXJjZSBtZXNzYWdlLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtZnJvbS1tZXNzYWdlfVxuICAgKi9cbiAgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogU3RhcnRUaHJlYWRXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGhyZWFkIHdpdGhvdXQgdXNpbmcgYSBtZXNzYWdlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSB0aHJlYWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsIHwgVGhyZWFkfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ3JlYXRpbmcgYSBwcml2YXRlIHRocmVhZCByZXF1aXJlcyB0aGUgc2VydmVyIHRvIGJlIGJvb3N0ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC13aXRob3V0LW1lc3NhZ2V9XG4gICAqL1xuICBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogU3luY2hyb25pc2VzIGEgdGVtcGxhdGUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gc3luY2hyb25pc2UgYSB0ZW1wbGF0ZSBvZi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICovXG4gIHN5bmNHdWlsZFRlbXBsYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHR5cGluZyBpbmRpY2F0b3IgZm9yIHRoZSBib3QgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byB0cmlnZ2VyIHRoZSB0eXBpbmcgaW5kaWNhdG9yLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBHZW5lcmFsbHksIGJvdHMgc2hvdWxkIF9ub3RfIHVzZSB0aGlzIHJvdXRlLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UeXBpbmcgU3RhcnRfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3RyaWdnZXItdHlwaW5nLWluZGljYXRvcn1cbiAgICovXG4gIHRyaWdnZXJUeXBpbmdJbmRpY2F0b3I6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcywgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgKlxuICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICovXG4gIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHM6IChjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gICAqIFJlLXJlZ2lzdGVycyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQsIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21tYW5kcyBjb21wbGV0ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hvc2UgbGlzdCBvZiBjb21tYW5kcyB0byBvdmVyd3JpdGUuXG4gICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgKlxuICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgKi9cbiAgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gKiBCYW5zIGEgdXNlciBmcm9tIGEgZ3VpbGQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gYmFuIHRoZSB1c2VyIGZyb20uXG4gKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGJhbiBmcm9tIHRoZSBndWlsZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmFuLlxuICpcbiAqIEByZW1hcmtzXG4gKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICpcbiAqIEZpcmVzIGEgX0d1aWxkIEJhbiBBZGRfIGdhdGV3YXkgZXZlbnQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1iYW59XG4gKi9cbiAgYmFuTWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IENyZWF0ZUd1aWxkQmFuKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbmlja25hbWUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZW1iZXJ9XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlciBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktY3VycmVudC1tZW1iZXJ9XG4gICAqL1xuICBlZGl0Qm90TWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0Qm90TWVtYmVyT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgbWVtYmVyJ3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIG1lbWJlciBvZi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHVzZXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgdmFyaW91cyBwZXJtaXNzaW9ucyBkZXBlbmRpbmcgb24gd2hhdCBpcyBlZGl0ZWQgYWJvdXQgdGhlIG1lbWJlci5cbiAgICogVG8gZmluZCBvdXQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gdG8gZW5hY3QgYSBjaGFuZ2UsIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyBlbmRwb2ludCdzIHtAbGluayBNb2RpZnlHdWlsZE1lbWJlciB8IHBhcmFtZXRlcnN9LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLW1lbWJlcn1cbiAgICovXG4gIGVkaXRNZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZE1lbWJlcikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgLyoqXG4gKiBHZXRzIHRoZSBtZW1iZXIgb2JqZWN0IGJ5IHVzZXIgSUQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBtZW1iZXIgb2JqZWN0IGZvci5cbiAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gZ2V0IHRoZSBtZW1iZXIgb2JqZWN0IGZvci5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkTWVtYmVyV2l0aFVzZXJ9LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtbWVtYmVyfVxuICovXG4gIGdldE1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYEdVSUxEX01FTUJFUlNgIGludGVudC5cbiAgICpcbiAgICog4pqg77iPIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBlbmRwb2ludCB3aXRoIHZlcnkgbGFyZ2UgYm90cy4gSW5zdGVhZCwgb3B0IHRvIHVzZSBgZmV0Y2hNZW1iZXJzKClgOlxuICAgKiBSRVNUIGNvbW11bmljYXRpb24gb25seSBwZXJtaXRzIDUwIHJlcXVlc3RzIHRvIGJlIG1hZGUgcGVyIHNlY29uZCwgd2hpbGUgZ2F0ZXdheXMgYWxsb3cgZm9yIHVwIHRvIDEyMCByZXF1ZXN0c1xuICAgKiBwZXIgbWludXRlIHBlciBzaGFyZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c30uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL3JhdGUtbGltaXRzI3JhdGUtbGltaXRzfVxuICAgKi9cbiAgZ2V0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTGlzdEd1aWxkTWVtYmVycykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG5cbiAgLyoqXG4gKiBLaWNrcyBhIG1lbWJlciBmcm9tIGEgZ3VpbGQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8ga2ljayB0aGUgbWVtYmVyIGZyb20uXG4gKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBraWNrIGZyb20gdGhlIGd1aWxkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBSZXF1aXJlcyB0aGUgYEtJQ0tfTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAqXG4gKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtbWVtYmVyfVxuICovXG4gIGtpY2tNZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gKiBJbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZyBpbmFjdGl2ZSBtZW1iZXJzLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHBydW5lIHRoZSBtZW1iZXJzIG9mLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHBydW5pbmcgb2YgbWVtYmVycy5cbiAqIEByZXR1cm5zIEEgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgbWVtYmVycyB3ZXJlIHBydW5lZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gKlxuICog4p2XIFJlcXVlc3RzIHRvIHRoaXMgZW5kcG9pbnQgd2lsbCB0aW1lIG91dCBmb3IgbGFyZ2UgZ3VpbGRzLiBUbyBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcsIHNldCB0aGUge0BsaW5rIEJlZ2luR3VpbGRQcnVuZS5jb21wdXRlUHJ1bmVDb3VudH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIHRvIGBmYWxzZWAuIFRoaXMgd2lsbCBiZWdpbiB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nLCBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGB1bmRlZmluZWRgLCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhY3R1YWwgY291bnQgb2YgbWVtYmVycyB0aGF0IGhhdmUgYmVlbiBraWNrZWQuXG4gKlxuICog4pqg77iPIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2VzcyB3aWxsIG5vdCByZW1vdmUgbWVtYmVycyB3aXRoIGEgcm9sZS4gVG8gaW5jbHVkZSB0aGUgbWVtYmVycyB3aG8gaGF2ZSBhIF9wYXJ0aWN1bGFyIHN1YnNldCBvZiByb2xlc18sIHNwZWNpZnkgdGhlIHJvbGUocykgaW4gdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuaW5jbHVkZVJvbGVzIHwgaW5jbHVkZVJvbGVzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIuXG4gKlxuICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgbWVtYmVyIGtpY2tlZC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjYmVnaW4tZ3VpbGQtcHJ1bmV9XG4gKi9cbiAgcHJ1bmVNZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBCZWdpbkd1aWxkUHJ1bmUpID0+IFByb21pc2U8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT5cbiAgLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIG1lbWJlcnMgd2hvc2UgdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBzdGFydCB3aXRoIGEgcHJvdmlkZWQgc3RyaW5nLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHNlYXJjaCBpbi5cbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzdHJpbmcgdG8gbWF0Y2ggdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBhZ2FpbnN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbWJlcnMuXG4gKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjc2VhcmNoLWd1aWxkLW1lbWJlcnN9XG4gKi9cbiAgc2VhcmNoTWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8U2VhcmNoTWVtYmVycywgJ3F1ZXJ5Jz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAvKipcbiAqIFVuYmFucyBhIHVzZXIgZnJvbSBhIGd1aWxkLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHVuYmFuIHRoZSB1c2VyIGluLlxuICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byB1bmJhbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAqXG4gKiBGaXJlcyBhIF9HdWlsZCBCYW4gUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtYmFufVxuICovXG4gIHVuYmFuTWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0TWV0aG9kcyA9ICdHRVQnIHwgJ1BPU1QnIHwgJ0RFTEVURScgfCAnUEFUQ0gnIHwgJ1BVVCdcbmV4cG9ydCB0eXBlIEFwaVZlcnNpb25zID0gOSB8IDEwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV2ViaG9vayBleHRlbmRzIFdpdGhSZWFzb24ge1xuICAvKiogTmFtZSBvZiB0aGUgd2ViaG9vayAoMS04MCBjaGFyYWN0ZXJzKSAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIEltYWdlIHVybCBmb3IgdGhlIGRlZmF1bHQgd2ViaG9vayBhdmF0YXIgKi9cbiAgYXZhdGFyPzogc3RyaW5nIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucyB7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHNcbiAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHVuYXV0aG9yaXplZD86IGJvb2xlYW5cbiAgdXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEJvZHkge1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGJvZHk6IHN0cmluZyB8IEZvcm1EYXRhXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdE9wdGlvbnMge1xuICAvKiogVGhlIHVybCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLiAqL1xuICB1cmw6IHN0cmluZ1xuICAvKiogVGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBzZW5kaW5nIHRoZSByZXF1ZXN0LiAqL1xuICBtZXRob2Q6IFJlcXVlc3RNZXRob2RzXG4gIC8qKiBUaGUgYm9keSB0byBiZSBzZW50IGluIHRoZSByZXF1ZXN0LiAqL1xuICBib2R5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAvKiogVGhlIGFtb3VudCBvZiB0aW1lcyB0aGlzIHJlcXVlc3QgaGFzIGJlZW4gcmV0cmllZC4gKi9cbiAgcmV0cnlDb3VudDogbnVtYmVyXG4gIC8qKiBIYW5kbGVyIHRvIHJldHJ5IGEgcmVxdWVzdCBzaG91bGQgaXQgYmUgcmF0ZSBsaW1pdGVkLiAqL1xuICByZXRyeVJlcXVlc3Q/OiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBSZXNvbHZlIGhhbmRsZXIgd2hlbiBhIHJlcXVlc3Qgc3VjY2VlZHMuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogYW55IHwgUHJvbWlzZUxpa2U8YW55PikgPT4gdm9pZFxuICAvKiogUmVqZWN0IGhhbmRsZXIgd2hlbiBhIHJlcXVlc3QgZmFpbHMuICovXG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxuICAvKiogSWYgdGhpcyByZXF1ZXN0IGhhcyBhIGJ1Y2tldCBpZCB3aGljaCBpdCBmYWxscyB1bmRlciBmb3IgcmF0ZSBsaW1pdCAqL1xuICBidWNrZXRJZD86IHN0cmluZ1xuICAvKiogQWRkaXRpb25hbCByZXF1ZXN0IG9wdGlvbnMsIHVzZWQgZm9yIHRoaW5ncyBsaWtlIG92ZXJyaWRpbmcgYXV0aG9yaXphdGlvbiBoZWFkZXIuICovXG4gIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdFJhdGVMaW1pdGVkUGF0aCB7XG4gIHVybDogc3RyaW5nXG4gIHJlc2V0VGltZXN0YW1wOiBudW1iZXJcbiAgYnVja2V0SWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rTWVzc2FnZUVkaXRvciB7XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2stbWVzc2FnZX1cbiAgICovXG4gICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhICYgeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KTogUHJvbWlzZTxcbiAgICBDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT5cbiAgPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG9yaWdpbmFsIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBvcmlnaW5hbDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSAmIHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG59XG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRlbXBsYXRlIHtcbiAgLyoqIE5hbWUgd2hpY2ggdGhlIHRlbXBsYXRlIHNob3VsZCBoYXZlICovXG4gIG5hbWU6IHN0cmluZ1xuICAvKiogRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3RlbXBsYXRlI21vZGlmeS1ndWlsZC10ZW1wbGF0ZSAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RpZnlHdWlsZFRlbXBsYXRlIHtcbiAgLyoqIE5hbWUgb2YgdGhlIHRlbXBsYXRlICgxLTEwMCBjaGFyYWN0ZXJzKSAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKiBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgKDAtMTIwIGNoYXJhY3RlcnMpICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNjcmVhdGUtZ3VpbGQtYmFuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUd1aWxkQmFuIGV4dGVuZHMgV2l0aFJlYXNvbiB7XG4gIC8qKiBOdW1iZXIgb2Ygc2Vjb25kcyB0byBkZWxldGUgbWVzc2FnZXMgZm9yLCBiZXR3ZWVuIDAgYW5kIDYwNDgwMCAoNyBkYXlzKSAqL1xuICBkZWxldGVNZXNzYWdlU2Vjb25kcz86IG51bWJlclxufVxuZXhwb3J0IGludGVyZmFjZSBFZGl0Qm90TWVtYmVyT3B0aW9ucyBleHRlbmRzIFdpdGhSZWFzb24ge1xuICBuaWNrPzogc3RyaW5nIHwgbnVsbFxufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktZ3VpbGQtbWVtYmVyICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmeUd1aWxkTWVtYmVyIHtcbiAgLyoqIFZhbHVlIHRvIHNldCB1c2VycyBuaWNrbmFtZSB0by4gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTklDS05BTUVTYCBwZXJtaXNzaW9uICovXG4gIG5pY2s/OiBzdHJpbmcgfCBudWxsXG4gIC8qKiBBcnJheSBvZiByb2xlIGlkcyB0aGUgbWVtYmVyIGlzIGFzc2lnbmVkLiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiAqL1xuICByb2xlcz86IEJpZ1N0cmluZ1tdIHwgbnVsbFxuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBtdXRlZCBpbiB2b2ljZSBjaGFubmVscy4gV2lsbCB0aHJvdyBhIDQwMCBpZiB0aGUgdXNlciBpcyBub3QgaW4gYSB2b2ljZSBjaGFubmVsLiBSZXF1aXJlcyB0aGUgYE1VVEVfTUVNQkVSU2AgcGVybWlzc2lvbiAqL1xuICBtdXRlPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgZGVhZmVuZWQgaW4gdm9pY2UgY2hhbm5lbHMuIFdpbGwgdGhyb3cgYSA0MDAgaWYgdGhlIHVzZXIgaXMgbm90IGluIGEgdm9pY2UgY2hhbm5lbC4gUmVxdWlyZXMgdGhlIGBNT1ZFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgZGVhZj86IGJvb2xlYW4gfCBudWxsXG4gIC8qKiBJZCBvZiBjaGFubmVsIHRvIG1vdmUgdXNlciB0byAoaWYgdGhleSBhcmUgY29ubmVjdGVkIHRvIHZvaWNlKS4gUmVxdWlyZXMgdGhlIGBNT1ZFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgY2hhbm5lbElkPzogQmlnU3RyaW5nIHwgbnVsbFxuICAvKiogd2hlbiB0aGUgdXNlcidzIHRpbWVvdXQgd2lsbCBleHBpcmUgYW5kIHRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSBpbiB0aGUgZ3VpbGQgYWdhaW4gKHVwIHRvIDI4IGRheXMgaW4gdGhlIGZ1dHVyZSksIHNldCB0byBudWxsIHRvIHJlbW92ZSB0aW1lb3V0LiBSZXF1aXJlcyB0aGUgYE1PREVSQVRFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgY29tbXVuaWNhdGlvbkRpc2FibGVkVW50aWw/OiBudW1iZXIgfCBudWxsXG59XG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lICovXG5leHBvcnQgaW50ZXJmYWNlIEJlZ2luR3VpbGRQcnVuZSB7XG4gIC8qKiBOdW1iZXIgb2YgZGF5cyB0byBwcnVuZSAoMSBvciBtb3JlKSwgZGVmYXVsdDogNyAqL1xuICBkYXlzPzogbnVtYmVyXG4gIC8qKiBXaGV0aGVyICdwcnVuZWQnIGlzIHJldHVybmVkLCBkaXNjb3VyYWdlZCBmb3IgbGFyZ2UgZ3VpbGRzLCBkZWZhdWx0OiB0cnVlICovXG4gIGNvbXB1dGVQcnVuZUNvdW50PzogYm9vbGVhblxuICAvKiogUm9sZShzKSBybyBpbmNsdWRlLCBkZWZhdWx0OiBub25lICovXG4gIGluY2x1ZGVSb2xlcz86IHN0cmluZ1tdXG59XG4iXSwibmFtZXMiOlsiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiY2FtZWxpemUiLCJkZWxheSIsImdldEJvdElkRnJvbVRva2VuIiwidXJsVG9CYXNlNjQiLCJjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCIsIlF1ZXVlIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJvcHRpb25zIiwidG9rZW4iLCJFcnJvciIsInJlc3QiLCJhcHBsaWNhdGlvbklkIiwiQmlnSW50IiwidmVyc2lvbiIsImJhc2VVcmwiLCJtYXhSZXRyeUNvdW50IiwiSW5maW5pdHkiLCJnbG9iYWxseVJhdGVMaW1pdGVkIiwicHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwiaW52YWxpZEJ1Y2tldCIsInJvdXRlcyIsIndlYmhvb2tzIiwiaWQiLCJ3ZWJob29rSWQiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwidXJsIiwidGhyZWFkSWQiLCJvcmlnaW5hbCIsIndlYmhvb2siLCJ3YWl0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzZXNzaW9uSW5mbyIsImdhdGV3YXlCb3QiLCJjaGFubmVscyIsImRtIiwiY2hhbm5lbElkIiwiY2hhbm5lbCIsImZvbGxvdyIsImZvcnVtIiwiaW52aXRlcyIsIm1lc3NhZ2VzIiwib3ZlcndyaXRlIiwib3ZlcndyaXRlSWQiLCJjcm9zc3Bvc3QiLCJzdGFnZXMiLCJzdGFnZSIsInRocmVhZHMiLCJhbGwiLCJhY3RpdmUiLCJndWlsZElkIiwibWVtYmVycyIsIm1lIiwidXNlciIsInVzZXJJZCIsImFyY2hpdmVkIiwicHVibGljIiwiYmVmb3JlIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwibGltaXQiLCJwcml2YXRlIiwiam9pbmVkIiwidHlwaW5nIiwiZ3VpbGRzIiwiYXV0b21vZCIsInJ1bGUiLCJydWxlSWQiLCJydWxlcyIsImVtb2ppIiwiZW1vamlJZCIsImVtb2ppcyIsImV2ZW50cyIsIndpdGhVc2VyQ291bnQiLCJldmVudCIsImV2ZW50SWQiLCJ1c2VycyIsIndpdGhNZW1iZXIiLCJhZnRlciIsImludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9ucyIsImludml0ZSIsImludml0ZUNvZGUiLCJ3aXRoQ291bnRzIiwid2l0aEV4cGlyYXRpb24iLCJzY2hlZHVsZWRFdmVudElkIiwiYmFuIiwiYm90IiwibWVtYmVyIiwic2VhcmNoIiwicXVlcnkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwcnVuZSIsImRheXMiLCJBcnJheSIsImlzQXJyYXkiLCJpbmNsdWRlUm9sZXMiLCJqb2luIiwidGVtcGxhdGVzIiwiY29kZSIsImd1aWxkIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJvbmUiLCJjb21tYW5kSWQiLCJ3aXRoTG9jYWxpemF0aW9ucyIsInBlcm1pc3Npb25zIiwicGVybWlzc2lvbiIsImNvbW1hbmQiLCJyZXNwb25zZXMiLCJjYWxsYmFjayIsImludGVyYWN0aW9uSWQiLCJ1c2VyQm90Iiwib2F1dGgyQXBwbGljYXRpb24iLCJuaXRyb1N0aWNrZXJQYWNrcyIsImNoZWNrUmF0ZUxpbWl0cyIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwicmVzZXRUaW1lc3RhbXAiLCJjcmVhdGVSZXF1ZXN0IiwiaGVhZGVycyIsInVuYXV0aG9yaXplZCIsImF1dGhvcml6YXRpb24iLCJrZXkiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZCIsImJvZHkiLCJyZWFzb24iLCJpbmNsdWRlcyIsImZpbGUiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJ2YWx1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJzaXplIiwic2V0VGltZW91dCIsInByb2Nlc3NIZWFkZXJzIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJidWNrZXRJZCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJpbnRlcnZhbCIsIm1heCIsInNldCIsImdsb2JhbFJlc2V0Iiwic2VuZFJlcXVlc3QiLCJyZXNwb25zZSIsImZldGNoIiwic2ltcGxpZnlVcmwiLCJzdGF0dXMiLCJyZXRyeUNvdW50IiwicmVqZWN0Iiwib2siLCJlcnJvciIsInJlc2V0QWZ0ZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwianNvbiIsInJvdXRlIiwicmVwbGFjZSIsIm1hdGNoIiwicCIsInN1YnN0cmluZyIsImluZGV4T2YiLCJlbmRzV2l0aCIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInBhcnRzIiwic3BsaXQiLCJzaGlmdCIsInN0YXJ0c1dpdGgiLCJxdWV1ZSIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJQcm9taXNlIiwicG9zdCIsInBhdGNoIiwicHV0IiwiZGVsZXRlTWVzc2FnZSIsImVkaXQiLCJlZGl0TWVzc2FnZSIsInNlbmQiLCJzZW5kTWVzc2FnZSIsInB1Ymxpc2giLCJwdWJsaXNoTWVzc2FnZSIsImdldENoYW5uZWwiLCJjcmVhdGUiLCJjcmVhdGVDaGFubmVsIiwiZGVsZXRlQ2hhbm5lbCIsImVkaXRDaGFubmVsIiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwiZm9sbG93QW5ub3VuY2VtZW50IiwiZm9ydW1zIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwicG9zaXRpb25zIiwiY2hhbm5lbFBvc2l0aW9ucyIsImVkaXRDaGFubmVsUG9zaXRpb25zIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsImRhdGEiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsImdldFN0YWdlSW5zdGFuY2UiLCJ3aXRoIiwic3RhcnRUaHJlYWRXaXRoTWVzc2FnZSIsIndpdGhvdXQiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImpvaW5UaHJlYWQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwia2ljayIsInJlbW92ZVRocmVhZE1lbWJlciIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJjcmVhdGVFbW9qaSIsImRlbGV0ZUVtb2ppIiwiZWRpdEVtb2ppIiwiZ2V0RW1vamkiLCJjcmVhdGVBdXRvbW9kUnVsZSIsImRlbGV0ZUF1dG9tb2RSdWxlIiwiZWRpdEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRDaGFubmVscyIsImdldEVtb2ppcyIsImNyZWF0ZVNjaGVkdWxlZEV2ZW50IiwiZGVsZXRlU2NoZWR1bGVkRXZlbnQiLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJnZXRTY2hlZHVsZWRFdmVudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJnZXRJbnRlZ3JhdGlvbnMiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImNyZWF0ZUludml0ZSIsImRlbGV0ZUludml0ZSIsImdldEludml0ZSIsImxpc3QiLCJnZXRJbnZpdGVzIiwiY3JlYXRlR3VpbGRUZW1wbGF0ZSIsInRlbXBsYXRlQ29kZSIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJlZGl0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsInN5bmMiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImVkaXRNZW1iZXIiLCJlZGl0U2VsZiIsImVkaXRCb3RNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXREbUNoYW5uZWwiLCJraWNrTWVtYmVyIiwiZ2V0TWVtYmVycyIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJ1bmJhbiIsInVuYmFuTWVtYmVyIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJiZWFyZXJUb2tlbiIsImVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsInVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJmb2xsb3d1cCIsInNlbmRGb2xsb3d1cE1lc3NhZ2UiLCJzZW5kSW50ZXJhY3Rpb25SZXNwb25zZSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiY3JlYXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2siLCJkZWxldGVXZWJob29rV2l0aFRva2VuIiwiZWRpdFdlYmhvb2siLCJlZGl0V2ViaG9va1dpdGhUb2tlbiIsImV4ZWN1dGUiLCJleGVjdXRlV2ViaG9vayIsImdldENoYW5uZWxXZWJob29rcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2siLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZGVsZXRlV2ViaG9va01lc3NhZ2UiLCJPYmplY3QiLCJhc3NpZ24iLCJlZGl0V2ViaG9va01lc3NhZ2UiLCJlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSIsImFkZFRocmVhZE1lbWJlciIsIm5hbWUiLCJhdmF0YXIiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsInVzZXJuYW1lIiwidHJpbSIsInR5cGUiLCJVcGRhdGVNZXNzYWdlIiwidG9waWMiLCJ3ZWJob29rX2NoYW5uZWxfaWQiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJyZWNpcGllbnRfaWQiLCJnZXRHYXRld2F5Qm90IiwiZ2V0Tml0cm9TdGlja2VyUGFja3MiLCJnZXRTZXNzaW9uSW5mbyIsImdldFVzZXIiLCJBdXRob3JpemF0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFTQSw0QkFBQUEsQ0FBd0IsS0FBUSxtQkFBbUIsQUFDNUQsUUFBU0MsWUFBQUEsQ0FBUSxDQUFFQyxTQUFBQSxDQUFLLENBQUVDLHFCQUFBQSxDQUFpQixDQUFFQyxlQUFBQSxDQUFXLEtBQVEsbUJBQW1CLEFBRW5GLFFBQVNDLDhCQUFBQSxDQUEwQixLQUFRLG9CQUFvQixBQUMvRCxRQUFTQyxTQUFBQSxDQUFLLEtBQVEsWUFBWSxBQXlFbEMsUUFBTyxTQUFTQyxrQkFBa0JDLENBQWlDLENBQWUsQ0FFaEYsR0FBSSxDQUFDQSxFQUFRQyxLQUFLLENBQUUsTUFBTSxBQUFJQyxNQUFNLGtDQUFrQyxDQUV0RSxJQUFNQyxFQUFvQixDQUN4QkYsTUFBT0QsRUFBUUMsS0FBSyxDQUNwQkcsY0FBZUosRUFBUUksYUFBYSxDQUFHQyxPQUFPTCxFQUFRSSxhQUFhLEVBQUlULEVBQWtCSyxFQUFRQyxLQUFLLENBQUMsQ0FDdkdLLFFBQVNOLEVBQVFNLE9BQU8sRUFBSSxHQUM1QkMsUUFBU1As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
|
|
1
|
+
/* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { calculateBits, camelToSnakeCase, camelize, delay, getBotIdFromToken, logger, processReactionString, urlToBase64, snakelize } from '@discordeno/utils';
|
|
2
|
+
import { createInvalidRequestBucket } from './invalidBucket.js';
|
|
3
|
+
import { Queue } from './queue.js';
|
|
4
|
+
import { InteractionResponseTypes } from '@discordeno/types';
|
|
5
|
+
import { createRoutes } from './routes.js';
|
|
6
|
+
// TODO: make dynamic based on package.json file
|
|
7
|
+
const version = '19.0.0-alpha.1';
|
|
8
|
+
export const DISCORD_API_VERSION = 10;
|
|
9
|
+
export const DISCORD_API_URL = 'https://discord.com/api';
|
|
10
|
+
export const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
|
|
11
|
+
export const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
|
|
12
|
+
export const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
|
|
13
|
+
export const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
|
|
14
|
+
export const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
|
|
15
|
+
export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
|
|
16
|
+
export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
|
|
17
|
+
export function createRestManager(options) {
|
|
18
|
+
const applicationId = options.applicationId ? BigInt(options.applicationId) : options.token ? getBotIdFromToken(options.token) : undefined;
|
|
19
|
+
if (!applicationId) {
|
|
20
|
+
throw new Error('`applicationId` was not provided and was not able to extract the id from the bots token. Please explicitly pass `applicationId` to the rest manager.');
|
|
21
|
+
}
|
|
22
|
+
const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
|
|
23
|
+
const rest = {
|
|
24
|
+
applicationId,
|
|
25
|
+
authorization: options.proxy?.authorization,
|
|
26
|
+
baseUrl,
|
|
27
|
+
deleteQueueDelay: 60000,
|
|
28
|
+
globallyRateLimited: false,
|
|
29
|
+
invalidBucket: createInvalidRequestBucket({}),
|
|
30
|
+
isProxied: !baseUrl.startsWith(DISCORD_API_URL),
|
|
31
|
+
maxRetryCount: Infinity,
|
|
32
|
+
processingRateLimitedPaths: false,
|
|
33
|
+
queues: new Map(),
|
|
34
|
+
rateLimitedPaths: new Map(),
|
|
35
|
+
token: options.token,
|
|
36
|
+
version: options.version ?? DISCORD_API_VERSION,
|
|
37
|
+
routes: createRoutes(),
|
|
38
|
+
checkRateLimits (url) {
|
|
39
|
+
const ratelimited = rest.rateLimitedPaths.get(url);
|
|
40
|
+
const global = rest.rateLimitedPaths.get('global');
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
if (ratelimited && now < ratelimited.resetTimestamp) {
|
|
43
|
+
return ratelimited.resetTimestamp - now;
|
|
44
|
+
}
|
|
45
|
+
if (global && now < global.resetTimestamp) {
|
|
46
|
+
return global.resetTimestamp - now;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
},
|
|
50
|
+
changeToDiscordFormat (obj) {
|
|
51
|
+
if (obj === null) return null;
|
|
52
|
+
if (typeof obj === 'object') {
|
|
53
|
+
if (Array.isArray(obj)) {
|
|
54
|
+
return obj.map((item)=>rest.changeToDiscordFormat(item));
|
|
55
|
+
}
|
|
56
|
+
const newObj = {};
|
|
57
|
+
for (const key of Object.keys(obj)){
|
|
58
|
+
const value = obj[key];
|
|
59
|
+
// Some falsy values should be allowed like null or 0
|
|
60
|
+
if (value !== undefined) {
|
|
61
|
+
switch(key){
|
|
62
|
+
case 'permissions':
|
|
63
|
+
case 'allow':
|
|
64
|
+
case 'deny':
|
|
65
|
+
newObj[key] = typeof value === 'string' ? value : calculateBits(value);
|
|
66
|
+
continue;
|
|
67
|
+
case 'defaultMemberPermissions':
|
|
68
|
+
newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
|
|
69
|
+
continue;
|
|
70
|
+
case 'nameLocalizations':
|
|
71
|
+
newObj.name_localizations = value;
|
|
72
|
+
continue;
|
|
73
|
+
case 'descriptionLocalizations':
|
|
74
|
+
newObj.description_localizations = value;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(value);
|
|
79
|
+
}
|
|
80
|
+
return newObj;
|
|
81
|
+
}
|
|
82
|
+
if (typeof obj === 'bigint') return obj.toString();
|
|
83
|
+
return obj;
|
|
84
|
+
},
|
|
85
|
+
createRequestBody (method, options) {
|
|
86
|
+
const headers = {
|
|
87
|
+
'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
|
|
88
|
+
};
|
|
89
|
+
if (options?.unauthorized !== false) headers.authorization = `Bot ${rest.token}`;
|
|
90
|
+
// IF A REASON IS PROVIDED ENCODE IT IN HEADERS
|
|
91
|
+
if (options?.reason !== undefined) {
|
|
92
|
+
headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
|
|
93
|
+
}
|
|
94
|
+
let body;
|
|
95
|
+
// TODO: check if we need to add specific check for GET method
|
|
96
|
+
// Since GET does not allow bodies
|
|
97
|
+
// Have to check for attachments first, since body then has to be send in a different way.
|
|
98
|
+
if (options?.files !== undefined) {
|
|
99
|
+
const form = new FormData();
|
|
100
|
+
for(let i = 0; i < options.files.length; ++i){
|
|
101
|
+
form.append(`file${i}`, options.files[i].blob, options.files[i].name);
|
|
102
|
+
}
|
|
103
|
+
form.append('payload_json', JSON.stringify(snakelize({
|
|
104
|
+
...options.body,
|
|
105
|
+
files: undefined
|
|
106
|
+
})));
|
|
107
|
+
body = form;
|
|
108
|
+
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
109
|
+
} else if (options?.body !== undefined) {
|
|
110
|
+
if (options.body instanceof FormData) {
|
|
111
|
+
body = options.body;
|
|
112
|
+
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
113
|
+
} else {
|
|
114
|
+
body = JSON.stringify(rest.changeToDiscordFormat(options.body));
|
|
115
|
+
headers['content-type'] = `application/json`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
|
|
119
|
+
if (options?.headers) {
|
|
120
|
+
Object.assign(headers, options.headers);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
body,
|
|
124
|
+
headers,
|
|
125
|
+
method
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
processRateLimitedPaths () {
|
|
129
|
+
const now = Date.now();
|
|
130
|
+
for (const [key, value] of rest.rateLimitedPaths.entries()){
|
|
131
|
+
// rest.debug(
|
|
132
|
+
// `[REST - processRateLimitedPaths] Running for of loop. ${
|
|
133
|
+
// value.resetTimestamp - now
|
|
134
|
+
// }`
|
|
135
|
+
// )
|
|
136
|
+
// If the time has not reached cancel
|
|
137
|
+
if (value.resetTimestamp > now) continue;
|
|
138
|
+
// Rate limit is over, delete the rate limiter
|
|
139
|
+
rest.rateLimitedPaths.delete(key);
|
|
140
|
+
// If it was global, also mark the global value as false
|
|
141
|
+
if (key === 'global') rest.globallyRateLimited = false;
|
|
142
|
+
}
|
|
143
|
+
// ALL PATHS ARE CLEARED CAN CANCEL OUT!
|
|
144
|
+
if (rest.rateLimitedPaths.size === 0) {
|
|
145
|
+
rest.processingRateLimitedPaths = false;
|
|
146
|
+
} else {
|
|
147
|
+
rest.processingRateLimitedPaths = true;
|
|
148
|
+
// RECHECK IN 1 SECOND
|
|
149
|
+
setTimeout(()=>{
|
|
150
|
+
// rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
|
|
151
|
+
rest.processRateLimitedPaths();
|
|
152
|
+
}, 1000);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
/** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
|
|
156
|
+
let rateLimited = false;
|
|
157
|
+
// GET ALL NECESSARY HEADERS
|
|
158
|
+
const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
|
|
159
|
+
const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
160
|
+
const reset = Date.now() + Number(retryAfter) * 1000;
|
|
161
|
+
const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
|
|
162
|
+
// undefined override null needed for typings
|
|
163
|
+
const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
|
|
164
|
+
const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
|
|
165
|
+
rest.queues.get(url)?.handleCompletedRequest({
|
|
166
|
+
remaining: remaining ? Number(remaining) : undefined,
|
|
167
|
+
interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
|
|
168
|
+
max: limit ? Number(limit) : undefined
|
|
169
|
+
});
|
|
170
|
+
// IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
|
|
171
|
+
if (remaining === '0') {
|
|
172
|
+
rateLimited = true;
|
|
173
|
+
// SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
|
|
174
|
+
rest.rateLimitedPaths.set(url, {
|
|
175
|
+
url,
|
|
176
|
+
resetTimestamp: reset,
|
|
177
|
+
bucketId
|
|
178
|
+
});
|
|
179
|
+
// SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
|
|
180
|
+
if (bucketId) {
|
|
181
|
+
rest.rateLimitedPaths.set(bucketId, {
|
|
182
|
+
url,
|
|
183
|
+
resetTimestamp: reset,
|
|
184
|
+
bucketId
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
|
|
189
|
+
if (global) {
|
|
190
|
+
const retryAfter = headers.get('retry-after');
|
|
191
|
+
const globalReset = Date.now() + Number(retryAfter) * 1000;
|
|
192
|
+
// rest.debug(
|
|
193
|
+
// `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
|
|
194
|
+
// )
|
|
195
|
+
rest.globallyRateLimited = true;
|
|
196
|
+
rateLimited = true;
|
|
197
|
+
setTimeout(()=>{
|
|
198
|
+
rest.globallyRateLimited = false;
|
|
199
|
+
}, globalReset);
|
|
200
|
+
rest.rateLimitedPaths.set('global', {
|
|
201
|
+
url: 'global',
|
|
202
|
+
resetTimestamp: globalReset,
|
|
203
|
+
bucketId
|
|
204
|
+
});
|
|
205
|
+
if (bucketId) {
|
|
206
|
+
rest.rateLimitedPaths.set(bucketId, {
|
|
207
|
+
url: 'global',
|
|
208
|
+
resetTimestamp: globalReset,
|
|
209
|
+
bucketId
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (rateLimited && !rest.processingRateLimitedPaths) {
|
|
214
|
+
rest.processRateLimitedPaths();
|
|
215
|
+
}
|
|
216
|
+
return rateLimited ? bucketId : undefined;
|
|
217
|
+
},
|
|
218
|
+
async sendRequest (options) {
|
|
219
|
+
const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
|
|
220
|
+
const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
|
|
221
|
+
logger.debug(`sending request to ${url}`, 'with payload:', {
|
|
222
|
+
...payload,
|
|
223
|
+
headers: {
|
|
224
|
+
...payload.headers,
|
|
225
|
+
authorization: 'Bot tokenhere'
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
const response = await fetch(url, payload).catch(async (error)=>{
|
|
229
|
+
logger.error(error);
|
|
230
|
+
// Mark request and completed
|
|
231
|
+
rest.invalidBucket.handleCompletedRequest(999, false);
|
|
232
|
+
options.reject({
|
|
233
|
+
ok: false,
|
|
234
|
+
status: 999,
|
|
235
|
+
error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
|
|
236
|
+
});
|
|
237
|
+
throw error;
|
|
238
|
+
});
|
|
239
|
+
logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
|
|
240
|
+
// Mark request and completed
|
|
241
|
+
rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
|
|
242
|
+
// Set the bucket id if it was available on the headers
|
|
243
|
+
const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers);
|
|
244
|
+
if (bucketId) options.bucketId = bucketId;
|
|
245
|
+
if (response.status < 200 || response.status >= 400) {
|
|
246
|
+
logger.debug(`Request to ${url} failed.`);
|
|
247
|
+
if (response.status !== 429) {
|
|
248
|
+
options.reject({
|
|
249
|
+
ok: false,
|
|
250
|
+
status: response.status,
|
|
251
|
+
body: await response.text()
|
|
252
|
+
});
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
logger.debug(`Request to ${url} was ratelimited.`);
|
|
256
|
+
// Too many attempts, get rid of request from queue.
|
|
257
|
+
if (options.retryCount >= rest.maxRetryCount) {
|
|
258
|
+
logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
|
|
259
|
+
// rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
|
|
260
|
+
options.reject({
|
|
261
|
+
ok: false,
|
|
262
|
+
status: response.status,
|
|
263
|
+
error: 'The request was rate limited and it maxed out the retries limit.'
|
|
264
|
+
});
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
options.retryCount += 1;
|
|
268
|
+
const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
269
|
+
if (resetAfter) await delay(Number(resetAfter) * 1000);
|
|
270
|
+
// process the response to prevent mem leak
|
|
271
|
+
await response.arrayBuffer();
|
|
272
|
+
return await options.retryRequest?.(options);
|
|
273
|
+
}
|
|
274
|
+
// Discord sometimes sends no response with no content.
|
|
275
|
+
options.resolve({
|
|
276
|
+
ok: true,
|
|
277
|
+
status: response.status,
|
|
278
|
+
body: response.status === 204 ? undefined : await response.text()
|
|
279
|
+
});
|
|
280
|
+
},
|
|
281
|
+
simplifyUrl (url, method) {
|
|
282
|
+
const parts = url.split('/');
|
|
283
|
+
const secondLastPart = parts[parts.length - 2];
|
|
284
|
+
if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
|
|
285
|
+
return url;
|
|
286
|
+
}
|
|
287
|
+
if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
|
|
288
|
+
parts.splice(-2);
|
|
289
|
+
parts.push('reactions');
|
|
290
|
+
} else {
|
|
291
|
+
parts.splice(-1);
|
|
292
|
+
parts.push('x');
|
|
293
|
+
}
|
|
294
|
+
if (parts[parts.length - 3] === 'reactions') {
|
|
295
|
+
parts.splice(-2);
|
|
296
|
+
}
|
|
297
|
+
if (method === 'DELETE' && secondLastPart === 'messages') {
|
|
298
|
+
return `D${parts.join('/')}`;
|
|
299
|
+
}
|
|
300
|
+
return parts.join('/');
|
|
301
|
+
},
|
|
302
|
+
async processRequest (request) {
|
|
303
|
+
const url = rest.simplifyUrl(request.route, request.method);
|
|
304
|
+
if (request.runThroughQueue === false) {
|
|
305
|
+
await rest.sendRequest(request);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const queue = rest.queues.get(url);
|
|
309
|
+
if (queue !== undefined) {
|
|
310
|
+
queue.makeRequest(request);
|
|
311
|
+
} else {
|
|
312
|
+
// CREATES A NEW QUEUE
|
|
313
|
+
const bucketQueue = new Queue(rest, {
|
|
314
|
+
url,
|
|
315
|
+
deleteQueueDelay: rest.deleteQueueDelay
|
|
316
|
+
});
|
|
317
|
+
// Add request to queue
|
|
318
|
+
bucketQueue.makeRequest(request);
|
|
319
|
+
// Save queue
|
|
320
|
+
rest.queues.set(url, bucketQueue);
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
async makeRequest (method, route, options) {
|
|
324
|
+
if (rest.isProxied) {
|
|
325
|
+
if (rest.authorization !== undefined) {
|
|
326
|
+
options ??= {};
|
|
327
|
+
options.headers ??= {};
|
|
328
|
+
options.headers.authorization = rest.authorization;
|
|
329
|
+
}
|
|
330
|
+
const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
|
|
331
|
+
if (!result.ok) {
|
|
332
|
+
const err = await result.json().catch(()=>{});
|
|
333
|
+
// Legacy Handling to not break old code or when body is missing
|
|
334
|
+
if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
|
|
335
|
+
throw new Error(JSON.stringify(err));
|
|
336
|
+
}
|
|
337
|
+
return result.status !== 204 ? await result.json() : undefined;
|
|
338
|
+
}
|
|
339
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
340
|
+
return await new Promise(async (resolve, reject)=>{
|
|
341
|
+
const payload = {
|
|
342
|
+
route,
|
|
343
|
+
method,
|
|
344
|
+
requestBodyOptions: options,
|
|
345
|
+
retryCount: 0,
|
|
346
|
+
retryRequest: async function(payload) {
|
|
347
|
+
await rest.processRequest(payload);
|
|
348
|
+
},
|
|
349
|
+
resolve: (data)=>{
|
|
350
|
+
resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
|
|
351
|
+
},
|
|
352
|
+
reject,
|
|
353
|
+
runThroughQueue: options?.runThroughQueue
|
|
354
|
+
};
|
|
355
|
+
await rest.processRequest(payload);
|
|
356
|
+
});
|
|
357
|
+
},
|
|
358
|
+
async get (url, options) {
|
|
359
|
+
return camelize(await rest.makeRequest('GET', url, options));
|
|
360
|
+
},
|
|
361
|
+
async post (url, options) {
|
|
362
|
+
return camelize(await rest.makeRequest('POST', url, options));
|
|
363
|
+
},
|
|
364
|
+
async delete (url, options) {
|
|
365
|
+
camelize(await rest.makeRequest('DELETE', url, options));
|
|
366
|
+
},
|
|
367
|
+
async patch (url, options) {
|
|
368
|
+
return camelize(await rest.makeRequest('PATCH', url, options));
|
|
369
|
+
},
|
|
370
|
+
async put (url, options) {
|
|
371
|
+
return camelize(await rest.makeRequest('PUT', url, options));
|
|
372
|
+
},
|
|
373
|
+
async addReaction (channelId, messageId, reaction) {
|
|
374
|
+
reaction = processReactionString(reaction);
|
|
375
|
+
await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
376
|
+
},
|
|
377
|
+
async addReactions (channelId, messageId, reactions, ordered = false) {
|
|
378
|
+
if (!ordered) {
|
|
379
|
+
await Promise.all(reactions.map(async (reaction)=>{
|
|
380
|
+
await rest.addReaction(channelId, messageId, reaction);
|
|
381
|
+
}));
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
for (const reaction of reactions){
|
|
385
|
+
await rest.addReaction(channelId, messageId, reaction);
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
async addRole (guildId, userId, roleId, reason) {
|
|
389
|
+
await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
390
|
+
reason
|
|
391
|
+
});
|
|
392
|
+
},
|
|
393
|
+
async addThreadMember (channelId, userId) {
|
|
394
|
+
await rest.put(rest.routes.channels.threads.user(channelId, userId));
|
|
395
|
+
},
|
|
396
|
+
async createAutomodRule (guildId, body, reason) {
|
|
397
|
+
return await rest.post(rest.routes.guilds.automod.rules(guildId), {
|
|
398
|
+
body,
|
|
399
|
+
reason
|
|
400
|
+
});
|
|
401
|
+
},
|
|
402
|
+
async createChannel (guildId, body, reason) {
|
|
403
|
+
return await rest.post(rest.routes.guilds.channels(guildId), {
|
|
404
|
+
body,
|
|
405
|
+
reason
|
|
406
|
+
});
|
|
407
|
+
},
|
|
408
|
+
async createEmoji (guildId, body, reason) {
|
|
409
|
+
return await rest.post(rest.routes.guilds.emojis(guildId), {
|
|
410
|
+
body,
|
|
411
|
+
reason
|
|
412
|
+
});
|
|
413
|
+
},
|
|
414
|
+
async createGlobalApplicationCommand (body) {
|
|
415
|
+
return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), {
|
|
416
|
+
body
|
|
417
|
+
});
|
|
418
|
+
},
|
|
419
|
+
async createGuild (body) {
|
|
420
|
+
return await rest.post(rest.routes.guilds.all(), {
|
|
421
|
+
body
|
|
422
|
+
});
|
|
423
|
+
},
|
|
424
|
+
async createGuildApplicationCommand (body, guildId) {
|
|
425
|
+
return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
|
|
426
|
+
body
|
|
427
|
+
});
|
|
428
|
+
},
|
|
429
|
+
async createGuildFromTemplate (templateCode, body) {
|
|
430
|
+
if (body.icon) {
|
|
431
|
+
body.icon = await urlToBase64(body.icon);
|
|
432
|
+
}
|
|
433
|
+
return await rest.post(rest.routes.guilds.templates.code(templateCode), {
|
|
434
|
+
body
|
|
435
|
+
});
|
|
436
|
+
},
|
|
437
|
+
async createGuildSticker (guildId, options, reason) {
|
|
438
|
+
const form = new FormData();
|
|
439
|
+
form.append('file', options.file.blob, options.file.name);
|
|
440
|
+
form.append('name', options.name);
|
|
441
|
+
form.append('description', options.description);
|
|
442
|
+
form.append('tags', options.tags);
|
|
443
|
+
return await rest.post(rest.routes.guilds.stickers(guildId), {
|
|
444
|
+
body: form,
|
|
445
|
+
reason
|
|
446
|
+
});
|
|
447
|
+
},
|
|
448
|
+
async createGuildTemplate (guildId, body) {
|
|
449
|
+
return await rest.post(rest.routes.guilds.templates.all(guildId), {
|
|
450
|
+
body
|
|
451
|
+
});
|
|
452
|
+
},
|
|
453
|
+
async createForumThread (channelId, body, reason) {
|
|
454
|
+
return await rest.post(rest.routes.channels.forum(channelId), {
|
|
455
|
+
body,
|
|
456
|
+
files: body.files,
|
|
457
|
+
reason
|
|
458
|
+
});
|
|
459
|
+
},
|
|
460
|
+
async createInvite (channelId, body = {}, reason) {
|
|
461
|
+
return await rest.post(rest.routes.channels.invites(channelId), {
|
|
462
|
+
body,
|
|
463
|
+
reason
|
|
464
|
+
});
|
|
465
|
+
},
|
|
466
|
+
async createRole (guildId, body, reason) {
|
|
467
|
+
return await rest.post(rest.routes.guilds.roles.all(guildId), {
|
|
468
|
+
body,
|
|
469
|
+
reason
|
|
470
|
+
});
|
|
471
|
+
},
|
|
472
|
+
async createScheduledEvent (guildId, body, reason) {
|
|
473
|
+
return await rest.post(rest.routes.guilds.events.events(guildId), {
|
|
474
|
+
body,
|
|
475
|
+
reason
|
|
476
|
+
});
|
|
477
|
+
},
|
|
478
|
+
async createStageInstance (body, reason) {
|
|
479
|
+
return await rest.post(rest.routes.channels.stages(), {
|
|
480
|
+
body,
|
|
481
|
+
reason
|
|
482
|
+
});
|
|
483
|
+
},
|
|
484
|
+
async createWebhook (channelId, options, reason) {
|
|
485
|
+
return await rest.post(rest.routes.channels.webhooks(channelId), {
|
|
486
|
+
body: {
|
|
487
|
+
name: options.name,
|
|
488
|
+
avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
|
|
489
|
+
},
|
|
490
|
+
reason
|
|
491
|
+
});
|
|
492
|
+
},
|
|
493
|
+
async deleteAutomodRule (guildId, ruleId, reason) {
|
|
494
|
+
await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
495
|
+
reason
|
|
496
|
+
});
|
|
497
|
+
},
|
|
498
|
+
async deleteChannel (channelId, reason) {
|
|
499
|
+
await rest.delete(rest.routes.channels.channel(channelId), {
|
|
500
|
+
reason
|
|
501
|
+
});
|
|
502
|
+
},
|
|
503
|
+
async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
|
|
504
|
+
await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
|
|
505
|
+
reason
|
|
506
|
+
});
|
|
507
|
+
},
|
|
508
|
+
async deleteEmoji (guildId, id, reason) {
|
|
509
|
+
await rest.delete(rest.routes.guilds.emoji(guildId, id), {
|
|
510
|
+
reason
|
|
511
|
+
});
|
|
512
|
+
},
|
|
513
|
+
async deleteFollowupMessage (token, messageId) {
|
|
514
|
+
await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
515
|
+
unauthorized: true
|
|
516
|
+
});
|
|
517
|
+
},
|
|
518
|
+
async deleteGlobalApplicationCommand (commandId) {
|
|
519
|
+
await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
520
|
+
},
|
|
521
|
+
async deleteGuild (guildId) {
|
|
522
|
+
await rest.delete(rest.routes.guilds.guild(guildId));
|
|
523
|
+
},
|
|
524
|
+
async deleteGuildApplicationCommand (commandId, guildId) {
|
|
525
|
+
await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
526
|
+
},
|
|
527
|
+
async deleteGuildSticker (guildId, stickerId, reason) {
|
|
528
|
+
await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
529
|
+
reason
|
|
530
|
+
});
|
|
531
|
+
},
|
|
532
|
+
async deleteGuildTemplate (guildId, templateCode) {
|
|
533
|
+
await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
|
|
534
|
+
},
|
|
535
|
+
async deleteIntegration (guildId, integrationId, reason) {
|
|
536
|
+
await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
|
|
537
|
+
reason
|
|
538
|
+
});
|
|
539
|
+
},
|
|
540
|
+
async deleteInvite (inviteCode, reason) {
|
|
541
|
+
await rest.delete(rest.routes.guilds.invite(inviteCode), {
|
|
542
|
+
reason
|
|
543
|
+
});
|
|
544
|
+
},
|
|
545
|
+
async deleteMessage (channelId, messageId, reason) {
|
|
546
|
+
await rest.delete(rest.routes.channels.message(channelId, messageId), {
|
|
547
|
+
reason
|
|
548
|
+
});
|
|
549
|
+
},
|
|
550
|
+
async deleteMessages (channelId, messageIds, reason) {
|
|
551
|
+
await rest.post(rest.routes.channels.bulk(channelId), {
|
|
552
|
+
body: {
|
|
553
|
+
messages: messageIds.slice(0, 100).map((id)=>id.toString())
|
|
554
|
+
},
|
|
555
|
+
reason
|
|
556
|
+
});
|
|
557
|
+
},
|
|
558
|
+
async deleteOriginalInteractionResponse (token) {
|
|
559
|
+
await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
560
|
+
unauthorized: true
|
|
561
|
+
});
|
|
562
|
+
},
|
|
563
|
+
async deleteOwnReaction (channelId, messageId, reaction) {
|
|
564
|
+
reaction = processReactionString(reaction);
|
|
565
|
+
await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
566
|
+
},
|
|
567
|
+
async deleteReactionsAll (channelId, messageId) {
|
|
568
|
+
await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
|
|
569
|
+
},
|
|
570
|
+
async deleteReactionsEmoji (channelId, messageId, reaction) {
|
|
571
|
+
reaction = processReactionString(reaction);
|
|
572
|
+
await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
|
|
573
|
+
},
|
|
574
|
+
async deleteRole (guildId, roleId, reason) {
|
|
575
|
+
await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
576
|
+
reason
|
|
577
|
+
});
|
|
578
|
+
},
|
|
579
|
+
async deleteScheduledEvent (guildId, eventId) {
|
|
580
|
+
await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
|
|
581
|
+
},
|
|
582
|
+
async deleteStageInstance (channelId, reason) {
|
|
583
|
+
await rest.delete(rest.routes.channels.stage(channelId), {
|
|
584
|
+
reason
|
|
585
|
+
});
|
|
586
|
+
},
|
|
587
|
+
async deleteUserReaction (channelId, messageId, userId, reaction) {
|
|
588
|
+
reaction = processReactionString(reaction);
|
|
589
|
+
await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
|
|
590
|
+
},
|
|
591
|
+
async deleteWebhook (webhookId, reason) {
|
|
592
|
+
await rest.delete(rest.routes.webhooks.id(webhookId), {
|
|
593
|
+
reason
|
|
594
|
+
});
|
|
595
|
+
},
|
|
596
|
+
async deleteWebhookMessage (webhookId, token, messageId, options) {
|
|
597
|
+
await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
|
|
598
|
+
},
|
|
599
|
+
async deleteWebhookWithToken (webhookId, token) {
|
|
600
|
+
await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
|
|
601
|
+
},
|
|
602
|
+
async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
|
|
603
|
+
return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
|
|
604
|
+
body: {
|
|
605
|
+
permissions
|
|
606
|
+
},
|
|
607
|
+
headers: {
|
|
608
|
+
authorization: `Bearer ${bearerToken}`
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
},
|
|
612
|
+
async editAutomodRule (guildId, ruleId, body, reason) {
|
|
613
|
+
return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
614
|
+
body,
|
|
615
|
+
reason
|
|
616
|
+
});
|
|
617
|
+
},
|
|
618
|
+
async editBotProfile (options) {
|
|
619
|
+
const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
|
|
620
|
+
return await rest.patch(rest.routes.userBot(), {
|
|
621
|
+
body: {
|
|
622
|
+
username: options.username?.trim(),
|
|
623
|
+
avatar
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
},
|
|
627
|
+
async editChannel (channelId, body, reason) {
|
|
628
|
+
return await rest.patch(rest.routes.channels.channel(channelId), {
|
|
629
|
+
body,
|
|
630
|
+
reason
|
|
631
|
+
});
|
|
632
|
+
},
|
|
633
|
+
async editChannelPermissionOverrides (channelId, body, reason) {
|
|
634
|
+
await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
|
|
635
|
+
body,
|
|
636
|
+
reason
|
|
637
|
+
});
|
|
638
|
+
},
|
|
639
|
+
async editChannelPositions (guildId, body) {
|
|
640
|
+
await rest.patch(rest.routes.guilds.channels(guildId), {
|
|
641
|
+
body
|
|
642
|
+
});
|
|
643
|
+
},
|
|
644
|
+
async editEmoji (guildId, id, body, reason) {
|
|
645
|
+
return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
|
|
646
|
+
body,
|
|
647
|
+
reason
|
|
648
|
+
});
|
|
649
|
+
},
|
|
650
|
+
async editFollowupMessage (token, messageId, body) {
|
|
651
|
+
return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
652
|
+
body,
|
|
653
|
+
files: body.files,
|
|
654
|
+
unauthorized: true
|
|
655
|
+
});
|
|
656
|
+
},
|
|
657
|
+
async editGlobalApplicationCommand (commandId, body) {
|
|
658
|
+
return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
|
|
659
|
+
body
|
|
660
|
+
});
|
|
661
|
+
},
|
|
662
|
+
async editGuild (guildId, body, reason) {
|
|
663
|
+
return await rest.patch(rest.routes.guilds.guild(guildId), {
|
|
664
|
+
body,
|
|
665
|
+
reason
|
|
666
|
+
});
|
|
667
|
+
},
|
|
668
|
+
async editGuildApplicationCommand (commandId, guildId, body) {
|
|
669
|
+
return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
|
|
670
|
+
body
|
|
671
|
+
});
|
|
672
|
+
},
|
|
673
|
+
async editGuildMfaLevel (guildId, mfaLevel, reason) {
|
|
674
|
+
await rest.post(rest.routes.guilds.mfa(guildId), {
|
|
675
|
+
body: {
|
|
676
|
+
level: mfaLevel
|
|
677
|
+
},
|
|
678
|
+
reason
|
|
679
|
+
});
|
|
680
|
+
},
|
|
681
|
+
async editGuildSticker (guildId, stickerId, body, reason) {
|
|
682
|
+
return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
683
|
+
body,
|
|
684
|
+
reason
|
|
685
|
+
});
|
|
686
|
+
},
|
|
687
|
+
async editGuildTemplate (guildId, templateCode, body) {
|
|
688
|
+
return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
|
|
689
|
+
body
|
|
690
|
+
});
|
|
691
|
+
},
|
|
692
|
+
async editMessage (channelId, messageId, body) {
|
|
693
|
+
return await rest.patch(rest.routes.channels.message(channelId, messageId), {
|
|
694
|
+
body,
|
|
695
|
+
files: body.files
|
|
696
|
+
});
|
|
697
|
+
},
|
|
698
|
+
async editOriginalInteractionResponse (token, body) {
|
|
699
|
+
return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
700
|
+
body,
|
|
701
|
+
files: body.files
|
|
702
|
+
});
|
|
703
|
+
},
|
|
704
|
+
async editOriginalWebhookMessage (webhookId, token, options) {
|
|
705
|
+
return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
|
|
706
|
+
body: {
|
|
707
|
+
type: InteractionResponseTypes.UpdateMessage,
|
|
708
|
+
data: options
|
|
709
|
+
},
|
|
710
|
+
files: options.files,
|
|
711
|
+
unauthorized: true
|
|
712
|
+
});
|
|
713
|
+
},
|
|
714
|
+
async editOwnVoiceState (guildId, options) {
|
|
715
|
+
await rest.patch(rest.routes.guilds.voice(guildId), {
|
|
716
|
+
body: {
|
|
717
|
+
...options,
|
|
718
|
+
request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
|
|
719
|
+
}
|
|
720
|
+
});
|
|
721
|
+
},
|
|
722
|
+
async editScheduledEvent (guildId, eventId, body, reason) {
|
|
723
|
+
return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
|
|
724
|
+
body,
|
|
725
|
+
reason
|
|
726
|
+
});
|
|
727
|
+
},
|
|
728
|
+
async editRole (guildId, roleId, body, reason) {
|
|
729
|
+
return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
730
|
+
body,
|
|
731
|
+
reason
|
|
732
|
+
});
|
|
733
|
+
},
|
|
734
|
+
async editRolePositions (guildId, body, reason) {
|
|
735
|
+
return await rest.patch(rest.routes.guilds.roles.all(guildId), {
|
|
736
|
+
body,
|
|
737
|
+
reason
|
|
738
|
+
});
|
|
739
|
+
},
|
|
740
|
+
async editStageInstance (channelId, topic, reason) {
|
|
741
|
+
return await rest.patch(rest.routes.channels.stage(channelId), {
|
|
742
|
+
body: {
|
|
743
|
+
topic
|
|
744
|
+
},
|
|
745
|
+
reason
|
|
746
|
+
});
|
|
747
|
+
},
|
|
748
|
+
async editUserVoiceState (guildId, options) {
|
|
749
|
+
await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
|
|
750
|
+
body: options
|
|
751
|
+
});
|
|
752
|
+
},
|
|
753
|
+
async editWebhook (webhookId, body, reason) {
|
|
754
|
+
return await rest.patch(rest.routes.webhooks.id(webhookId), {
|
|
755
|
+
body,
|
|
756
|
+
reason
|
|
757
|
+
});
|
|
758
|
+
},
|
|
759
|
+
async editWebhookMessage (webhookId, token, messageId, options) {
|
|
760
|
+
return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
761
|
+
body: options,
|
|
762
|
+
files: options.files
|
|
763
|
+
});
|
|
764
|
+
},
|
|
765
|
+
async editWebhookWithToken (webhookId, token, body) {
|
|
766
|
+
return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
|
|
767
|
+
body
|
|
768
|
+
});
|
|
769
|
+
},
|
|
770
|
+
async editWelcomeScreen (guildId, body, reason) {
|
|
771
|
+
return await rest.patch(rest.routes.guilds.welcome(guildId), {
|
|
772
|
+
body,
|
|
773
|
+
reason
|
|
774
|
+
});
|
|
775
|
+
},
|
|
776
|
+
async editWidgetSettings (guildId, body, reason) {
|
|
777
|
+
return await rest.patch(rest.routes.guilds.widget(guildId), {
|
|
778
|
+
body,
|
|
779
|
+
reason
|
|
780
|
+
});
|
|
781
|
+
},
|
|
782
|
+
async executeWebhook (webhookId, token, options) {
|
|
783
|
+
return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
|
|
784
|
+
body: options
|
|
785
|
+
});
|
|
786
|
+
},
|
|
787
|
+
async followAnnouncement (sourceChannelId, targetChannelId) {
|
|
788
|
+
return await rest.post(rest.routes.channels.follow(sourceChannelId), {
|
|
789
|
+
body: {
|
|
790
|
+
webhook_channel_id: targetChannelId
|
|
791
|
+
}
|
|
792
|
+
});
|
|
793
|
+
},
|
|
794
|
+
async getActiveThreads (guildId) {
|
|
795
|
+
return await rest.get(rest.routes.channels.threads.active(guildId));
|
|
796
|
+
},
|
|
797
|
+
async getApplicationCommandPermission (guildId, commandId) {
|
|
798
|
+
return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
|
|
799
|
+
},
|
|
800
|
+
async getApplicationCommandPermissions (guildId) {
|
|
801
|
+
return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
|
|
802
|
+
},
|
|
803
|
+
async getApplicationInfo () {
|
|
804
|
+
return await rest.get(rest.routes.oauth2Application());
|
|
805
|
+
},
|
|
806
|
+
async getAuditLog (guildId, options) {
|
|
807
|
+
return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
|
|
808
|
+
},
|
|
809
|
+
async getAutomodRule (guildId, ruleId) {
|
|
810
|
+
return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
|
|
811
|
+
},
|
|
812
|
+
async getAutomodRules (guildId) {
|
|
813
|
+
return await rest.get(rest.routes.guilds.automod.rules(guildId));
|
|
814
|
+
},
|
|
815
|
+
async getAvailableVoiceRegions () {
|
|
816
|
+
return await rest.get(rest.routes.regions());
|
|
817
|
+
},
|
|
818
|
+
async getBan (guildId, userId) {
|
|
819
|
+
return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
|
|
820
|
+
},
|
|
821
|
+
async getBans (guildId, options) {
|
|
822
|
+
return await rest.get(rest.routes.guilds.members.bans(guildId, options));
|
|
823
|
+
},
|
|
824
|
+
async getChannel (id) {
|
|
825
|
+
return await rest.get(rest.routes.channels.channel(id));
|
|
826
|
+
},
|
|
827
|
+
async getChannelInvites (channelId) {
|
|
828
|
+
return await rest.get(rest.routes.channels.invites(channelId));
|
|
829
|
+
},
|
|
830
|
+
async getChannels (guildId) {
|
|
831
|
+
return await rest.get(rest.routes.guilds.channels(guildId));
|
|
832
|
+
},
|
|
833
|
+
async getChannelWebhooks (channelId) {
|
|
834
|
+
return await rest.get(rest.routes.channels.webhooks(channelId));
|
|
835
|
+
},
|
|
836
|
+
async getDmChannel (userId) {
|
|
837
|
+
return await rest.post(rest.routes.channels.dm(), {
|
|
838
|
+
body: {
|
|
839
|
+
recipient_id: userId
|
|
840
|
+
}
|
|
841
|
+
});
|
|
842
|
+
},
|
|
843
|
+
async getEmoji (guildId, emojiId) {
|
|
844
|
+
return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
|
|
845
|
+
},
|
|
846
|
+
async getEmojis (guildId) {
|
|
847
|
+
return await rest.get(rest.routes.guilds.emojis(guildId));
|
|
848
|
+
},
|
|
849
|
+
async getFollowupMessage (token, messageId) {
|
|
850
|
+
return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
851
|
+
unauthorized: true
|
|
852
|
+
});
|
|
853
|
+
},
|
|
854
|
+
async getGatewayBot () {
|
|
855
|
+
return await rest.get(rest.routes.gatewayBot());
|
|
856
|
+
},
|
|
857
|
+
async getGlobalApplicationCommand (commandId) {
|
|
858
|
+
return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
859
|
+
},
|
|
860
|
+
async getGlobalApplicationCommands () {
|
|
861
|
+
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
|
|
862
|
+
},
|
|
863
|
+
async getGuild (guildId, options = {
|
|
864
|
+
counts: true
|
|
865
|
+
}) {
|
|
866
|
+
return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
|
|
867
|
+
},
|
|
868
|
+
async getGuildApplicationCommand (commandId, guildId) {
|
|
869
|
+
return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
870
|
+
},
|
|
871
|
+
async getGuildApplicationCommands (guildId) {
|
|
872
|
+
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
|
|
873
|
+
},
|
|
874
|
+
async getGuildPreview (guildId) {
|
|
875
|
+
return await rest.get(rest.routes.guilds.preview(guildId));
|
|
876
|
+
},
|
|
877
|
+
async getGuildTemplate (templateCode) {
|
|
878
|
+
return await rest.get(rest.routes.guilds.templates.code(templateCode));
|
|
879
|
+
},
|
|
880
|
+
async getGuildTemplates (guildId) {
|
|
881
|
+
return await rest.get(rest.routes.guilds.templates.all(guildId));
|
|
882
|
+
},
|
|
883
|
+
async getGuildWebhooks (guildId) {
|
|
884
|
+
return await rest.get(rest.routes.guilds.webhooks(guildId));
|
|
885
|
+
},
|
|
886
|
+
async getIntegrations (guildId) {
|
|
887
|
+
return await rest.get(rest.routes.guilds.integrations(guildId));
|
|
888
|
+
},
|
|
889
|
+
async getInvite (inviteCode, options) {
|
|
890
|
+
return await rest.get(rest.routes.guilds.invite(inviteCode, options));
|
|
891
|
+
},
|
|
892
|
+
async getInvites (guildId) {
|
|
893
|
+
return await rest.get(rest.routes.guilds.invites(guildId));
|
|
894
|
+
},
|
|
895
|
+
async getMessage (channelId, messageId) {
|
|
896
|
+
return await rest.get(rest.routes.channels.message(channelId, messageId));
|
|
897
|
+
},
|
|
898
|
+
async getMessages (channelId, options) {
|
|
899
|
+
return await rest.get(rest.routes.channels.messages(channelId, options));
|
|
900
|
+
},
|
|
901
|
+
async getNitroStickerPacks () {
|
|
902
|
+
return await rest.get(rest.routes.nitroStickerPacks());
|
|
903
|
+
},
|
|
904
|
+
async getOriginalInteractionResponse (token) {
|
|
905
|
+
return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
906
|
+
unauthorized: true
|
|
907
|
+
});
|
|
908
|
+
},
|
|
909
|
+
async getPinnedMessages (channelId) {
|
|
910
|
+
return await rest.get(rest.routes.channels.pins(channelId));
|
|
911
|
+
},
|
|
912
|
+
async getPrivateArchivedThreads (channelId, options) {
|
|
913
|
+
return await rest.get(rest.routes.channels.threads.private(channelId, options));
|
|
914
|
+
},
|
|
915
|
+
async getPrivateJoinedArchivedThreads (channelId, options) {
|
|
916
|
+
return await rest.get(rest.routes.channels.threads.joined(channelId, options));
|
|
917
|
+
},
|
|
918
|
+
async getPruneCount (guildId, options) {
|
|
919
|
+
return await rest.get(rest.routes.guilds.prune(guildId, options));
|
|
920
|
+
},
|
|
921
|
+
async getPublicArchivedThreads (channelId, options) {
|
|
922
|
+
return await rest.get(rest.routes.channels.threads.public(channelId, options));
|
|
923
|
+
},
|
|
924
|
+
async getRoles (guildId) {
|
|
925
|
+
return await rest.get(rest.routes.guilds.roles.all(guildId));
|
|
926
|
+
},
|
|
927
|
+
async getScheduledEvent (guildId, eventId, options) {
|
|
928
|
+
return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
|
|
929
|
+
},
|
|
930
|
+
async getScheduledEvents (guildId, options) {
|
|
931
|
+
return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
|
|
932
|
+
},
|
|
933
|
+
async getScheduledEventUsers (guildId, eventId, options) {
|
|
934
|
+
return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
|
|
935
|
+
},
|
|
936
|
+
async getSessionInfo () {
|
|
937
|
+
return await rest.getGatewayBot();
|
|
938
|
+
},
|
|
939
|
+
async getStageInstance (channelId) {
|
|
940
|
+
return await rest.get(rest.routes.channels.stage(channelId));
|
|
941
|
+
},
|
|
942
|
+
async getSticker (stickerId) {
|
|
943
|
+
return await rest.get(rest.routes.sticker(stickerId));
|
|
944
|
+
},
|
|
945
|
+
async getGuildSticker (guildId, stickerId) {
|
|
946
|
+
return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
|
|
947
|
+
},
|
|
948
|
+
async getGuildStickers (guildId) {
|
|
949
|
+
return await rest.get(rest.routes.guilds.stickers(guildId));
|
|
950
|
+
},
|
|
951
|
+
async getThreadMember (channelId, userId) {
|
|
952
|
+
return await rest.get(rest.routes.channels.threads.user(channelId, userId));
|
|
953
|
+
},
|
|
954
|
+
async getThreadMembers (channelId) {
|
|
955
|
+
return await rest.get(rest.routes.channels.threads.members(channelId));
|
|
956
|
+
},
|
|
957
|
+
async getReactions (channelId, messageId, reaction, options) {
|
|
958
|
+
return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
|
|
959
|
+
},
|
|
960
|
+
async getUser (id) {
|
|
961
|
+
return await rest.get(rest.routes.user(id));
|
|
962
|
+
},
|
|
963
|
+
async getVanityUrl (guildId) {
|
|
964
|
+
return await rest.get(rest.routes.guilds.vanity(guildId));
|
|
965
|
+
},
|
|
966
|
+
async getVoiceRegions (guildId) {
|
|
967
|
+
return await rest.get(rest.routes.guilds.regions(guildId));
|
|
968
|
+
},
|
|
969
|
+
async getWebhook (webhookId) {
|
|
970
|
+
return await rest.get(rest.routes.webhooks.id(webhookId));
|
|
971
|
+
},
|
|
972
|
+
async getWebhookMessage (webhookId, token, messageId, options) {
|
|
973
|
+
return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
|
|
974
|
+
},
|
|
975
|
+
async getWebhookWithToken (webhookId, token) {
|
|
976
|
+
return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
|
|
977
|
+
},
|
|
978
|
+
async getWelcomeScreen (guildId) {
|
|
979
|
+
return await rest.get(rest.routes.guilds.welcome(guildId));
|
|
980
|
+
},
|
|
981
|
+
async getWidget (guildId) {
|
|
982
|
+
return await rest.get(rest.routes.guilds.widgetJson(guildId));
|
|
983
|
+
},
|
|
984
|
+
async getWidgetSettings (guildId) {
|
|
985
|
+
return await rest.get(rest.routes.guilds.widget(guildId));
|
|
986
|
+
},
|
|
987
|
+
async joinThread (channelId) {
|
|
988
|
+
await rest.put(rest.routes.channels.threads.me(channelId));
|
|
989
|
+
},
|
|
990
|
+
async leaveGuild (guildId) {
|
|
991
|
+
await rest.delete(rest.routes.guilds.leave(guildId));
|
|
992
|
+
},
|
|
993
|
+
async leaveThread (channelId) {
|
|
994
|
+
await rest.delete(rest.routes.channels.threads.me(channelId));
|
|
995
|
+
},
|
|
996
|
+
async publishMessage (channelId, messageId) {
|
|
997
|
+
return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
|
|
998
|
+
},
|
|
999
|
+
async removeRole (guildId, userId, roleId, reason) {
|
|
1000
|
+
await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
1001
|
+
reason
|
|
1002
|
+
});
|
|
1003
|
+
},
|
|
1004
|
+
async removeThreadMember (channelId, userId) {
|
|
1005
|
+
await rest.delete(rest.routes.channels.threads.user(channelId, userId));
|
|
1006
|
+
},
|
|
1007
|
+
async sendFollowupMessage (token, options) {
|
|
1008
|
+
return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
|
|
1009
|
+
body: options,
|
|
1010
|
+
files: options.files,
|
|
1011
|
+
unauthorized: true
|
|
1012
|
+
});
|
|
1013
|
+
},
|
|
1014
|
+
async sendInteractionResponse (interactionId, token, options) {
|
|
1015
|
+
return await rest.post(rest.routes.interactions.responses.callback(interactionId, token), {
|
|
1016
|
+
body: options,
|
|
1017
|
+
files: options.data?.files,
|
|
1018
|
+
runThroughQueue: false,
|
|
1019
|
+
unauthorized: true
|
|
1020
|
+
});
|
|
1021
|
+
},
|
|
1022
|
+
async sendMessage (channelId, body) {
|
|
1023
|
+
return await rest.post(rest.routes.channels.messages(channelId), {
|
|
1024
|
+
body,
|
|
1025
|
+
files: body.files
|
|
1026
|
+
});
|
|
1027
|
+
},
|
|
1028
|
+
async startThreadWithMessage (channelId, messageId, body, reason) {
|
|
1029
|
+
return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
|
|
1030
|
+
body,
|
|
1031
|
+
reason
|
|
1032
|
+
});
|
|
1033
|
+
},
|
|
1034
|
+
async startThreadWithoutMessage (channelId, body, reason) {
|
|
1035
|
+
return await rest.post(rest.routes.channels.threads.all(channelId), {
|
|
1036
|
+
body,
|
|
1037
|
+
reason
|
|
1038
|
+
});
|
|
1039
|
+
},
|
|
1040
|
+
async syncGuildTemplate (guildId) {
|
|
1041
|
+
return await rest.put(rest.routes.guilds.templates.all(guildId));
|
|
1042
|
+
},
|
|
1043
|
+
async banMember (guildId, userId, body, reason) {
|
|
1044
|
+
await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1045
|
+
body,
|
|
1046
|
+
reason
|
|
1047
|
+
});
|
|
1048
|
+
},
|
|
1049
|
+
async editBotMember (guildId, body, reason) {
|
|
1050
|
+
return await rest.patch(rest.routes.guilds.members.bot(guildId), {
|
|
1051
|
+
body,
|
|
1052
|
+
reason
|
|
1053
|
+
});
|
|
1054
|
+
},
|
|
1055
|
+
async editMember (guildId, userId, body, reason) {
|
|
1056
|
+
return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
|
|
1057
|
+
body,
|
|
1058
|
+
reason
|
|
1059
|
+
});
|
|
1060
|
+
},
|
|
1061
|
+
async getMember (guildId, userId) {
|
|
1062
|
+
return await rest.get(rest.routes.guilds.members.member(guildId, userId));
|
|
1063
|
+
},
|
|
1064
|
+
async getMembers (guildId, options) {
|
|
1065
|
+
return await rest.get(rest.routes.guilds.members.members(guildId, options));
|
|
1066
|
+
},
|
|
1067
|
+
async kickMember (guildId, userId, reason) {
|
|
1068
|
+
await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
|
|
1069
|
+
reason
|
|
1070
|
+
});
|
|
1071
|
+
},
|
|
1072
|
+
async pinMessage (channelId, messageId, reason) {
|
|
1073
|
+
await rest.put(rest.routes.channels.pin(channelId, messageId), {
|
|
1074
|
+
reason
|
|
1075
|
+
});
|
|
1076
|
+
},
|
|
1077
|
+
async pruneMembers (guildId, body, reason) {
|
|
1078
|
+
return await rest.post(rest.routes.guilds.members.prune(guildId), {
|
|
1079
|
+
body,
|
|
1080
|
+
reason
|
|
1081
|
+
});
|
|
1082
|
+
},
|
|
1083
|
+
async searchMembers (guildId, query, options) {
|
|
1084
|
+
return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
|
|
1085
|
+
},
|
|
1086
|
+
async unbanMember (guildId, userId, reason) {
|
|
1087
|
+
await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1088
|
+
reason
|
|
1089
|
+
});
|
|
1090
|
+
},
|
|
1091
|
+
async unpinMessage (channelId, messageId, reason) {
|
|
1092
|
+
await rest.delete(rest.routes.channels.pin(channelId, messageId), {
|
|
1093
|
+
reason
|
|
1094
|
+
});
|
|
1095
|
+
},
|
|
1096
|
+
async triggerTypingIndicator (channelId) {
|
|
1097
|
+
await rest.post(rest.routes.channels.typing(channelId));
|
|
1098
|
+
},
|
|
1099
|
+
async upsertGlobalApplicationCommands (body) {
|
|
1100
|
+
return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), {
|
|
1101
|
+
body
|
|
1102
|
+
});
|
|
1103
|
+
},
|
|
1104
|
+
async upsertGuildApplicationCommands (guildId, body) {
|
|
1105
|
+
return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
|
|
1106
|
+
body
|
|
1107
|
+
});
|
|
1108
|
+
},
|
|
1109
|
+
preferSnakeCase (enabled) {
|
|
1110
|
+
const camelizer = enabled ? (x)=>x : camelize;
|
|
1111
|
+
rest.get = async (url, options)=>{
|
|
1112
|
+
return camelizer(await rest.makeRequest('GET', url, options));
|
|
1113
|
+
};
|
|
1114
|
+
rest.post = async (url, options)=>{
|
|
1115
|
+
return camelizer(await rest.makeRequest('POST', url, options));
|
|
1116
|
+
};
|
|
1117
|
+
rest.delete = async (url, options)=>{
|
|
1118
|
+
camelizer(await rest.makeRequest('DELETE', url, options));
|
|
1119
|
+
};
|
|
1120
|
+
rest.patch = async (url, options)=>{
|
|
1121
|
+
return camelizer(await rest.makeRequest('PATCH', url, options));
|
|
1122
|
+
};
|
|
1123
|
+
rest.put = async (url, options)=>{
|
|
1124
|
+
return camelizer(await rest.makeRequest('PUT', url, options));
|
|
1125
|
+
};
|
|
1126
|
+
return rest;
|
|
1127
|
+
}
|
|
1128
|
+
};
|
|
1129
|
+
return rest;
|
|
1130
|
+
}
|
|
1131
|
+
var HttpResponseCode;
|
|
1132
|
+
(function(HttpResponseCode) {
|
|
1133
|
+
HttpResponseCode[HttpResponseCode[/** Minimum value of a code in oder to consider that it was successful. */ "Success"] = 200] = "Success";
|
|
1134
|
+
HttpResponseCode[HttpResponseCode[/** Request completed successfully, but Discord returned an empty body. */ "NoContent"] = 204] = "NoContent";
|
|
1135
|
+
HttpResponseCode[HttpResponseCode[/** Minimum value of a code in order to consider that something went wrong. */ "Error"] = 400] = "Error";
|
|
1136
|
+
HttpResponseCode[HttpResponseCode[/** This request got rate limited. */ "TooManyRequests"] = 429] = "TooManyRequests";
|
|
1137
|
+
})(HttpResponseCode || (HttpResponseCode = {}));
|
|
1138
|
+
|
|
1139
|
+
//# sourceMappingURL=manager.js.map
|