@discordeno/rest 19.0.0-next.08e21ba → 19.0.0-next.0b02607

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manager.js CHANGED
@@ -1,2 +1,1097 @@
1
- import{InteractionResponseTypes as e}from"@discordeno/types";import{calculateBits as t,camelize as a,camelToSnakeCase as s,delay as i,findFiles as n,getBotIdFromToken as o,logger as r,urlToBase64 as l}from"@discordeno/utils";import{createInvalidRequestBucket as d}from"./invalidBucket.js";import{Queue as c}from"./queue.js";export function createRestManager(u){if(!u.token)throw Error("You must provide a valid token.");let m={token:u.token,applicationId:u.applicationId?BigInt(u.applicationId):o(u.token),version:u.version??10,baseUrl:u.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,deleteQueueDelay:6e4,queues:new Map,rateLimitedPaths:new Map,invalidBucket:d({}),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:()=>m.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:{all:()=>"/guilds",auditlogs:(e,t)=>{let a=`/guilds/${e}/audit-logs?`;return t&&(t.actionType&&(a+=`action_type=${t.actionType}`),t.before&&(a+=`&before=${t.before}`),t.limit&&(a+=`&limit=${t.limit}`),t.userId&&(a+=`&user_id=${t.userId}`)),a},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}},guild(e,t){let a=`/guilds/${e}?`;return void 0!==t&&(a+=`with_counts=${t.toString()}`),a},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}`,bans:(e,t)=>{let a=`/guilds/${e}/bans?`;return t&&(t.limit&&(a+=`limit=${t.limit}`),t.after&&(a+=`&after=${t.after}`),t.before&&(a+=`&before=${t.before}`)),a},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}},roles:{one:(e,t)=>`/guilds/${e}/roles/${t}`,all:e=>`/guilds/${e}/roles`,member:(e,t,a)=>`/guilds/${e}/members/${t}/roles/${a}`},stickers:e=>`/guilds/${e}/stickers`,sticker:(e,t)=>`/guilds/${e}/stickers/${t}`,templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},vanity:e=>`/guilds/${e}/vanity-url`,regions:e=>`/guilds/${e}/regions`,webhooks:e=>`/guilds/${e}/webhooks`},sticker:e=>`/stickers/${e}`,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=m.rateLimitedPaths.get(e),a=m.rateLimitedPaths.get("global"),s=Date.now();return t&&s<t.resetTimestamp?t.resetTimestamp-s:!!a&&s<a.resetTimestamp&&a.resetTimestamp-s},changeToDiscordFormat(e){if(null===e)return null;if("object"==typeof e){if(Array.isArray(e))return e.map(e=>m.changeToDiscordFormat(e));let a={};for(let i of Object.keys(e)){if("permissions"===i){a.permissions=t(e[i]);continue}a[s(i)]=m.changeToDiscordFormat(e[i])}return a}return"bigint"==typeof e?e.toString():e},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${m.token}`),e.headers)for(let a in e.headers)t[a.toLowerCase()]=e.headers[a];if("GET"===e.method&&(e.body=void 0),e.body?.reason&&(t["X-Audit-Log-Reason"]=encodeURIComponent(e.body.reason),e.body.reason=void 0),e.body){let{file:s}=e.body;if(s){let i=n(s),o=new FormData;if(e.url?.endsWith("/stickers")&&"POST"===e.method)o.append("file",i[0].blob,i[0].name),o.append("name",e.body.name),o.append("description",e.body.description),o.append("tags",e.body.tags);else{for(let r=0;r<i.length;r++)o.append(`file${r}`,i[r].blob,i[r].name);s&&(e.body.file=void 0),o.append("payload_json",JSON.stringify(m.changeToDiscordFormat(e.body)))}e.body.file=o}else e.body&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json")}return{headers:t,body:e.body?.file??JSON.stringify(m.changeToDiscordFormat(e.body)),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,a]of m.rateLimitedPaths.entries())a.resetTimestamp>e||(m.rateLimitedPaths.delete(t),"global"!==t||(m.globallyRateLimited=!1));0===m.rateLimitedPaths.size?m.processingRateLimitedPaths=!1:(m.processingRateLimitedPaths=!0,setTimeout(()=>{m.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,l=t.get("x-ratelimit-limit");if(m.queues.get(e)?.handleCompletedRequest({remaining:s?Number(s):void 0,interval:i?1e3*Number(i):void 0,max:l?Number(l):void 0}),"0"===s&&(a=!0,m.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&m.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),c=Date.now()+1e3*Number(d);m.globallyRateLimited=!0,a=!0,setTimeout(()=>{m.globallyRateLimited=!1},c),m.rateLimitedPaths.set("global",{url:"global",resetTimestamp:c,bucketId:r}),r&&m.rateLimitedPaths.set(r,{url:"global",resetTimestamp:c,bucketId:r})}return a&&!m.processingRateLimitedPaths&&m.processRateLimitedPaths(),a?r:void 0},async sendRequest(e){let t=e.url.startsWith("https://")?e.url:`${m.baseUrl}/v${m.version}${e.url}`,a=m.createRequest({method:e.method,url:e.url,body:e.body,...e.options});r.debug(`sending request to ${t}`,"with payload:",{...a,headers:{...a.headers,authorization:"Bot tokenhere"}});let s=await fetch(t,a);r.debug(`request fetched from ${t} with status ${s.status} & ${s.statusText}`);let n=m.processHeaders(m.simplifyUrl(e.url,e.method),s.headers);if(n&&(e.bucketId=n),s.status<200||s.status>=400){if(r.debug(`Request to ${t} failed.`),429===s.status){if(r.debug(`Request to ${t} was ratelimited.`),e.retryCount++>=m.maxRetryCount)return r.debug(`Request to ${t} exceeded the maximum allowed retries.`,"with payload:",a),e.reject?.({ok:!1,status:s.status,error:"The options was rate limited and it maxed out the retries limit."});m.invalidBucket.handleCompletedRequest(s.status,"shared"===s.headers.get("X-RateLimit-Scope"));let o=s.headers.get("x-ratelimit-reset-after");return o&&await i(1e3*Number(o)),await e.retryRequest?.(e)}return e.reject(await s.json())}if(204===s.status)return e.resolve(void 0);e.resolve(await s.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=`${m.baseUrl}/v${m.version}/${a.join("/")}`;let s=m.simplifyUrl(e.url,e.method),i=m.queues.get(s);if(void 0!==i)i.makeRequest(e);else{let n=new c(m,{url:s,deleteQueueDelay:m.deleteQueueDelay});n.makeRequest(e),m.queues.set(s,n)}},makeRequest:async(e,t,a,s)=>await new Promise((i,n)=>{m.processRequest({url:t,method:e,body:a,retryCount:0,retryRequest:async function(e){await m.sendRequest(e)},resolve:i,reject:n,options:s})}),get:async e=>a(await m.makeRequest("GET",e)),post:async(e,t)=>a(await m.makeRequest("POST",e,t)),delete:async(e,t)=>a(await m.makeRequest("DELETE",e,t)),patch:async(e,t)=>a(await m.makeRequest("PATCH",e,t)),put:async(e,t,s)=>a(await m.makeRequest("PUT",e,t,s)),channels:{messages:{delete:async(e,t,a)=>await m.deleteMessage(e,t,a),edit:async(e,t,a)=>await m.editMessage(e,t,a),send:async(e,t)=>await m.sendMessage(e,t),publish:async(e,t)=>await m.publishMessage(e,t)},get:async e=>await m.getChannel(e),create:async(e,t)=>await m.createChannel(e,t),delete:async(e,t)=>await m.deleteChannel(e,t),edit:async(e,t)=>await m.editChannel(e,t),follow:async(e,t)=>await m.followAnnouncement(e,t),forums:{post:async(e,t)=>await m.createForumThread(e,t)},permissions:{edit:async(e,t)=>await m.editChannelPermissionOverrides(e,t),delete:async(e,t)=>await m.deleteChannelPermissionOverride(e,t)},positions:async(e,t)=>await m.editChannelPositions(e,t),invites:async e=>await m.getChannelInvites(e),stages:{create:async e=>await m.createStageInstance(e),delete:async(e,t)=>await m.deleteStageInstance(e,t),edit:async(e,t)=>await m.editStageInstance(e,t),get:async e=>await m.getStageInstance(e)},threads:{create:{with:{message:async(e,t,a)=>await m.startThreadWithMessage(e,t,a)},without:{message:async(e,t)=>await m.startThreadWithoutMessage(e,t)}},get:{active:async e=>await m.getActiveThreads(e),archived:{private:async(e,t)=>await m.getPrivateArchivedThreads(e,t),joined:async(e,t)=>await m.getPrivateJoinedArchivedThreads(e,t),public:async(e,t)=>await m.getPublicArchivedThreads(e,t)},member:async(e,t)=>await m.getThreadMember(e,t),members:async e=>await m.getThreadMembers(e)},join:async e=>await m.joinThread(e),leave:async e=>await m.leaveThread(e),kick:async(e,t)=>await m.removeThreadMember(e,t)},typing:async e=>await m.triggerTypingIndicator(e)},emojis:{create:async(e,t)=>await m.createEmoji(e,t),delete:async(e,t,a)=>await m.deleteEmoji(e,t,a),edit:async(e,t,a)=>await m.editEmoji(e,t,a),get:async(e,t)=>await m.getEmoji(e,t)},guilds:{auditlogs:async(e,t)=>await m.getAuditLog(e,t),automod:{create:async(e,t)=>await m.createAutomodRule(e,t),delete:async(e,t)=>await m.deleteAutomodRule(e,t),edit:async(e,t,a)=>await m.editAutomodRule(e,t,a),get:{rule:async(e,t)=>await m.getAutomodRule(e,t),rules:async e=>await m.getAutomodRules(e)}},ban:async(e,t)=>await m.getBan(e,t),bans:async(e,t)=>await m.getBans(e,t),create:async e=>await m.createGuild(e),channels:async e=>await m.getChannels(e),delete:async e=>await m.deleteGuild(e),edit:async(e,t)=>await m.editGuild(e,t),emojis:async e=>await m.getEmojis(e),events:{create:async(e,t)=>await m.createScheduledEvent(e,t),delete:async(e,t)=>await m.deleteScheduledEvent(e,t),edit:async(e,t,a)=>await m.editScheduledEvent(e,t,a),get:{event:async(e,t,a)=>await m.getScheduledEvent(e,t,a),events:async(e,t)=>await m.getScheduledEvents(e,t),users:async(e,t,a)=>await m.getScheduledEventUsers(e,t,a)}},get:async(e,t={counts:!0})=>await m.get(m.routes.guilds.guild(e,t.counts)),integrations:{get:async e=>await m.getIntegrations(e),delete:async(e,t)=>await m.deleteIntegration(e,t)},invites:{create:async(e,t)=>await m.createInvite(e,t),delete:async(e,t)=>await m.deleteInvite(e,t),get:async(e,t)=>await m.getInvite(e,t),list:async e=>await m.getInvites(e)},stickers:{create:async(e,t)=>await m.createGuildSticker(e,t),delete:async(e,t,a)=>await m.deleteGuildSticker(e,t,a),edit:async(e,t,a)=>await m.editGuildSticker(e,t,a),sticker:async(e,t)=>await m.getGuildSticker(e,t),stickers:async e=>await m.getGuildStickers(e)},templates:{create:async(e,t)=>await m.createGuildTemplate(e,t),delete:async(e,t)=>await m.deleteGuildTemplate(e,t),edit:async(e,t,a)=>await m.editGuildTemplate(e,t,a),get:async e=>await m.getGuildTemplate(e),list:async e=>await m.getGuildTemplates(e),sync:async e=>await m.syncGuildTemplate(e)},members:{ban:async(e,t,a)=>await m.banMember(e,t,a),edit:async(e,t,a)=>await m.editMember(e,t,a),editSelf:async(e,t)=>await m.editBotMember(e,t),get:async(e,t)=>await m.getMember(e,t),dm:async e=>await m.getDmChannel(e),kick:async(e,t,a)=>await m.kickMember(e,t,a),list:async(e,t)=>await m.getMembers(e,t),prune:async(e,t)=>await m.pruneMembers(e,t),search:async(e,t,a)=>await m.searchMembers(e,t,a),unban:async(e,t)=>await m.unbanMember(e,t)},interactions:{commands:{create:{global:async e=>await m.createGlobalApplicationCommand(e),guild:async(e,t)=>await m.createGuildApplicationCommand(e,t)},delete:{global:async e=>await m.deleteGlobalApplicationCommand(e),guild:async(e,t)=>await m.deleteGuildApplicationCommand(e,t)},edit:{global:async(e,t)=>await m.editGlobalApplicationCommand(e,t),guild:async(e,t,a)=>await m.editGuildApplicationCommand(e,t,a),permissions:async(e,t,a,s)=>await m.editApplicationCommandPermissions(e,t,a,s)},get:{global:{all:async()=>await m.getGlobalApplicationCommands(),one:async e=>await m.getGlobalApplicationCommand(e)},guilds:{all:async e=>await m.getGuildApplicationCommands(e),one:async(e,t)=>await m.getGuildApplicationCommand(e,t)},permission:async(e,t)=>await m.getApplicationCommandPermission(e,t),permissions:async e=>await m.getApplicationCommandPermissions(e)},replace:{global:async e=>await m.upsertGlobalApplicationCommands(e),guild:async(e,t)=>await m.upsertGuildApplicationCommands(e,t)}},responses:{create:{followup:async(e,t)=>await m.sendFollowupMessage(e,t),original:async(e,t,a)=>await m.sendInteractionResponse(e,t,a)},delete:{followup:async(e,t)=>await m.deleteFollowupMessage(e,t),original:async e=>await m.deleteOriginalInteractionResponse(e)},edit:{followup:async(e,t,a)=>await m.editFollowupMessage(e,t,a),original:async(e,t)=>await m.editOriginalInteractionResponse(e,t)},get:{followup:async(e,t)=>await m.getFollowupMessage(e,t),original:async e=>await m.getOriginalInteractionResponse(e)}}},roles:{add:async(e,t,a,s)=>await m.addRole(e,t,a,s),create:async(e,t,a)=>await m.createRole(e,t,a),delete:async(e,t)=>await m.deleteRole(e,t),edit:async(e,t,a)=>await m.editRole(e,t,a),list:async e=>await m.getRoles(e),positions:async(e,t)=>await m.editRolePositions(e,t),remove:async(e,t,a,s)=>await m.removeRole(e,t,a,s)},vanity:async e=>await m.getVanityUrl(e),regions:async e=>await m.getVoiceRegions(e)},sticker:async e=>await m.getSticker(e),users:{channel:async e=>await m.getDmChannel(e)},webhooks:{create:async(e,t)=>await m.createWebhook(e,t),delete:{with:{id:async(e,t)=>await m.deleteWebhook(e,t),token:async(e,t)=>await m.deleteWebhookWithToken(e,t)}},edit:{with:{id:async(e,t)=>await m.editWebhook(e,t),token:async(e,t,a)=>await m.editWebhookWithToken(e,t,a)}},execute:async(e,t,a)=>await m.executeWebhook(e,t,a),get:{channel:async e=>await m.getChannelWebhooks(e),guild:async e=>await m.getGuildWebhooks(e),message:async(e,t,a,s)=>await m.getWebhookMessage(e,t,a,s),with:{id:async e=>await m.getWebhook(e),token:async(e,t)=>await m.getWebhookWithToken(e,t)}},messages:{delete:async(e,t,a,s)=>await m.deleteWebhookMessage(e,t,a,s),edit:Object.assign(async(e,t,a,s)=>await m.editWebhookMessage(e,t,a,s),{original:async(e,t,a)=>await m.editOriginalWebhookMessage(e,t,a)})}},addRole:async(e,t,a,s)=>await m.put(m.routes.guilds.roles.member(e,t,a),{reason:s}),addThreadMember:async(e,t)=>await m.put(m.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await m.post(m.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await m.post(m.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await m.post(m.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await m.post(m.routes.interactions.commands.commands(m.applicationId),e),createGuild:async e=>await m.post(m.routes.guilds.all(),e),createGuildApplicationCommand:async(e,t)=>await m.post(m.routes.interactions.commands.guilds.all(m.applicationId,t),e),createGuildSticker:async(e,t)=>await m.post(m.routes.guilds.stickers(e),t),createGuildTemplate:async(e,t)=>await m.post(m.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await m.post(m.routes.channels.forum(e),t),createInvite:async(e,t={})=>await m.post(m.routes.channels.invites(e),t),createRole:async(e,t,a)=>await m.post(m.routes.guilds.roles.all(e),{...t,reason:a}),createScheduledEvent:async(e,t)=>await m.post(m.routes.guilds.events.events(e),t),createStageInstance:async e=>await m.post(m.routes.channels.stages(),e),createWebhook:async(e,t)=>await m.post(m.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await l(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,a)=>await m.delete(m.routes.guilds.automod.rule(e,t),{reason:a}),deleteChannel:async(e,t)=>await m.delete(m.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,a)=>await m.delete(m.routes.channels.overwrite(e,t),a?{reason:a}:void 0),deleteEmoji:async(e,t,a)=>await m.delete(m.routes.guilds.emoji(e,t),{reason:a}),deleteFollowupMessage:async(e,t)=>await m.delete(m.routes.interactions.responses.message(m.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await m.delete(m.routes.interactions.commands.command(m.applicationId,e)),deleteGuild:async e=>await m.delete(m.routes.guilds.guild(e)),deleteGuildApplicationCommand:async(e,t)=>await m.delete(m.routes.interactions.commands.guilds.one(m.applicationId,t,e)),deleteGuildSticker:async(e,t,a)=>await m.delete(m.routes.guilds.sticker(e,t),a?{reason:a}:void 0),deleteGuildTemplate:async(e,t)=>await m.delete(m.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await m.delete(m.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await m.delete(m.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,a)=>await m.delete(m.routes.channels.message(e,t),{reason:a}),deleteOriginalInteractionResponse:async e=>await m.delete(m.routes.interactions.responses.original(m.applicationId,e)),deleteRole:async(e,t)=>await m.delete(m.routes.guilds.roles.one(e,t)),deleteScheduledEvent:async(e,t)=>await m.delete(m.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await m.delete(m.routes.channels.stage(e),t?{reason:t}:void 0),deleteWebhook:async(e,t)=>await m.delete(m.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,a,s)=>await m.delete(m.routes.webhooks.message(e,t,a,s)),deleteWebhookWithToken:async(e,t)=>await m.delete(m.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,a,s)=>await m.put(m.routes.interactions.commands.permission(m.applicationId,e,t),{permissions:s},{headers:{authorization:`Bearer ${a}`}}),editAutomodRule:async(e,t,a)=>await m.patch(m.routes.guilds.automod.rule(e,t),a),async editBotProfile(e){let t=e?.botAvatarURL?await l(e?.botAvatarURL):e?.botAvatarURL;return await m.patch(m.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await m.patch(m.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await m.put(m.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await m.patch(m.routes.guilds.channels(e),t),editEmoji:async(e,t,a)=>await m.patch(m.routes.guilds.emoji(e,t),a),editFollowupMessage:async(e,t,a)=>await m.patch(m.routes.interactions.responses.message(m.applicationId,e,t),a),editGlobalApplicationCommand:async(e,t)=>await m.patch(m.routes.interactions.commands.command(m.applicationId,e),t),editGuild:async(e,t)=>await m.patch(m.routes.guilds.guild(e),t),editGuildApplicationCommand:async(e,t,a)=>await m.patch(m.routes.interactions.commands.guilds.one(m.applicationId,t,e),a),editGuildSticker:async(e,t,a)=>await m.patch(m.routes.guilds.sticker(e,t),a),editGuildTemplate:async(e,t,a)=>await m.patch(m.routes.guilds.templates.guild(e,t),a),editMessage:async(e,t,a)=>await m.patch(m.routes.channels.message(e,t),a),editOriginalInteractionResponse:async(e,t)=>await m.patch(m.routes.interactions.responses.original(m.applicationId,e),t),editOriginalWebhookMessage:async(t,a,s)=>await m.patch(m.routes.webhooks.original(t,a,s),{type:e.UpdateMessage,data:s}),editScheduledEvent:async(e,t,a)=>await m.patch(m.routes.guilds.events.event(e,t),a),editRole:async(e,t,a)=>await m.patch(m.routes.guilds.roles.one(e,t),a),editRolePositions:async(e,t)=>await m.patch(m.routes.guilds.roles.all(e),t),editStageInstance:async(e,t)=>await m.patch(m.routes.channels.stage(e),{topic:t.topic}),editWebhook:async(e,t)=>await m.patch(m.routes.webhooks.id(e),t),editWebhookMessage:async(e,t,a,s)=>await m.patch(m.routes.webhooks.message(e,t,a,s),s),editWebhookWithToken:async(e,t,a)=>await m.patch(m.routes.webhooks.webhook(e,t),a),executeWebhook:async(e,t,a)=>await m.post(m.routes.webhooks.webhook(e,t,a),a),followAnnouncement:async(e,t)=>await m.post(m.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await m.get(m.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await m.get(m.routes.interactions.commands.permission(m.applicationId,e,t)),getApplicationCommandPermissions:async e=>await m.get(m.routes.interactions.commands.permissions(m.applicationId,e)),getApplicationInfo:async()=>await m.get(m.routes.oauth2Application()),getAuditLog:async(e,t)=>await m.get(m.routes.guilds.auditlogs(e,t)),getAutomodRule:async(e,t)=>await m.get(m.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await m.get(m.routes.guilds.automod.rules(e)),getBan:async(e,t)=>await m.get(m.routes.guilds.members.ban(e,t)),getBans:async(e,t)=>await m.get(m.routes.guilds.members.bans(e,t)),getChannel:async e=>await m.get(m.routes.channels.channel(e)),getChannelInvites:async e=>await m.get(m.routes.channels.invites(e)),getChannels:async e=>await m.get(m.routes.guilds.channels(e)),getChannelWebhooks:async e=>await m.get(m.routes.channels.webhooks(e)),getDmChannel:async e=>await m.post(m.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await m.get(m.routes.guilds.emoji(e,t)),getEmojis:async e=>await m.get(m.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await m.get(m.routes.interactions.responses.message(m.applicationId,e,t)),getGatewayBot:async()=>await m.get(m.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await m.get(m.routes.interactions.commands.command(m.applicationId,e)),getGlobalApplicationCommands:async()=>await m.get(m.routes.interactions.commands.commands(m.applicationId)),getGuild:async(e,t={counts:!0})=>await m.get(m.routes.guilds.guild(e,t.counts)),getGuildApplicationCommand:async(e,t)=>await m.get(m.routes.interactions.commands.guilds.one(m.applicationId,t,e)),getGuildApplicationCommands:async e=>await m.get(m.routes.interactions.commands.guilds.all(m.applicationId,e)),getGuildTemplate:async e=>await m.get(m.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await m.get(m.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await m.get(m.routes.guilds.webhooks(e)),getIntegrations:async e=>await m.get(m.routes.guilds.integrations(e)),getInvite:async(e,t)=>await m.get(m.routes.guilds.invite(e,t)),getInvites:async e=>await m.get(m.routes.guilds.invites(e)),getNitroStickerPacks:async()=>await m.get(m.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await m.get(m.routes.interactions.responses.original(m.applicationId,e)),getPrivateArchivedThreads:async(e,t)=>await m.get(m.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await m.get(m.routes.channels.threads.joined(e,t)),getPublicArchivedThreads:async(e,t)=>await m.get(m.routes.channels.threads.public(e,t)),getRoles:async e=>await m.get(m.routes.guilds.roles.all(e)),getScheduledEvent:async(e,t,a)=>await m.get(m.routes.guilds.events.event(e,t,a?.withUserCount)),getScheduledEvents:async(e,t)=>await m.get(m.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,a)=>await m.get(m.routes.guilds.events.users(e,t,a)),getSessionInfo:async()=>await m.getGatewayBot(),getStageInstance:async e=>await m.get(m.routes.channels.stage(e)),getSticker:async e=>await m.get(m.routes.sticker(e)),getGuildSticker:async(e,t)=>await m.get(m.routes.guilds.sticker(e,t)),getGuildStickers:async e=>await m.get(m.routes.guilds.stickers(e)),getThreadMember:async(e,t)=>await m.get(m.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await m.get(m.routes.channels.threads.members(e)),getUser:async e=>await m.get(m.routes.user(e)),getVanityUrl:async e=>await m.get(m.routes.guilds.vanity(e)),getVoiceRegions:async e=>await m.get(m.routes.guilds.regions(e)),getWebhook:async e=>await m.get(m.routes.webhooks.id(e)),getWebhookMessage:async(e,t,a,s)=>await m.get(m.routes.webhooks.message(e,t,a,s)),getWebhookWithToken:async(e,t)=>await m.get(m.routes.webhooks.webhook(e,t)),joinThread:async e=>await m.put(m.routes.channels.threads.me(e)),leaveThread:async e=>await m.delete(m.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await m.post(m.routes.channels.crosspost(e,t)),removeRole:async(e,t,a,s)=>await m.delete(m.routes.guilds.roles.member(e,t,a),{reason:s}),removeThreadMember:async(e,t)=>await m.delete(m.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((a,s)=>{m.sendRequest({url:m.routes.webhooks.webhook(m.applicationId,e),method:"POST",body:t,retryCount:0,retryRequest:async function(e){await m.sendRequest(e)},resolve:a,reject:s})}),sendInteractionResponse:async(e,t,a)=>await new Promise((s,i)=>{m.sendRequest({url:m.routes.interactions.responses.callback(e,t),method:"POST",body:a,retryCount:0,retryRequest:async function(e){await m.sendRequest(e)},resolve:s,reject:i})}),sendMessage:async(e,t)=>await m.post(m.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,a)=>await m.post(m.routes.channels.threads.message(e,t),a),startThreadWithoutMessage:async(e,t)=>await m.post(m.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await m.put(m.routes.guilds.templates.all(e)),banMember:async(e,t,a)=>await m.put(m.routes.guilds.members.ban(e,t),a),editBotMember:async(e,t)=>await m.patch(m.routes.guilds.members.bot(e),t),editMember:async(e,t,a)=>await m.patch(m.routes.guilds.members.member(e,t),a),getMember:async(e,t)=>await m.get(m.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await m.get(m.routes.guilds.members.members(e,t)),kickMember:async(e,t,a)=>await m.delete(m.routes.guilds.members.member(e,t),{reason:a}),pruneMembers:async(e,t)=>await m.post(m.routes.guilds.members.prune(e),t),searchMembers:async(e,t,a)=>await m.get(m.routes.guilds.members.search(e,t,a)),unbanMember:async(e,t)=>await m.delete(m.routes.guilds.members.ban(e,t)),triggerTypingIndicator:async e=>await m.post(m.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await m.put(m.routes.interactions.commands.commands(m.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await m.put(m.routes.interactions.commands.guilds.all(m.applicationId,e),t)};return m}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FsY3VsYXRlQml0cywgY2FtZWxpemUsIGNhbWVsVG9TbmFrZUNhc2UsIGRlbGF5LCBmaW5kRmlsZXMsIGdldEJvdElkRnJvbVRva2VuLCBsb2dnZXIsIHVybFRvQmFzZTY0IH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5cbmltcG9ydCB7IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IH0gZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zLFxuICBCaWdTdHJpbmcsXG4gIENhbWVsaXplLFxuICBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMsXG4gIENyZWF0ZUNoYW5uZWxJbnZpdGUsXG4gIENyZWF0ZUZvcnVtUG9zdFdpdGhNZXNzYWdlLFxuICBDcmVhdGVHdWlsZCxcbiAgQ3JlYXRlR3VpbGRDaGFubmVsLFxuICBDcmVhdGVHdWlsZEVtb2ppLFxuICBDcmVhdGVHdWlsZFJvbGUsXG4gIENyZWF0ZU1lc3NhZ2VPcHRpb25zLFxuICBDcmVhdGVTY2hlZHVsZWRFdmVudCxcbiAgQ3JlYXRlU3RhZ2VJbnN0YW5jZSxcbiAgRGVsZXRlV2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICBEaXNjb3JkQWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZEFwcGxpY2F0aW9uLFxuICBEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kLFxuICBEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMsXG4gIERpc2NvcmRBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRDaGFubmVsLFxuICBEaXNjb3JkQ3JlYXRlV2ViaG9vayxcbiAgRGlzY29yZEVtb2ppLFxuICBEaXNjb3JkRm9sbG93QW5ub3VuY2VtZW50Q2hhbm5lbCxcbiAgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbCxcbiAgRGlzY29yZEdldEdhdGV3YXlCb3QsXG4gIERpc2NvcmRHdWlsZCxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRNZW1iZXIsXG4gIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgRGlzY29yZE1lc3NhZ2UsXG4gIERpc2NvcmRSb2xlLFxuICBEaXNjb3JkU2NoZWR1bGVkRXZlbnQsXG4gIERpc2NvcmRTdGFnZUluc3RhbmNlLFxuICBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIERpc2NvcmRUZW1wbGF0ZSxcbiAgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgRGlzY29yZFVzZXIsXG4gIERpc2NvcmRXZWJob29rLFxuICBFZGl0QXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucyxcbiAgRWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzT3B0aW9ucyxcbiAgRWRpdEd1aWxkUm9sZSxcbiAgRWRpdE1lc3NhZ2UsXG4gIEVkaXRTY2hlZHVsZWRFdmVudCxcbiAgRWRpdFN0YWdlSW5zdGFuY2VPcHRpb25zLFxuICBFeGVjdXRlV2ViaG9vayxcbiAgR2V0R3VpbGRQcnVuZUNvdW50UXVlcnksXG4gIEdldEludml0ZSxcbiAgR2V0TWVzc2FnZXNPcHRpb25zLFxuICBHZXRTY2hlZHVsZWRFdmVudHMsXG4gIEdldFNjaGVkdWxlZEV2ZW50VXNlcnMsXG4gIEdldFdlYmhvb2tNZXNzYWdlT3B0aW9ucyxcbiAgSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEsXG4gIEludGVyYWN0aW9uUmVzcG9uc2UsXG4gIExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIExpc3RHdWlsZE1lbWJlcnMsXG4gIE1vZGlmeUNoYW5uZWwsXG4gIE1vZGlmeUd1aWxkQ2hhbm5lbFBvc2l0aW9ucyxcbiAgTW9kaWZ5R3VpbGRFbW9qaSxcbiAgTW9kaWZ5Um9sZVBvc2l0aW9ucyxcbiAgTW9kaWZ5V2ViaG9vayxcbiAgU2VhcmNoTWVtYmVycyxcbiAgU3RhcnRUaHJlYWRXaXRoTWVzc2FnZSxcbiAgU3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSxcbiAgV2l0aFJlYXNvbixcblxuICBBdExlYXN0T25lLFxuICBDcmVhdGVHdWlsZFN0aWNrZXJPcHRpb25zLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRTdGlja2VyLFxuICBEaXNjb3JkVmFuaXR5VXJsLFxuICBEaXNjb3JkVm9pY2VSZWdpb24sXG4gIEVkaXRHdWlsZFN0aWNrZXJPcHRpb25zLFxuICBHZXRCYW5zLFxuICBHZXRHdWlsZEF1ZGl0TG9nLFxuICBNb2RpZnlHdWlsZH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEludmFsaWRSZXF1ZXN0QnVja2V0IH0gZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuXG4vLyBUT0RPOiBtYWtlIGR5bmFtaWMgYmFzZWQgb24gcGFja2FnZS5qc29uIGZpbGVcbmNvbnN0IHZlcnNpb24gPSAnMTkuMC4wLWFscGhhLjEnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIC8vIEZhbHN5IHRva2VuIHN0cmluZyBjaGVja1xuICBpZiAoIW9wdGlvbnMudG9rZW4pIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIHRva2VuLicpXG5cbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgYXBwbGljYXRpb25JZDogb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKSxcbiAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gMTAsXG4gICAgYmFzZVVybDogb3B0aW9ucy5iYXNlVXJsID8/ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaScsXG4gICAgbWF4UmV0cnlDb3VudDogSW5maW5pdHksXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgcHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHM6IGZhbHNlLFxuICAgIGRlbGV0ZVF1ZXVlRGVsYXk6IDYwMDAwLFxuICAgIHF1ZXVlczogbmV3IE1hcCgpLFxuICAgIHJhdGVMaW1pdGVkUGF0aHM6IG5ldyBNYXAoKSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7fSksXG5cbiAgICByb3V0ZXM6IHtcbiAgICAgIHdlYmhvb2tzOiB7XG4gICAgICAgIGlkOiAod2ViaG9va0lkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHt3ZWJob29rSWR9YFxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlOiAod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICBvcmlnaW5hbDogKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0vbWVzc2FnZXMvQG9yaWdpbmFsP2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2s6ICh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2FpdCAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYHdhaXQ9JHtvcHRpb25zLndhaXQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBNaXNjZWxsYW5lb3VzIEVuZHBvaW50c1xuICAgICAgc2Vzc2lvbkluZm86ICgpID0+IHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSxcblxuICAgICAgLy8gQ2hhbm5lbCBFbmRwb2ludHNcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIGRtOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvdXNlcnMvQG1lL2NoYW5uZWxzJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2BcbiAgICAgICAgfSxcblxuICAgICAgICBjaGFubmVsOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIGZvbGxvdzogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9mb2xsb3dlcnNgXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ydW06IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcz9oYXNfbWVzc2FnZT10cnVlYFxuICAgICAgICB9LFxuXG4gICAgICAgIGludml0ZXM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcblxuICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2VzOiAoY2hhbm5lbElkLCBvcHRpb25zPzogR2V0TWVzc2FnZXNPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXM/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQWZ0ZXIob3B0aW9ucykgJiYgb3B0aW9ucy5hZnRlcikge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYGFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0JlZm9yZShvcHRpb25zKSAmJiBvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0Fyb3VuZChvcHRpb25zKSAmJiBvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZhcm91bmQ9JHtvcHRpb25zLmFyb3VuZH1gXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAoaXNHZXRNZXNzYWdlc0xpbWl0KG9wdGlvbnMpICYmIG9wdGlvbnMubGltaXQpIHtcbiAgICAgICAgICAgIC8vICAgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG5cbiAgICAgICAgb3ZlcndyaXRlOiAoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9wZXJtaXNzaW9ucy8ke292ZXJ3cml0ZUlkfWBcbiAgICAgICAgfSxcblxuICAgICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vY3Jvc3Nwb3N0YFxuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlczogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3N0YWdlLWluc3RhbmNlcydcbiAgICAgICAgfSxcblxuICAgICAgICBzdGFnZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3N0YWdlLWluc3RhbmNlcy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhyZWFkIEVuZHBvaW50c1xuICAgICAgICB0aHJlYWRzOiB7XG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGhyZWFkcy9hY3RpdmVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFyY2hpdmVkOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHVibGljP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3VzZXJzL0BtZS90aHJlYWRzL2FyY2hpdmVkL3ByaXZhdGU/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICB0eXBpbmc6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdHlwaW5nYFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gR3VpbGQgRW5kcG9pbnRzXG4gICAgICBndWlsZHM6IHtcbiAgICAgICAgYWxsOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvZ3VpbGRzJ1xuICAgICAgICB9LFxuICAgICAgICBhdWRpdGxvZ3M6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXVkaXQtbG9ncz9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWN0aW9uVHlwZSkgdXJsICs9IGBhY3Rpb25fdHlwZT0ke29wdGlvbnMuYWN0aW9uVHlwZX1gXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudXNlcklkKSB1cmwgKz0gYCZ1c2VyX2lkPSR7b3B0aW9ucy51c2VySWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b21vZDoge1xuICAgICAgICAgIHJ1bGU6IChndWlsZElkLCBydWxlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlcy8ke3J1bGVJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydWxlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjaGFubmVsczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2BcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamk6IChndWlsZElkLCBlbW9qaUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vZW1vamlzLyR7ZW1vamlJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGVtb2ppczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXNgXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGV2ZW50czogKGd1aWxkSWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzP2BcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudDogKGd1aWxkSWQsIGV2ZW50SWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH1gXG5cbiAgICAgICAgICAgIGlmICh3aXRoVXNlckNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX3VzZXJfY291bnQ9JHt3aXRoVXNlckNvdW50LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VyczogKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aE1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJndpdGhfbWVtYmVyPSR7b3B0aW9ucy53aXRoTWVtYmVyLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZ3VpbGQoZ3VpbGRJZCwgd2l0aENvdW50cykge1xuICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9P2BcblxuICAgICAgICAgIGlmICh3aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVybCArPSBgd2l0aF9jb3VudHM9JHt3aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2ludGVncmF0aW9ucy8ke2ludGVncmF0aW9uSWR9YFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zP2luY2x1ZGVfYXBwbGljYXRpb25zPXRydWVgXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvaW52aXRlcy8ke2ludml0ZUNvZGV9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfY291bnRzPSR7b3B0aW9ucy53aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aEV4cGlyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJndpdGhfZXhwaXJhdGlvbj0ke29wdGlvbnMud2l0aEV4cGlyYXRpb24udG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZWRFdmVudElkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmZ3VpbGRfc2NoZWR1bGVkX2V2ZW50X2lkPSR7b3B0aW9ucy5zY2hlZHVsZWRFdmVudElkfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZXM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgIGJhbjogKGd1aWxkSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYmFucy8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiYW5zOiAoZ3VpbGRJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYmFucz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlcikgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm90OiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy9AbWVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXI6IChndWlsZElkLCB1c2VySWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtYmVyczogKGd1aWxkSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlcikgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VhcmNoOiAoZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvc2VhcmNoP3F1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBydW5lOiAoZ3VpbGRJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcHJ1bmU/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmRheXMpIHVybCArPSBgZGF5cz0ke29wdGlvbnMuZGF5c31gXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZVJvbGVzKSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICB1cmwgKz0gYCZpbmNsdWRlX3JvbGVzPSR7b3B0aW9ucy5pbmNsdWRlUm9sZXMuam9pbignLCcpfWBcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVSb2xlcykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICB1cmwgKz0gYCZpbmNsdWRlX3JvbGVzPSR7b3B0aW9ucy5pbmNsdWRlUm9sZXN9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByb2xlczoge1xuICAgICAgICAgIG9uZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcm9sZUlkOiBCaWdTdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3JvbGVzLyR7cm9sZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXI6IChndWlsZElkLCBtZW1iZXJJZCwgcm9sZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7bWVtYmVySWR9L3JvbGVzLyR7cm9sZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdGlja2VyczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9zdGlja2Vyc2BcbiAgICAgICAgfSxcbiAgICAgICAgc3RpY2tlcjogKGd1aWxkSWQsIHN0aWNrZXJJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3N0aWNrZXJzLyR7c3RpY2tlcklkfWBcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgY29kZTogKGNvZGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy90ZW1wbGF0ZXMvJHtjb2RlfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGd1aWxkOiAoZ3VpbGRJZCwgY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGVtcGxhdGVzLyR7Y29kZX1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90ZW1wbGF0ZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdmFuaXR5OiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3Zhbml0eS11cmxgXG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2lvbnM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcmVnaW9uc2BcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9va3M6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vd2ViaG9va3NgXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBzdGlja2VyOiAoc3RpY2tlcklkOiBCaWdTdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGAvc3RpY2tlcnMvJHtzdGlja2VySWR9YFxuICAgICAgfSxcblxuICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBFbmRwb2ludHNcbiAgICAgICAgICBjb21tYW5kczogKGFwcGxpY2F0aW9uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzYFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAgIGFsbChhcHBsaWNhdGlvbklkLCBndWlsZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzYFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25lKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpIHtcbiAgICAgICAgICAgICAgbGV0IHVybCA9IGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9P2BcblxuICAgICAgICAgICAgICBpZiAod2l0aExvY2FsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgd2l0aF9sb2NhbGl6YXRpb25zPSR7d2l0aExvY2FsaXphdGlvbnMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbnM6IChhcHBsaWNhdGlvbklkLCBndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy9wZXJtaXNzaW9uc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBlcm1pc3Npb246IChhcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfS9wZXJtaXNzaW9uc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IChhcHBsaWNhdGlvbklkLCBjb21tYW5kSWQsIHdpdGhMb2NhbGl6YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICBpZiAod2l0aExvY2FsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhMb2NhbGl6YXRpb25zPSR7d2l0aExvY2FsaXphdGlvbnMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIC8vIEludGVyYWN0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNhbGxiYWNrOiAoaW50ZXJhY3Rpb25JZCwgdG9rZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2ludGVyYWN0aW9ucy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L2NhbGxiYWNrYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHtpbnRlcmFjdGlvbklkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWxgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXNzYWdlOiAoYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvd2ViaG9va3MvJHthcHBsaWNhdGlvbklkfS8ke3Rva2VufS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFVzZXIgZW5kcG9pbnRzXG4gICAgICB1c2VyKHVzZXJJZCkge1xuICAgICAgICByZXR1cm4gYC91c2Vycy8ke3VzZXJJZH1gXG4gICAgICB9LFxuXG4gICAgICB1c2VyQm90KCkge1xuICAgICAgICByZXR1cm4gJy91c2Vycy9AbWUnXG4gICAgICB9LFxuXG4gICAgICBvYXV0aDJBcHBsaWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdvYXV0aDIvYXBwbGljYXRpb25zL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIGdhdGV3YXlCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL2dhdGV3YXkvYm90J1xuICAgICAgfSxcblxuICAgICAgbml0cm9TdGlja2VyUGFja3MoKSB7XG4gICAgICAgIHJldHVybiAnL3N0aWNrZXItcGFja3MnXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBjaGVja1JhdGVMaW1pdHModXJsKSB7XG4gICAgICBjb25zdCByYXRlbGltaXRlZCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQodXJsKVxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdwZXJtaXNzaW9ucycpIHtcbiAgICAgICAgICAgIG5ld09iai5wZXJtaXNzaW9ucyA9IGNhbGN1bGF0ZUJpdHMob2JqW2tleV0pXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqW2tleV0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JykgcmV0dXJuIG9iai50b1N0cmluZygpXG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAndXNlci1hZ2VudCc6IGBEaXNjb3JkQm90IChodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vLCB2JHt2ZXJzaW9ufSlgLFxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMudW5hdXRob3JpemVkKSBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIC8vIFNPTUVUSU1FUyBTUEVDSUFMIEhFQURFUlMgKEUuRy4gQ1VTVE9NIEFVVEhPUklaQVRJT04pIE5FRUQgVE8gQkUgVVNFRFxuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvbnMuaGVhZGVyc1trZXldXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR0VUIE1FVEhPRFMgU0hPVUxEIE5PVCBIQVZFIEEgQk9EWVxuICAgICAgaWYgKG9wdGlvbnMubWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zLmJvZHk/LnJlYXNvbikge1xuICAgICAgICBoZWFkZXJzWydYLUF1ZGl0LUxvZy1SZWFzb24nXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLmJvZHkucmVhc29uIGFzIHN0cmluZylcbiAgICAgICAgb3B0aW9ucy5ib2R5LnJlYXNvbiA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSB9ID0gb3B0aW9ucy5ib2R5XG4gICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBmaW5kRmlsZXMoZmlsZSlcbiAgICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcblxuICAgICAgICAgIC8vIFdIRU4gQ1JFQVRJTkcgQSBTVElDS0VSLCBESVNDT1JEIFdBTlRTIEZPUk0gREFUQSBPTkxZXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXJsPy5lbmRzV2l0aCgnL3N0aWNrZXJzJykgJiYgb3B0aW9ucy5tZXRob2QgPT09ICdQT1NUJykge1xuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBmaWxlc1swXS5ibG9iLCBmaWxlc1swXS5uYW1lKVxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ25hbWUnLCBvcHRpb25zLmJvZHkubmFtZSBhcyBzdHJpbmcpXG4gICAgICAgICAgICBmb3JtLmFwcGVuZCgnZGVzY3JpcHRpb24nLCBvcHRpb25zLmJvZHkuZGVzY3JpcHRpb24gYXMgc3RyaW5nKVxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLmJvZHkudGFncyBhcyBzdHJpbmcpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgZm9ybS5hcHBlbmQoYGZpbGUke2l9YCwgZmlsZXNbaV0uYmxvYiwgZmlsZXNbaV0ubmFtZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbGUpIG9wdGlvbnMuYm9keS5maWxlID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3B0aW9ucy5ib2R5LmZpbGUgPSBmb3JtXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ib2R5ICYmICFbJ0dFVCcsICdERUxFVEUnXS5pbmNsdWRlcyhvcHRpb25zLm1ldGhvZCkpIHtcbiAgICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IChvcHRpb25zLmJvZHk/LmZpbGUgPz8gSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSkpIGFzIEZvcm1EYXRhIHwgc3RyaW5nLFxuICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycykge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZycpXG4gICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJylcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgIGNvbnN0IGdsb2JhbCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1nbG9iYWwnKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1idWNrZXQnKSA/PyB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWxpbWl0JylcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KHVybCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCh1cmwsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGJ1Y2tldElkLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKVxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgZ2xvYmFsUmVzZXQpXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYnVja2V0SWQsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXRlTGltaXRlZCAmJiAhcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocykge1xuICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXRlTGltaXRlZCA/IGJ1Y2tldElkIDogdW5kZWZpbmVkXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IG9wdGlvbnMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgPyBvcHRpb25zLnVybCA6IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy51cmx9YFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdCh7IG1ldGhvZDogb3B0aW9ucy5tZXRob2QsIHVybDogb3B0aW9ucy51cmwsIGJvZHk6IG9wdGlvbnMuYm9keSwgLi4ub3B0aW9ucy5vcHRpb25zIH0pXG5cbiAgICAgIGxvZ2dlci5kZWJ1Zyhgc2VuZGluZyByZXF1ZXN0IHRvICR7dXJsfWAsICd3aXRoIHBheWxvYWQ6JywgeyAuLi5wYXlsb2FkLCBoZWFkZXJzOiB7IC4uLnBheWxvYWQuaGVhZGVycywgYXV0aG9yaXphdGlvbjogJ0JvdCB0b2tlbmhlcmUnIH0gfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKVxuICAgICAgbG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMudXJsLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBmYWlsZWQuYClcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IHdhcyByYXRlbGltaXRlZC5gKVxuICAgICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgICBpZiAob3B0aW9ucy5yZXRyeUNvdW50KysgPj0gcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0cmllcy5gLCAnd2l0aCBwYXlsb2FkOicsIHBheWxvYWQpXG4gICAgICAgICAgICAvLyByZXN0LmRlYnVnKGBbUkVTVCAtIFJldHJpZXNNYXhlZF0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuICAgICAgICAgICAgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBxdWV1ZSB0byBwcmV2ZW50IHJldHJ5XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWplY3Q/Lih7XG4gICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICAgIGVycm9yOiAnVGhlIG9wdGlvbnMgd2FzIHJhdGUgbGltaXRlZCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJhdGUgbGltaXRlZCwgYWRkIGJhY2sgdG8gcXVldWVcbiAgICAgICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdChyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1TY29wZScpID09PSAnc2hhcmVkJylcblxuICAgICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQtYWZ0ZXInKVxuICAgICAgICAgIGlmIChyZXNldEFmdGVyKSBhd2FpdCBkZWxheShOdW1iZXIocmVzZXRBZnRlcikgKiAxMDAwKVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLnJlamVjdChhd2FpdCByZXNwb25zZS5qc29uKCkpXG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIG5vIHJlc3BvbnNlXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHJldHVybiBvcHRpb25zLnJlc29sdmUodW5kZWZpbmVkKVxuXG4gICAgICBvcHRpb25zLnJlc29sdmUoYXdhaXQgcmVzcG9uc2UuanNvbigpKVxuICAgIH0sXG5cbiAgICAvLyBDcmVkaXRzOiBnaXRodWIuY29tL2FiYWxhYmFoYWhhL2VyaXMgbGliL3Jlc3QvUmVxdWVzdEhhbmRsZXIuanMjTDM5N1xuICAgIC8vIE1vZGlmaWVkIGZvciBvdXIgdXNlLWNhc2VcbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgbGV0IHJvdXRlID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKC9cXC8oW2Etei1dKylcXC8oPzpbMC05XXsxNywxOX0pL2csIGZ1bmN0aW9uIChtYXRjaCwgcDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFsnY2hhbm5lbHMnLCAnZ3VpbGRzJ10uaW5jbHVkZXMocCkgPyBtYXRjaCA6IGAvJHtwfS94YFxuICAgICAgICB9KVxuICAgICAgICAucmVwbGFjZSgvXFwvcmVhY3Rpb25zXFwvW14vXSsvZywgJy9yZWFjdGlvbnMveCcpXG5cbiAgICAgIC8vIEdFTkVSQUwgL3JlYWN0aW9ucyBhbmQgL3JlYWN0aW9ucy9lbW9qaS9AbWUgc2hhcmUgdGhlIGJ1Y2tldHNcbiAgICAgIGlmIChyb3V0ZS5pbmNsdWRlcygnL3JlYWN0aW9ucycpKSB7XG4gICAgICAgIHJvdXRlID0gcm91dGUuc3Vic3RyaW5nKDAsIHJvdXRlLmluZGV4T2YoJy9yZWFjdGlvbnMnKSArICcvcmVhY3Rpb25zJy5sZW5ndGgpXG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSBNZXNzYWdlIGVuZHBvaW50IGhhcyBpdHMgb3duIHJhdGUgbGltaXRcbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIHJvdXRlID0gbWV0aG9kICsgcm91dGVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlXG4gICAgfSxcblxuICAgIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3Qgcm91dGUgPSByZXF1ZXN0LnVybC5zdWJzdHJpbmcocmVxdWVzdC51cmwuaW5kZXhPZignYXBpLycpKVxuICAgICAgY29uc3QgcGFydHMgPSByb3V0ZS5zcGxpdCgnLycpXG4gICAgICAvLyBSZW1vdmUgdGhlIGFwaS9cbiAgICAgIHBhcnRzLnNoaWZ0KClcbiAgICAgIC8vIFJlbW92ZXMgdGhlIC92Iy9cbiAgICAgIGlmIChwYXJ0c1swXT8uc3RhcnRzV2l0aCgndicpKSBwYXJ0cy5zaGlmdCgpXG4gICAgICAvLyBTZXQgdGhlIGZ1bGwgdXJsIHRvIGRpc2NvcmQgYXBpIGluIGNhc2UgaXQgd2FzIHJlY2lldmVkIGluIGEgcHJveHkgcmVzdFxuICAgICAgcmVxdWVzdC51cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0vJHtwYXJ0cy5qb2luKCcvJyl9YFxuXG4gICAgICBjb25zdCB1cmwgPSByZXN0LnNpbXBsaWZ5VXJsKHJlcXVlc3QudXJsLCByZXF1ZXN0Lm1ldGhvZClcbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KHVybClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSB9KVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KHVybCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnByb2Nlc3NSZXF1ZXN0KHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgYm9keSkpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGJvZHkpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHksIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBjaGFubmVsczoge1xuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgYXN5bmMgZGVsZXRlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24/KSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kTWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcHVibGlzaChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWwoaWQpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVDaGFubmVsKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVDaGFubmVsKGlkLCByZWFzb24pXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBlZGl0KGlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsKGlkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZm9sbG93KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZClcbiAgICAgIH0sXG5cbiAgICAgIGZvcnVtczoge1xuICAgICAgICBhc3luYyBwb3N0KGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGFzeW5jIGVkaXQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoY2hhbm5lbElkLCBpZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBpZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBpbnZpdGVzKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWxJbnZpdGVzKGlkKVxuICAgICAgfSxcblxuICAgICAgc3RhZ2VzOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlU3RhZ2VJbnN0YW5jZShvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChjaGFubmVsSWQsIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIGRhdGEpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0KGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgdGhyZWFkczoge1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2l0aG91dDoge1xuICAgICAgICAgICAgYXN5bmMgbWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgYXN5bmMgYWN0aXZlKGd1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXJjaGl2ZWQ6IHtcbiAgICAgICAgICAgIGFzeW5jIHByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIG1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBtZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBqb2luKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmpvaW5UaHJlYWQoY2hhbm5lbElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxlYXZlKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmxlYXZlVGhyZWFkKGNoYW5uZWxJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBraWNrKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgdHlwaW5nKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LnRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoaWQpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBlbW9qaXM6IHtcbiAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0RW1vamkoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBnZXQoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgZ3VpbGRzOiB7XG4gICAgICBhc3luYyBhdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXV0b21vZDoge1xuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIGV2ZW50SWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBldmVudElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBhc3luYyBydWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBydWxlcyhndWlsZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBdXRvbW9kUnVsZXMoZ3VpbGRJZClcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgYmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRCYW4oZ3VpbGRJZCwgdXNlcklkKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgYmFucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEJhbnMoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkKG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjaGFubmVscyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVscyhpZClcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGRlbGV0ZShpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZChpZClcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGVtb2ppcyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaXMoaWQpXG4gICAgICB9LFxuXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShndWlsZElkLCBldmVudElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBhc3luYyBldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBldmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgICB9LFxuXG4gICAgICBpbnRlZ3JhdGlvbnM6IHtcbiAgICAgICAgYXN5bmMgZ2V0KGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBpbnZpdGVzOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVJbnZpdGUoaW52aXRlQ29kZSwgcmVhc29uKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldChpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbGlzdChndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0SW52aXRlcyhndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgc3RpY2tlcnM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBzdGlja2VySWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc3RpY2tlcnMoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkU3RpY2tlcnMoZ3VpbGRJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0KHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsaXN0KGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzeW5jKGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbWVtYmVyczoge1xuICAgICAgICBhc3luYyBiYW4oZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0U2VsZihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldChndWlsZElkLCB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRtKHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldERtQ2hhbm5lbCh1c2VySWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMga2ljayhndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbGlzdChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHBydW5lKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHVuYmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChjb21tYW5kLCBndWlsZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGdsb2JhbChjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIGd1aWxkKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBnbG9iYWwoY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgZ3VpbGQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBwZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgICAgYXN5bmMgYWxsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKVxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGFzeW5jIG9uZShjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgICAgIGFzeW5jIGFsbChndWlsZElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgYXN5bmMgb25lKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgcGVybWlzc2lvbnMoZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcmVwbGFjZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChndWlsZElkLCBjb21tYW5kcykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC51cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgb3JpZ2luYWwoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIG9yaWdpbmFsKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBnZXQ6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICByb2xlczoge1xuICAgICAgICBhc3luYyBhZGQoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbilcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlUm9sZShndWlsZElkLCBvcHRpb25zLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIHJvbGVJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGVkaXQoZ3VpbGRJZCwgcm9sZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFJvbGUoZ3VpbGRJZCwgcm9sZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxpc3QoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFJvbGVzKGd1aWxkSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcG9zaXRpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0Um9sZVBvc2l0aW9ucyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHJlbW92ZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgdmFuaXR5KGd1aWxkSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VmFuaXR5VXJsKGd1aWxkSWQpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyByZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luYyBzdGlja2VyKHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0U3RpY2tlcihzdGlja2VySWQpXG4gICAgfSxcblxuICAgIHVzZXJzOiB7XG4gICAgICBhc3luYyBjaGFubmVsKHVzZXJJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXREbUNoYW5uZWwodXNlcklkKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgd2ViaG9va3M6IHtcbiAgICAgIGFzeW5jIGNyZWF0ZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlV2ViaG9vayhjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBkZWxldGU6IHtcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGFzeW5jIGlkKGlkLCByZWFzb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVdlYmhvb2soaWQsIHJlYXNvbilcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgdG9rZW4oaWQsIHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVXZWJob29rV2l0aFRva2VuKGlkLCB0b2tlbilcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgZWRpdDoge1xuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgYXN5bmMgaWQod2ViaG9va0lkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0V2ViaG9vayh3ZWJob29rSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHRva2VuKGlkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFdlYmhvb2tXaXRoVG9rZW4oaWQsIHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBleGVjdXRlKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucylcbiAgICAgIH0sXG5cbiAgICAgIGdldDoge1xuICAgICAgICBhc3luYyBjaGFubmVsKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ3VpbGQoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBtZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgYXN5bmMgaWQod2ViaG9va0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRXZWJob29rKHdlYmhvb2tJZClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgdG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBtZXNzYWdlczoge1xuICAgICAgICBhc3luYyBkZWxldGUod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIGpzIGhhY2sgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRvIHdlYmhvb2tzLm1lc3NhZ2VzLmVkaXQoKSBhcyB3ZWxsIGFzIHdlYmhvb2tzLm1lc3NhZ2VzLmVkaXQub3JpZ2luYWwoKVxuICAgICAgICBlZGl0OiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIC8vIFRoZSBiYXNlIGZ1bmN0aW9uIGZvciB3ZWJob29rcy5tZXNzYWdlcy5lZGl0KClcbiAgICAgICAgICAoYXN5bmMgKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgICB9KSBhcyBXZWJob29rTWVzc2FnZUVkaXRvcixcbiAgICAgICAgICAvLyBUaGUgcHJvcGVydGllcyB0aGF0IHdlYmhvb2tzLm1lc3NhZ2VzLmVkaXQueHh4IHdpbGwgaGF2ZSBhcmUgbGlzdGVkIGluIHRoaXMgb2JqZWN0XG4gICAgICAgICAge1xuICAgICAgICAgICAgb3JpZ2luYWw6IGFzeW5jICh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRPcmlnaW5hbFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgV2ViaG9va01lc3NhZ2VFZGl0b3IsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgY29tbWFuZClcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGQob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5hbGwoKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCBjb21tYW5kKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBvcHRpb25zID0ge30pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVSb2xlKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2Uob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgIH0gYXMgRGlzY29yZENyZWF0ZVdlYmhvb2spXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQsIHJvbGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAge1xuICAgICAgICAgIHBlcm1pc3Npb25zOiBvcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkxcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXJCb3QoKSwge1xuICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZT8udHJpbSgpLFxuICAgICAgICBhdmF0YXIsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvcHRpb25zLmlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgY2hhbm5lbFBvc2l0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCBjaGFubmVsUG9zaXRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mub3JpZ2luYWwod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlUG9zaXRpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgZGF0YSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgdG9waWM6IGRhdGEudG9waWMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2sod2ViaG9va0lkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICB3ZWJob29rX2NoYW5uZWxfaWQ6IHRhcmdldENoYW5uZWxJZCxcbiAgICAgIH0gYXMgRGlzY29yZEZvbGxvd0Fubm91bmNlbWVudENoYW5uZWwpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucyhyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDJBcHBsaWNhdGlvbigpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIHJlY2lwaWVudF9pZDogdXNlcklkLnRvU3RyaW5nKCksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXROaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMubml0cm9TdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlcihzdGlja2VySWQ6IEJpZ1N0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5zdGlja2VyKHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbml0eVVybChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZhbml0eVVybD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZhbml0eShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJlZ2lvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2hhbmdlIHRvIHJlcHJvY2VzcyBxdWV1ZSBpdGVtXG4gICAgICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICB1cmw6IHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMudHlwaW5nKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCBjb21tYW5kcylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGNvbW1hbmRzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCBjb21tYW5kcylcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIHJlc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMge1xuICAvKiogVGhlIGJvdCB0b2tlbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFrZSByZXF1ZXN0cy4gKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKipcbiAgICogRm9yIG9sZCBib3RzIHRoYXQgaGF2ZSBhIGRpZmZlcmVudCBib3QgaWQgYW5kIGFwcGxpY2F0aW9uIGlkLlxuICAgKiBAZGVmYXVsdCBib3QgaWQgZnJvbSB0b2tlblxuICAgKi9cbiAgYXBwbGljYXRpb25JZD86IEJpZ1N0cmluZ1xuICAvKipcbiAgICogVGhlIGJhc2UgdXJsIHRvIGNvbm5lY3QgdG8uIElmIHlvdSBjcmVhdGUgYSBwcm94eSByZXN0LCB0aGF0IHVybCB3b3VsZCBnbyBoZXJlLlxuICAgKiBJVCBTSE9VTEQgTk9UIEVORCBXSVRIIEEgL1xuICAgKiBAZGVmYXVsdCBodHRwczovL2Rpc2NvcmQuY29tL2FwaVxuICAgKi9cbiAgYmFzZVVybD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIGFwaSB2ZXJzaW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgdmVyc2lvbj86IEFwaVZlcnNpb25zXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdE1hbmFnZXIge1xuICAvKiogVGhlIGJvdCB0b2tlbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFrZSByZXF1ZXN0cy4gKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKiogVGhlIGFwcGxpY2F0aW9uIGlkLiBOb3JtYWxseSB0aGlzIGlzIG5vdCByZXF1aXJlZCBmb3IgcmVjZW50IGJvdHMgYnV0IG9sZCBib3QncyBhcHBsaWNhdGlvbiBpZCBpcyBzb21ldGltZXMgZGlmZmVyZW50IGZyb20gdGhlIGJvdCBpZCBzbyBpdCBpcyByZXF1aXJlZCBmb3IgdGhvc2UgYm90cy4gKi9cbiAgYXBwbGljYXRpb25JZDogYmlnaW50XG4gIC8qKiBUaGUgYXBpIHZlcnNpb24gdG8gdXNlIHdoZW4gbWFraW5nIHJlcXVlc3RzLiBPbmx5IHRoZSBsYXRlc3Qgc3VwcG9ydGVkIHZlcnNpb24gd2lsbCBiZSB0ZXN0ZWQuICovXG4gIHZlcnNpb246IEFwaVZlcnNpb25zXG4gIC8qKlxuICAgKiBUaGUgYmFzZSB1cmwgdG8gY29ubmVjdCB0by4gSWYgeW91IGNyZWF0ZSBhIHByb3h5IHJlc3QsIHRoYXQgdXJsIHdvdWxkIGdvIGhlcmUuXG4gICAqIElUIFNIT1VMRCBOT1QgRU5EIFdJVEggQSAvXG4gICAqIEBkZWZhdWx0IGh0dHBzOi8vZGlzY29yZC5jb20vYXBpXG4gICAqL1xuICBiYXNlVXJsOiBzdHJpbmdcbiAgLyoqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lcyBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWQuIERlZmF1bHRzIHRvIEluZmluaXR5ICovXG4gIG1heFJldHJ5Q291bnQ6IG51bWJlclxuICAvKiogV2hldGhlciBvciBub3QgdGhlIG1hbmFnZXIgaXMgcmF0ZSBsaW1pdGVkIGdsb2JhbGx5IGFjcm9zcyBhbGwgcmVxdWVzdHMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBnbG9iYWxseVJhdGVMaW1pdGVkOiBib29sZWFuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgcmF0ZSBsaW1pdGVkIHBhdGhzIGFyZSBiZWluZyBwcm9jZXNzZWQgdG8gYWxsb3cgcmVxdWVzdHMgdG8gYmUgbWFkZSBvbmNlIHRpbWUgaXMgdXAuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogYm9vbGVhblxuICAvKiogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGRlbGV0aW5nIHRoaXMgcXVldWUgaWYgaXQgaXMgZW1wdHkuIERlZmF1bHRzIHRvIDYwMDAwKG9uZSBtaW51dGUpLiAqL1xuICBkZWxldGVRdWV1ZURlbGF5OiBudW1iZXJcbiAgLyoqIFRoZSBxdWV1ZXMgdGhhdCBob2xkIGFsbCB0aGUgcmVxdWVzdHMgdG8gYmUgcHJvY2Vzc2VkLiAqL1xuICBxdWV1ZXM6IE1hcDxzdHJpbmcsIFF1ZXVlPlxuICAvKiogVGhlIHBhdGhzIHRoYXQgYXJlIGN1cnJlbnRseSByYXRlIGxpbWl0ZWQuICovXG4gIHJhdGVMaW1pdGVkUGF0aHM6IE1hcDxzdHJpbmcsIFJlc3RSYXRlTGltaXRlZFBhdGg+XG4gIC8qKiBUaGUgYnVja2V0IGZvciBoYW5kbGluZyBhbnkgaW52YWxpZCByZXF1ZXN0cy4gICovXG4gIGludmFsaWRCdWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0XG4gIC8qKiBUaGUgcm91dGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBtYW5hZ2VyLiAqL1xuICByb3V0ZXM6IHtcbiAgICAvKiogUm91dGUgdG8gZ2V0IGEgYm90cyBzZXNzaW9uIGluZm8uICovXG4gICAgc2Vzc2lvbkluZm86ICgpID0+IHN0cmluZ1xuICAgIC8qKiBBIHNwZWNpZmljIHVzZXIgcm91dGUuICovXG4gICAgdXNlcjogKGlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgIC8qKiBDdXJyZW50IGJvdCB1c2VyIHJvdXRlLiAqL1xuICAgIHVzZXJCb3Q6ICgpID0+IHN0cmluZ1xuICAgIC8vIE9BdXRoMlxuICAgIG9hdXRoMkFwcGxpY2F0aW9uOiAoKSA9PiBzdHJpbmdcbiAgICAvLyBHYXRld2F5IEJvdFxuICAgIGdhdGV3YXlCb3Q6ICgpID0+IHN0cmluZ1xuICAgIC8vIE5pdHJvIFN0aWNrZXIgUGFja3NcbiAgICBuaXRyb1N0aWNrZXJQYWNrczogKCkgPT4gc3RyaW5nXG4gICAgLyoqIFJvdXRlcyBmb3Igd2ViaG9vayByZWxhdGVkIHJvdXRlcy4gKi9cbiAgICB3ZWJob29rczoge1xuICAgICAgLyoqIFJvdXRlIGZvciBtYW5hZ2luZyB0aGUgb3JpZ2luYWwgbWVzc2FnZSBzZW50IGJ5IGEgd2ViaG9vay4gKi9cbiAgICAgIG9yaWdpbmFsOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciB3ZWJob29rIHdpdGggYSBpZC4gKi9cbiAgICAgIGlkOiAod2ViaG9va0lkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHdlYmhvb2sgd2l0aCBhIHRva2VuLiAqL1xuICAgICAgd2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zPzogeyB3YWl0PzogYm9vbGVhbjsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgbWVzc2FnZSB0aGF0IHdhcyBzZW50IHRocm91Z2ggYSB3ZWJob29rLiAqL1xuICAgICAgbWVzc2FnZTogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSkgPT4gc3RyaW5nXG4gICAgfVxuICAgIC8qKiBSb3V0ZXMgZm9yIGNoYW5uZWwgcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgY2hhbm5lbHM6IHtcbiAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIGRtIGNoYW5uZWwuICovXG4gICAgICBkbTogKCkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyB3ZWJob29rIGluIGEgY2hhbm5lbC4gKi9cbiAgICAgIHdlYmhvb2tzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNoYW5uZWwuICovXG4gICAgICBjaGFubmVsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBmb2xsb3dpbmcgYSBzcGVjaWZpYyBjaGFubmVsLiAqL1xuICAgICAgZm9sbG93OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBtYW5hZ2luZyBhIGZvcnVtIHdpdGggYSBtZXNzYWdlLiAqL1xuICAgICAgZm9ydW06IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY2hhbm5lbCdzIGludml0ZXMuICovXG4gICAgICBpbnZpdGVzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIG1lc3NhZ2UgKi9cbiAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgaWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBtZXNzYWdlcy4gKi9cbiAgICAgIG1lc3NhZ2VzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRNZXNzYWdlc09wdGlvbnMpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIG92ZXJ3cml0ZS4gKi9cbiAgICAgIG92ZXJ3cml0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvdmVyd3JpdGVJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgY3Jvc3Nwb3N0aW5nIGEgc3BlY2lmaWMgbWVzc2FnZS4gKi9cbiAgICAgIGNyb3NzcG9zdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBzdGFnZXMgKi9cbiAgICAgIHN0YWdlczogKCkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgc3RhZ2UgKi9cbiAgICAgIHN0YWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlcyBmb3IgaGFuZGxpbmcgdGhyZWFkIHJlbGF0ZWQgdG8gYSBjaGFubmVsLiAqL1xuICAgICAgdGhyZWFkczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIHRocmVhZCBhIHNwZWNpZmljIG1lc3NhZ2UuICovXG4gICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIHRocmVhZCB3aXRob3V0IGEgbWVzc2FnZS4gKi9cbiAgICAgICAgYWxsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGFjdGl2ZSB0aHJlYWRzLiAqL1xuICAgICAgICBhY3RpdmU6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIG1lbWJlcnMgaW4gYSB0aHJlYWQuICovXG4gICAgICAgIG1lbWJlcnM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgdGhlIGJvdCBtZW1iZXIgaW4gYSB0aHJlYWQuICovXG4gICAgICAgIG1lOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgbWVtYmVyIGluIGEgdGhyZWFkLiAqL1xuICAgICAgICB1c2VyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhcmNoaXZlZCB0aHJlYWRzLiAqL1xuICAgICAgICBhcmNoaXZlZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBwdWJsaWNhbGx5IGFyY2hpdmVkIHRocmVhZHMuICovXG4gICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzLiAqL1xuICAgICAgICBwcml2YXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBMaXN0QXJjaGl2ZWRUaHJlYWRzKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBwcml2YXRlIGFyY2hpdmVkIHRocmVhZHMgdGhhdCB0aGUgYm90IGhhcyBqb2luZWQuICovXG4gICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHR5cGluZyBpbmRpY2F0b3JzIGluIGEgY8KraGFubmVsLiAqL1xuICAgICAgdHlwaW5nOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgIH1cbiAgICAvKiogUm91dGVzIGZvciBndWlsZCByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICBndWlsZHM6IHtcbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIGEgbm9uLXNwZWNpZmljIGd1aWxkLiAqL1xuICAgICAgYWxsOiAoKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYXVkaXQgbG9ncyBpbiBhIGd1aWxkLiAqL1xuICAgICAgYXVkaXRsb2dzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0R3VpbGRBdWRpdExvZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGVzIGZvciBhIGd1aWxkcyBhdXRvbW9kZXJhdGlvbi4gKi9cbiAgICAgIGF1dG9tb2Q6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgYXV0b21vZGVyYXRpb24uICovXG4gICAgICAgIHJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGF1dG9tb2RlcmF0aW9uIHJ1bGUgZ3VpbGQncyAqL1xuICAgICAgICBydWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3Mgc2NoZWR1bGVkIGV2ZW50cy4gKi9cbiAgICAgIGV2ZW50czoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBzY2hlZHVsZWQgZXZlbnQuICovXG4gICAgICAgIGV2ZW50czogKGd1aWxkSWQ6IEJpZ1N0cmluZywgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgc2NoZWR1bGVkIGV2ZW50LiAqL1xuICAgICAgICBldmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCB3aXRoVXNlckNvdW50PzogYm9vbGVhbikgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzY2hlZHVsZWQgZXZlbnQgdXNlcnMuICovXG4gICAgICAgIHVzZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGNoYW5uZWxzIGluIGEgZ3VpbGQgKi9cbiAgICAgIGNoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBlbW9qaS4gKi9cbiAgICAgIGVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGVtb2ppcy4gKi9cbiAgICAgIGVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQuICovXG4gICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgd2l0aENvdW50cz86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGludGVncmF0aW9uLiAqL1xuICAgICAgaW50ZWdyYXRpb246IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBpbnRlZ3JhdGlvbnMuICovXG4gICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGd1aWxkIGludml0ZS4gKi9cbiAgICAgIGludml0ZTogKGludml0ZUNvZGU6IHN0cmluZywgb3B0aW9ucz86IEdldEludml0ZSkgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBpbnZpdGVzIGluIGEgZ3VpbGQuICovXG4gICAgICBpbnZpdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIHdlYmhvb2tzIGluIGEgZ3VpbGQgKi9cbiAgICAgIHdlYmhvb2tzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIGEgZ3VpbGQncyBtZW1iZXJzLiAqL1xuICAgICAgbWVtYmVyczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgbWVtYmVyJ3MgYmFuLiAqL1xuICAgICAgICBiYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgYmFucyBpbiBhIGd1aWxkLiAqL1xuICAgICAgICBiYW5zOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0QmFucykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSB0aGUgYm90IGd1aWxkIG1lbWJlci4gKi9cbiAgICAgICAgYm90OiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGd1aWxkIG1lbWJlci4gKi9cbiAgICAgICAgbWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGd1aWxkIG1lbWJlcnMuICovXG4gICAgICAgIG1lbWJlcnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBMaXN0R3VpbGRNZW1iZXJzKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBtZW1iZXIgc2VhcmNoaW5nIGluIGEgZ3VpbGQuICovXG4gICAgICAgIHNlYXJjaDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXIgfSkgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHJ1bmluZyBndWlsZCBtZW1iZXJzLiAqL1xuICAgICAgICBwcnVuZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEdldEd1aWxkUHJ1bmVDb3VudFF1ZXJ5KSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIGEgZ3VpbGQncyB0ZW1wbGF0ZXMuICovXG4gICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmMgZ3VpbGQncyB0ZW1wbGF0ZXMgd2l0aCBhIGNvZGUgb25seS4gKi9cbiAgICAgICAgY29kZTogKGNvZGU6IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCdzIHRlbXBsYXRlIHdpdGggYSBndWlsZCBpZCBhbmQgY29kZS4gKi9cbiAgICAgICAgZ3VpbGQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGNvZGU6IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGd1aWxkJ3MgdGVtcGxhdGVzLiAqL1xuICAgICAgICBhbGw6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgdmFuaXR5IHVybC4gKi9cbiAgICAgIHZhbml0eTogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgZ3VpbGQncyByZWdpb25zLiAqL1xuICAgICAgcmVnaW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3Mgcm9sZXMuICovXG4gICAgICByb2xlczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgcm9sZS4gKi9cbiAgICAgICAgb25lOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCByb2xlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIHJvbGVzLiAqL1xuICAgICAgICBhbGw6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgbWVtYmVycyByb2xlcyBpbiBhIGd1aWxkLiAqL1xuICAgICAgICBtZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIG1lbWJlcklkOiBCaWdTdHJpbmcsIHJvbGVJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCBzdGlja2VyLiAqL1xuICAgICAgc3RpY2tlcnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgZ3VpbGQgc3RpY2tlcnMuICovXG4gICAgICBzdGlja2VyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBzdGlja2VySWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgfVxuICAgIC8qKiBSb3V0ZXMgZm9yIGludGVyYWN0aW9uIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gY29tbWFuZCByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIGNvbW1hbmRzLiAqL1xuICAgICAgICBjb21tYW5kczogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgZ3VpbGQgcmVsYXRlZCBjb21tYW5kcy4gKi9cbiAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgZ3VpbGQgY29tbWFuZHMuICovXG4gICAgICAgICAgYWxsOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBndWlsZCBjb21tYW5kLiAqL1xuICAgICAgICAgIG9uZTogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kSWQ6IEJpZ1N0cmluZywgd2l0aExvY2FsaXphdGlvbnM/OiBib29sZWFuKSA9PiBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBjb21tYW5kIHBlcm1pc3Npb25zLiAqL1xuICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNvbW1hbmQncyBwZXJtaXNzaW9uLiAqL1xuICAgICAgICBwZXJtaXNzaW9uOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNvbW1hbmQuICovXG4gICAgICAgIGNvbW1hbmQ6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nLCB3aXRoTG9jYWxpemF0aW9ucz86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gcmVzcG9uc2UgcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGNhbGxiYWNrIHJlc3BvbnNlIHdpdGggaWQgYW5kIHRva2VuLiAqL1xuICAgICAgICBjYWxsYmFjazogKGludGVyYWN0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIHVzaW5nIGlkIGFuZCB0b2tlbi4gKi9cbiAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgZm9sbG93dXAgbWVzc2FnZSBmcm9tIGEgaW50ZXJhY3Rpb24gcmVzcG9uc2UuICovXG4gICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHN0aWNrZXIuICovXG4gICAgc3RpY2tlcjogKHN0aWNrZXJJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuICAvKiogQ2hlY2sgdGhlIHJhdGUgbGltaXRzIGZvciBhIHVybCBvciBhIGJ1Y2tldC4gKi9cbiAgY2hlY2tSYXRlTGltaXRzOiAodXJsOiBzdHJpbmcpID0+IG51bWJlciB8IGZhbHNlXG4gIC8qKiBSZXNoYXBlcyBhbmQgbW9kaWZpZXMgdGhlIG9iaiBhcyBuZWVkZWQgdG8gbWFrZSBpdCByZWFkeSBmb3IgZGlzY29yZHMgYXBpLiAqL1xuICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQ6IChvYmo6IGFueSkgPT4gYW55XG4gIC8qKiBDcmVhdGVzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGhlYWRlcnMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHNlbmQgYSByZXF1ZXN0LiBXaWxsIGhhbmRsZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kcyBhbmQgZXZlcnl0aGluZyBuZWNlc3NhcnkgZm9yIGRpc2NvcmQuICovXG4gIGNyZWF0ZVJlcXVlc3Q6IChvcHRpb25zOiBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMpID0+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+XG4gIH1cbiAgLyoqIEd1aWxkIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMgKi9cbiAgZ3VpbGRzOiB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGd1aWxkJ3MgYXVkaXQgbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgYXVkaXQgbG9nIG9mLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgYXVkaXQgbG9nLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBdWRpdExvZ30uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgVklFV19BVURJVF9MT0dgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXVkaXQtbG9nI2dldC1ndWlsZC1hdWRpdC1sb2d9XG4gICAgICovXG4gICAgYXVkaXRsb2dzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0R3VpbGRBdWRpdExvZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXVkaXRMb2c+PlxuICAgIGF1dG9tb2Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhbiBhdXRvbW9kIHJ1bGUgaW4gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBydWxlIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBydWxlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jY3JlYXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYW4gYXV0b21vZCBydWxlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBydWxlIGluLlxuICAgICAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBlZGl0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJ1bGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI21vZGlmeS1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdEF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnM+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAgICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIGF1dG9tb2RlcmF0aW9uIGRhdGEgaW4gYSBndWlsZC4gKi9cbiAgICAgIGdldDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhbiBhdXRvbW9kIHJ1bGUgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlIG9mLlxuICAgICAgICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNnZXQtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAgICAgICAqL1xuICAgICAgICBydWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYXV0b21vZCBydWxlcyBmb3IgYSBndWlsZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZXMgZnJvbS5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHJ1bGUgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2xpc3QtYXV0by1tb2RlcmF0aW9uLXJ1bGVzLWZvci1ndWlsZH1cbiAgICAgICAgICovXG4gICAgICAgIHJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiYW4gYnkgdXNlciBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGJhbiBmcm9tLlxuICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gZ2V0IHRoZSBiYW4gZm9yLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQmFufS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtYmFufVxuICAgICAqL1xuICAgIGJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEJhbj4+XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBiYW5zIGZvciBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBiYW5zIGZvci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGxpc3Qgb2YgYmFucy5cbiAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRCYW59IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIFVzZXJzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIElEcyBpbiBfYXNjZW5kaW5nXyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtYmFuc31cbiAgICAgKi9cbiAgICBiYW5zOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0QmFucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQmFuW10+PlxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ3VpbGQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRHdWlsZH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIOKaoO+4jyBUaGlzIHJvdXRlIGNhbiBvbmx5IGJlIHVzZWQgYnkgYm90cyBpbiBfX2Zld2VyIHRoYW4gMTAgZ3VpbGRzX18uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9HdWlsZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkfVxuICAgICAqL1xuICAgIGNyZWF0ZTogKG9wdGlvbnM6IENyZWF0ZUd1aWxkKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHdWlsZD4+XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3IgYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGNoYW5uZWxzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY2hhbm5lbCBJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXhjbHVkZXMgdGhyZWFkcy5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtY2hhbm5lbHN9XG4gICAgICovXG4gICAgY2hhbm5lbHM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWxbXT4+XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGJvdCB1c2VyIG11c3QgYmUgdGhlIG93bmVyIG9mIHRoZSBndWlsZC5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX0d1aWxkIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNkZWxldGUtZ3VpbGR9XG4gICAgICovXG4gICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgLyoqXG4gICAgICogRWRpdHMgYSBndWlsZCdzIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQuXG4gICAgICogQHBhcmFtIHNoYXJkSWQgLSBUaGUgSUQgb2YgdGhlIHNoYXJkIHRoZSBndWlsZCBpcyBpbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZ3VpbGQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgR3VpbGR9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIElmIGF0dGVtcHRpbmcgdG8gYWRkIG9yIHJlbW92ZSB0aGUge0BsaW5rIEd1aWxkRmVhdHVyZXMuQ29tbXVuaXR5fSBmZWF0dXJlOlxuICAgICAqIC0gUmVxdWlyZXMgdGhlIGBBRE1JTklTVFJBVE9SYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZH1cbiAgICAgKi9cbiAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR3VpbGQ+PlxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgZW1vamlzIGZvciBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHdoaWNoIHRvIGdldCB0aGUgZW1vamlzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfSBvYmplY3RzIGFzc29ydGVkIGJ5IGVtb2ppIElELlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2xpc3QtZ3VpbGQtZW1vamlzfVxuICAgICAqL1xuICAgIGVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamlbXT4+XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBhIGd1aWxkJ3Mgc2NoZWR1bGVkIGV2ZW50cy4gKi9cbiAgICBldmVudHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBldmVudCBpbiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEEgZ3VpbGQgY2FuIG9ubHkgaGF2ZSBhIG1heGltdW0gb2YgMTAwIGV2ZW50cyB3aXRoIGEgc3RhdHVzIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5BY3RpdmV9IG9yIHtAbGluayBTY2hlZHVsZWRFdmVudFN0YXR1cy5TY2hlZHVsZWR9IChpbmNsdXNpdmUpLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNjcmVhdGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVNjaGVkdWxlZEV2ZW50KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBzY2hlZHVsZWQgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZWRpdC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIFRvIHN0YXJ0IG9yIGVuZCBhbiBldmVudCwgbW9kaWZ5IHRoZSBldmVudCdzIGBzdGF0dXNgIHByb3BlcnR5LlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgZW50aXR5X21ldGFkYXRhYCBwcm9wZXJ0eSBpcyBkaXNjYXJkZWQgZm9yIGV2ZW50cyB3aG9zZSBgZW50aXR5X3R5cGVgIGlzIG5vdCB7QGxpbmsgU2NoZWR1bGVkRXZlbnRFbnRpdHlUeXBlLkV4dGVybmFsfS5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjbW9kaWZ5LWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPEVkaXRTY2hlZHVsZWRFdmVudD4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cblxuICAgICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgc2NoZWR1bGVkIGV2ZW50IGJ5IGl0cyBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHNjaGVkdWxlZCBldmVudC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNnZXQtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IHsgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBzY2hlZHVsZWQgZXZlbnRzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnRzIGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50cy5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudH0gb2JqZWN0cyBhc3NvcnRlZCBieSBldmVudCBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNsaXN0LXNjaGVkdWxlZC1ldmVudHMtZm9yLWd1aWxkfVxuICAgICAgICAgKi9cbiAgICAgICAgZXZlbnRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRzKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgdG8gYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyB0byB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZ2V0IHRoZSBzdWJzY3JpYmVycyBvZi5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzdWJzY3JpYmVycy5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBVc2VyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlcnMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgSURzIGluIF9hc2NlbmRpbmdfIG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnQtdXNlcnN9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyczogKFxuICAgICAgICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICBldmVudElkOiBCaWdTdHJpbmcsXG4gICAgICAgICAgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50VXNlcnMsXG4gICAgICAgICkgPT4gUHJvbWlzZTxcbiAgICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICB1c2VyOiBDYW1lbGl6ZTxEaXNjb3JkVXNlcj5cbiAgICAgICAgICAgIG1lbWJlcj86IENhbWVsaXplPERpc2NvcmRNZW1iZXI+XG4gICAgICAgICAgfT5cbiAgICAgICAgPlxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZ3VpbGQgYnkgaXRzIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGd1aWxkLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBHdWlsZH0uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkfVxuICAgICAqL1xuICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IHsgY291bnRzPzogYm9vbGVhbiB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHdWlsZD4+XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBhIGd1aWxkJ3MgaW50ZWdyYXRpb25zLiAqL1xuICAgIGludGVncmF0aW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBhdHRhY2hlZCB0byBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgaW50ZWdyYXRpb25zIGZyb20uXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEludGVncmF0aW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IGludGVncmF0aW9uIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLWludGVncmF0aW9uc31cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnRlZ3JhdGlvbltdPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhbiBpbnRlZ3JhdGlvbiBhdHRhY2hlZCB0byBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgaW50ZWdyYXRpb24uXG4gICAgICAgKiBAcGFyYW0gaW50ZWdyYXRpb25JZCAtIFRoZSBJRCBvZiB0aGUgaW50ZWdyYXRpb24gdG8gZGVsZXRlIGZyb20gdGhlIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBEZWxldGVzIGFsbCB3ZWJob29rcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVncmF0aW9uLCBhbmQga2lja3MgdGhlIGFzc29jaWF0ZWQgYm90IGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBJbnRlZ3JhdGlvbnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICogRmlyZXMgYSBfSW50ZWdyYXRpb24gRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNkZWxldGUtZ3VpbGQtaW50ZWdyYXRpb259XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaW50ZWdyYXRpb25JZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIGludml0ZXMuICovXG4gICAgaW52aXRlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGludml0ZSB0byBhIGNoYW5uZWwgaW4gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgaW52aXRlIHRvLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBpbnZpdGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEludml0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgQ1JFQVRFX0lOU1RBTlRfSU5WSVRFYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGFuIF9JbnZpdGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBwcml2YXRlUmVtYXJrc1xuICAgICAgICogVGhlIHJlcXVlc3QgYm9keSBpcyBub3Qgb3B0aW9uYWwsIGFuZCBhbiBlbXB0eSBKU09OIG9iamVjdCBtdXN0IGJlIHNlbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBmaWVsZHMgYXJlIGJlaW5nIHRyYW5zbWl0dGVkLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2NyZWF0ZS1jaGFubmVsLWludml0ZX1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBDcmVhdGVDaGFubmVsSW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGU+PlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGFuIGludml0ZSB0byBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBkZWxldGUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGFuIF9JbnZpdGUgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1jaGFubmVsLWludml0ZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGJ5IGl0cyBpbnZpdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gaW52aXRlQ29kZSAtIFRoZSBpbnZpdGUgY29kZSBvZiB0aGUgaW52aXRlIHRvIGdldC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgaW52aXRlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2ludml0ZSNnZXQtaW52aXRlfVxuICAgICAgICovXG4gICAgICBnZXQ6IChpbnZpdGVDb2RlOiBzdHJpbmcsIG9wdGlvbnM/OiBHZXRJbnZpdGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZU1ldGFkYXRhPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGludml0ZXMgZnJvbS5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfSBvYmplY3RzIGFzc29ydGVkIGJ5IGludml0ZSBjb2RlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvaW52aXRlI2dldC1pbnZpdGVzfVxuICAgICAgICovXG4gICAgICBsaXN0OiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBzdGlja2VycyBpbiBhIGd1aWxkLiAqL1xuICAgIHN0aWNrZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZSBhIG5ldyBzdGlja2VyIGZvciB0aGUgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXRcbiAgICAgICAqIEByZXR1cm4gQSB7QGxpbmsgRGlzY29yZFN0aWNrZXJ9XG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKiBGaXJlcyBhIEd1aWxkIFN0aWNrZXJzIFVwZGF0ZSBHYXRld2F5IGV2ZW50LlxuICAgICAgICogRXZlcnkgZ3VpbGRzIGhhcyBmaXZlIGZyZWUgc3RpY2tlciBzbG90cyBieSBkZWZhdWx0LCBhbmQgZWFjaCBCb29zdCBsZXZlbCB3aWxsIGdyYW50IGFjY2VzcyB0byBtb3JlIHNsb3RzLlxuICAgICAgICogTG90dGllIHN0aWNrZXJzIGNhbiBvbmx5IGJlIHVwbG9hZGVkIG9uIGd1aWxkcyB0aGF0IGhhdmUgZWl0aGVyIHRoZSBgVkVSSUZJRURgIGFuZC9vciB0aGUgYFBBUlRORVJFRGAgZ3VpbGQgZmVhdHVyZS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNjcmVhdGUtZ3VpbGQtc3RpY2tlcn1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZFN0aWNrZXJPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGlja2VyPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIGEgbmV3IHN0aWNrZXIgZm9yIHRoZSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldFxuICAgICAgICogQHJldHVybiBBIHtAbGluayBEaXNjb3JkU3RpY2tlcn1cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqIEZpcmVzIGEgR3VpbGQgU3RpY2tlcnMgVXBkYXRlIEdhdGV3YXkgZXZlbnQuXG4gICAgICAgKiBFdmVyeSBndWlsZHMgaGFzIGZpdmUgZnJlZSBzdGlja2VyIHNsb3RzIGJ5IGRlZmF1bHQsIGFuZCBlYWNoIEJvb3N0IGxldmVsIHdpbGwgZ3JhbnQgYWNjZXNzIHRvIG1vcmUgc2xvdHMuXG4gICAgICAgKiBMb3R0aWUgc3RpY2tlcnMgY2FuIG9ubHkgYmUgdXBsb2FkZWQgb24gZ3VpbGRzIHRoYXQgaGF2ZSBlaXRoZXIgdGhlIGBWRVJJRklFRGAgYW5kL29yIHRoZSBgUEFSVE5FUkVEYCBndWlsZCBmZWF0dXJlLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGlja2VyI2RlbGV0ZS1ndWlsZC1zdGlja2VyfVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHN0aWNrZXJJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdCB0aGUgZ2l2ZW4gc3RpY2tlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldFxuICAgICAgICogQHJldHVybiBBIHtAbGluayBEaXNjb3JkU3RpY2tlcn1cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqIEZpcmVzIGEgR3VpbGQgU3RpY2tlcnMgVXBkYXRlIEdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjbW9kaWZ5LWd1aWxkLXN0aWNrZXJ9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHN0aWNrZXJJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBBdExlYXN0T25lPEVkaXRHdWlsZFN0aWNrZXJPcHRpb25zPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlcj4+XG4gICAgICAvKipcbiAgICAgICAqIFJldHVybnMgYSBzdGlja2VyIG9iamVjdCBmb3IgdGhlIGdpdmVuIGd1aWxkIGFuZCBzdGlja2VyIElEcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldFxuICAgICAgICogQHBhcmFtIHN0aWNrZXJJZCBUaGUgSUQgb2YgdGhlIHN0aWNrZXIgdG8gZ2V0XG4gICAgICAgKiBAcmV0dXJuIEEge0BsaW5rIERpc2NvcmRTdGlja2VyfVxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzIEluY2x1ZGVzIHRoZSB1c2VyIGZpZWxkIGlmIHRoZSBib3QgaGFzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjZ2V0LWd1aWxkLXN0aWNrZXJ9XG4gICAgICAgKi9cbiAgICAgIHN0aWNrZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHN0aWNrZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGlja2VyPj5cbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdGlja2VyIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldFxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkU3RpY2tlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSBzdGlja2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzIEluY2x1ZGVzIHVzZXIgZmllbGRzIGlmIHRoZSBib3QgaGFzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjbGlzdC1ndWlsZC1zdGlja2Vyc31cbiAgICAgICAqL1xuICAgICAgc3RpY2tlcnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXJbXT4+XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjY3JlYXRlLWd1aWxkLXRlbXBsYXRlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSB0ZW1wbGF0ZSBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHRlbXBsYXRlJ3Mgc2V0dGluZ3MuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgYSB0ZW1wbGF0ZSBvZi5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNtb2RpZnktZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYSB0ZW1wbGF0ZSBieSBpdHMgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGdldC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGdldDogKHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVGVtcGxhdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdGVtcGxhdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2dldC1ndWlsZC10ZW1wbGF0ZXN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBTeW5jaHJvbmlzZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHN5bmNocm9uaXNlIGEgdGVtcGxhdGUgb2YuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICAgICAqL1xuICAgICAgc3luYzogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgIH1cbiAgICAvKiBHdWlsZCBNZW1iZXJzIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgbWVtYmVyczoge1xuICAgICAgLyoqXG4gICAgICAgKiBCYW5zIGEgdXNlciBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGJhbiB0aGUgdXNlciBmcm9tLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBiYW4gZnJvbSB0aGUgZ3VpbGQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGJhbi5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBCYW4gQWRkXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNjcmVhdGUtZ3VpbGQtYmFufVxuICAgICAgICovXG4gICAgICBiYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQ3JlYXRlR3VpbGRCYW4pID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgdGhlIG5pY2tuYW1lIG9mIHRoZSBib3QgdXNlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG5pY2tuYW1lLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lbWJlcn1cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWN1cnJlbnQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBlZGl0U2VsZjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdEJvdE1lbWJlck9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gICAgICAvKipcbiAgICAgICAqIEVkaXRzIGEgbWVtYmVyJ3MgcHJvcGVydGllcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbWVtYmVyIG9mLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBUaGlzIGVuZHBvaW50IHJlcXVpcmVzIHZhcmlvdXMgcGVybWlzc2lvbnMgZGVwZW5kaW5nIG9uIHdoYXQgaXMgZWRpdGVkIGFib3V0IHRoZSBtZW1iZXIuXG4gICAgICAgKiBUbyBmaW5kIG91dCB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiB0byBlbmFjdCBhIGNoYW5nZSwgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIGVuZHBvaW50J3Mge0BsaW5rIE1vZGlmeUd1aWxkTWVtYmVyIHwgcGFyYW1ldGVyc30uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkTWVtYmVyKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXI+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgYSBETSBjaGFubmVsIHdpdGggYSB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ2hhbm5lbH0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3VzZXIjY3JlYXRlLWRtfVxuICAgICAgICovXG4gICAgICBkbTogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbWVtYmVyIG9iamVjdCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIG1lbWJlciBvYmplY3QgZm9yLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBnZXQgdGhlIG1lbWJlciBvYmplY3QgZm9yLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1tZW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEdVSUxEX01FTUJFUlNgIGludGVudC5cbiAgICAgICAqXG4gICAgICAgKiDimqDvuI8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGVuZHBvaW50IHdpdGggdmVyeSBsYXJnZSBib3RzLiBJbnN0ZWFkLCBvcHQgdG8gdXNlIGBmZXRjaE1lbWJlcnMoKWA6XG4gICAgICAgKiBSRVNUIGNvbW11bmljYXRpb24gb25seSBwZXJtaXRzIDUwIHJlcXVlc3RzIHRvIGJlIG1hZGUgcGVyIHNlY29uZCwgd2hpbGUgZ2F0ZXdheXMgYWxsb3cgZm9yIHVwIHRvIDEyMCByZXF1ZXN0c1xuICAgICAgICogcGVyIG1pbnV0ZSBwZXIgc2hhcmQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvcmF0ZS1saW1pdHMjcmF0ZS1saW1pdHN9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvcmF0ZS1saW1pdHMjcmF0ZS1saW1pdHN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IExpc3RHdWlsZE1lbWJlcnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBLaWNrcyBhIG1lbWJlciBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGtpY2sgdGhlIG1lbWJlciBmcm9tLlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8ga2ljayBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAga2ljazogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBJbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZyBpbmFjdGl2ZSBtZW1iZXJzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBwcnVuZSB0aGUgbWVtYmVycyBvZi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBwcnVuaW5nIG9mIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IG1lbWJlcnMgd2VyZSBwcnVuZWQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgS0lDS19NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIOKdlyBSZXF1ZXN0cyB0byB0aGlzIGVuZHBvaW50IHdpbGwgdGltZSBvdXQgZm9yIGxhcmdlIGd1aWxkcy4gVG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLCBzZXQgdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuY29tcHV0ZVBydW5lQ291bnR9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciB0byBgZmFsc2VgLiBUaGlzIHdpbGwgYmVnaW4gdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZywgYW5kIGltbWVkaWF0ZWx5IHJldHVybiBgdW5kZWZpbmVkYCwgcmF0aGVyIHRoYW4gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyB0aGUgYWN0dWFsIGNvdW50IG9mIG1lbWJlcnMgdGhhdCBoYXZlIGJlZW4ga2lja2VkLlxuICAgICAgICpcbiAgICAgICAqIOKaoO+4jyBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3Mgd2lsbCBub3QgcmVtb3ZlIG1lbWJlcnMgd2l0aCBhIHJvbGUuIFRvIGluY2x1ZGUgdGhlIG1lbWJlcnMgd2hvIGhhdmUgYSBfcGFydGljdWxhciBzdWJzZXQgb2Ygcm9sZXNfLCBzcGVjaWZ5IHRoZSByb2xlKHMpIGluIHRoZSB7QGxpbmsgQmVnaW5HdWlsZFBydW5lLmluY2x1ZGVSb2xlcyB8IGluY2x1ZGVSb2xlc30gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlciBSZW1vdmVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IG1lbWJlciBraWNrZWQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lfVxuICAgICAgICovXG4gICAgICBwcnVuZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQmVnaW5HdWlsZFBydW5lKSA9PiBQcm9taXNlPHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgbWVtYmVycyB3aG9zZSB1c2VybmFtZXMgb3Igbmlja25hbWVzIHN0YXJ0IHdpdGggYSBwcm92aWRlZCBzdHJpbmcuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHNlYXJjaCBpbi5cbiAgICAgICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzdHJpbmcgdG8gbWF0Y2ggdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBhZ2FpbnN0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbWJlcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjc2VhcmNoLWd1aWxkLW1lbWJlcnN9XG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8U2VhcmNoTWVtYmVycywgJ3F1ZXJ5Jz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBVbmJhbnMgYSB1c2VyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gdW5iYW4gdGhlIHVzZXIgaW4uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIHVuYmFuLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIEJhbiBSZW1vdmVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI3JlbW92ZS1ndWlsZC1iYW59XG4gICAgICAgKi9cbiAgICAgIHVuYmFuOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICAvKiogSW50ZXJhY3Rpb24gcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICBpbnRlcmFjdGlvbnM6IHtcbiAgICAgIC8qKiBDb21tYW5kIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgICBjb21tYW5kczoge1xuICAgICAgICAvKiogTWV0aG9kcyBmb3IgY3JlYXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYWNjZXNzaWJsZSBnbG9iYWxseTsgYWNyb3NzIGRpZmZlcmVudCBndWlsZHMgYW5kIGNoYW5uZWxzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgICAgICAgICAqIOKaoO+4jyBHbG9iYWwgY29tbWFuZHMgb25jZSBjcmVhdGVkIGFyZSBjYWNoZWQgZm9yIHBlcmlvZHMgb2YgX19hbiBob3VyX18sIHNvIGNoYW5nZXMgbWFkZSB0byBleGlzdGluZyBjb21tYW5kcyB3aWxsIHRha2UgYW4gaG91ciB0byBzdXJmYWNlLlxuICAgICAgICAgICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNjcmVhdGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZDogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENyZWF0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCBvbmx5IGFjY2Vzc2libGUgaW4gYSBzcGVjaWZpYyBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gY3JlYXRlLlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNvbW1hbmQgZm9yLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICAgICAgICAgKiDimqDvuI8gWW91IGNhbiBvbmx5IGNyZWF0ZSB1cCB0byAyMDAgX25ld18gY29tbWFuZHMgZGFpbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ3VpbGQ6IChjb21tYW5kOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgZGVsZXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBEZWxldGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBnbG9iYWxseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZGVsZXRlLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2RlbGV0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSBjb21tYW5kIGZyb20uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZGVsZXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ3VpbGQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIGVkaXRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRWRpdHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2VkaXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbnMgZm9yIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAgICAgICAgICogQHBhcmFtIGJlYXJlclRva2VuIC0gVGhlIGJlYXJlciB0b2tlbiB0byB1c2UgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZCBwZXJtaXNzaW9ucy5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVGhlIGJlYXJlciB0b2tlbiByZXF1aXJlcyB0aGUgYGFwcGxpY2F0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucy51cGRhdGVgIHNjb3BlIHRvIGJlIGVuYWJsZWQsIGFuZCB0byBoYXZlIGFjY2VzcyB0byB0aGUgZ3VpbGQgd2hvc2UgSUQgaGFzIGJlZW4gcHJvdmlkZWQgaW4gdGhlIHBhcmFtZXRlcnMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb25zOiAoXG4gICAgICAgICAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgICAgICAgICBjb21tYW5kSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiBzdHJpbmcsXG4gICAgICAgICAgICBvcHRpb25zOiBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdLFxuICAgICAgICAgICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+PlxuICAgICAgICB9XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBnZXR0aW5nIGEgY29tbWFuZC4gKi9cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgZ2xvYmFsOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZCBieSBpdHMgSUQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvbmU6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPj5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiB5b3VyIGJvdCdzIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcy5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhbGw6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgICAgICAgICB9XG4gICAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvbmU6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgYnkgeW91ciBib3QgaW4gYSBndWlsZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmRzIGFyZSByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc3N9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIH1cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb246IChndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgcGVybWlzc2lvbnMgb2YgYWxsIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgaW4gYSBndWlsZCBieSB0aGUgSUQgb2YgdGhlIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2JqZWN0cyBvZi5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwZXJtaXNzaW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIHJlcGxhY2luZyBleGlzdGluZyBjb21tYW5kcyBpbiBidWxrLiAqL1xuICAgICAgICByZXBsYWNlOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcywgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgbGlzdCBvZiBjb21tYW5kcyB0byB1c2UgdG8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBsaXN0LlxuICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICog4pqg77iPIENvbW1hbmRzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3Qgd2lsbCBjb3VudCB0b3dhcmRzIHRoZSBkYWlseSBsaW1pdCBvZiBfMjAwXyBuZXcgY29tbWFuZHMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjYnVsay1vdmVyd3JpdGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdsb2JhbDogKGNvbW1hbmRzOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmRbXSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFJlLXJlZ2lzdGVycyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQsIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21tYW5kcyBjb21wbGV0ZWx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHdob3NlIGxpc3Qgb2YgY29tbWFuZHMgdG8gb3ZlcndyaXRlLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4p2XIENvbW1hbmRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBgY29tbWFuZHNgIGFycmF5IHdpbGwgYmUgX19kZWxldGVkX18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKiBSZXNwb25zZSByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGNyZWF0aW5nIGEgcmVzcG9uc2UuICovXG4gICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNlbmRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4pqg77iPIEludGVyYWN0aW9uIHRva2VucyBhcmUgb25seSB2YWxpZCBmb3IgXzE1IG1pbnV0ZXNfLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNlbmRzIGEgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gaW50ZXJhY3Rpb25JZCAtIFRoZSBJRCBvZiB0aGUgaW50ZXJhY3Rpb24gdG8gcmVzcG9uZCB0by5cbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4pqg77iPIEludGVyYWN0aW9uIHRva2VucyBhcmUgb25seSB2YWxpZCBmb3IgXzE1IG1pbnV0ZXNfLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1pbnRlcmFjdGlvbi1yZXNwb25zZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25SZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICB9XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGRlbGV0aW5nIGEgcmVzcG9uc2UuICovXG4gICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2RlbGV0ZS1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBEZWxldGVzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZGVsZXRlTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gZWRpdGluZyBhIHJlc3BvbnNlLiAqL1xuICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRWRpdHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZWRpdE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNlZGl0LWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGVkaXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZWRpdC1vcmlnaW5hbC1pbnRlcmFjdGlvbi1yZXNwb25zZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBvcmlnaW5hbDogKHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIGEgcmVzcG9uc2UuICovXG4gICAgICAgIGdldDoge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEdldHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbiBieSB0aGUgSUQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBnZXQuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICAgICAgICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAgICAgICAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmb2xsb3d1cDogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICAgICAgICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAgICAgICAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiogUm9sZSByZWxhdGVkIGhlbHBlcnMgbWV0aG9kcy4gKi9cbiAgICByb2xlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBBZGRzIGEgcm9sZSB0byBhIG1lbWJlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIG1lbWJlciB0byBhZGQgdGhlIHJvbGUgdG8gaXMgaW4uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBhZGQgdGhlIHJvbGUgdG8uXG4gICAgICAgKiBAcGFyYW0gcm9sZUlkIC0gVGhlIElEIG9mIHRoZSByb2xlIHRvIGFkZCB0byB0aGUgbWVtYmVyLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNhZGQtZ3VpbGQtbWVtYmVyLXJvbGV9XG4gICAgICAgKi9cbiAgICAgIGFkZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIHJvbGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHJvbGUgaW4gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSByb2xlIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSByb2xlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRSb2xlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgUm9sZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1yb2xlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkUm9sZSwgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRSb2xlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHJvbGUgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHJvbGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSByb2xlSWQgLSBUaGUgSUQgb2YgdGhlIHJvbGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBSb2xlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLXJvbGV9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcm9sZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSByb2xlIGluIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJvbGUgaW4uXG4gICAgICAgKiBAcGFyYW0gcm9sZUlkIC0gVGhlIElEIG9mIHRoZSByb2xlIHRvIGVkaXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcm9sZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRSb2xlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgUm9sZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZC1yb2xlfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCByb2xlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdEd1aWxkUm9sZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkUm9sZT4+XG4gICAgICAvKipcbiAgICAgICAqIEVkaXRzIHRoZSBwb3NpdGlvbnMgb2YgYSBzZXQgb2Ygcm9sZXMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJvbGUgcG9zaXRpb25zIGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJvbGUgcG9zaXRpb25zLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkUm9sZX0gb2JqZWN0cyBhc3NvcnRlZCBieSByb2xlIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBSb2xlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgcm9sZSBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLXJvbGUtcG9zaXRpb25zfVxuICAgICAgICovXG4gICAgICBwb3NpdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeVJvbGVQb3NpdGlvbnNbXSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkUm9sZVtdPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiByb2xlcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzb3JjUm9sZX0gb2JqZWN0cyBhc3NvcnRlZCBieSByb2xlIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiDimqDvuI8gVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgZHVlIHRvIHtAbGluayBVc2VyfSBvYmplY3RzIGFscmVhZHkgYmVpbmcgaW5jbHVkZWQgaW4gZ3VpbGQgcGF5bG9hZHMuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1yb2xlc31cbiAgICAgICAqL1xuICAgICAgbGlzdDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkUm9sZVtdPj5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBhIHJvbGUgZnJvbSBhIG1lbWJlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIG1lbWJlciB0byByZW1vdmUgdGhlIHJvbGUgZnJvbSBpcyBpbi5cbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIHJlbW92ZSB0aGUgcm9sZSBmcm9tLlxuICAgICAgICogQHBhcmFtIHJvbGVJZCAtIFRoZSBJRCBvZiB0aGUgcm9sZSB0byByZW1vdmUgZnJvbSB0aGUgbWVtYmVyLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtbWVtYmVyLXJvbGV9XG4gICAgICAgKi9cbiAgICAgIHJlbW92ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIHJvbGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFuaXR5IHVybCBvZiBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgdmFuaXR5IHVybCBpbmZvcm1hdGlvbiBmb3IuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhbml0eVVybH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogVGhlIGBjb2RlYCBwcm9wZXJ0eSB3aWxsIGJlIGBudWxsYCBpZiB0aGUgZ3VpbGQgZG9lcyBub3QgaGF2ZSBhIHNldCB2YW5pdHkgdXJsLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC12YW5pdHktdXJsfVxuICAgICAqL1xuICAgIHZhbml0eTogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVmFuaXR5VXJsPj5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHZvaWNlIHJlZ2lvbnMgZm9yIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB2b2ljZSByZWdpb25zIGZvci5cbiAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFZvaWNlUmVnaW9ucyB8IFZvaWNlUmVnaW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IHZvaWNlIHJlZ2lvbiBJRC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtdm9pY2UtcmVnaW9uc31cbiAgICAgKi9cbiAgICByZWdpb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRWb2ljZVJlZ2lvbltdPj5cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHN0aWNrZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gc3RpY2tlciBJRC5cbiAgICpcbiAgICogQHBhcmFtIHN0aWNrZXJJZCBUaGUgSUQgb2YgdGhlIHN0aWNrZXIgdG8gZ2V0XG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc2NvcmRTdGlja2VyfVxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNnZXQtc3RpY2tlcn1cbiAgICovXG4gIHN0aWNrZXI6IChzdGlja2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlcj4+XG4gIC8qKiBXZWJob29rIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gIHdlYmhvb2tzOiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHdlYmhvb2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgd2ViaG9vayBpbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiDimqDvuI8gVGhlIHdlYmhvb2sgbmFtZSBtdXN0IG5vdCBjb250YWluIHRoZSBzdHJpbmcgJ2NseWRlJyAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNjcmVhdGUtd2ViaG9va31cbiAgICAgKi9cbiAgICBjcmVhdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgLyoqIE1ldGhvZHMgdG8gZGVsZXRlIGEgd2ViaG9vay4gKi9cbiAgICBkZWxldGU6IHtcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAoaWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGRlbGV0ZSB0aGUgbWVzc2FnZSBiZWxvbmdpbmcgdG8uXG4gICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGRlbGV0ZSB0aGUgd2ViaG9vay5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKGlkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBlZGl0aW5nIGEgd2ViaG9vay4gKi9cbiAgICBlZGl0OiB7XG4gICAgICB3aXRoOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFZGl0cyBhIHdlYmhvb2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2t9XG4gICAgICAgICAqL1xuICAgICAgICBpZDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgd2ViaG9vay5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNtb2RpZnktd2ViaG9vay13aXRoLXRva2VufVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogT21pdDxNb2RpZnlXZWJob29rLCAnY2hhbm5lbElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIHdlYmhvb2ssIGNhdXNpbmcgYSBtZXNzYWdlIHRvIGJlIHBvc3RlZCBpbiB0aGUgY2hhbm5lbCBjb25maWd1cmVkIGZvciB0aGUgd2ViaG9vay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZXhlY3V0ZS5cbiAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBleGVjdXRlIHRoZSB3ZWJob29rLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIHdlYmhvb2suXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHtAbGluayBFeGVjdXRlV2ViaG9vay53YWl0IHwgd2FpdH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIGlzIHNldCB0byBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB0aGUgd2ViaG9vayBjaGFubmVsIGlzIGEgZm9ydW0gY2hhbm5lbCwgeW91IG11c3QgcHJvdmlkZSBhIHZhbHVlIGZvciBlaXRoZXIgYHRocmVhZElkYCBvciBgdGhyZWFkTmFtZWAuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNleGVjdXRlLXdlYmhvb2t9XG4gICAgICovXG4gICAgZXhlY3V0ZTogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBFeGVjdXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4gfCB1bmRlZmluZWQ+XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBnZXR0aW5nIHdlYmhvb2tzLiAqL1xuICAgIGdldDoge1xuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGEgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgd2hpY2ggdG8gZ2V0IHRoZSB3ZWJob29rcyBvZi5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWNoYW5uZWwtd2ViaG9va3N9XG4gICAgICAgKi9cbiAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHdlYmhvb2tzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWd1aWxkLXdlYmhvb2tzfVxuICAgICAgICovXG4gICAgICBndWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyBhIHdlYmhvb2sgbWVzc2FnZSBieSBpdHMgSUQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQgYSBtZXNzYWdlIG9mLlxuICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHdlYmhvb2sgbWVzc2FnZXMuXG4gICAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gdGhlIElEIG9mIHRoZSB3ZWJob29rIG1lc3NhZ2UgdG8gZ2V0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBtZXNzYWdlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB3ZWJob29rIGJ5IGl0cyBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAod2ViaG9va0lkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHdlYmhvb2sgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHRoZSB3ZWJob29rLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay13aXRoLXRva2VufVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gbWVzc2FnZSBzZW50IGJ5IGEgd2ViaG9vay4gKi9cbiAgICBtZXNzYWdlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIG1hbmFnZSB0aGUgd2ViaG9vay5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogRGVsZXRlV2ViaG9va01lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgbWVzc2FnZXMgc2VudCBieSBhIHdlYmhvb2suICovXG4gICAgICBlZGl0OiBXZWJob29rTWVzc2FnZUVkaXRvclxuICAgIH1cbiAgfVxuICAvKiogVXNlciByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICB1c2Vyczoge1xuICAgIC8qKlxuICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGNyZWF0ZSB0aGUgRE0gY2hhbm5lbCB3aXRoLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvdXNlciNjcmVhdGUtZG19XG4gICAgICovXG4gICAgY2hhbm5lbDogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgfVxuICAvKipcbiAgICogQWRkcyBhIHJvbGUgdG8gYSBtZW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgbWVtYmVyIHRvIGFkZCB0aGUgcm9sZSB0byBpcyBpbi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8gYWRkIHRoZSByb2xlIHRvLlxuICAgKiBAcGFyYW0gcm9sZUlkIC0gVGhlIElEIG9mIHRoZSByb2xlIHRvIGFkZCB0byB0aGUgbWVtYmVyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2FkZC1ndWlsZC1tZW1iZXItcm9sZX1cbiAgICovXG4gIGFkZFJvbGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCByb2xlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBBZGRzIGEgbWVtYmVyIHRvIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gYWRkIHRoZSBtZW1iZXIgdG8uXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIGFkZCB0byB0aGUgdGhyZWFkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBzZW5kIG1lc3NhZ2VzIGluIHRoZSB0aHJlYWQuXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2FkZC10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgYWRkVGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGF1dG9tb2QgcnVsZSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBydWxlIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHJ1bGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jY3JlYXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgY3JlYXRlQXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY2hhbm5lbCB3aXRoaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2hhbm5lbC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNldHRpbmcgcGVybWlzc2lvbiBvdmVyd3JpdGVzLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gaXMgb25seSBwb3NzaWJsZSBmb3IgZ3VpbGQgYWRtaW5pc3RyYXRvcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWNoYW5uZWx9XG4gICAqL1xuICBjcmVhdGVDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZENoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbW9qaSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbW9qaS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEVtb2ppcyBoYXZlIGEgbWF4aW11bSBmaWxlIHNpemUgb2YgMjU2IGtpbG9iaXRzLiBBdHRlbXB0aW5nIHRvIHVwbG9hZCBhIGxhcmdlciBlbW9qaSB3aWxsIGNhdXNlIHRoZSByb3V0ZSB0byByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjY3JlYXRlLWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgY3JlYXRlRW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgZm9ydW0gY2hhbm5lbCwgYW5kIHNlbmRzIGEgbWVzc2FnZSB3aXRoaW4gdGhlIGNyZWF0ZWQgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBmb3J1bSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgdGhyZWFkIHdpdGhpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0gd2l0aCBhIG5lc3RlZCB7QGxpbmsgTWVzc2FnZX0gb2JqZWN0LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC1pbi1mb3J1bS1jaGFubmVsfVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjcmVhdGVGb3J1bVRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVGb3J1bVBvc3RXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYWNjZXNzaWJsZSBnbG9iYWxseTsgYWNyb3NzIGRpZmZlcmVudCBndWlsZHMgYW5kIGNoYW5uZWxzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgKiDimqDvuI8gR2xvYmFsIGNvbW1hbmRzIG9uY2UgY3JlYXRlZCBhcmUgY2FjaGVkIGZvciBwZXJpb2RzIG9mIF9fYW4gaG91cl9fLCBzbyBjaGFuZ2VzIG1hZGUgdG8gZXhpc3RpbmcgY29tbWFuZHMgd2lsbCB0YWtlIGFuIGhvdXIgdG8gc3VyZmFjZS5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZDogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGd1aWxkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEd1aWxkfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICog4pqg77iPIFRoaXMgcm91dGUgY2FuIG9ubHkgYmUgdXNlZCBieSBib3RzIGluIF9fZmV3ZXIgdGhhbiAxMCBndWlsZHNfXy5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkfVxuICAgKi9cbiAgY3JlYXRlR3VpbGQ6IChvcHRpb25zOiBDcmVhdGVHdWlsZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR3VpbGQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIG9ubHkgYWNjZXNzaWJsZSBpbiBhIHNwZWNpZmljIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCwgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHN0aWNrZXIgZm9yIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXRcbiAgICogQHJldHVybiBBIHtAbGluayBEaXNjb3JkU3RpY2tlcn1cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICogRmlyZXMgYSBHdWlsZCBTdGlja2VycyBVcGRhdGUgR2F0ZXdheSBldmVudC5cbiAgICogRXZlcnkgZ3VpbGRzIGhhcyBmaXZlIGZyZWUgc3RpY2tlciBzbG90cyBieSBkZWZhdWx0LCBhbmQgZWFjaCBCb29zdCBsZXZlbCB3aWxsIGdyYW50IGFjY2VzcyB0byBtb3JlIHNsb3RzLlxuICAgKiBMb3R0aWUgc3RpY2tlcnMgY2FuIG9ubHkgYmUgdXBsb2FkZWQgb24gZ3VpbGRzIHRoYXQgaGF2ZSBlaXRoZXIgdGhlIGBWRVJJRklFRGAgYW5kL29yIHRoZSBgUEFSVE5FUkVEYCBndWlsZCBmZWF0dXJlLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNjcmVhdGUtZ3VpbGQtc3RpY2tlcn1cbiAgICovXG4gIGNyZWF0ZUd1aWxkU3RpY2tlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlR3VpbGRTdGlja2VyT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlcj4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRlbXBsYXRlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjY3JlYXRlLWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgY3JlYXRlR3VpbGRUZW1wbGF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlVGVtcGxhdGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgaW52aXRlIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGludml0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRJbnZpdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9JTlNUQU5UX0lOVklURWAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYW4gX0ludml0ZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlUmVtYXJrc1xuICAgKiBUaGUgcmVxdWVzdCBib2R5IGlzIG5vdCBvcHRpb25hbCwgYW5kIGFuIGVtcHR5IEpTT04gb2JqZWN0IG11c3QgYmUgc2VudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IGZpZWxkcyBhcmUgYmVpbmcgdHJhbnNtaXR0ZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2NyZWF0ZS1jaGFubmVsLWludml0ZX1cbiAgICovXG4gIGNyZWF0ZUludml0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQ3JlYXRlQ2hhbm5lbEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSByb2xlIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHJvbGUgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgcm9sZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRSb2xlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFJvbGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLXJvbGV9XG4gICAqL1xuICBjcmVhdGVSb2xlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZFJvbGUsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkUm9sZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIGV2ZW50IGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQSBndWlsZCBjYW4gb25seSBoYXZlIGEgbWF4aW11bSBvZiAxMDAgZXZlbnRzIHdpdGggYSBzdGF0dXMgb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLkFjdGl2ZX0gb3Ige0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLlNjaGVkdWxlZH0gKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjY3JlYXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGNyZWF0ZVNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVTY2hlZHVsZWRFdmVudCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhZ2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNjcmVhdGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBjcmVhdGVTdGFnZUluc3RhbmNlOiAob3B0aW9uczogQ3JlYXRlU3RhZ2VJbnN0YW5jZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIHdlYmhvb2sgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIOKaoO+4jyBUaGUgd2ViaG9vayBuYW1lIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnY2x5ZGUnIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNjcmVhdGUtd2ViaG9va31cbiAgICovXG4gIGNyZWF0ZVdlYmhvb2s6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF1dG9tb2QgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgcnVsZSBmcm9tLlxuICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBhdXRvbW9kIHJ1bGUgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNkZWxldGUtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAqL1xuICBkZWxldGVBdXRvbW9kUnVsZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIGNoYW5uZWwgZnJvbSB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVkIHtAbGluayBDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGNvbW11bml0eSBndWlsZHMsIHRoZSBfUnVsZXNfLCBfR3VpZGVsaW5lc18gYW5kIF9Db21tdW5pdHkgVXBkYXRlXyBjaGFubmVscyBjYW5ub3QgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQ6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9UaHJlYWQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBPdGhlcndpc2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIC0g4pqg77iPIERlbGV0aW5nIGEgY2F0ZWdvcnkgY2hhbm5lbCBkb2VzIG5vdCBkZWxldGUgaXRzIGNoaWxkIGNoYW5uZWxzLlxuICAgKiAgIEluc3RlYWQsIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGBwYXJlbnRfaWRgIHByb3BlcnR5IHJlbW92ZWQsIGFuZCBhIGBDaGFubmVsIFVwZGF0ZWAgZ2F0ZXdheSBldmVudCB3aWxsIGZpcmUgZm9yIGVhY2ggb2YgdGhlbS5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9DaGFubmVsIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlY2xvc2UtY2hhbm5lbH1cbiAgICovXG4gIGRlbGV0ZUNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcGVybWlzc2lvbiBvdmVycmlkZSBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZSB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSBvZi5cbiAgICogQHBhcmFtIG92ZXJ3cml0ZUlkIC0gVGhlIElEIG9mIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1wZXJtaXNzaW9ufVxuICAgKi9cbiAgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvdmVyd3JpdGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gZW1vamkgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGVtb2ppIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2RlbGV0ZS1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGRlbGV0ZUVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBnbG9iYWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgYm90IHVzZXIgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIGd1aWxkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNkZWxldGUtZ3VpbGR9XG4gICAqL1xuICBkZWxldGVHdWlsZDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgY29tbWFuZCBmcm9tLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2RlbGV0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGUgYSBuZXcgc3RpY2tlciBmb3IgdGhlIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldFxuICAgKiBAcmV0dXJuIEEge0BsaW5rIERpc2NvcmRTdGlja2VyfVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKiBGaXJlcyBhIEd1aWxkIFN0aWNrZXJzIFVwZGF0ZSBHYXRld2F5IGV2ZW50LlxuICAgKiBFdmVyeSBndWlsZHMgaGFzIGZpdmUgZnJlZSBzdGlja2VyIHNsb3RzIGJ5IGRlZmF1bHQsIGFuZCBlYWNoIEJvb3N0IGxldmVsIHdpbGwgZ3JhbnQgYWNjZXNzIHRvIG1vcmUgc2xvdHMuXG4gICAqIExvdHRpZSBzdGlja2VycyBjYW4gb25seSBiZSB1cGxvYWRlZCBvbiBndWlsZHMgdGhhdCBoYXZlIGVpdGhlciB0aGUgYFZFUklGSUVEYCBhbmQvb3IgdGhlIGBQQVJUTkVSRURgIGd1aWxkIGZlYXR1cmUuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGlja2VyI2RlbGV0ZS1ndWlsZC1zdGlja2VyfVxuICAgKi9cbiAgZGVsZXRlR3VpbGRTdGlja2VyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBzdGlja2VySWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgdGVtcGxhdGUgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGRlbGV0ZUd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGludGVncmF0aW9uIGF0dGFjaGVkIHRvIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgaW50ZWdyYXRpb24uXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlZ3JhdGlvbiB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBEZWxldGVzIGFsbCB3ZWJob29rcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVncmF0aW9uLCBhbmQga2lja3MgdGhlIGFzc29jaWF0ZWQgYm90IGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgSW50ZWdyYXRpb25zIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfSW50ZWdyYXRpb24gRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLWludGVncmF0aW9ufVxuICAgKi9cbiAgZGVsZXRlSW50ZWdyYXRpb246IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gaW52aXRlQ29kZSAtIFRoZSBpbnZpdGUgY29kZSBvZiB0aGUgaW52aXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9JbnZpdGUgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1pbnZpdGV9XG4gICAqL1xuICBkZWxldGVJbnZpdGU6IChpbnZpdGVDb2RlOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIG1lc3NhZ2UgZnJvbSBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGZyb20uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIG5vdCBkZWxldGluZyBvd24gbWVzc2FnZTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1tZXNzYWdlfVxuICAgKi9cbiAgZGVsZXRlTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2U6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcm9sZSBmcm9tIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIHJvbGUgZnJvbS5cbiAgICogQHBhcmFtIHJvbGVJZCAtIFRoZSBJRCBvZiB0aGUgcm9sZSB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBSb2xlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2RlbGV0ZS1ndWlsZC1yb2xlfVxuICAgKi9cbiAgZGVsZXRlUm9sZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcm9sZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBzY2hlZHVsZWQgZXZlbnQgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgU2NoZWR1bGVkIEV2ZW50IERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNkZWxldGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgKi9cbiAgZGVsZXRlU2NoZWR1bGVkRXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgc3RhZ2UgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3RhZ2UgY2hhbm5lbCwgaWYgb25lIGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RhZ2UtaW5zdGFuY2UjZGVsZXRlLXN0YWdlLWluc3RhbmNlfVxuICAgKi9cbiAgZGVsZXRlU3RhZ2VJbnN0YW5jZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSB3ZWJob29rLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2t9XG4gICAqL1xuICBkZWxldGVXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUgdGhlIG1lc3NhZ2UgYmVsb25naW5nIHRvLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBtYW5hZ2UgdGhlIHdlYmhvb2suXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGVsZXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9va31cbiAgICovXG4gIGRlbGV0ZVdlYmhvb2tNZXNzYWdlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogRGVsZXRlV2ViaG9va01lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgd2ViaG9vayBtZXNzYWdlIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUgdGhlIG1lc3NhZ2UgYmVsb25naW5nIHRvLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBkZWxldGUgdGhlIHdlYmhvb2suXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNkZWxldGUtd2ViaG9vay13aXRoLXRva2VufVxuICAgKi9cbiAgZGVsZXRlV2ViaG9va1dpdGhUb2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbnMgZm9yIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAqIEBwYXJhbSBiZWFyZXJUb2tlbiAtIFRoZSBiZWFyZXIgdG9rZW4gdG8gdXNlIHRvIG1ha2UgdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kIHBlcm1pc3Npb25zLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhlIGJlYXJlciB0b2tlbiByZXF1aXJlcyB0aGUgYGFwcGxpY2F0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9ucy51cGRhdGVgIHNjb3BlIHRvIGJlIGVuYWJsZWQsIGFuZCB0byBoYXZlIGFjY2VzcyB0byB0aGUgZ3VpbGQgd2hvc2UgSUQgaGFzIGJlZW4gcHJvdmlkZWQgaW4gdGhlIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNlZGl0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAqL1xuICBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM6IChcbiAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgY29tbWFuZElkOiBCaWdTdHJpbmcsXG4gICAgYmVhcmVyVG9rZW46IHN0cmluZyxcbiAgICBvcHRpb25zOiBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdLFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPj5cbiAgLyoqXG4gICAqIEVkaXRzIGFuIGF1dG9tb2QgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJ1bGUgaW4uXG4gICAqIEBwYXJhbSBydWxlSWQgLSBUaGUgSUQgb2YgdGhlIHJ1bGUgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJ1bGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNtb2RpZnktYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAqL1xuICBlZGl0QXV0b21vZFJ1bGU6IChcbiAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgcnVsZUlkOiBCaWdTdHJpbmcsXG4gICAgb3B0aW9uczogUGFydGlhbDxFZGl0QXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucz4sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBib3QncyB1c2VybmFtZSBvciBhdmF0YXIuXG4gICAqIE5PVEU6IHVzZXJuYW1lOiBpZiBjaGFuZ2VkIG1heSBjYXVzZSB0aGUgYm90J3MgZGlzY3JpbWluYXRvciB0byBiZSByYW5kb21pemVkLlxuICAgKi9cbiAgZWRpdEJvdFByb2ZpbGU6IChvcHRpb25zOiB7IHVzZXJuYW1lPzogc3RyaW5nOyBib3RBdmF0YXJVUkw/OiBzdHJpbmcgfCBudWxsIH0pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFVzZXI+PlxuICAvKipcbiAgICogRWRpdHMgYSBjaGFubmVsJ3Mgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgZWRpdGluZyBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkdyb3VwRG19OlxuICAgKiAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBJZiBlZGl0aW5nIGEgdGhyZWFkIGNoYW5uZWw6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbiBfX3VubGVzc19fIGlmIHNldHRpbmcgdGhlIGBhcmNoaXZlZGAgcHJvcGVydHkgdG8gYGZhbHNlYCB3aGVuIHRoZSBgbG9ja2VkYCBwcm9wZXJ0eSBpcyBhbHNvIGBmYWxzZWAsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIC0gRmlyZXMgYSBfVGhyZWFkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogSWYgZWRpdGluZyBhIGd1aWxkIGNoYW5uZWw6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIC0gSWYgbW9kaWZ5aW5nIHBlcm1pc3Npb24gb3ZlcnJpZGVzOlxuICAgKiAgIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqICAgLSBPbmx5IHBlcm1pc3Npb25zIHRoZSBib3QgdXNlciBoYXMgaW4gdGhlIGd1aWxkIG9yIHBhcmVudCBjaGFubmVsIGNhbiBiZSBhbGxvd2VkL2RlbmllZCBfX3VubGVzc19fIHRoZSBib3QgdXNlciBoYXMgYSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uIG92ZXJyaWRlIGluIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiAtIElmIG1vZGlmeWluZyBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkQ2F0ZWdvcnl9OlxuICAgKiAgICAgLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudCBmb3IgZWFjaCBjaGlsZCBjaGFubmVsIGltcGFjdGVkIGluIHRoaXMgY2hhbmdlLlxuICAgKiAtIE90aGVyd2lzZTpcbiAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqL1xuICBlZGl0Q2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlDaGFubmVsKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlcyBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGVzIG9mLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2VkaXQtY2hhbm5lbC1wZXJtaXNzaW9uc31cbiAgICovXG4gIGVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXNPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcG9zaXRpb25zIG9mIGEgc2V0IG9mIGNoYW5uZWxzIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBpbiB3aGljaCB0byBlZGl0IHRoZSBwb3NpdGlvbnMgb2YgdGhlIGNoYW5uZWxzLlxuICAgKiBAcGFyYW0gY2hhbm5lbFBvc2l0aW9ucyAtIEEgc2V0IG9mIG9iamVjdHMgZGVmaW5pbmcgdGhlIHVwZGF0ZWQgcG9zaXRpb25zIG9mIHRoZSBjaGFubmVscy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSBjaGFubmVsIGltcGFjdGVkIGluIHRoaXMgY2hhbmdlLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLWNoYW5uZWwtcG9zaXRpb25zfVxuICAgKi9cbiAgZWRpdENoYW5uZWxQb3NpdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcsIGNoYW5uZWxQb3NpdGlvbnM6IE1vZGlmeUd1aWxkQ2hhbm5lbFBvc2l0aW9uc1tdKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyBhbiBlbW9qaS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGVtb2ppIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBlbW9qaS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHVwZGF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgYEd1aWxkIEVtb2ppcyBVcGRhdGVgIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNtb2RpZnktZ3VpbGQtZW1vaml9XG4gICAqL1xuICBlZGl0RW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIGlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZWRpdE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICpcbiAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNlZGl0LWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAqL1xuICBlZGl0Rm9sbG93dXBNZXNzYWdlOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNlZGl0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGd1aWxkJ3Mgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0LlxuICAgKiBAcGFyYW0gc2hhcmRJZCAtIFRoZSBJRCBvZiB0aGUgc2hhcmQgdGhlIGd1aWxkIGlzIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZ3VpbGQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEd1aWxkfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIGF0dGVtcHRpbmcgdG8gYWRkIG9yIHJlbW92ZSB0aGUge0BsaW5rIEd1aWxkRmVhdHVyZXMuQ29tbXVuaXR5fSBmZWF0dXJlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgQURNSU5JU1RSQVRPUmAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkfVxuICAgKi9cbiAgZWRpdEd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR3VpbGQ+PlxuICAvKipcbiAgICogRWRpdHMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kOiAoXG4gICAgY29tbWFuZElkOiBCaWdTdHJpbmcsXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogRWRpdCB0aGUgZ2l2ZW4gc3RpY2tlci5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXRcbiAgICogQHJldHVybiBBIHtAbGluayBEaXNjb3JkU3RpY2tlcn1cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICogRmlyZXMgYSBHdWlsZCBTdGlja2VycyBVcGRhdGUgR2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjbW9kaWZ5LWd1aWxkLXN0aWNrZXJ9XG4gICAqL1xuICBlZGl0R3VpbGRTdGlja2VyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBzdGlja2VySWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQXRMZWFzdE9uZTxFZGl0R3VpbGRTdGlja2VyT3B0aW9ucz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXI+PlxuICAvKipcbiAgICogRWRpdHMgYSB0ZW1wbGF0ZSdzIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCBhIHRlbXBsYXRlIG9mLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjbW9kaWZ5LWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgZWRpdEd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdCB0aGUgbWVzc2FnZSBpbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRHMgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBlZGl0aW5nIGFub3RoZXIgdXNlcidzIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqIC0gT25seSB0aGUge0BsaW5rIEVkaXRNZXNzYWdlLmZsYWdzIHwgZmxhZ3N9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciBjYW4gYmUgZWRpdGVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+IHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG9yaWdpbmFsIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEgJiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHJvbGUgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJvbGUgaW4uXG4gICAqIEBwYXJhbSByb2xlSWQgLSBUaGUgSUQgb2YgdGhlIHJvbGUgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJvbGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRSb2xlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFJvbGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLXJvbGV9XG4gICAqL1xuICBlZGl0Um9sZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcm9sZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRHdWlsZFJvbGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFJvbGU+PlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBvc2l0aW9ucyBvZiBhIHNldCBvZiByb2xlcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJvbGUgcG9zaXRpb25zIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcm9sZSBwb3NpdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFJvbGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcm9sZSBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFJvbGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSByb2xlIGltcGFjdGVkIGluIHRoaXMgY2hhbmdlLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLXJvbGUtcG9zaXRpb25zfVxuICAgKi9cbiAgZWRpdFJvbGVQb3NpdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeVJvbGVQb3NpdGlvbnNbXSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkUm9sZVtdPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgc2NoZWR1bGVkIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgc2NoZWR1bGVkIGV2ZW50IGluLlxuICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGVkaXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFNjaGVkdWxlZEV2ZW50fS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBUbyBzdGFydCBvciBlbmQgYW4gZXZlbnQsIG1vZGlmeSB0aGUgZXZlbnQncyBgc3RhdHVzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogVGhlIGBlbnRpdHlfbWV0YWRhdGFgIHByb3BlcnR5IGlzIGRpc2NhcmRlZCBmb3IgZXZlbnRzIHdob3NlIGBlbnRpdHlfdHlwZWAgaXMgbm90IHtAbGluayBTY2hlZHVsZWRFdmVudEVudGl0eVR5cGUuRXh0ZXJuYWx9LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBTY2hlZHVsZWQgRXZlbnQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I21vZGlmeS1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAqL1xuICBlZGl0U2NoZWR1bGVkRXZlbnQ6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZywgb3B0aW9uczogUGFydGlhbDxFZGl0U2NoZWR1bGVkRXZlbnQ+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHN0YWdlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBzdGFnZSBjaGFubmVsIHRoZSBzdGFnZSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBVcGRhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RhZ2UtaW5zdGFuY2UjbW9kaWZ5LXN0YWdlLWluc3RhbmNlfVxuICAgKi9cbiAgZWRpdFN0YWdlSW5zdGFuY2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgZGF0YTogRWRpdFN0YWdlSW5zdGFuY2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGFnZUluc3RhbmNlPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9va31cbiAgICovXG4gIGVkaXRXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeVdlYmhvb2spID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogRWRpdHMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdCB0aGUgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBlZGl0V2ViaG9va01lc3NhZ2U6IChcbiAgICB3ZWJob29rSWQ6IEJpZ1N0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIG1lc3NhZ2VJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhICYgeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9LFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogRWRpdHMgYSB3ZWJob29rIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSB3ZWJob29rLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI21vZGlmeS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAqL1xuICBlZGl0V2ViaG9va1dpdGhUb2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBPbWl0PE1vZGlmeVdlYmhvb2ssICdjaGFubmVsSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHdlYmhvb2ssIGNhdXNpbmcgYSBtZXNzYWdlIHRvIGJlIHBvc3RlZCBpbiB0aGUgY2hhbm5lbCBjb25maWd1cmVkIGZvciB0aGUgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBleGVjdXRlLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBleGVjdXRlIHRoZSB3ZWJob29rLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSB3ZWJob29rLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LCBvciBgdW5kZWZpbmVkYCBpZiB0aGUge0BsaW5rIEV4ZWN1dGVXZWJob29rLndhaXQgfCB3YWl0fSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIHRoZSB3ZWJob29rIGNoYW5uZWwgaXMgYSBmb3J1bSBjaGFubmVsLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsdWUgZm9yIGVpdGhlciBgdGhyZWFkSWRgIG9yIGB0aHJlYWROYW1lYC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZXhlY3V0ZS13ZWJob29rfVxuICAgKi9cbiAgZXhlY3V0ZVdlYmhvb2s6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogRXhlY3V0ZVdlYmhvb2spID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+IHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogRm9sbG93cyBhbiBhbm5vdW5jZW1lbnQgY2hhbm5lbCwgYWxsb3dpbmcgbWVzc2FnZXMgcG9zdGVkIHdpdGhpbiBpdCB0byBiZSBjcm9zcy1wb3N0ZWQgaW50byB0aGUgdGFyZ2V0IGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsIHRvIGZvbGxvdy5cbiAgICogQHBhcmFtIHRhcmdldENoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGFyZ2V0IGNoYW5uZWwgLSB0aGUgY2hhbm5lbCB0byBjcm9zcy1wb3N0IHRvLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uIGluIHRoZSBfX3RhcmdldCBjaGFubmVsX18uXG4gICAqXG4gICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZm9sbG93LWFubm91bmNlbWVudC1jaGFubmVsfVxuICAgKi9cbiAgZm9sbG93QW5ub3VuY2VtZW50OiAoc291cmNlQ2hhbm5lbElkOiBCaWdTdHJpbmcsIHRhcmdldENoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRGb2xsb3dlZENoYW5uZWw+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgYWN0aXZlIHRocmVhZHMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHRocmVhZHMgb2YuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQWN0aXZlVGhyZWFkc30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJldHVybnMgYm90aCBwdWJsaWMgYW5kIHByaXZhdGUgdGhyZWFkcy5cbiAgICpcbiAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGlkYCBwcm9wZXJ0eSBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbGlzdC1hY3RpdmUtZ3VpbGQtdGhyZWFkc31cbiAgICovXG4gIGdldEFjdGl2ZVRocmVhZHM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFjdGl2ZVRocmVhZHM+PlxuICAvKiogR2V0IHRoZSBhcHBsaWNhdGlvbnMgaW5mbyAqL1xuICBnZXRBcHBsaWNhdGlvbkluZm86ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIG9mIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAqL1xuICBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+PlxuICAvKipcbiAgICogR2V0cyB0aGUgcGVybWlzc2lvbnMgb2YgYWxsIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgaW4gYSBndWlsZCBieSB0aGUgSUQgb2YgdGhlIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+PlxuICAvKipcbiAgICogR2V0cyBhIGd1aWxkJ3MgYXVkaXQgbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBhdWRpdCBsb2cgb2YuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgYXVkaXQgbG9nLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXVkaXRMb2d9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFZJRVdfQVVESVRfTE9HYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXVkaXQtbG9nI2dldC1ndWlsZC1hdWRpdC1sb2d9XG4gICAqL1xuICBnZXRBdWRpdExvZzogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEdldEd1aWxkQXVkaXRMb2cpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1ZGl0TG9nPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gYXV0b21vZCBydWxlIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZSBvZi5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jZ2V0LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhdXRvbW9kIHJ1bGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlcyBmcm9tLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcnVsZSBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbGlzdC1hdXRvLW1vZGVyYXRpb24tcnVsZXMtZm9yLWd1aWxkfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgYmFuIGJ5IHVzZXIgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGJhbiBmcm9tLlxuICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGdldCB0aGUgYmFuIGZvci5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRCYW59LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLWJhbn1cbiAgICovXG4gIGdldEJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEJhbj4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGJhbnMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgYmFucyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbGlzdCBvZiBiYW5zLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRCYW59IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogVXNlcnMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgSURzIGluIF9hc2NlbmRpbmdfIG9yZGVyLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLWJhbnN9XG4gICAqL1xuICBnZXRCYW5zOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0QmFucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQmFuW10+PlxuICAvKipcbiAgICogR2V0cyBhIGNoYW5uZWwgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQsIGEge0BsaW5rIFRocmVhZE1lbWJlcn0gb2JqZWN0IGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsfVxuICAgKi9cbiAgZ2V0Q2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgaW52aXRlcyBmb3IgYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgaW52aXRlcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkSW52aXRlTWV0YWRhdGF9IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBPbmx5IHVzYWJsZSBmb3IgZ3VpbGQgY2hhbm5lbHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsLWludml0ZXN9XG4gICAqL1xuICBnZXRDaGFubmVsSW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGNoYW5uZWxzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNoYW5uZWwgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV4Y2x1ZGVzIHRocmVhZHMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtY2hhbm5lbHN9XG4gICAqL1xuICBnZXRDaGFubmVsczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbFtdPj5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgd2hpY2ggdG8gZ2V0IHRoZSB3ZWJob29rcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LWNoYW5uZWwtd2ViaG9va3N9XG4gICAqL1xuICBnZXRDaGFubmVsV2ViaG9va3M6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9va1tdPj5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy91c2VyI2NyZWF0ZS1kbX1cbiAgICovXG4gIGdldERtQ2hhbm5lbDogKHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gZW1vamkgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBnZXQgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gZW1vamlJZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2dldC1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGdldEVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBlbW9qaUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgZW1vamlzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hpY2ggdG8gZ2V0IHRoZSBlbW9qaXMgb2YuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEVtb2ppfSBvYmplY3RzIGFzc29ydGVkIGJ5IGVtb2ppIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbGlzdC1ndWlsZC1lbW9qaXN9XG4gICAqL1xuICBnZXRFbW9qaXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppW10+PlxuICAvKipcbiAgICogR2V0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uIGJ5IHRoZSBJRCBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGdldEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqIEdldCB0aGUgYm90cyBHYXRld2F5IG1ldGFkYXRhIHRoYXQgY2FuIGhlbHAgZHVyaW5nIHRoZSBvcGVyYXRpb24gb2YgbGFyZ2Ugb3Igc2hhcmRlZCBib3RzLiAqL1xuICBnZXRHYXRld2F5Qm90OiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90Pj5cbiAgLyoqXG4gICAqIEdldHMgYSBnbG9iYWwgYXBwbGljYXRpb24gY29tbWFuZCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB5b3VyIGJvdCdzIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAqL1xuICBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgZ3VpbGQgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGd1aWxkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgR3VpbGR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkfVxuICAgKi9cbiAgZ2V0R3VpbGQ6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiB7IGNvdW50cz86IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR3VpbGQ+PlxuICAvKipcbiAgICogR2V0cyBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCBpbi5cbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgYnkgeW91ciBib3QgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kcyBhcmUgcmVnaXN0ZXJlZCBpbi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHNzfVxuICAgKi9cbiAgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RpY2tlciBvYmplY3QgZm9yIHRoZSBnaXZlbiBndWlsZCBhbmQgc3RpY2tlciBJRHMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0XG4gICAqIEBwYXJhbSBzdGlja2VySWQgVGhlIElEIG9mIHRoZSBzdGlja2VyIHRvIGdldFxuICAgKiBAcmV0dXJuIEEge0BsaW5rIERpc2NvcmRTdGlja2VyfVxuICAgKlxuICAgKiBAcmVtYXJrcyBJbmNsdWRlcyB0aGUgdXNlciBmaWVsZCBpZiB0aGUgYm90IGhhcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNnZXQtZ3VpbGQtc3RpY2tlcn1cbiAgICovXG4gIGdldEd1aWxkU3RpY2tlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgc3RpY2tlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXI+PlxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdGlja2VyIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXRcbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkU3RpY2tlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSBzdGlja2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrcyBJbmNsdWRlcyB1c2VyIGZpZWxkcyBpZiB0aGUgYm90IGhhcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNsaXN0LWd1aWxkLXN0aWNrZXJzfVxuICAgKi9cbiAgZ2V0R3VpbGRTdGlja2VyczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlcltdPj5cbiAgLyoqXG4gICAqIEdldHMgYSB0ZW1wbGF0ZSBieSBpdHMgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlQ29kZSAtIFRoZSBjb2RlIG9mIHRoZSB0ZW1wbGF0ZSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBUZW1wbGF0ZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgZ2V0R3VpbGRUZW1wbGF0ZTogKHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiB0ZW1wbGF0ZXMgZm9yLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFRlbXBsYXRlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHRlbXBsYXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICovXG4gIGdldEd1aWxkVGVtcGxhdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZVtdPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfSBvYmplY3RzIGFzc29ydGVkIGJ5IHdlYmhvb2sgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtZ3VpbGQtd2ViaG9va3N9XG4gICAqL1xuICBnZXRHdWlsZFdlYmhvb2tzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgZnJvbS5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnRlZ3JhdGlvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnRlZ3JhdGlvbiBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtaW50ZWdyYXRpb25zfVxuICAgKi9cbiAgZ2V0SW50ZWdyYXRpb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnRlZ3JhdGlvbltdPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBieSBpdHMgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBpbnZpdGVDb2RlIC0gVGhlIGludml0ZSBjb2RlIG9mIHRoZSBpbnZpdGUgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGludml0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZX1cbiAgICovXG4gIGdldEludml0ZTogKGludml0ZUNvZGU6IHN0cmluZywgb3B0aW9ucz86IEdldEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGE+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBpbnZpdGVzIGZyb20uXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgSW52aXRlTWV0YWRhdGEgfCBJbnZpdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgaW52aXRlIGNvZGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvaW52aXRlI2dldC1pbnZpdGVzfVxuICAgKi9cbiAgZ2V0SW52aXRlczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHN0aWNrZXIgcGFja3MgYXZhaWxhYmxlIHRvIE5pdHJvIHN1YnNjcmliZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gYm90IFRoZSBib3QgaW5zdGFuY2UgdG8gdXNlIHRvIG1ha2UgdGhlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgU3RpY2tlclBhY2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgc3RpY2tlciBJRC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjbGlzdC1uaXRyby1zdGlja2VyLXBhY2tzfVxuICAgKi9cbiAgZ2V0Tml0cm9TdGlja2VyUGFja3M6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXJQYWNrW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICpcbiAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IgYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFyY2hpdmVkVGhyZWFkc30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIFJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQcml2YXRlVGhyZWFkfS5cbiAgICpcbiAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGFyY2hpdmVfdGltZXN0YW1wYCBwcm9wZXJ0eSBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsaXN0LXByaXZhdGUtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyB0aGUgYm90IGlzIGEgbWVtYmVyIG9mIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgaWRgIHByb3BlcnR5IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3Qtam9pbmVkLXByaXZhdGUtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHB1YmxpYyBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcmNoaXZlZFRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFRleHR9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzfSwgcmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3NUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtcHVibGljLWFyY2hpdmVkLXRocmVhZHN9XG4gICAqL1xuICBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFyY2hpdmVkVGhyZWFkcz4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHJvbGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzIGZvci5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNvcmNSb2xlfSBvYmplY3RzIGFzc29ydGVkIGJ5IHJvbGUgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSBkdWUgdG8ge0BsaW5rIFVzZXJ9IG9iamVjdHMgYWxyZWFkeSBiZWluZyBpbmNsdWRlZCBpbiBndWlsZCBwYXlsb2Fkcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1yb2xlc31cbiAgICovXG4gIGdldFJvbGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRSb2xlW10+PlxuICAvKipcbiAgICogR2V0cyBhIHNjaGVkdWxlZCBldmVudCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGdldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZ2V0LWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGdldFNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiB7IHdpdGhVc2VyQ291bnQ/OiBib29sZWFuIH0pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygc2NoZWR1bGVkIGV2ZW50cyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgc2NoZWR1bGVkIGV2ZW50cyBmcm9tLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHNjaGVkdWxlZCBldmVudHMuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgZXZlbnQgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjbGlzdC1zY2hlZHVsZWQtZXZlbnRzLWZvci1ndWlsZH1cbiAgICovXG4gIGdldFNjaGVkdWxlZEV2ZW50czogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50cykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnRbXT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHN1YnNjcmliZXJzIHRvIGEgc2NoZWR1bGVkIGV2ZW50IGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgc3Vic2NyaWJlcnMgdG8gdGhlIHNjaGVkdWxlZCBldmVudCBmcm9tLlxuICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGdldCB0aGUgc3Vic2NyaWJlcnMgb2YuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc3Vic2NyaWJlcnMuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVXNlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIFVzZXJzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIElEcyBpbiBfYXNjZW5kaW5nXyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNnZXQtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50LXVzZXJzfVxuICAgKi9cbiAgZ2V0U2NoZWR1bGVkRXZlbnRVc2VyczogKFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBldmVudElkOiBCaWdTdHJpbmcsXG4gICAgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50VXNlcnMsXG4gICkgPT4gUHJvbWlzZTxBcnJheTx7IHVzZXI6IENhbWVsaXplPERpc2NvcmRVc2VyPjsgbWVtYmVyPzogQ2FtZWxpemU8RGlzY29yZE1lbWJlcj4gfT4+XG4gIC8qKiBHZXQgdGhlIGJvdHMgR2F0ZXdheSBtZXRhZGF0YSB0aGF0IGNhbiBoZWxwIGR1cmluZyB0aGUgb3BlcmF0aW9uIG9mIGxhcmdlIG9yIHNoYXJkZWQgYm90cy4gKi9cbiAgZ2V0U2Vzc2lvbkluZm86ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+PlxuICAvKipcbiAgICogR2V0cyB0aGUgc3RhZ2UgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3RhZ2UgY2hhbm5lbCwgaWYgb25lIGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RhZ2UtaW5zdGFuY2UjZ2V0LXN0YWdlLWluc3RhbmNlfVxuICAgKi9cbiAgZ2V0U3RhZ2VJbnN0YW5jZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTdGFnZUluc3RhbmNlPj5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGlja2VyIG9iamVjdCBmb3IgdGhlIGdpdmVuIHN0aWNrZXIgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBzdGlja2VySWQgVGhlIElEIG9mIHRoZSBzdGlja2VyIHRvIGdldFxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNjb3JkU3RpY2tlcn1cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0aWNrZXIjZ2V0LXN0aWNrZXJ9XG4gICAqL1xuICBnZXRTdGlja2VyOiAoc3RpY2tlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0aWNrZXI+PlxuICAvKipcbiAgICogR2V0cyBhIHRocmVhZCBtZW1iZXIgYnkgdGhlaXIgdXNlciBJRC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGdldCB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSB0aHJlYWQgbWVtYmVyIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtdGhyZWFkLW1lbWJlcn1cbiAgICovXG4gIGdldFRocmVhZE1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdGhyZWFkIG1lbWJlcnMgZm9yIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVycyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkVGhyZWFkTWVtYmVyfSBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSB0aGUgYEdVSUxEX01FTUJFUlNgIHByaXZpbGVnZWQgaW50ZW50IGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtdGhyZWFkLW1lbWJlcnN9XG4gICAqL1xuICBnZXRUaHJlYWRNZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRocmVhZE1lbWJlcltdPj5cbiAgLyoqXG4gICAqIEdldCBhIHVzZXIncyBkYXRhIGZyb20gdGhlIGFwaVxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIHVzZXIncyBpZFxuICAgKiBAcmV0dXJucyB7Q2FtZWxpemU8RGlzY29yZFVzZXI+fVxuICAgKi9cbiAgZ2V0VXNlcjogKGlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFVzZXI+PlxuICAvKipcbiAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFuaXR5IHVybCBvZiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB2YW5pdHkgdXJsIGluZm9ybWF0aW9uIGZvci5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhbml0eVVybH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBUaGUgYGNvZGVgIHByb3BlcnR5IHdpbGwgYmUgYG51bGxgIGlmIHRoZSBndWlsZCBkb2VzIG5vdCBoYXZlIGEgc2V0IHZhbml0eSB1cmwuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtdmFuaXR5LXVybH1cbiAgICovXG4gIGdldFZhbml0eVVybDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVmFuaXR5VXJsPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygdm9pY2UgcmVnaW9ucyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgdm9pY2UgcmVnaW9ucyBmb3IuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVm9pY2VSZWdpb25zIHwgVm9pY2VSZWdpb259IG9iamVjdHMgYXNzb3J0ZWQgYnkgdm9pY2UgcmVnaW9uIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLXZvaWNlLXJlZ2lvbnN9XG4gICAqL1xuICBnZXRWb2ljZVJlZ2lvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFZvaWNlUmVnaW9uW10+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rfVxuICAgKi9cbiAgZ2V0V2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEdldHMgYSB3ZWJob29rIG1lc3NhZ2UgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldCBhIG1lc3NhZ2Ugb2YuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGdldCB3ZWJob29rIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gdGhlIElEIG9mIHRoZSB3ZWJob29rIG1lc3NhZ2UgdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBnZXRXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgbWVzc2FnZUlkOiBCaWdTdHJpbmcsXG4gICAgb3B0aW9ucz86IEdldFdlYmhvb2tNZXNzYWdlT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEdldHMgYSB3ZWJob29rIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBnZXQuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGdldCB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2std2l0aC10b2tlbn1cbiAgICovXG4gIGdldFdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBib3QgdXNlciB0byBhIHRocmVhZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGFkZCB0aGUgYm90IHVzZXIgdG8uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2pvaW4tdGhyZWFkfVxuICAgKi9cbiAgam9pblRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBib3QgdXNlciBmcm9tIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gcmVtb3ZlIHRoZSBib3QgdXNlciBmcm9tLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdGhyZWFkIG5vdCBiZSBhcmNoaXZlZC5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsZWF2ZS10aHJlYWR9XG4gICAqL1xuICBsZWF2ZVRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcm9zcy1wb3N0cyBhIG1lc3NhZ2UgcG9zdGVkIGluIGFuIGFubm91bmNlbWVudCBjaGFubmVsIHRvIHN1YnNjcmliZWQgY2hhbm5lbHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGNyb3NzLXBvc3QuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcm9zcy1wb3N0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFNFTkRfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIG5vdCBjcm9zcy1wb3N0aW5nIG93biBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQgaW4gdGhlIGd1aWxkcyB0aGUgc3Vic2NyaWJlZCBjaGFubmVscyBhcmUgaW4uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2Nyb3NzcG9zdC1tZXNzYWdlfVxuICAgKi9cbiAgcHVibGlzaE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvbGUgZnJvbSBhIG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBtZW1iZXIgdG8gcmVtb3ZlIHRoZSByb2xlIGZyb20gaXMgaW4uXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIHJlbW92ZSB0aGUgcm9sZSBmcm9tLlxuICAgKiBAcGFyYW0gcm9sZUlkIC0gVGhlIElEIG9mIHRoZSByb2xlIHRvIHJlbW92ZSBmcm9tIHRoZSBtZW1iZXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLW1lbWJlci1yb2xlfVxuICAgKi9cbiAgcmVtb3ZlUm9sZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIHJvbGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBtZW1iZXIgZnJvbSBhIHRocmVhZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIHJlbW92ZSB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSB0aHJlYWQgbWVtYmVyIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgdGhlIHRocmVhZCBpcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQcml2YXRlVGhyZWFkfSwgcmVxdWlyZXMgdG8gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRocmVhZC5cbiAgICogT3RoZXJ3aXNlLCByZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgdGhyZWFkIG5vdCBiZSBhcmNoaXZlZC5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNyZW1vdmUtdGhyZWFkLW1lbWJlcn1cbiAgICovXG4gIHJlbW92ZVRocmVhZE1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBzZW5kIHRoZSBtZXNzYWdlIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoYXQgdGhlIGJvdCB1c2VyIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyB0byBiZSBzZW50IGluLlxuICAgKlxuICAgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSB0byBhIGd1aWxkIGNoYW5uZWw6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBJZiBzZW5kaW5nIGEgVFRTIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX1RUU19NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogSWYgc2VuZGluZyBhIG1lc3NhZ2UgYXMgYSByZXBseSB0byBhbm90aGVyIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICogLSBUaGUgbWVzc2FnZSBiZWluZyByZXBsaWVkIHRvIGNhbm5vdCBiZSBhIHN5c3RlbSBtZXNzYWdlLlxuICAgKlxuICAgKiDimqDvuI8gVGhlIG1heGltdW0gc2l6ZSBvZiBhIHJlcXVlc3QgKGFjY291bnRpbmcgZm9yIGFueSBhdHRhY2htZW50cyBhbmQgbWVzc2FnZSBjb250ZW50KSBmb3IgYm90IHVzZXJzIGlzIF84IE1pQl8uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcmVhdGUtbWVzc2FnZX1cbiAgICovXG4gIHNlbmRNZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZU1lc3NhZ2VPcHRpb25zKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIFNlbmRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBJbnRlcmFjdGlvbiB0b2tlbnMgYXJlIG9ubHkgdmFsaWQgZm9yIF8xNSBtaW51dGVzXy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAqXG4gICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAqL1xuICBzZW5kRm9sbG93dXBNZXNzYWdlOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+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/OiBudW1iZXIgfCBudWxsXG59XG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lICovXG5leHBvcnQgaW50ZXJmYWNlIEJlZ2luR3VpbGRQcnVuZSB7XG4gIC8qKiBOdW1iZXIgb2YgZGF5cyB0byBwcnVuZSAoMSBvciBtb3JlKSwgZGVmYXVsdDogNyAqL1xuICBkYXlzPzogbnVtYmVyXG4gIC8qKiBXaGV0aGVyICdwcnVuZWQnIGlzIHJldHVybmVkLCBkaXNjb3VyYWdlZCBmb3IgbGFyZ2UgZ3VpbGRzLCBkZWZhdWx0OiB0cnVlICovXG4gIGNvbXB1dGVQcnVuZUNvdW50PzogYm9vbGVhblxuICAvKiogUm9sZShzKSBybyBpbmNsdWRlLCBkZWZhdWx0OiBub25lICovXG4gIGluY2x1ZGVSb2xlcz86IHN0cmluZ1tdXG59XG4iXSwibmFtZXMiOlsiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiY2FsY3VsYXRlQml0cyIsImNhbWVsaXplIiwiY2FtZWxUb1NuYWtlQ2FzZSIsImRlbGF5IiwiZmluZEZpbGVzIiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJsb2dnZXIiLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSZXN0TWFuYWdlciIsIm9wdGlvbnMiLCJ0b2tlbiIsIkVycm9yIiwicmVzdCIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ2ZXJzaW9uIiwiYmFzZVVybCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsImRlbGV0ZVF1ZXVlRGVsYXkiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwiaW52YWxpZEJ1Y2tldCIsInJvdXRlcyIsIndlYmhvb2tzIiwiaWQiLCJ3ZWJob29rSWQiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwidXJsIiwidGhyZWFkSWQiLCJvcmlnaW5hbCIsIndlYmhvb2siLCJ3YWl0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzZXNzaW9uSW5mbyIsImdhdGV3YXlCb3QiLCJjaGFubmVscyIsImRtIiwiY2hhbm5lbElkIiwiY2hhbm5lbCIsImZvbGxvdyIsImZvcnVtIiwiaW52aXRlcyIsIm1lc3NhZ2VzIiwib3ZlcndyaXRlIiwib3ZlcndyaXRlSWQiLCJjcm9zc3Bvc3QiLCJzdGFnZXMiLCJzdGFnZSIsInRocmVhZHMiLCJhbGwiLCJhY3RpdmUiLCJndWlsZElkIiwibWVtYmVycyIsIm1lIiwidXNlciIsInVzZXJJZCIsImFyY2hpdmVkIiwicHVibGljIiwiYmVmb3JlIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwibGltaXQiLCJwcml2YXRlIiwiam9pbmVkIiwidHlwaW5nIiwiZ3VpbGRzIiwiYXVkaXRsb2dzIiwiYWN0aW9uVHlwZSIsImF1dG9tb2QiLCJydWxlIiwicnVsZUlkIiwicnVsZXMiLCJlbW9qaSIsImVtb2ppSWQiLCJlbW9qaXMiLCJldmVudHMiLCJ3aXRoVXNlckNvdW50IiwiZXZlbnQiLCJldmVudElkIiwidXNlcnMiLCJ3aXRoTWVtYmVyIiwiYWZ0ZXIiLCJndWlsZCIsIndpdGhDb3VudHMiLCJpbnRlZ3JhdGlvbiIsImludGVncmF0aW9uSWQiLCJpbnRlZ3JhdGlvbnMiLCJpbnZpdGUiLCJpbnZpdGVDb2RlIiwid2l0aEV4cGlyYXRpb24iLCJzY2hlZHVsZWRFdmVudElkIiwiYmFuIiwiYmFucyIsImJvdCIsIm1lbWJlciIsInNlYXJjaCIsInF1ZXJ5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicHJ1bmUiLCJkYXlzIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5jbHVkZVJvbGVzIiwiam9pbiIsInJvbGVzIiwib25lIiwicm9sZUlkIiwibWVtYmVySWQiLCJzdGlja2VycyIsInN0aWNrZXIiLCJzdGlja2VySWQiLCJ0ZW1wbGF0ZXMiLCJjb2RlIiwidmFuaXR5IiwicmVnaW9ucyIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY29tbWFuZElkIiwid2l0aExvY2FsaXphdGlvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJjb21tYW5kIiwicmVzcG9uc2VzIiwiY2FsbGJhY2siLCJpbnRlcmFjdGlvbklkIiwidXNlckJvdCIsIm9hdXRoMkFwcGxpY2F0aW9uIiwibml0cm9TdGlja2VyUGFja3MiLCJjaGVja1JhdGVMaW1pdHMiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsInJlc2V0VGltZXN0YW1wIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwibWFwIiwiaXRlbSIsIm5ld09iaiIsImtleSIsIk9iamVjdCIsImtleXMiLCJjcmVhdGVSZXF1ZXN0IiwiaGVhZGVycyIsInVuYXV0aG9yaXplZCIsImF1dGhvcml6YXRpb24iLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZCIsImJvZHkiLCJyZWFzb24iLCJmaWxlIiwiZmlsZXMiLCJmb3JtIiwiRm9ybURhdGEiLCJlbmRzV2l0aCIsImFwcGVuZCIsImJsb2IiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwiaSIsImxlbmd0aCIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbmNsdWRlcyIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwidmFsdWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwiYnVja2V0SWQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJtYXgiLCJzZXQiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwic3RhcnRzV2l0aCIsInBheWxvYWQiLCJkZWJ1ZyIsInJlc3BvbnNlIiwiZmV0Y2giLCJzdGF0dXMiLCJzdGF0dXNUZXh0Iiwic2ltcGxpZnlVcmwiLCJyZXRyeUNvdW50IiwicmVqZWN0Iiwib2siLCJlcnJvciIsInJlc2V0QWZ0ZXIiLCJyZXRyeVJlcXVlc3QiLCJqc29uIiwicmVzb2x2ZSIsInJvdXRlIiwicmVwbGFjZSIsIm1hdGNoIiwicCIsInN1YnN0cmluZyIsImluZGV4T2YiLCJwcm9jZXNzUmVxdWVzdCIsInJlcXVlc3QiLCJwYXJ0cyIsInNwbGl0Iiwic2hpZnQiLCJxdWV1ZSIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJQcm9taXNlIiwicG9zdCIsInBhdGNoIiwicHV0IiwiZGVsZXRlTWVzc2FnZSIsImVkaXQiLCJlZGl0TWVzc2FnZSIsInNlbmQiLCJzZW5kTWVzc2FnZSIsInB1Ymxpc2giLCJwdWJsaXNoTWVzc2FnZSIsImdldENoYW5uZWwiLCJjcmVhdGUiLCJjcmVhdGVDaGFubmVsIiwiZGVsZXRlQ2hhbm5lbCIsImVkaXRDaGFubmVsIiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwiZm9sbG93QW5ub3VuY2VtZW50IiwiZm9ydW1zIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwicG9zaXRpb25zIiwiY2hhbm5lbFBvc2l0aW9ucyIsImVkaXRDaGFubmVsUG9zaXRpb25zIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsImRhdGEiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsImdldFN0YWdlSW5zdGFuY2UiLCJ3aXRoIiwic3RhcnRUaHJlYWRXaXRoTWVzc2FnZSIsIndpdGhvdXQiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImpvaW5UaHJlYWQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwia2ljayIsInJlbW92ZVRocmVhZE1lbWJlciIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJjcmVhdGVFbW9qaSIsImRlbGV0ZUVtb2ppIiwiZWRpdEVtb2ppIiwiZ2V0RW1vamkiLCJnZXRBdWRpdExvZyIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJlZGl0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZSIsImdldEF1dG9tb2RSdWxlcyIsImdldEJhbiIsImdldEJhbnMiLCJjcmVhdGVHdWlsZCIsImdldENoYW5uZWxzIiwiZGVsZXRlR3VpbGQiLCJlZGl0R3VpbGQiLCJnZXRFbW9qaXMiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZWRpdFNjaGVkdWxlZEV2ZW50IiwiZ2V0U2NoZWR1bGVkRXZlbnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwiY291bnRzIiwiZ2V0SW50ZWdyYXRpb25zIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJjcmVhdGVJbnZpdGUiLCJkZWxldGVJbnZpdGUiLCJnZXRJbnZpdGUiLCJsaXN0IiwiZ2V0SW52aXRlcyIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImRlbGV0ZUd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiY3JlYXRlR3VpbGRUZW1wbGF0ZSIsInRlbXBsYXRlQ29kZSIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJlZGl0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsInN5bmMiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImVkaXRNZW1iZXIiLCJlZGl0U2VsZiIsImVkaXRCb3RNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXREbUNoYW5uZWwiLCJraWNrTWVtYmVyIiwiZ2V0TWVtYmVycyIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJ1bmJhbiIsInVuYmFuTWVtYmVyIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJiZWFyZXJUb2tlbiIsImVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsInVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJmb2xsb3d1cCIsInNlbmRGb2xsb3d1cE1lc3NhZ2UiLCJzZW5kSW50ZXJhY3Rpb25SZXNwb25zZSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiYWRkIiwiYWRkUm9sZSIsImNyZWF0ZVJvbGUiLCJkZWxldGVSb2xlIiwiZWRpdFJvbGUiLCJnZXRSb2xlcyIsImVkaXRSb2xlUG9zaXRpb25zIiwicmVtb3ZlIiwicmVtb3ZlUm9sZSIsImdldFZhbml0eVVybCIsImdldFZvaWNlUmVnaW9ucyIsImdldFN0aWNrZXIiLCJjcmVhdGVXZWJob29rIiwiZGVsZXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2ViaG9vayIsImVkaXRXZWJob29rV2l0aFRva2VuIiwiZXhlY3V0ZSIsImV4ZWN1dGVXZWJob29rIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldFdlYmhvb2tNZXNzYWdlIiwiZ2V0V2ViaG9vayIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImFzc2lnbiIsImVkaXRXZWJob29rTWVzc2FnZSIsImVkaXRPcmlnaW5hbFdlYmhvb2tNZXNzYWdlIiwiYWRkVGhyZWFkTWVtYmVyIiwiYXZhdGFyIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJ1c2VybmFtZSIsInRyaW0iLCJ0eXBlIiwiVXBkYXRlTWVzc2FnZSIsInRvcGljIiwid2ViaG9va19jaGFubmVsX2lkIiwiZ2V0QXBwbGljYXRpb25JbmZvIiwicmVjaXBpZW50X2lkIiwiZ2V0R2F0ZXdheUJvdCIsImdldEd1aWxkIiwiZ2V0Tml0cm9TdGlja2VyUGFja3MiLCJnZXRTZXNzaW9uSW5mbyIsImdldFVzZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQVNBLDRCQUFBQSxDQUF3QixLQUFRLG1CQUFtQixBQUM1RCxRQUFTQyxpQkFBQUEsQ0FBYSxDQUFFQyxZQUFBQSxDQUFRLENBQUVDLG9CQUFBQSxDQUFnQixDQUFFQyxTQUFBQSxDQUFLLENBQUVDLGFBQUFBLENBQVMsQ0FBRUMscUJBQUFBLENBQWlCLENBQUVDLFVBQUFBLENBQU0sQ0FBRUMsZUFBQUEsQ0FBVyxLQUFRLG1CQUFtQixBQUV2SSxRQUFTQyw4QkFBQUEsQ0FBMEIsS0FBUSxvQkFB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
1
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { InteractionResponseTypes } from '@discordeno/types';
2
+ import { calculateBits, camelize, camelToSnakeCase, delay, getBotIdFromToken, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
3
+ import fetch from 'node-fetch';
4
+ import { createInvalidRequestBucket } from './invalidBucket.js';
5
+ import { Queue } from './queue.js';
6
+ import { createRoutes } from './routes.js';
7
+ // TODO: make dynamic based on package.json file
8
+ const version = '19.0.0-alpha.1';
9
+ export function createRestManager(options) {
10
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : options.token ? getBotIdFromToken(options.token) : undefined;
11
+ if (!applicationId) {
12
+ 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.');
13
+ }
14
+ const baseUrl = options.proxy?.baseUrl ?? 'https://discord.com/api';
15
+ const rest = {
16
+ token: options.token,
17
+ applicationId,
18
+ version: options.version ?? 10,
19
+ baseUrl,
20
+ isProxied: !baseUrl.startsWith('https://discord.com/api'),
21
+ maxRetryCount: Infinity,
22
+ globallyRateLimited: false,
23
+ processingRateLimitedPaths: false,
24
+ deleteQueueDelay: 60000,
25
+ queues: new Map(),
26
+ rateLimitedPaths: new Map(),
27
+ invalidBucket: createInvalidRequestBucket({}),
28
+ authorization: options.proxy?.authorization,
29
+ routes: createRoutes(),
30
+ checkRateLimits (url) {
31
+ const ratelimited = rest.rateLimitedPaths.get(url);
32
+ const global = rest.rateLimitedPaths.get('global');
33
+ const now = Date.now();
34
+ if (ratelimited && now < ratelimited.resetTimestamp) {
35
+ return ratelimited.resetTimestamp - now;
36
+ }
37
+ if (global && now < global.resetTimestamp) {
38
+ return global.resetTimestamp - now;
39
+ }
40
+ return false;
41
+ },
42
+ changeToDiscordFormat (obj) {
43
+ if (obj === null) return null;
44
+ if (typeof obj === 'object') {
45
+ if (Array.isArray(obj)) {
46
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
47
+ }
48
+ const newObj = {};
49
+ for (const key of Object.keys(obj)){
50
+ // Keys that dont require snake casing
51
+ if ([
52
+ 'permissions',
53
+ 'allow',
54
+ 'deny'
55
+ ].includes(key)) {
56
+ newObj[key] = calculateBits(obj[key]);
57
+ continue;
58
+ }
59
+ if (key === 'defaultMemberPermissions') {
60
+ newObj.default_member_permissions = calculateBits(obj[key]);
61
+ continue;
62
+ }
63
+ newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(obj[key]);
64
+ }
65
+ return newObj;
66
+ }
67
+ if (typeof obj === 'bigint') return obj.toString();
68
+ return obj;
69
+ },
70
+ createRequestBody (method, options) {
71
+ const headers = {
72
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
73
+ };
74
+ if (options?.unauthorized !== false) headers.authorization = `Bot ${rest.token}`;
75
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
76
+ if (options?.reason !== undefined) {
77
+ headers['x-audit-log-reason'] = encodeURIComponent(options?.reason);
78
+ }
79
+ let body;
80
+ // TODO: check if we need to add specific check for GET method
81
+ // Since GET does not allow bodies
82
+ // Have to check for attachments first, since body then has to be send in a different way.
83
+ if (options?.files !== undefined) {
84
+ const form = new FormData();
85
+ for(let i = 0; i < options.files.length; ++i){
86
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
87
+ }
88
+ form.append('payload_json', JSON.stringify({
89
+ ...options.body,
90
+ files: undefined
91
+ }));
92
+ body = form;
93
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
94
+ } else if (options?.body !== undefined) {
95
+ if (options.body instanceof FormData) {
96
+ body = options.body;
97
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
98
+ } else {
99
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
100
+ headers['content-type'] = `application/json`;
101
+ }
102
+ }
103
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
104
+ if (options?.headers) {
105
+ Object.assign(headers, options.headers);
106
+ }
107
+ return {
108
+ body,
109
+ headers,
110
+ method
111
+ };
112
+ },
113
+ processRateLimitedPaths () {
114
+ const now = Date.now();
115
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
116
+ // rest.debug(
117
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
118
+ // value.resetTimestamp - now
119
+ // }`
120
+ // )
121
+ // If the time has not reached cancel
122
+ if (value.resetTimestamp > now) continue;
123
+ // Rate limit is over, delete the rate limiter
124
+ rest.rateLimitedPaths.delete(key);
125
+ // If it was global, also mark the global value as false
126
+ if (key === 'global') rest.globallyRateLimited = false;
127
+ }
128
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
129
+ if (rest.rateLimitedPaths.size === 0) {
130
+ rest.processingRateLimitedPaths = false;
131
+ } else {
132
+ rest.processingRateLimitedPaths = true;
133
+ // RECHECK IN 1 SECOND
134
+ setTimeout(()=>{
135
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
136
+ rest.processRateLimitedPaths();
137
+ }, 1000);
138
+ }
139
+ },
140
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
141
+ let rateLimited = false;
142
+ // GET ALL NECESSARY HEADERS
143
+ const remaining = headers.get('x-ratelimit-remaining');
144
+ const retryAfter = headers.get('x-ratelimit-reset-after');
145
+ const reset = Date.now() + Number(retryAfter) * 1000;
146
+ const global = headers.get('x-ratelimit-global');
147
+ // undefined override null needed for typings
148
+ const bucketId = headers.get('x-ratelimit-bucket') ?? undefined;
149
+ const limit = headers.get('x-ratelimit-limit');
150
+ rest.queues.get(url)?.handleCompletedRequest({
151
+ remaining: remaining ? Number(remaining) : undefined,
152
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
153
+ max: limit ? Number(limit) : undefined
154
+ });
155
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
156
+ if (remaining === '0') {
157
+ rateLimited = true;
158
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
159
+ rest.rateLimitedPaths.set(url, {
160
+ url,
161
+ resetTimestamp: reset,
162
+ bucketId
163
+ });
164
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
165
+ if (bucketId) {
166
+ rest.rateLimitedPaths.set(bucketId, {
167
+ url,
168
+ resetTimestamp: reset,
169
+ bucketId
170
+ });
171
+ }
172
+ }
173
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
174
+ if (global) {
175
+ const retryAfter = headers.get('retry-after');
176
+ const globalReset = Date.now() + Number(retryAfter) * 1000;
177
+ // rest.debug(
178
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
179
+ // )
180
+ rest.globallyRateLimited = true;
181
+ rateLimited = true;
182
+ setTimeout(()=>{
183
+ rest.globallyRateLimited = false;
184
+ }, globalReset);
185
+ rest.rateLimitedPaths.set('global', {
186
+ url: 'global',
187
+ resetTimestamp: globalReset,
188
+ bucketId
189
+ });
190
+ if (bucketId) {
191
+ rest.rateLimitedPaths.set(bucketId, {
192
+ url: 'global',
193
+ resetTimestamp: globalReset,
194
+ bucketId
195
+ });
196
+ }
197
+ }
198
+ if (rateLimited && !rest.processingRateLimitedPaths) {
199
+ rest.processRateLimitedPaths();
200
+ }
201
+ return rateLimited ? bucketId : undefined;
202
+ },
203
+ async sendRequest (options) {
204
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
205
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
206
+ logger.debug(`sending request to ${url}`, 'with payload:', {
207
+ ...payload,
208
+ headers: {
209
+ ...payload.headers,
210
+ authorization: 'Bot tokenhere'
211
+ }
212
+ });
213
+ const response = await fetch(url, payload);
214
+ logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
215
+ // Set the bucket id if it was available on the headers
216
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers);
217
+ if (bucketId) options.bucketId = bucketId;
218
+ if (response.status < 200 || response.status >= 400) {
219
+ logger.debug(`Request to ${url} failed.`);
220
+ if (response.status !== 429) {
221
+ options.reject({
222
+ ok: false,
223
+ status: response.status,
224
+ body: await response.text()
225
+ });
226
+ return;
227
+ }
228
+ logger.debug(`Request to ${url} was ratelimited.`);
229
+ // Too many attempts, get rid of request from queue.
230
+ if (options.retryCount >= rest.maxRetryCount) {
231
+ logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
232
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
233
+ options.reject({
234
+ ok: false,
235
+ status: response.status,
236
+ error: 'The request was rate limited and it maxed out the retries limit.'
237
+ });
238
+ return;
239
+ }
240
+ options.retryCount += 1;
241
+ // Rate limited, add back to queue
242
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get('X-RateLimit-Scope') === 'shared');
243
+ const resetAfter = response.headers.get('x-ratelimit-reset-after');
244
+ if (resetAfter) await delay(Number(resetAfter) * 1000);
245
+ // process the response to prevent mem leak
246
+ await response.arrayBuffer();
247
+ return await options.retryRequest?.(options);
248
+ }
249
+ // Discord sometimes sends no response with no content.
250
+ options.resolve({
251
+ ok: true,
252
+ status: response.status,
253
+ body: response.status === 204 ? undefined : await response.text()
254
+ });
255
+ },
256
+ simplifyUrl (url, method) {
257
+ const parts = url.split('/');
258
+ const secondLastPart = parts[parts.length - 2];
259
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
260
+ return url;
261
+ }
262
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
263
+ parts.splice(-2);
264
+ parts.push('reactions');
265
+ } else {
266
+ parts.splice(-1);
267
+ parts.push('x');
268
+ }
269
+ if (parts[parts.length - 3] === 'reactions') {
270
+ parts.splice(-2);
271
+ }
272
+ if (method === 'DELETE' && secondLastPart === 'messages') {
273
+ return `D${parts.join('/')}`;
274
+ }
275
+ return parts.join('/');
276
+ },
277
+ async processRequest (request) {
278
+ const route = request.route.substring(request.route.indexOf('api/'));
279
+ const parts = route.split('/');
280
+ // Remove the api/
281
+ parts.shift();
282
+ // Removes the /v#/
283
+ if (parts[0]?.startsWith('v')) parts.shift();
284
+ // Set the full url to discord api in case it was recieved in a proxy rest
285
+ request.route = `${rest.baseUrl}/v${rest.version}/${parts.join('/')}`;
286
+ const url = rest.simplifyUrl(request.route, request.method);
287
+ if (request.runThroughQueue === false) {
288
+ await rest.sendRequest(request);
289
+ return;
290
+ }
291
+ const queue = rest.queues.get(url);
292
+ if (queue !== undefined) {
293
+ queue.makeRequest(request);
294
+ } else {
295
+ // CREATES A NEW QUEUE
296
+ const bucketQueue = new Queue(rest, {
297
+ url,
298
+ deleteQueueDelay: rest.deleteQueueDelay
299
+ });
300
+ // Add request to queue
301
+ bucketQueue.makeRequest(request);
302
+ // Save queue
303
+ rest.queues.set(url, bucketQueue);
304
+ }
305
+ },
306
+ async makeRequest (method, route, options) {
307
+ if (rest.isProxied) {
308
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
309
+ if (!result.ok) {
310
+ const err = await result.json().catch(()=>{});
311
+ // Legacy Handling to not break old code or when body is missing
312
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
313
+ throw new Error(JSON.stringify(err));
314
+ }
315
+ return result.status !== 204 ? await result.json() : undefined;
316
+ }
317
+ // eslint-disable-next-line no-async-promise-executor
318
+ return await new Promise(async (resolve, reject)=>{
319
+ const payload = {
320
+ route,
321
+ method,
322
+ requestBodyOptions: options,
323
+ retryCount: 0,
324
+ retryRequest: async function(payload) {
325
+ await rest.processRequest(payload);
326
+ },
327
+ resolve: (data)=>{
328
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
329
+ },
330
+ reject,
331
+ runThroughQueue: options?.runThroughQueue
332
+ };
333
+ await rest.processRequest(payload);
334
+ });
335
+ },
336
+ async get (url, options) {
337
+ return camelize(await rest.makeRequest('GET', url, options));
338
+ },
339
+ async post (url, options) {
340
+ return camelize(await rest.makeRequest('POST', url, options));
341
+ },
342
+ async delete (url, options) {
343
+ camelize(await rest.makeRequest('DELETE', url, options));
344
+ },
345
+ async patch (url, options) {
346
+ return camelize(await rest.makeRequest('PATCH', url, options));
347
+ },
348
+ async put (url, options) {
349
+ return camelize(await rest.makeRequest('PUT', url, options));
350
+ },
351
+ async addReaction (channelId, messageId, reaction) {
352
+ reaction = processReactionString(reaction);
353
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
354
+ },
355
+ async addReactions (channelId, messageId, reactions, ordered = false) {
356
+ if (!ordered) {
357
+ await Promise.all(reactions.map(async (reaction)=>{
358
+ await rest.addReaction(channelId, messageId, reaction);
359
+ }));
360
+ return;
361
+ }
362
+ for (const reaction of reactions){
363
+ await rest.addReaction(channelId, messageId, reaction);
364
+ }
365
+ },
366
+ async addRole (guildId, userId, roleId, reason) {
367
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
368
+ reason
369
+ });
370
+ },
371
+ async addThreadMember (channelId, userId) {
372
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
373
+ },
374
+ async createAutomodRule (guildId, body, reason) {
375
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
376
+ body,
377
+ reason
378
+ });
379
+ },
380
+ async createChannel (guildId, body, reason) {
381
+ return await rest.post(rest.routes.guilds.channels(guildId), {
382
+ body,
383
+ reason
384
+ });
385
+ },
386
+ async createEmoji (guildId, body, reason) {
387
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
388
+ body,
389
+ reason
390
+ });
391
+ },
392
+ async createGlobalApplicationCommand (body) {
393
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), {
394
+ body
395
+ });
396
+ },
397
+ async createGuild (body) {
398
+ return await rest.post(rest.routes.guilds.all(), {
399
+ body
400
+ });
401
+ },
402
+ async createGuildApplicationCommand (body, guildId) {
403
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
404
+ body
405
+ });
406
+ },
407
+ async createGuildFromTemplate (templateCode, body) {
408
+ if (body.icon) {
409
+ body.icon = await urlToBase64(body.icon);
410
+ }
411
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
412
+ body
413
+ });
414
+ },
415
+ async createGuildSticker (guildId, options, reason) {
416
+ const form = new FormData();
417
+ form.append('file', options.file.blob, options.file.name);
418
+ form.append('name', options.name);
419
+ form.append('description', options.description);
420
+ form.append('tags', options.tags);
421
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
422
+ body: form,
423
+ reason
424
+ });
425
+ },
426
+ async createGuildTemplate (guildId, body) {
427
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
428
+ body
429
+ });
430
+ },
431
+ async createForumThread (channelId, body, reason) {
432
+ return await rest.post(rest.routes.channels.forum(channelId), {
433
+ body,
434
+ files: body.files,
435
+ reason
436
+ });
437
+ },
438
+ async createInvite (channelId, body = {}, reason) {
439
+ return await rest.post(rest.routes.channels.invites(channelId), {
440
+ body,
441
+ reason
442
+ });
443
+ },
444
+ async createRole (guildId, body, reason) {
445
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
446
+ body,
447
+ reason
448
+ });
449
+ },
450
+ async createScheduledEvent (guildId, body, reason) {
451
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
452
+ body,
453
+ reason
454
+ });
455
+ },
456
+ async createStageInstance (body, reason) {
457
+ return await rest.post(rest.routes.channels.stages(), {
458
+ body,
459
+ reason
460
+ });
461
+ },
462
+ async createWebhook (channelId, options, reason) {
463
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
464
+ body: {
465
+ name: options.name,
466
+ avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
467
+ },
468
+ reason
469
+ });
470
+ },
471
+ async deleteAutomodRule (guildId, ruleId, reason) {
472
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
473
+ reason
474
+ });
475
+ },
476
+ async deleteChannel (channelId, reason) {
477
+ await rest.delete(rest.routes.channels.channel(channelId), {
478
+ reason
479
+ });
480
+ },
481
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
482
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
483
+ reason
484
+ });
485
+ },
486
+ async deleteEmoji (guildId, id, reason) {
487
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
488
+ reason
489
+ });
490
+ },
491
+ async deleteFollowupMessage (token, messageId) {
492
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
493
+ unauthorized: true
494
+ });
495
+ },
496
+ async deleteGlobalApplicationCommand (commandId) {
497
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
498
+ },
499
+ async deleteGuild (guildId) {
500
+ await rest.delete(rest.routes.guilds.guild(guildId));
501
+ },
502
+ async deleteGuildApplicationCommand (commandId, guildId) {
503
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
504
+ },
505
+ async deleteGuildSticker (guildId, stickerId, reason) {
506
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
507
+ reason
508
+ });
509
+ },
510
+ async deleteGuildTemplate (guildId, templateCode) {
511
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
512
+ },
513
+ async deleteIntegration (guildId, integrationId, reason) {
514
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
515
+ reason
516
+ });
517
+ },
518
+ async deleteInvite (inviteCode, reason) {
519
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
520
+ reason
521
+ });
522
+ },
523
+ async deleteMessage (channelId, messageId, reason) {
524
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
525
+ reason
526
+ });
527
+ },
528
+ async deleteMessages (channelId, messageIds, reason) {
529
+ await rest.post(rest.routes.channels.bulk(channelId), {
530
+ body: {
531
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
532
+ },
533
+ reason
534
+ });
535
+ },
536
+ async deleteOriginalInteractionResponse (token) {
537
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
538
+ unauthorized: true
539
+ });
540
+ },
541
+ async deleteOwnReaction (channelId, messageId, reaction) {
542
+ reaction = processReactionString(reaction);
543
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
544
+ },
545
+ async deleteReactionsAll (channelId, messageId) {
546
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
547
+ },
548
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
549
+ reaction = processReactionString(reaction);
550
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
551
+ },
552
+ async deleteRole (guildId, roleId, reason) {
553
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
554
+ reason
555
+ });
556
+ },
557
+ async deleteScheduledEvent (guildId, eventId) {
558
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
559
+ },
560
+ async deleteStageInstance (channelId, reason) {
561
+ await rest.delete(rest.routes.channels.stage(channelId), {
562
+ reason
563
+ });
564
+ },
565
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
566
+ reaction = processReactionString(reaction);
567
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
568
+ },
569
+ async deleteWebhook (webhookId, reason) {
570
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
571
+ reason
572
+ });
573
+ },
574
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
575
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
576
+ },
577
+ async deleteWebhookWithToken (webhookId, token) {
578
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
579
+ },
580
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
581
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
582
+ body: {
583
+ permissions
584
+ },
585
+ headers: {
586
+ authorization: `Bearer ${bearerToken}`
587
+ }
588
+ });
589
+ },
590
+ async editAutomodRule (guildId, ruleId, body, reason) {
591
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
592
+ body,
593
+ reason
594
+ });
595
+ },
596
+ async editBotProfile (options) {
597
+ const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
598
+ return await rest.patch(rest.routes.userBot(), {
599
+ body: {
600
+ username: options.username?.trim(),
601
+ avatar
602
+ }
603
+ });
604
+ },
605
+ async editChannel (channelId, body, reason) {
606
+ return await rest.patch(rest.routes.channels.channel(channelId), {
607
+ body,
608
+ reason
609
+ });
610
+ },
611
+ async editChannelPermissionOverrides (channelId, body, reason) {
612
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
613
+ body,
614
+ reason
615
+ });
616
+ },
617
+ async editChannelPositions (guildId, body) {
618
+ await rest.patch(rest.routes.guilds.channels(guildId), {
619
+ body
620
+ });
621
+ },
622
+ async editEmoji (guildId, id, body, reason) {
623
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
624
+ body,
625
+ reason
626
+ });
627
+ },
628
+ async editFollowupMessage (token, messageId, body) {
629
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
630
+ body,
631
+ files: body.files,
632
+ unauthorized: true
633
+ });
634
+ },
635
+ async editGlobalApplicationCommand (commandId, body) {
636
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
637
+ body
638
+ });
639
+ },
640
+ async editGuild (guildId, body, reason) {
641
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
642
+ body,
643
+ reason
644
+ });
645
+ },
646
+ async editGuildApplicationCommand (commandId, guildId, body) {
647
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
648
+ body
649
+ });
650
+ },
651
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
652
+ await rest.post(rest.routes.guilds.mfa(guildId), {
653
+ body: {
654
+ level: mfaLevel
655
+ },
656
+ reason
657
+ });
658
+ },
659
+ async editGuildSticker (guildId, stickerId, body, reason) {
660
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
661
+ body,
662
+ reason
663
+ });
664
+ },
665
+ async editGuildTemplate (guildId, templateCode, body) {
666
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
667
+ body
668
+ });
669
+ },
670
+ async editMessage (channelId, messageId, body) {
671
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
672
+ body
673
+ });
674
+ },
675
+ async editOriginalInteractionResponse (token, body) {
676
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
677
+ body,
678
+ files: body.files
679
+ });
680
+ },
681
+ async editOriginalWebhookMessage (webhookId, token, options) {
682
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
683
+ body: {
684
+ type: InteractionResponseTypes.UpdateMessage,
685
+ data: options
686
+ },
687
+ files: options.files,
688
+ unauthorized: true
689
+ });
690
+ },
691
+ async editOwnVoiceState (guildId, options) {
692
+ await rest.patch(rest.routes.guilds.voice(guildId), {
693
+ body: {
694
+ ...options,
695
+ request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
696
+ }
697
+ });
698
+ },
699
+ async editScheduledEvent (guildId, eventId, body, reason) {
700
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
701
+ body,
702
+ reason
703
+ });
704
+ },
705
+ async editRole (guildId, roleId, body, reason) {
706
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
707
+ body,
708
+ reason
709
+ });
710
+ },
711
+ async editRolePositions (guildId, body, reason) {
712
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
713
+ body,
714
+ reason
715
+ });
716
+ },
717
+ async editStageInstance (channelId, topic, reason) {
718
+ return await rest.patch(rest.routes.channels.stage(channelId), {
719
+ body: {
720
+ topic
721
+ },
722
+ reason
723
+ });
724
+ },
725
+ async editUserVoiceState (guildId, options) {
726
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
727
+ body: options
728
+ });
729
+ },
730
+ async editWebhook (webhookId, body, reason) {
731
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
732
+ body,
733
+ reason
734
+ });
735
+ },
736
+ async editWebhookMessage (webhookId, token, messageId, options) {
737
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
738
+ body: options,
739
+ files: options.files
740
+ });
741
+ },
742
+ async editWebhookWithToken (webhookId, token, body) {
743
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
744
+ body
745
+ });
746
+ },
747
+ async editWelcomeScreen (guildId, body, reason) {
748
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
749
+ body,
750
+ reason
751
+ });
752
+ },
753
+ async editWidgetSettings (guildId, body, reason) {
754
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
755
+ body,
756
+ reason
757
+ });
758
+ },
759
+ async executeWebhook (webhookId, token, options) {
760
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
761
+ body: options
762
+ });
763
+ },
764
+ async followAnnouncement (sourceChannelId, targetChannelId) {
765
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
766
+ body: {
767
+ webhook_channel_id: targetChannelId
768
+ }
769
+ });
770
+ },
771
+ async getActiveThreads (guildId) {
772
+ return await rest.get(rest.routes.channels.threads.active(guildId));
773
+ },
774
+ async getApplicationCommandPermission (guildId, commandId) {
775
+ return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
776
+ },
777
+ async getApplicationCommandPermissions (guildId) {
778
+ return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
779
+ },
780
+ async getApplicationInfo () {
781
+ return await rest.get(rest.routes.oauth2Application());
782
+ },
783
+ async getAuditLog (guildId, options) {
784
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
785
+ },
786
+ async getAutomodRule (guildId, ruleId) {
787
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
788
+ },
789
+ async getAutomodRules (guildId) {
790
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
791
+ },
792
+ async getAvailableVoiceRegions () {
793
+ return await rest.get(rest.routes.regions());
794
+ },
795
+ async getBan (guildId, userId) {
796
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
797
+ },
798
+ async getBans (guildId, options) {
799
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
800
+ },
801
+ async getChannel (id) {
802
+ return await rest.get(rest.routes.channels.channel(id));
803
+ },
804
+ async getChannelInvites (channelId) {
805
+ return await rest.get(rest.routes.channels.invites(channelId));
806
+ },
807
+ async getChannels (guildId) {
808
+ return await rest.get(rest.routes.guilds.channels(guildId));
809
+ },
810
+ async getChannelWebhooks (channelId) {
811
+ return await rest.get(rest.routes.channels.webhooks(channelId));
812
+ },
813
+ async getDmChannel (userId) {
814
+ return await rest.post(rest.routes.channels.dm(), {
815
+ body: {
816
+ recipient_id: userId
817
+ }
818
+ });
819
+ },
820
+ async getEmoji (guildId, emojiId) {
821
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
822
+ },
823
+ async getEmojis (guildId) {
824
+ return await rest.get(rest.routes.guilds.emojis(guildId));
825
+ },
826
+ async getFollowupMessage (token, messageId) {
827
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
828
+ unauthorized: true
829
+ });
830
+ },
831
+ async getGatewayBot () {
832
+ return await rest.get(rest.routes.gatewayBot());
833
+ },
834
+ async getGlobalApplicationCommand (commandId) {
835
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
836
+ },
837
+ async getGlobalApplicationCommands () {
838
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
839
+ },
840
+ async getGuild (guildId, options = {
841
+ counts: true
842
+ }) {
843
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
844
+ },
845
+ async getGuildApplicationCommand (commandId, guildId) {
846
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
847
+ },
848
+ async getGuildApplicationCommands (guildId) {
849
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
850
+ },
851
+ async getGuildPreview (guildId) {
852
+ return await rest.get(rest.routes.guilds.preview(guildId));
853
+ },
854
+ async getGuildTemplate (templateCode) {
855
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
856
+ },
857
+ async getGuildTemplates (guildId) {
858
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
859
+ },
860
+ async getGuildWebhooks (guildId) {
861
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
862
+ },
863
+ async getIntegrations (guildId) {
864
+ return await rest.get(rest.routes.guilds.integrations(guildId));
865
+ },
866
+ async getInvite (inviteCode, options) {
867
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
868
+ },
869
+ async getInvites (guildId) {
870
+ return await rest.get(rest.routes.guilds.invites(guildId));
871
+ },
872
+ async getMessage (channelId, messageId) {
873
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
874
+ },
875
+ async getMessages (channelId, options) {
876
+ return await rest.get(rest.routes.channels.messages(channelId, options));
877
+ },
878
+ async getNitroStickerPacks () {
879
+ return await rest.get(rest.routes.nitroStickerPacks());
880
+ },
881
+ async getOriginalInteractionResponse (token) {
882
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
883
+ unauthorized: true
884
+ });
885
+ },
886
+ async getPinnedMessages (channelId) {
887
+ return await rest.get(rest.routes.channels.pins(channelId));
888
+ },
889
+ async getPrivateArchivedThreads (channelId, options) {
890
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
891
+ },
892
+ async getPrivateJoinedArchivedThreads (channelId, options) {
893
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
894
+ },
895
+ async getPruneCount (guildId, options) {
896
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
897
+ },
898
+ async getPublicArchivedThreads (channelId, options) {
899
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
900
+ },
901
+ async getRoles (guildId) {
902
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
903
+ },
904
+ async getScheduledEvent (guildId, eventId, options) {
905
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
906
+ },
907
+ async getScheduledEvents (guildId, options) {
908
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
909
+ },
910
+ async getScheduledEventUsers (guildId, eventId, options) {
911
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
912
+ },
913
+ async getSessionInfo () {
914
+ return await rest.getGatewayBot();
915
+ },
916
+ async getStageInstance (channelId) {
917
+ return await rest.get(rest.routes.channels.stage(channelId));
918
+ },
919
+ async getSticker (stickerId) {
920
+ return await rest.get(rest.routes.sticker(stickerId));
921
+ },
922
+ async getGuildSticker (guildId, stickerId) {
923
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
924
+ },
925
+ async getGuildStickers (guildId) {
926
+ return await rest.get(rest.routes.guilds.stickers(guildId));
927
+ },
928
+ async getThreadMember (channelId, userId) {
929
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
930
+ },
931
+ async getThreadMembers (channelId) {
932
+ return await rest.get(rest.routes.channels.threads.members(channelId));
933
+ },
934
+ async getReactions (channelId, messageId, reaction, options) {
935
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
936
+ },
937
+ async getUser (id) {
938
+ return await rest.get(rest.routes.user(id));
939
+ },
940
+ async getVanityUrl (guildId) {
941
+ return await rest.get(rest.routes.guilds.vanity(guildId));
942
+ },
943
+ async getVoiceRegions (guildId) {
944
+ return await rest.get(rest.routes.guilds.regions(guildId));
945
+ },
946
+ async getWebhook (webhookId) {
947
+ return await rest.get(rest.routes.webhooks.id(webhookId));
948
+ },
949
+ async getWebhookMessage (webhookId, token, messageId, options) {
950
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
951
+ },
952
+ async getWebhookWithToken (webhookId, token) {
953
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
954
+ },
955
+ async getWelcomeScreen (guildId) {
956
+ return await rest.get(rest.routes.guilds.welcome(guildId));
957
+ },
958
+ async getWidget (guildId) {
959
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
960
+ },
961
+ async getWidgetSettings (guildId) {
962
+ return await rest.get(rest.routes.guilds.widget(guildId));
963
+ },
964
+ async joinThread (channelId) {
965
+ await rest.put(rest.routes.channels.threads.me(channelId));
966
+ },
967
+ async leaveGuild (guildId) {
968
+ await rest.delete(rest.routes.guilds.leave(guildId));
969
+ },
970
+ async leaveThread (channelId) {
971
+ await rest.delete(rest.routes.channels.threads.me(channelId));
972
+ },
973
+ async publishMessage (channelId, messageId) {
974
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
975
+ },
976
+ async removeRole (guildId, userId, roleId, reason) {
977
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
978
+ reason
979
+ });
980
+ },
981
+ async removeThreadMember (channelId, userId) {
982
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
983
+ },
984
+ async sendFollowupMessage (token, options) {
985
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
986
+ body: options,
987
+ files: options.files,
988
+ unauthorized: true
989
+ });
990
+ },
991
+ async sendInteractionResponse (interactionId, token, options) {
992
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token), {
993
+ body: options,
994
+ files: options.data?.files,
995
+ runThroughQueue: false,
996
+ unauthorized: true
997
+ });
998
+ },
999
+ async sendMessage (channelId, body) {
1000
+ return await rest.post(rest.routes.channels.messages(channelId), {
1001
+ body,
1002
+ files: body.files
1003
+ });
1004
+ },
1005
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1006
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1007
+ body,
1008
+ reason
1009
+ });
1010
+ },
1011
+ async startThreadWithoutMessage (channelId, body, reason) {
1012
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1013
+ body,
1014
+ reason
1015
+ });
1016
+ },
1017
+ async syncGuildTemplate (guildId) {
1018
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1019
+ },
1020
+ async banMember (guildId, userId, body, reason) {
1021
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1022
+ body,
1023
+ reason
1024
+ });
1025
+ },
1026
+ async editBotMember (guildId, body, reason) {
1027
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1028
+ body,
1029
+ reason
1030
+ });
1031
+ },
1032
+ async editMember (guildId, userId, body, reason) {
1033
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1034
+ body,
1035
+ reason
1036
+ });
1037
+ },
1038
+ async getMember (guildId, userId) {
1039
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1040
+ },
1041
+ async getMembers (guildId, options) {
1042
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1043
+ },
1044
+ async kickMember (guildId, userId, reason) {
1045
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1046
+ reason
1047
+ });
1048
+ },
1049
+ async pinMessage (channelId, messageId, reason) {
1050
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1051
+ reason
1052
+ });
1053
+ },
1054
+ async pruneMembers (guildId, body, reason) {
1055
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1056
+ body,
1057
+ reason
1058
+ });
1059
+ },
1060
+ async searchMembers (guildId, query, options) {
1061
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1062
+ },
1063
+ async unbanMember (guildId, userId, reason) {
1064
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1065
+ reason
1066
+ });
1067
+ },
1068
+ async unpinMessage (channelId, messageId, reason) {
1069
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1070
+ reason
1071
+ });
1072
+ },
1073
+ async triggerTypingIndicator (channelId) {
1074
+ await rest.post(rest.routes.channels.typing(channelId));
1075
+ },
1076
+ async upsertGlobalApplicationCommands (body) {
1077
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), {
1078
+ body
1079
+ });
1080
+ },
1081
+ async upsertGuildApplicationCommands (guildId, body) {
1082
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
1083
+ body
1084
+ });
1085
+ }
1086
+ };
1087
+ return rest;
1088
+ }
1089
+ var HttpResponseCode;
1090
+ (function(HttpResponseCode) {
1091
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in oder to consider that it was successful. */ "Success"] = 200] = "Success";
1092
+ HttpResponseCode[HttpResponseCode[/** Request completed successfully, but Discord returned an empty body. */ "NoContent"] = 204] = "NoContent";
1093
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in order to consider that something went wrong. */ "Error"] = 400] = "Error";
1094
+ HttpResponseCode[HttpResponseCode[/** This request got rate limited. */ "TooManyRequests"] = 429] = "TooManyRequests";
1095
+ })(HttpResponseCode || (HttpResponseCode = {}));
1096
+
1097
+ //# sourceMappingURL=manager.js.map