@arena-im/react-sdk-auth 1.11.0-dev.2 → 1.13.0-dev.1
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/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useRef as i,useEffect as s,useCallback as a}from"react";import{useMutation as c,QueryClient as u,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as k}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as m}from"jwt-decode";const T=n(void 0),h=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,c]=r(void 0),[u,l]=r(void 0),[d,k]=r(void 0);return e(T.Provider,{value:{isOpen:n,appName:i,appDescription:a,trackOptions:d,onAuthCompleted:u,openDialog:({trackOptions:e,appName:t,appDescription:n,onAuthCompleted:r})=>{o(!0),k(e),s(t),c(n),l(r)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},f=()=>{const e=o(T);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},g=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},y=n(void 0),U=({children:t,environment:n="development"})=>{const o=g(n);return e(y.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(y);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},v={"Content-Type":"application/json"};async function I(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var w,_;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(w||(w={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const E={public:{idToken:p.get(_.PUBLIC_ID_TOKEN)||null,refreshToken:p.get(_.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:p.get(_.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:p.get(_.GUEST_ID_TOKEN)||null},custom:{idToken:p.get(_.CUSTOM_ID_TOKEN)||null}},C=d()(k((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),p.set(_.PUBLIC_ID_TOKEN,n,{expires:1/24}),p.set(_.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&P(w.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),p.set(_.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&P(w.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),p.set(_.GUEST_ID_TOKEN,n,{expires:1/24}),o&&P(w.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),p.set(_.CUSTOM_ID_TOKEN,n),o&&P(w.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{p.remove(_.PUBLIC_ID_TOKEN),p.remove(_.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&P(w.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(_.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(w.ANONYMOUS,{idToken:null,source:n})},c=(t=!0,n)=>{p.remove(_.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(w.GUEST,{idToken:null,source:n})},u=(t=!0,n)=>{p.remove(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(w.CUSTOM,{idToken:null,source:n})};return{tokens:E,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[w.PUBLIC,w.GUEST,w.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(w.CUSTOM)?{type:w.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(w.PUBLIC)?{type:w.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(w.GUEST)?{type:w.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(w.ANONYMOUS)?{type:w.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),c(!0,e),u(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{c(!0,e)},clearCustomTokens:e=>{u(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{c(!1)},silentClearCustomTokens:()=>{u(!1)}}}));function N(){const e=C(e=>e.silentUpdatePublicTokens),t=C(e=>e.silentUpdateAnonymousToken),n=C(e=>e.silentUpdateGuestTokens),o=C(e=>e.silentUpdateCustomToken),r=C(e=>e.clearTokens),a=C(e=>e.silentClearPublicTokens),c=C(e=>e.silentClearAnonymousTokens),u=C(e=>e.silentClearGuestTokens),l=C(e=>e.silentClearCustomTokens),d=i(`widget-${Math.random().toString(36).substr(2,9)}`);return s(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:k,source:p}=r.detail;if(p!==d.current)switch(k){case w.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case w.ANONYMOUS:i?t(i):c();break;case w.GUEST:i?n(i):u();break;case w.CUSTOM:i?o(i):l()}};return document.addEventListener(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,c,u,l]),{eventSource:d.current}}function b(){const e=C(e=>e.getToken),t=C(e=>e.getMostPrivilegedToken),n=C(e=>e.getRefreshToken),o=C(e=>e.updatePublicTokens),r=C(e=>e.updateAnonymousToken),i=C(e=>e.updateGuestTokens),s=C(e=>e.updateCustomToken),a=C(e=>e.clearTokens),c=C(e=>e.clearPublicTokens),u=C(e=>e.clearCustomTokens),{eventSource:l}=N();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>c(l),clearCustomTokens:()=>u(l)}}function A(e){return C(t=>t.tokens[e])}function x(e){return C(t=>t.tokens[e]?.idToken)}function L(e){return C(t=>t.tokens[e]?.refreshToken)}var D,R;function K(){const e=A(w.PUBLIC),{refreshPublicTokens:t}=F(),{config:n}=S(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await I("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...v,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const c=a.headers.get("content-type");if(!c||!c.includes("application/json"))return a;const u=await a.text();if(!u)return null;try{return JSON.parse(u)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(R||(R={}));const M=d()(k((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=m(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=C.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=p.get(_.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);C.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=p.get(_.PUBLIC_ID_TOKEN),r=p.get(_.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(_.CUSTOM_ID_TOKEN),s=localStorage.getItem(_.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});C.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=g(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await I("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=m(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});C.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function B(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function $(){return M(e=>e.refreshedTokenLoaded)}function F(){return{setUser:M(e=>e.setUser),setPublicProfile:M(e=>e.setPublicProfile),logout:M(e=>e.logout),refreshPublicTokens:M(e=>e.refreshPublicTokens),setUserByTokenId:M(e=>e.setUserByTokenId),loadStoredUser:M(e=>e.loadStoredUser),ssoV2Exchange:M(e=>e.ssoV2Exchange)}}function J(){const{updatePublicProfile:e}=K();return{updatePublicProfile:e}}function Y(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function j({children:e}){const{config:t}=S(),n=B(),{setPublicProfile:o,loadStoredUser:r}=F(),{getPublicProfile:i}=K(),{mutateAsync:u}=c({mutationFn:i}),l=a(async()=>{if(n?.uid){const e=await u(n.uid);o(e)}},[n?.uid,u,o]);return s(()=>{l()},[l]),s(()=>{r(t)},[t,r]),e}const H="arenaAnonymousId",V="rs_anonymous_id",z="rs_initial_referrer",q="rs_initial_referring_domain";function W(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Z(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function Q(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(z)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(z,e),localStorage.setItem(q,t)}}();const r=localStorage.getItem(z)||"$direct",i=localStorage.getItem(q)||"";return{channel:"web",anonymousId:W(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Z(o)}}function X(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(H)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(H,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(H,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function ee(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function te(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:ee(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:Q(),timestamp:(new Date).toISOString(),integrations:{All:!0},...X(n)}}function ne(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function oe(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:ne(i),body:JSON.stringify({type:"page",...te(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:ne(i),body:JSON.stringify({event:t,type:"track",...te(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function re(){const{appName:t,appDescription:n,trackOptions:o,isOpen:r,closeDialog:i,onAuthCompleted:a}=f(),c=t||"Arena AI Chat",u=n||"Arena AI Chat",{setUser:l}=F(),{updatePublicTokens:d}=b(),{config:k}=S(),p=oe(o);let m=`${k.authIframeUrl}/?app-name=${c}&app-description=${u}`;return m+="&language=en",s(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void p(R.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:s}=e.data?.payload||{};return o?(p(R.AuthenticationCompleted,o.uid,{is_signup:s,auth_type:r}),a?.(o),d(t,n),l(o),void i()):void console.error("Authentication completed but user data is missing")}}else p(R.AuthenticationViewed);else i()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[l,d,a,p,i]),r?e("iframe",{src:m,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function ie({children:e}){const t=C(e=>e.tokens),n=C(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:o}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await I("POST",e)}}}();return s(()=>{t.anonymous.idToken||o().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,o]),e}function se({children:n,queryClient:o,environment:r}){return o=o||new u,e(l,{client:o,children:e(U,{environment:r,children:e(j,{children:e(h,{children:t(ie,{children:[n,e(re,{})]})})})})})}export{R as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,se as AuthProvider,w as TokenType,f as useAuthDialog,G as usePublicProfile,L as useRefreshToken,$ as useRefreshedTokenLoaded,A as useToken,N as useTokenEventListener,C as useTokenStore,x as useTokenValue,b as useTokens,J as useUpdateProfile,B as useUser,F as useUserActions,M as useUserStore,Y as useUserWithProfile};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXNlclByb3BzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbnRlcmZhY2UgQXV0aERpYWxvZ0NvbnRleHRUeXBlIHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBhcHBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFwcERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBvbkF1dGhDb21wbGV0ZWQ6ICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb3BlbkRpYWxvZzogKG9wdGlvbnM6IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB2b2lkO1xuICBjbG9zZURpYWxvZzogKCkgPT4gdm9pZDtcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuY29uc3QgQXV0aERpYWxvZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PEF1dGhEaWFsb2dDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxudHlwZSBPcGVuRGlhbG9nT3B0aW9ucyA9IHtcbiAgdHJhY2tPcHRpb25zOiBUcmFja09wdGlvbnM7XG4gIGFwcE5hbWU/OiBzdHJpbmc7XG4gIGFwcERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBvbkF1dGhDb21wbGV0ZWQ/OiAoKSA9PiAodXNlcjogVXNlclByb3BzKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IEF1dGhEaWFsb2dQcm92aWRlciA9ICh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSA9PiB7XG4gIGNvbnN0IFtpc09wZW4sIHNldElzT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthcHBOYW1lLCBzZXRBcHBOYW1lXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY29uc3QgW2FwcERlc2NyaXB0aW9uLCBzZXRBcHBEZXNjcmlwdGlvbl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBbb25BdXRoQ29tcGxldGVkLCBzZXRPbkF1dGhDb21wbGV0ZWRdID0gdXNlU3RhdGU8XG4gICAgKCh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKTtcbiAgY29uc3QgW3RyYWNrT3B0aW9ucywgc2V0VHJhY2tPcHRpb25zXSA9IHVzZVN0YXRlPFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IG9wZW5EaWFsb2cgPSAoe1xuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBhcHBOYW1lLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfTogT3BlbkRpYWxvZ09wdGlvbnMpID0+IHtcbiAgICBzZXRJc09wZW4odHJ1ZSk7XG4gICAgc2V0VHJhY2tPcHRpb25zKHRyYWNrT3B0aW9ucyk7XG4gICAgc2V0QXBwTmFtZShhcHBOYW1lKTtcbiAgICBzZXRBcHBEZXNjcmlwdGlvbihhcHBEZXNjcmlwdGlvbik7XG4gICAgc2V0T25BdXRoQ29tcGxldGVkKG9uQXV0aENvbXBsZXRlZCk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VEaWFsb2cgPSAoKSA9PiBzZXRJc09wZW4oZmFsc2UpO1xuICBjb25zdCBvbk9wZW5DaGFuZ2UgPSAob3BlbjogYm9vbGVhbikgPT4gc2V0SXNPcGVuKG9wZW4pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dGhEaWFsb2dDb250ZXh0LlByb3ZpZGVyXG4gICAgICB2YWx1ZT17e1xuICAgICAgICBpc09wZW4sXG4gICAgICAgIGFwcE5hbWUsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIHByb2ZpbGVTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIGlkZW50aXR5U2VydmljZVVybDogc3RyaW5nO1xuICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgYXV0aElmcmFtZVVybDogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcbiAgZGVidWc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9IChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiBDb25maWcgPT4ge1xuICBjb25zdCBpc0RldiA9IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZmlsZVNlcnZpY2VVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfUFJEIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIGlkZW50aXR5U2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuSURFTlRJVFlfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Rva2VuLXNlcnZpY2UtZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfREVWIHx8XG4gICAgICAgICdBSXphU3lDSmhXRkNLM2ljczlrSjJlU2dRRDdrV0hVc09zSnlQZGsnXG4gICAgICA6IHByb2Nlc3MuZW52LkZJUkVCQVNFX1BVQkxJQ19BUElfS0VZX1BSRCB8fFxuICAgICAgICAnQUl6YVN5RC05dFNyUVduNzNTMHFtNkJxRUg1LTEySHE4TDBlVHNRJyxcbiAgICBhdXRoSWZyYW1lVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfREVWIHx8ICdodHRwczovL2F1dGgyLmRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuQVVUSF9JRlJBTUVfVVJMX1BSRCB8fCAnaHR0cHM6Ly9hdXRoMi5hcmVuYS5pbScsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgZGVidWc6IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnLFxuICB9O1xufTtcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldENvbmZpZywgRW52aXJvbm1lbnQsIENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBDb25maWdDb250ZXh0VHlwZSB7XG4gIGNvbmZpZzogQ29uZmlnO1xuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG59XG5cbmNvbnN0IENvbmZpZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PENvbmZpZ0NvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5pbnRlcmZhY2UgQ29uZmlnUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGVudmlyb25tZW50PzogRW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb25maWdQcm92aWRlciA9ICh7XG4gIGNoaWxkcmVuLFxuICBlbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCcsXG59OiBDb25maWdQcm92aWRlclByb3BzKSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnZpcm9ubWVudCk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29uZmlnQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBjb25maWcsIGVudmlyb25tZW50IH19PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQ29uZmlnQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VDb25maWcgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUNvbmZpZyBtdXN0IGJlIHVzZWQgd2l0aGluIGEgQ29uZmlnUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJjb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICBtZXRob2Q6IHN0cmluZyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge31cbikge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWN1cmVkUmVxdWVzdChwYXJhbXM6IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBvcHRpb25zOiBSZXF1ZXN0SW5pdDtcbiAgdG9rZW46IHN0cmluZztcbn0pIHtcbiAgY29uc3QgeyBtZXRob2QsIHVybCwgb3B0aW9ucyA9IHt9LCB0b2tlbiB9ID0gcGFyYW1zO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICB9O1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBlcnJvcnMgfSA9IEpTT04ucGFyc2UodGV4dCkgfHwge307XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JzPy5bMF0gfHwgJ0ludGVybmFsIHNlcnZlciBlcnJvcic7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTiByZXNwb25zZSBmcm9tIHNlcnZlcicpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBUb2tlblR5cGUge1xuICBBTk9OWU1PVVMgPSAnYW5vbnltb3VzJyxcbiAgR1VFU1QgPSAnZ3Vlc3QnLFxuICBQVUJMSUMgPSAncHVibGljJyxcbiAgQ1VTVE9NID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5QYWlyIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVG9rZW5zTWFwID0gUmVjb3JkPFRva2VuVHlwZSwgVG9rZW5QYWlyPjtcblxuZXhwb3J0IGVudW0gQXV0aENvb2tpZSB7XG4gIFBVQkxJQ19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1pZC10b2tlbicsXG4gIFBVQkxJQ19SRUZSRVNIX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLXJlZnJlc2gtdG9rZW4nLFxuICBBTk9OWU1PVVNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1hbm9ueW1vdXMtaWQtdG9rZW4nLFxuICBHVUVTVF9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWd1ZXN0LWlkLXRva2VuJyxcbiAgQ1VTVE9NX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtY3VzdG9tLWlkLXRva2VuJyxcbiAgQ1VTVE9NX1VTRVIgPSAnYXJlbmEtYXV0aC1jdXN0b20tdXNlcicsXG59XG4iLCJpbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5cbmV4cG9ydCBjb25zdCBUT0tFTl9VUERBVEVEX0VWRU5UID0gJ2FyZW5hLWF1dGgtdG9rZW4tdXBkYXRlZCc7XG5cbmludGVyZmFjZSBUb2tlbkV2ZW50UGFyYW1zIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChcbiAgdHlwZTogVG9rZW5UeXBlLFxuICBwYXJhbXM6IFRva2VuRXZlbnRQYXJhbXNcbikge1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgIG5ldyBDdXN0b21FdmVudChUT0tFTl9VUERBVEVEX0VWRU5ULCB7XG4gICAgICBkZXRhaWw6IHsgLi4ucGFyYW1zLCB0eXBlIH0sXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llLCBUb2tlbnNNYXAsIFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuU3RvcmUge1xuICB0b2tlbnM6IFRva2Vuc01hcDtcbiAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICBvcHRpb25zPzogQXJyYXk8VG9rZW5UeXBlPlxuICApID0+IHsgdHlwZTogVG9rZW5UeXBlOyBpZFRva2VuOiBzdHJpbmcgfSB8IG51bGw7XG4gIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICApID0+IHZvaWQ7XG4gIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBkZWZhdWx0VG9rZW5zOiBUb2tlbnNNYXAgPSB7XG4gIHB1YmxpYzoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKSB8fCBudWxsLFxuICAgIHJlZnJlc2hUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgYW5vbnltb3VzOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGd1ZXN0OiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgY3VzdG9tOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdXNlVG9rZW5TdG9yZSA9IGNyZWF0ZTxUb2tlblN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpZFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiZcbiAgICAgICAgcmVmcmVzaFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLnJlZnJlc2hUb2tlblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAzMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbiB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTiwgaWRUb2tlbik7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzogeyBpZFRva2VuOiBudWxsLCByZWZyZXNoVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywge1xuICAgICAgICAgIGlkVG9rZW46IG51bGwsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogZGVmYXVsdFRva2VucyxcblxuICAgICAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8uaWRUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgICAgICBvcHRpb25zID0gW1Rva2VuVHlwZS5QVUJMSUMsIFRva2VuVHlwZS5HVUVTVCwgVG9rZW5UeXBlLkFOT05ZTU9VU11cbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkNVU1RPTSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkNVU1RPTSxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLlBVQkxJQykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLlBVQkxJQyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuR1VFU1QpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5HVUVTVCxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gJiZcbiAgICAgICAgICBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5BTk9OWU1PVVMpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQU5PTllNT1VTLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICAgKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSlcbik7XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgVE9LRU5fVVBEQVRFRF9FVkVOVCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5VcGRhdGVFdmVudCB7XG4gIGRldGFpbDoge1xuICAgIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gICAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlOiBUb2tlblR5cGU7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5FdmVudExpc3RlbmVyKCkge1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZVB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVDdXN0b21Ub2tlblxuICApO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyR3Vlc3RUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnNcbiAgKTtcblxuICBjb25zdCBldmVudFNvdXJjZVJlZiA9IHVzZVJlZjxzdHJpbmc+KFxuICAgIGB3aWRnZXQtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVG9rZW5VcGRhdGUgPSAoXG4gICAgICBldmVudDogQ3VzdG9tRXZlbnQ8VG9rZW5VcGRhdGVFdmVudFsnZGV0YWlsJ10+XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHlwZSwgc291cmNlIH0gPSBldmVudC5kZXRhaWw7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IGV2ZW50U291cmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuUFVCTElDOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnJlc2ggdG9rZW4gaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyB0b2tlbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5BTk9OWU1PVVM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckFub255bW91c1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5HVUVTVDpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyR3Vlc3RUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQ1VTVE9NOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgKTtcbiAgICB9O1xuICB9LCBbXG4gICAgdXBkYXRlUHVibGljVG9rZW5zLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuLFxuICAgIGNsZWFyVG9rZW5zLFxuICAgIGNsZWFyUHVibGljVG9rZW5zLFxuICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zLFxuICAgIGNsZWFyR3Vlc3RUb2tlbnMsXG4gICAgY2xlYXJDdXN0b21Ub2tlbnMsXG4gIF0pO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRTb3VyY2U6IGV2ZW50U291cmNlUmVmLmN1cnJlbnQsXG4gIH07XG59XG4iLCJpbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IHVzZVRva2VuRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vdXNlLXRva2VuLWV2ZW50LWxpc3RlbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VucygpIHtcbiAgY29uc3QgZ2V0VG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFRva2VuKTtcbiAgY29uc3QgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuZ2V0TW9zdFByaXZpbGVnZWRUb2tlblxuICApO1xuICBjb25zdCBnZXRSZWZyZXNoVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFJlZnJlc2hUb2tlbik7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlUHVibGljVG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVHdWVzdFRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVDdXN0b21Ub2tlbik7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhckN1c3RvbVRva2Vucyk7XG5cbiAgY29uc3QgeyBldmVudFNvdXJjZSB9ID0gdXNlVG9rZW5FdmVudExpc3RlbmVyKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRUb2tlbixcbiAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuLFxuICAgIGdldFJlZnJlc2hUb2tlbixcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyVG9rZW5zOiAoKSA9PiBjbGVhclRva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IGNsZWFyUHVibGljVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhckN1c3RvbVRva2VuczogKCkgPT4gY2xlYXJDdXN0b21Ub2tlbnMoZXZlbnRTb3VyY2UpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5WYWx1ZShcbiAgdHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJ1xuKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8uaWRUb2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4pO1xufVxuIiwidHlwZSBOdWxsYWJsZTxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NXaWRnZXRUeXBlIHtcbiAgQXZhdGFyUHJvZmlsZSA9ICdhdmF0YXItcHJvZmlsZScsXG4gIEF2YXRhckNoYXQgPSAnYXZhdGFyLWNoYXQnLFxuICBDb21tZW50cyA9ICdjb21tZW50cycsXG4gIEdsb2JhbFByb2ZpbGUgPSAnZ2xvYmFsLXByb2ZpbGUnLFxuICBHcm91cENoYXQgPSAnZ3JvdXAtY2hhdCcsXG4gIFBvbGxzID0gJ3BvbGxzJyxcbiAgVW5pdmVyc2FsU25pcHBldCA9ICd1bml2ZXJzYWwtc25pcHBldCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrT3B0aW9ucyA9IHtcbiAgd2lkZ2V0SWQ6IHN0cmluZyB8IG51bGw7XG4gIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGU7XG4gIHNpdGVJZDogc3RyaW5nO1xuICByc1dyaXRlS2V5OiBzdHJpbmc7XG4gIHJzRGF0YVBsYW5lVXJsOiBzdHJpbmc7XG4gIHRyaWdnZXI6IHN0cmluZztcbn07XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc0V2ZW50IHtcbiAgQXV0aGVudGljYXRpb25Db21wbGV0ZWQgPSAnQXV0aGVudGljYXRpb24gQ29tcGxldGVkJyxcbiAgQXV0aGVudGljYXRpb25TdGFydGVkID0gJ0F1dGhlbnRpY2F0aW9uIFN0YXJ0ZWQnLFxuICBBdXRoZW50aWNhdGlvblZpZXdlZCA9ICdBdXRoZW50aWNhdGlvbiBWaWV3ZWQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja1Byb3BzID0gTnVsbGFibGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UHJvcHMge1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgdXNlcklkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1ZGRlckNvbnRleHQge1xuICBjaGFubmVsOiAnd2ViJztcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIGxvY2FsZT86IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB0aW1lem9uZT86IHN0cmluZztcbiAgb3M/OiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICBwYWdlPzoge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICB9O1xuICBzY3JlZW4/OiB7XG4gICAgZGVuc2l0eT86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaW5uZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgaW5uZXJXaWR0aD86IG51bWJlcjtcbiAgfTtcbiAgY2FtcGFpZ24/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuIiwiaW1wb3J0IHsgUHVibGljUHJvZmlsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCwgc2VjdXJlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS11c2VyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2ZpbGVTZXJ2aWNlcygpIHtcbiAgY29uc3QgdG9rZW4gPSB1c2VUb2tlbihUb2tlblR5cGUuUFVCTElDKTtcbiAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljUHJvZmlsZSh1c2VySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFB1YmxpY1Byb2ZpbGU+IHtcbiAgICBjb25zdCBmaWVsZHMgPSAnYmlvLHBob3RvVVJMLGRpc3BsYXlOYW1lLGxvY2F0aW9uLGhhbmRsZSc7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vcHVibGljL3VzZXJzLyR7dXNlcklkfS9wcm9maWxlP2ZpZWxkcz0ke2ZpZWxkc31gO1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHVibGljUHJvZmlsZShcbiAgICBwYXJhbXM6IE9taXQ8UHVibGljUHJvZmlsZSwgJ21ldGFkYXRhJz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vbWUvcHJvZmlsZS9wZXJzb25hbGA7XG4gICAgYXdhaXQgc2VjdXJlZFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgICAgIH0sXG4gICAgICB0b2tlbjogdG9rZW4uaWRUb2tlbiEsXG4gICAgfSk7XG4gICAgcmVmcmVzaFB1YmxpY1Rva2Vucyh7IHJlZnJlc2hUb2tlbkFwaUtleTogY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleSB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFB1YmxpY1Byb2ZpbGUsXG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQge1xuICBVc2VyUHJvcHMsXG4gIEZpcmViYXNlVXNlcixcbiAgU3NvVXNlclByb3BzLFxuICBTc29WMkV4Y2hhbmdlUmVzcG9uc2UsXG59IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSAnand0LWRlY29kZSc7XG5pbXBvcnQgeyB0eXBlIFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3R5cGVzJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IEF1dGhDb29raWUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIFVzZXJTdG9yZSB7XG4gIHVzZXI6IFVzZXJQcm9wcyB8IG51bGw7XG4gIHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsO1xuICByZWZyZXNoZWRUb2tlbkxvYWRlZDogYm9vbGVhbjtcbiAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHZvaWQ7XG4gIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4gdm9pZDtcbiAgbG9nb3V0OiAoKSA9PiB2b2lkO1xuICByZWZyZXNoUHVibGljVG9rZW5zOiAoY29uZmlnOiB7XG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmc7XG4gIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGxvYWRTdG9yZWRVc2VyOiAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzc29WMkV4Y2hhbmdlOiAoXG4gICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICBqd3Q6IHN0cmluZyxcbiAgICBlbnY/OiBFbnZpcm9ubWVudFxuICApID0+IFByb21pc2U8U3NvVjJFeGNoYW5nZVJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJTdG9yZSA9IGNyZWF0ZTxVc2VyU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+ICh7XG4gICAgdXNlcjogbnVsbCxcbiAgICBwdWJsaWNQcm9maWxlOiBudWxsLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBmYWxzZSxcblxuICAgIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyB1c2VyIH0pO1xuICAgIH0sXG5cbiAgICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHB1YmxpY1Byb2ZpbGUgfSk7XG4gICAgfSxcblxuICAgIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBqd3REZWNvZGU8RmlyZWJhc2VVc2VyPihpZFRva2VuKTtcbiAgICAgICAgY29uc3QgdXNlclByb3BzOiBVc2VyUHJvcHMgPSB7XG4gICAgICAgICAgdWlkOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IHVzZXIuc2FmZURpc3BsYXlOYW1lLFxuICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICAgIHBob3RvVVJMOiB1c2VyLnNhZmVQaG90b1VSTCxcbiAgICAgICAgICBoYW5kbGU6IHVzZXIuaGFuZGxlLFxuICAgICAgICB9O1xuICAgICAgICBzZXQoeyB1c2VyOiB1c2VyUHJvcHMgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9nb3V0OiAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgc2V0KHsgdXNlcjogbnVsbCB9KTtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2FyZW5hLWNvbW1lbnRzLWxvZ291dCcpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWZyZXNoUHVibGljVG9rZW5zOiBhc3luYyAoY29uZmlnOiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWZyZXNoIHRva2VuIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVmaXggPSAnaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbS92MS90b2tlbj9rZXk9JztcbiAgICAgICAgY29uc3QgYXBpS2V5ID0gY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleTtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJlZml4fSR7YXBpS2V5fWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgIHNldFVzZXJCeVRva2VuSWQoZGF0YS5pZF90b2tlbik7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVQdWJsaWNUb2tlbnMoZGF0YS5pZF90b2tlbiwgZGF0YS5yZWZyZXNoX3Rva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICBjb25zdCB7IGxvZ291dCB9ID0gZ2V0KCk7XG4gICAgICAgIGxvZ291dCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkU3RvcmVkVXNlcjogYXN5bmMgKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgcHVibGljSWRUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IHB1YmxpY1JlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tSWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbVVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgaWYgKCEhY3VzdG9tSWRUb2tlbiAmJiAhIWN1c3RvbVVzZXIpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXNlciA9IEpTT04ucGFyc2UoY3VzdG9tVXNlcik7XG5cbiAgICAgICAgc2V0KHsgdXNlcjogcGFyc2VkVXNlciB9KTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKGN1c3RvbUlkVG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHB1YmxpY0lkVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICAgIHNldFVzZXJCeVRva2VuSWQocHVibGljSWRUb2tlbik7XG4gICAgICAgIH0gZWxzZSBpZiAocHVibGljUmVmcmVzaFRva2VuICYmIGNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gZ2V0KCk7XG4gICAgICAgICAgYXdhaXQgcmVmcmVzaFB1YmxpY1Rva2Vucyhjb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldCh7IHJlZnJlc2hlZFRva2VuTG9hZGVkOiB0cnVlIH0pO1xuICAgIH0sXG5cbiAgICBzc29WMkV4Y2hhbmdlOiBhc3luYyAoXG4gICAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgICAgand0OiBzdHJpbmcsXG4gICAgICBlbnY/OiBFbnZpcm9ubWVudFxuICAgICkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudiA/PyAncHJvZHVjdGlvbicpO1xuICAgICAgICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3Nzby9zb3VyY2VzLyR7c3NvU291cmNlSUR9L3VzZXJgO1xuICAgICAgICBjb25zdCByZXNwb25zZTogU3NvVjJFeGNoYW5nZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCwge1xuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2lnbmVkVXNlckRhdGE6IGp3dCB9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZFVzZXIgPSBqd3REZWNvZGU8U3NvVXNlclByb3BzPihyZXNwb25zZS50b2tlbik7XG5cbiAgICAgICAgICBjb25zdCB7IHNldFVzZXIsIHNldFB1YmxpY1Byb2ZpbGUgfSA9IGdldCgpO1xuXG4gICAgICAgICAgc2V0VXNlcih7XG4gICAgICAgICAgICB1aWQ6IGRlY29kZWRVc2VyPy5zdWIsXG4gICAgICAgICAgICBlbWFpbDogZGVjb2RlZFVzZXI/LmVtYWlsLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzZXRQdWJsaWNQcm9maWxlKHtcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKHJlc3BvbnNlLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTTyBWMiBFeGNoYW5nZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICB9KSlcbik7XG4iLCJpbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy91c2VyLXN0b3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXIoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQdWJsaWNQcm9maWxlKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlckFjdGlvbnMoKSB7XG4gIGNvbnN0IHNldFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlcik7XG4gIGNvbnN0IHNldFB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0UHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IGxvZ291dCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2dvdXQpO1xuICBjb25zdCByZWZyZXNoUHVibGljVG9rZW5zID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBzZXRVc2VyQnlUb2tlbklkID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXJCeVRva2VuSWQpO1xuICBjb25zdCBsb2FkU3RvcmVkVXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2FkU3RvcmVkVXNlcik7XG4gIGNvbnN0IHNzb1YyRXhjaGFuZ2UgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc3NvVjJFeGNoYW5nZSk7XG4gIFxuXG4gIHJldHVybiB7XG4gICAgc2V0VXNlcixcbiAgICBzZXRQdWJsaWNQcm9maWxlLFxuICAgIGxvZ291dCxcbiAgICByZWZyZXNoUHVibGljVG9rZW5zLFxuICAgIHNldFVzZXJCeVRva2VuSWQsXG4gICAgbG9hZFN0b3JlZFVzZXIsXG4gICAgc3NvVjJFeGNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVwZGF0ZVByb2ZpbGUoKSB7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljUHJvZmlsZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJXaXRoUHJvZmlsZSgpIHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbiAgY29uc3QgcHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgcmVmcmVzaGVkVG9rZW5Mb2FkZWQgPSB1c2VVc2VyU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWRcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVzZXIsXG4gICAgcHVibGljUHJvZmlsZSxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZCxcbiAgfTtcbn1cblxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VVc2VyLCB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZU11dGF0aW9uIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlclByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpO1xuICBjb25zdCB7IHNldFB1YmxpY1Byb2ZpbGUsIGxvYWRTdG9yZWRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGdldFB1YmxpY1Byb2ZpbGU6IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgY29uc3QgeyBtdXRhdGVBc3luYzogZ2V0UHVibGljUHJvZmlsZSB9ID0gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlLFxuICB9KTtcblxuICBjb25zdCBsb2FkUHVibGljUHJvZmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAodXNlcj8udWlkKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHVibGljUHJvZmlsZSh1c2VyLnVpZCk7XG4gICAgICBzZXRQdWJsaWNQcm9maWxlKHByb2ZpbGUpO1xuICAgIH1cbiAgfSwgW3VzZXI/LnVpZCwgZ2V0UHVibGljUHJvZmlsZSwgc2V0UHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFB1YmxpY1Byb2ZpbGUoKTtcbiAgfSwgW2xvYWRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkU3RvcmVkVXNlcihjb25maWcpO1xuICB9LCBbY29uZmlnLCBsb2FkU3RvcmVkVXNlcl0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgQW5hbHl0aWNzRXZlbnQsXG4gIElkZW50aXR5UHJvcHMsXG4gIFJ1ZGRlckNvbnRleHQsXG4gIFRyYWNrUHJvcHMsXG59IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmltcG9ydCB7IHJlbW92ZVBhcmFtc0Zyb21VcmwgfSBmcm9tICcuLi91dGlscy91cmwnO1xuXG5jb25zdCBBTk9OWU1PVVNfSURfS0VZID0gJ2FyZW5hQW5vbnltb3VzSWQnO1xuXG5jb25zdCBMU19LRVlTID0ge1xuICBhbm9uOiAncnNfYW5vbnltb3VzX2lkJyxcbiAgaW5pdFJlZmVycmVyOiAncnNfaW5pdGlhbF9yZWZlcnJlcicsXG4gIGluaXREb21haW46ICdyc19pbml0aWFsX3JlZmVycmluZ19kb21haW4nLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yU2V0QW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmFub24pO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmFub24sIGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpOiB2b2lkIHtcbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikpIHtcbiAgICBjb25zdCByZWYgPSBkb2N1bWVudC5yZWZlcnJlciB8fCAnJGRpcmVjdCc7XG4gICAgY29uc3QgZG9tYWluID0gcmVmICYmIHJlZiAhPT0gJyRkaXJlY3QnID8gbmV3IFVSTChyZWYpLmhvc3RuYW1lIDogJyc7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIsIHJlZik7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluLCBkb21haW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2FtcGFpZ24odTogVVJMKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGtleXMgPSBbXG4gICAgJ3V0bV9zb3VyY2UnLFxuICAgICd1dG1fbWVkaXVtJyxcbiAgICAndXRtX2NhbXBhaWduJyxcbiAgICAndXRtX3Rlcm0nLFxuICAgICd1dG1fY29udGVudCcsXG4gIF07XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBrZXlzLmZvckVhY2goayA9PiB7XG4gICAgY29uc3QgdiA9IHUuc2VhcmNoUGFyYW1zLmdldChrKTtcbiAgICBpZiAodikgb3V0W2tdID0gdjtcbiAgfSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdXQpLmxlbmd0aCA/IG91dCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUnVkZGVyQ29udGV4dCgpOiBSdWRkZXJDb250ZXh0IHtcbiAgY29uc3QgdyA9IHdpbmRvdztcbiAgY29uc3QgZCA9IGRvY3VtZW50O1xuICBjb25zdCBzID0gd2luZG93LnNjcmVlbjtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3LmxvY2F0aW9uLmhyZWYpO1xuXG4gIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk7XG5cbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJlciA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpIHx8ICckZGlyZWN0JztcbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXREb21haW4pIHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogJ3dlYicsXG4gICAgYW5vbnltb3VzSWQ6IGdldE9yU2V0QW5vbnltb3VzSWQoKSxcbiAgICBsb2NhbGU6IG5hdmlnYXRvci5sYW5ndWFnZSxcbiAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICBvczogeyBuYW1lOiBuYXZpZ2F0b3IucGxhdGZvcm0sIHZlcnNpb246IHVuZGVmaW5lZCB9LFxuICAgIHBhZ2U6IHtcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHJlZmVycmVyOiBkLnJlZmVycmVyIHx8ICckZGlyZWN0JyxcbiAgICAgIHJlZmVycmluZ19kb21haW46IGQucmVmZXJyZXIgPyBuZXcgVVJMKGQucmVmZXJyZXIpLmhvc3RuYW1lIDogJycsXG4gICAgICBzZWFyY2g6IHVybC5zZWFyY2gsXG4gICAgICB0aXRsZTogZC50aXRsZSxcbiAgICAgIHVybDogdXJsLnRvU3RyaW5nKCksXG4gICAgICBpbml0aWFsX3JlZmVycmVyLFxuICAgICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluLFxuICAgIH0sXG4gICAgc2NyZWVuOiB7XG4gICAgICBkZW5zaXR5OiAody5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpID8/IDEsXG4gICAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHMud2lkdGgsXG4gICAgICBpbm5lckhlaWdodDogdy5pbm5lckhlaWdodCxcbiAgICAgIGlubmVyV2lkdGg6IHcuaW5uZXJXaWR0aCxcbiAgICB9LFxuICAgIGNhbXBhaWduOiBwYXJzZUNhbXBhaWduKHVybCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldElkZW50aWZpZXIob3B0aW9uczogSWRlbnRpdHlQcm9wcyA9IHt9KTogSWRlbnRpdHlQcm9wcyB7XG4gIGNvbnN0IGlkZW50aWZpZXI6IElkZW50aXR5UHJvcHMgPSB7fTtcblxuICBpZiAob3B0aW9ucy51c2VySWQpIHtcbiAgICBpZGVudGlmaWVyLnVzZXJJZCA9IG9wdGlvbnMudXNlcklkO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRBbm9ueW1vdXNJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50QW5vbnltb3VzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBTk9OWU1PVVNfSURfS0VZKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhY2Nlc3MgbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG9wdGlvbnMuYW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG9wdGlvbnMuYW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGN1cnJlbnRBbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBjdXJyZW50QW5vbnltb3VzSWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmV3QW5vbnltb3VzSWQgPSBnZW5lcmF0ZVVVSUQoKTtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gbmV3QW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG5ld0Fub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBuZXcgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q2Fub25pY2FsVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdsaW5rW3JlbD1cImNhbm9uaWNhbFwiXSdcbiAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gIGNvbnN0IHJhd1VybCA9IGNhbm9uaWNhbE1ldGE/LmhyZWYgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHJldHVybiByZW1vdmVQYXJhbXNGcm9tVXJsKHJhd1VybCk7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhcbiAgd2lkZ2V0VHlwZTogc3RyaW5nLFxuICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbikge1xuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHdpZGdldF90eXBlOiB3aWRnZXRUeXBlLFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIGRvbWFpbjogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgdGl0bGU6IHdpbmRvdy5kb2N1bWVudC50aXRsZSxcbiAgICAgIGNhbm9uaWNhbF91cmw6IGdldENhbm9uaWNhbFVybCgpLFxuICAgICAgc25pcHBldF9pZDogd2luZG93Ll9fQVJFTkFfXz8uc25pcHBldElkIHx8IG51bGwsXG4gICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgIH0sXG4gICAgY29udGV4dDogYnVpbGRSdWRkZXJDb250ZXh0KCksXG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgaW50ZWdyYXRpb25zOiB7IEFsbDogdHJ1ZSB9LFxuICAgIC4uLmdldElkZW50aWZpZXIoaWRlbnRpdHkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXk6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgQXV0aG9yaXphdGlvbjogJ0Jhc2ljICcgKyBidG9hKGAke3dyaXRlS2V5fTpgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljcyh3cml0ZUtleTogc3RyaW5nLCBkYXRhUGxhbmVVcmw6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHBhZ2U6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvcGFnZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0eXBlOiAncGFnZScsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCBwYWdlIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0cmFjazogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS90cmFja2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICB0eXBlOiAndHJhY2snLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgdHJhY2sgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhcmFtc0Zyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIHVybE9iai5zZWFyY2ggPSAnJztcblxuICAgIHJldHVybiB1cmxPYmouaHJlZjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhcmluZyBzZWFyY2ggcGFyYW1zIGZyb20gVVJMOicsIGVycm9yKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG4iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEFuYWx5dGljcyB9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCwgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYWNrKHRyYWNrT3B0aW9ucz86IFRyYWNrT3B0aW9ucykge1xuICBjb25zdCB0cmFjayA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHVzZXJJZD86IHN0cmluZyxcbiAgICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0cmFja09wdGlvbnMpIHJldHVybjtcblxuICAgICAgY29uc3QgYW5hbHl0aWNzID0gZ2V0QW5hbHl0aWNzKFxuICAgICAgICB0cmFja09wdGlvbnMucnNXcml0ZUtleSxcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzRGF0YVBsYW5lVXJsXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0cmFja1Byb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge1xuICAgICAgICBzaXRlX2lkOiB0cmFja09wdGlvbnMuc2l0ZUlkLFxuICAgICAgICB3aWRnZXRfaWQ6IHRyYWNrT3B0aW9ucy53aWRnZXRJZCxcbiAgICAgICAgdHJpZ2dlcjogdHJhY2tPcHRpb25zLnRyaWdnZXIsXG4gICAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgICB9O1xuXG4gICAgICBhbmFseXRpY3MudHJhY2soXG4gICAgICAgIHRyYWNrT3B0aW9ucy53aWRnZXRUeXBlLFxuICAgICAgICBldmVudCxcbiAgICAgICAgdHJhY2tQcm9wZXJ0aWVzLFxuICAgICAgICB1c2VySWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0sXG4gICAgW3RyYWNrT3B0aW9uc11cbiAgKTtcblxuICByZXR1cm4gdHJhY2s7XG59XG4iLCJpbXBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi4vY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VucyB9IGZyb20gJy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgdXNlVHJhY2sgfSBmcm9tICcuLi9ob29rcy91c2UtdHJhY2snO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBdXRoRGlhbG9nKCkge1xuICBjb25zdCB7XG4gICAgYXBwTmFtZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICB0cmFja09wdGlvbnMsXG4gICAgaXNPcGVuLFxuICAgIGNsb3NlRGlhbG9nLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfSA9IHVzZUF1dGhEaWFsb2coKTtcbiAgY29uc3QgZnJhbWVBcHBOYW1lID0gYXBwTmFtZSB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IGZyYW1lQXBwRGVzY3JpcHRpb24gPSBhcHBEZXNjcmlwdGlvbiB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IHsgc2V0VXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNUb2tlbnMgfSA9IHVzZVRva2VucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IGxhbmd1YWdlID0gJ2VuJztcbiAgY29uc3QgdHJhY2sgPSB1c2VUcmFjayh0cmFja09wdGlvbnMpO1xuXG4gIGxldCBpZnJhbWVVcmwgPSBgJHtjb25maWcuYXV0aElmcmFtZVVybH0vP2FwcC1uYW1lPSR7ZnJhbWVBcHBOYW1lfSZhcHAtZGVzY3JpcHRpb249JHtmcmFtZUFwcERlc2NyaXB0aW9ufWA7XG4gIGlmIChsYW5ndWFnZSkge1xuICAgIGlmcmFtZVVybCArPSBgJmxhbmd1YWdlPSR7bGFuZ3VhZ2V9YDtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnNvdXJjZSAhPT0gJ2FyZW5hLWF1dGhlbnRpY2F0aW9uJykgcmV0dXJuO1xuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXZpZXdlZCcpIHtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25WaWV3ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1zdGFydGVkJykge1xuICAgICAgICBjb25zdCB7IGF1dGhUeXBlIH0gPSBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uU3RhcnRlZCwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgYXV0aFR5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tY29tcGxldGVkJykge1xuICAgICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdXNlciwgYXV0aFR5cGUsIGlzU2lnbnVwIH0gPVxuICAgICAgICAgIG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcblxuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgYnV0IHVzZXIgZGF0YSBpcyBtaXNzaW5nJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25Db21wbGV0ZWQsIHVzZXIudWlkLCB7XG4gICAgICAgICAgaXNfc2lnbnVwOiBpc1NpZ251cCxcbiAgICAgICAgICBhdXRoX3R5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgb25BdXRoQ29tcGxldGVkPy4odXNlcik7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICBzZXRVc2VyKHVzZXIpO1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgfSwgW3NldFVzZXIsIHVwZGF0ZVB1YmxpY1Rva2Vucywgb25BdXRoQ29tcGxldGVkLCB0cmFjaywgY2xvc2VEaWFsb2ddKTtcblxuICByZXR1cm4gaXNPcGVuID8gKFxuICAgIDxpZnJhbWVcbiAgICAgIHNyYz17aWZyYW1lVXJsfVxuICAgICAgdGl0bGU9XCJBcmVuYSBBdXRoZW50aWNhdGlvblwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICB6SW5kZXg6IDk5OTk5OTk5OTksXG4gICAgICB9fVxuICAgID48L2lmcmFtZT5cbiAgKSA6IG51bGw7XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VBdXRoU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzJztcbmltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFub255bW91c1Rva2VuUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgdG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgeyBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIH0gPSB1c2VBdXRoU2VydmljZXMoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCkudGhlbigodG9rZW46IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4odG9rZW4uYWNjZXNzX3Rva2VuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW1xuICAgIHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbixcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICBdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoU2VydmljZXMoKSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgaWRlbnRpdHlVcmwgPSBjb25maWcuaWRlbnRpdHlTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKTogUHJvbWlzZTxFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7aWRlbnRpdHlVcmx9L2Fub255bW91cy10b2tlbmA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgQXV0aERpYWxvZ1Byb3ZpZGVyIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBVc2VyUHJvdmlkZXIgfSBmcm9tICcuL3VzZXItcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29uZmlnUHJvdmlkZXIgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgQXV0aERpYWxvZyBmcm9tICcuLi9kaWFsb2cnO1xuaW1wb3J0IHsgQW5vbnltb3VzVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGhQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBxdWVyeUNsaWVudCxcbiAgZW52aXJvbm1lbnQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIHF1ZXJ5Q2xpZW50PzogUXVlcnlDbGllbnQ7XG4gIGVudmlyb25tZW50PzogJ3Byb2R1Y3Rpb24nIHwgJ2RldmVsb3BtZW50Jztcbn0pIHtcbiAgcXVlcnlDbGllbnQgPSBxdWVyeUNsaWVudCB8fCBuZXcgUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gKFxuICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgPENvbmZpZ1Byb3ZpZGVyIGVudmlyb25tZW50PXtlbnZpcm9ubWVudH0+XG4gICAgICAgIDxVc2VyUHJvdmlkZXI+XG4gICAgICAgICAgPEF1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgICAgIDxBbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgIDxBdXRoRGlhbG9nIC8+XG4gICAgICAgICAgICA8L0Fub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgPC9BdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgIDwvVXNlclByb3ZpZGVyPlxuICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICk7XG59XG5cbmV4cG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbiJdLCJuYW1lcyI6WyJBdXRoRGlhbG9nQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJBdXRoRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsImlzT3BlbiIsInNldElzT3BlbiIsInVzZVN0YXRlIiwiYXBwTmFtZSIsInNldEFwcE5hbWUiLCJhcHBEZXNjcmlwdGlvbiIsInNldEFwcERlc2NyaXB0aW9uIiwib25BdXRoQ29tcGxldGVkIiwic2V0T25BdXRoQ29tcGxldGVkIiwidHJhY2tPcHRpb25zIiwic2V0VHJhY2tPcHRpb25zIiwiX2pzeCIsIlByb3ZpZGVyIiwidmFsdWUiLCJvcGVuRGlhbG9nIiwiY2xvc2VEaWFsb2ciLCJvbk9wZW5DaGFuZ2UiLCJvcGVuIiwidXNlQXV0aERpYWxvZyIsImNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRXJyb3IiLCJnZXRDb25maWciLCJlbnZpcm9ubWVudCIsImlzRGV2IiwicHJvZmlsZVNlcnZpY2VVcmwiLCJpZGVudGl0eVNlcnZpY2VVcmwiLCJyZWZyZXNoVG9rZW5BcGlLZXkiLCJhdXRoSWZyYW1lVXJsIiwiZGVidWciLCJDb25maWdDb250ZXh0IiwiQ29uZmlnUHJvdmlkZXIiLCJjb25maWciLCJ1c2VDb25maWciLCJkZWZhdWx0SGVhZGVycyIsImFzeW5jIiwicmVxdWVzdCIsIm1ldGhvZCIsInVybCIsIm9wdGlvbnMiLCJyZXNwb25zZSIsImZldGNoIiwiaGVhZGVycyIsIm9rIiwic3RhdHVzVGV4dCIsImpzb24iLCJUb2tlblR5cGUiLCJBdXRoQ29va2llIiwiVE9LRU5fVVBEQVRFRF9FVkVOVCIsImRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQiLCJ0eXBlIiwicGFyYW1zIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkZWZhdWx0VG9rZW5zIiwicHVibGljIiwiaWRUb2tlbiIsIkNvb2tpZXMiLCJnZXQiLCJQVUJMSUNfSURfVE9LRU4iLCJyZWZyZXNoVG9rZW4iLCJQVUJMSUNfUkVGUkVTSF9UT0tFTiIsImFub255bW91cyIsIkFOT05ZTU9VU19JRF9UT0tFTiIsImd1ZXN0IiwiR1VFU1RfSURfVE9LRU4iLCJjdXN0b20iLCJDVVNUT01fSURfVE9LRU4iLCJ1c2VUb2tlblN0b3JlIiwiY3JlYXRlIiwic3Vic2NyaWJlV2l0aFNlbGVjdG9yIiwic2V0IiwidXBkYXRlUHVibGljVG9rZW5zSGVscGVyIiwic291cmNlIiwidG9rZW5zIiwic3RhdGUiLCJleHBpcmVzIiwiUFVCTElDIiwidXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIiLCJBTk9OWU1PVVMiLCJ1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciIsIkdVRVNUIiwidXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIiLCJDVVNUT00iLCJjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciIsInJlbW92ZSIsImNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyIiwiY2xlYXJHdWVzdFRva2Vuc0hlbHBlciIsImNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyIiwibG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsIkNVU1RPTV9VU0VSIiwiZ2V0VG9rZW4iLCJnZXRNb3N0UHJpdmlsZWdlZFRva2VuIiwiaW5jbHVkZXMiLCJnZXRSZWZyZXNoVG9rZW4iLCJ1cGRhdGVQdWJsaWNUb2tlbnMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbiIsInVwZGF0ZUd1ZXN0VG9rZW5zIiwidXBkYXRlQ3VzdG9tVG9rZW4iLCJjbGVhclRva2VucyIsImNsZWFyUHVibGljVG9rZW5zIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJjbGVhckd1ZXN0VG9rZW5zIiwiY2xlYXJDdXN0b21Ub2tlbnMiLCJzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnMiLCJzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbiIsInNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zIiwic2lsZW50VXBkYXRlQ3VzdG9tVG9rZW4iLCJzaWxlbnRDbGVhclB1YmxpY1Rva2VucyIsInNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zIiwic2lsZW50Q2xlYXJHdWVzdFRva2VucyIsInNpbGVudENsZWFyQ3VzdG9tVG9rZW5zIiwidXNlVG9rZW5FdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2VSZWYiLCJ1c2VSZWYiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHIiLCJ1c2VFZmZlY3QiLCJoYW5kbGVUb2tlblVwZGF0ZSIsImV2ZW50IiwiY3VycmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2UiLCJ1c2VUb2tlbnMiLCJ1c2VUb2tlbiIsInVzZVRva2VuVmFsdWUiLCJ1c2VSZWZyZXNoVG9rZW4iLCJBbmFseXRpY3NXaWRnZXRUeXBlIiwiQW5hbHl0aWNzRXZlbnQiLCJ1c2VQcm9maWxlU2VydmljZXMiLCJ0b2tlbiIsInJlZnJlc2hQdWJsaWNUb2tlbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInByb2ZpbGVVcmwiLCJnZXRQdWJsaWNQcm9maWxlIiwidXNlcklkIiwidXBkYXRlUHVibGljUHJvZmlsZSIsIkF1dGhvcml6YXRpb24iLCJwYXlsb2FkIiwidGV4dCIsInN0YXR1cyIsImVycm9ycyIsIkpTT04iLCJwYXJzZSIsImNvbnRlbnRUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwic2VjdXJlZFJlcXVlc3QiLCJib2R5Iiwic3RyaW5naWZ5IiwidXNlVXNlclN0b3JlIiwidXNlciIsInB1YmxpY1Byb2ZpbGUiLCJyZWZyZXNoZWRUb2tlbkxvYWRlZCIsInNldFVzZXIiLCJzZXRQdWJsaWNQcm9maWxlIiwic2V0VXNlckJ5VG9rZW5JZCIsImp3dERlY29kZSIsInVzZXJQcm9wcyIsInVpZCIsInVzZXJfaWQiLCJkaXNwbGF5TmFtZSIsInNhZmVEaXNwbGF5TmFtZSIsImVtYWlsIiwicGhvdG9VUkwiLCJzYWZlUGhvdG9VUkwiLCJoYW5kbGUiLCJsb2dvdXQiLCJ0b2tlblN0b3JlIiwiZ2V0U3RhdGUiLCJFdmVudCIsIlVSTFNlYXJjaFBhcmFtcyIsInJlZnJlc2hfdG9rZW4iLCJncmFudF90eXBlIiwiZGF0YSIsImlkX3Rva2VuIiwibG9hZFN0b3JlZFVzZXIiLCJwdWJsaWNJZFRva2VuIiwicHVibGljUmVmcmVzaFRva2VuIiwiY3VzdG9tSWRUb2tlbiIsImdldEl0ZW0iLCJjdXN0b21Vc2VyIiwicGFyc2VkVXNlciIsInNzb1YyRXhjaGFuZ2UiLCJzc29Tb3VyY2VJRCIsImp3dCIsImVudiIsInNpZ25lZFVzZXJEYXRhIiwiZGVjb2RlZFVzZXIiLCJzdWIiLCJ1c2VVc2VyIiwidXNlUHVibGljUHJvZmlsZSIsInVzZVJlZnJlc2hlZFRva2VuTG9hZGVkIiwidXNlVXBkYXRlUHJvZmlsZSIsInVzZVVzZXJXaXRoUHJvZmlsZSIsIlVzZXJQcm92aWRlciIsImdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIiwibXV0YXRlQXN5bmMiLCJ1c2VNdXRhdGlvbiIsIm11dGF0aW9uRm4iLCJsb2FkUHVibGljUHJvZmlsZSIsInVzZUNhbGxiYWNrIiwicHJvZmlsZSIsIkFOT05ZTU9VU19JRF9LRVkiLCJMU19LRVlTIiwiZ2V0T3JTZXRBbm9ueW1vdXNJZCIsImV4aXN0aW5nIiwiaWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic2V0SXRlbSIsInBhcnNlQ2FtcGFpZ24iLCJ1Iiwib3V0IiwiZm9yRWFjaCIsImsiLCJ2Iiwic2VhcmNoUGFyYW1zIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImJ1aWxkUnVkZGVyQ29udGV4dCIsInciLCJ3aW5kb3ciLCJkIiwicyIsInNjcmVlbiIsIlVSTCIsImxvY2F0aW9uIiwiaHJlZiIsInJlZiIsInJlZmVycmVyIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJyZW1lbWJlckluaXRpYWxSZWZlcnJlciIsImluaXRpYWxfcmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmluZ19kb21haW4iLCJjaGFubmVsIiwiYW5vbnltb3VzSWQiLCJsb2NhbGUiLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZSIsInVzZXJBZ2VudCIsInRpbWV6b25lIiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwicmVzb2x2ZWRPcHRpb25zIiwidGltZVpvbmUiLCJvcyIsIm5hbWUiLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJwYWdlIiwicGF0aCIsInBhdGhuYW1lIiwicmVmZXJyaW5nX2RvbWFpbiIsInNlYXJjaCIsInRpdGxlIiwiZGVuc2l0eSIsImRldmljZVBpeGVsUmF0aW8iLCJoZWlnaHQiLCJ3aWR0aCIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsImNhbXBhaWduIiwiZ2V0SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJjdXJyZW50QW5vbnltb3VzSWQiLCJ3YXJuIiwibmV3QW5vbnltb3VzSWQiLCJyZXBsYWNlIiwiYyIsInIiLCJnZXRDYW5vbmljYWxVcmwiLCJjYW5vbmljYWxNZXRhIiwicXVlcnlTZWxlY3RvciIsInVybE9iaiIsInJlbW92ZVBhcmFtc0Zyb21VcmwiLCJnZXRFdmVudFByb3BlcnRpZXMiLCJ3aWRnZXRUeXBlIiwicHJvcGVydGllcyIsImlkZW50aXR5Iiwid2lkZ2V0X3R5cGUiLCJjYW5vbmljYWxfdXJsIiwic25pcHBldF9pZCIsIl9fQVJFTkFfXyIsInNuaXBwZXRJZCIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImludGVncmF0aW9ucyIsIkFsbCIsImdldEV2ZW50SGVhZGVycyIsIndyaXRlS2V5IiwiYnRvYSIsInVzZVRyYWNrIiwiYW5hbHl0aWNzIiwicnNXcml0ZUtleSIsImRhdGFQbGFuZVVybCIsInJzRGF0YVBsYW5lVXJsIiwidHJhY2siLCJ0cmFja1Byb3BlcnRpZXMiLCJzaXRlX2lkIiwic2l0ZUlkIiwid2lkZ2V0X2lkIiwid2lkZ2V0SWQiLCJ0cmlnZ2VyIiwiQXV0aERpYWxvZyIsImZyYW1lQXBwTmFtZSIsImZyYW1lQXBwRGVzY3JpcHRpb24iLCJpZnJhbWVVcmwiLCJoYW5kbGVyIiwibWVzc2FnZSIsImF1dGhUeXBlIiwiQXV0aGVudGljYXRpb25TdGFydGVkIiwiaXNTaWdudXAiLCJBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCIsImlzX3NpZ251cCIsImF1dGhfdHlwZSIsIkF1dGhlbnRpY2F0aW9uVmlld2VkIiwic3JjIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ6SW5kZXgiLCJBbm9ueW1vdXNUb2tlblByb3ZpZGVyIiwiZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiIsImlkZW50aXR5VXJsIiwidXNlQXV0aFNlcnZpY2VzIiwidGhlbiIsImFjY2Vzc190b2tlbiIsIkF1dGhQcm92aWRlciIsInF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudFByb3ZpZGVyIiwiY2xpZW50IiwiX2pzeHMiXSwibWFwcGluZ3MiOiI0WkFlQSxNQUFNQSxFQUFvQkMsT0FDeEJDLEdBVVdDLEVBQXFCLEVBQUdDLGVBQ25DLE1BQU9DLEVBQVFDLEdBQWFDLEdBQVMsSUFDOUJDLEVBQVNDLEdBQWNGLE9BQTZCTCxJQUNwRFEsRUFBZ0JDLEdBQXFCSixPQUMxQ0wsSUFFS1Us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
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useRef as i,useEffect as s,useCallback as a}from"react";import{useMutation as u,QueryClient as c,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as k}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as m}from"jwt-decode";const T=n(void 0),h=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,u]=r(void 0),[c,l]=r(void 0),[d,k]=r(void 0),[p,m]=r(void 0);return e(T.Provider,{value:{isOpen:n,appName:i,language:p,appDescription:a,trackOptions:d,onAuthCompleted:c,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),k(e),s(t),m(n),u(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},f=()=>{const e=o(T);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},g=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},y=n(void 0),U=({children:t,environment:n="development"})=>{const o=g(n);return e(y.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(y);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},v={"Content-Type":"application/json"};async function I(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var w,_;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(w||(w={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const E={public:{idToken:p.get(_.PUBLIC_ID_TOKEN)||null,refreshToken:p.get(_.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:p.get(_.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:p.get(_.GUEST_ID_TOKEN)||null},custom:{idToken:p.get(_.CUSTOM_ID_TOKEN)||null}},C=d()(k((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),p.set(_.PUBLIC_ID_TOKEN,n,{expires:1/24}),p.set(_.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&P(w.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),p.set(_.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&P(w.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),p.set(_.GUEST_ID_TOKEN,n,{expires:1/24}),o&&P(w.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),p.set(_.CUSTOM_ID_TOKEN,n),o&&P(w.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{p.remove(_.PUBLIC_ID_TOKEN),p.remove(_.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&P(w.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(_.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(w.ANONYMOUS,{idToken:null,source:n})},u=(t=!0,n)=>{p.remove(_.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(w.GUEST,{idToken:null,source:n})},c=(t=!0,n)=>{p.remove(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(w.CUSTOM,{idToken:null,source:n})};return{tokens:E,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[w.PUBLIC,w.GUEST,w.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(w.CUSTOM)?{type:w.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(w.PUBLIC)?{type:w.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(w.GUEST)?{type:w.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(w.ANONYMOUS)?{type:w.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),u(!0,e),c(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{u(!0,e)},clearCustomTokens:e=>{c(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{u(!1)},silentClearCustomTokens:()=>{c(!1)}}}));function N(){const e=C(e=>e.silentUpdatePublicTokens),t=C(e=>e.silentUpdateAnonymousToken),n=C(e=>e.silentUpdateGuestTokens),o=C(e=>e.silentUpdateCustomToken),r=C(e=>e.clearTokens),a=C(e=>e.silentClearPublicTokens),u=C(e=>e.silentClearAnonymousTokens),c=C(e=>e.silentClearGuestTokens),l=C(e=>e.silentClearCustomTokens),d=i(`widget-${Math.random().toString(36).substr(2,9)}`);return s(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:k,source:p}=r.detail;if(p!==d.current)switch(k){case w.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case w.ANONYMOUS:i?t(i):u();break;case w.GUEST:i?n(i):c();break;case w.CUSTOM:i?o(i):l()}};return document.addEventListener(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,u,c,l]),{eventSource:d.current}}function b(){const e=C(e=>e.getToken),t=C(e=>e.getMostPrivilegedToken),n=C(e=>e.getRefreshToken),o=C(e=>e.updatePublicTokens),r=C(e=>e.updateAnonymousToken),i=C(e=>e.updateGuestTokens),s=C(e=>e.updateCustomToken),a=C(e=>e.clearTokens),u=C(e=>e.clearPublicTokens),c=C(e=>e.clearCustomTokens),{eventSource:l}=N();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function A(e){return C(t=>t.tokens[e])}function x(e){return C(t=>t.tokens[e]?.idToken)}function L(e){return C(t=>t.tokens[e]?.refreshToken)}var D,R;function K(){const e=A(w.PUBLIC),{refreshPublicTokens:t}=F(),{config:n}=S(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await I("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...v,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(R||(R={}));const M=d()(k((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=m(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=C.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=p.get(_.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);C.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=p.get(_.PUBLIC_ID_TOKEN),r=p.get(_.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(_.CUSTOM_ID_TOKEN),s=localStorage.getItem(_.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});C.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=g(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await I("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=m(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});C.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function B(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function $(){return M(e=>e.refreshedTokenLoaded)}function F(){return{setUser:M(e=>e.setUser),setPublicProfile:M(e=>e.setPublicProfile),logout:M(e=>e.logout),refreshPublicTokens:M(e=>e.refreshPublicTokens),setUserByTokenId:M(e=>e.setUserByTokenId),loadStoredUser:M(e=>e.loadStoredUser),ssoV2Exchange:M(e=>e.ssoV2Exchange)}}function J(){const{updatePublicProfile:e}=K();return{updatePublicProfile:e}}function Y(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function j({children:e}){const{config:t}=S(),n=B(),{setPublicProfile:o,loadStoredUser:r}=F(),{getPublicProfile:i}=K(),{mutateAsync:c}=u({mutationFn:i}),l=a(async()=>{if(n?.uid){const e=await c(n.uid);o(e)}},[n?.uid,c,o]);return s(()=>{l()},[l]),s(()=>{r(t)},[t,r]),e}const H="arenaAnonymousId",V="rs_anonymous_id",z="rs_initial_referrer",q="rs_initial_referring_domain";function W(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Z(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function Q(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(z)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(z,e),localStorage.setItem(q,t)}}();const r=localStorage.getItem(z)||"$direct",i=localStorage.getItem(q)||"";return{channel:"web",anonymousId:W(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Z(o)}}function X(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(H)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(H,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(H,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function ee(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function te(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:ee(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:Q(),timestamp:(new Date).toISOString(),integrations:{All:!0},...X(n)}}function ne(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function oe(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:ne(i),body:JSON.stringify({type:"page",...te(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:ne(i),body:JSON.stringify({event:t,type:"track",...te(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function re(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:i,closeDialog:a,onAuthCompleted:u}=f(),c=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=F(),{updatePublicTokens:k}=b(),{config:p}=S(),m=oe(r),T=`${p.authIframeUrl}/?app-name=${c}&app-description=${l}&language=${o??"en"}`;return s(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void m(R.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:i}=e.data?.payload||{};return o?(m(R.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),u?.(o),k(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else m(R.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,k,u,m,a]),i?e("iframe",{src:T,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function ie({children:e}){const t=C(e=>e.tokens),n=C(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:o}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await I("POST",e)}}}();return s(()=>{t.anonymous.idToken||o().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,o]),e}function se({children:n,queryClient:o,environment:r}){return o=o||new c,e(l,{client:o,children:e(U,{environment:r,children:e(j,{children:e(h,{children:t(ie,{children:[n,e(re,{})]})})})})})}export{R as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,se as AuthProvider,w as TokenType,f as useAuthDialog,G as usePublicProfile,L as useRefreshToken,$ as useRefreshedTokenLoaded,A as useToken,N as useTokenEventListener,C as useTokenStore,x as useTokenValue,b as useTokens,J as useUpdateProfile,B as useUser,F as useUserActions,M as useUserStore,Y as useUserWithProfile};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXNlclByb3BzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbnRlcmZhY2UgQXV0aERpYWxvZ0NvbnRleHRUeXBlIHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBhcHBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFwcERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBvbkF1dGhDb21wbGV0ZWQ6ICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb3BlbkRpYWxvZzogKG9wdGlvbnM6IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB2b2lkO1xuICBjbG9zZURpYWxvZzogKCkgPT4gdm9pZDtcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuY29uc3QgQXV0aERpYWxvZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PEF1dGhEaWFsb2dDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxudHlwZSBPcGVuRGlhbG9nT3B0aW9ucyA9IHtcbiAgdHJhY2tPcHRpb25zOiBUcmFja09wdGlvbnM7XG4gIGFwcE5hbWU/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBhcHBEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgb25BdXRoQ29tcGxldGVkPzogKCkgPT4gKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBBdXRoRGlhbG9nUHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwTmFtZSwgc2V0QXBwTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFthcHBEZXNjcmlwdGlvbiwgc2V0QXBwRGVzY3JpcHRpb25dID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW29uQXV0aENvbXBsZXRlZCwgc2V0T25BdXRoQ29tcGxldGVkXSA9IHVzZVN0YXRlPFxuICAgICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFt0cmFja09wdGlvbnMsIHNldFRyYWNrT3B0aW9uc10gPSB1c2VTdGF0ZTxUcmFja09wdGlvbnMgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBbbGFuZ3VhZ2UsIHNldExhbmd1YWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IG9wZW5EaWFsb2cgPSAoe1xuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBhcHBOYW1lLFxuICAgIGxhbmd1YWdlLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfTogT3BlbkRpYWxvZ09wdGlvbnMpID0+IHtcbiAgICBzZXRJc09wZW4odHJ1ZSk7XG4gICAgc2V0VHJhY2tPcHRpb25zKHRyYWNrT3B0aW9ucyk7XG4gICAgc2V0QXBwTmFtZShhcHBOYW1lKTtcbiAgICBzZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgc2V0QXBwRGVzY3JpcHRpb24oYXBwRGVzY3JpcHRpb24pO1xuICAgIHNldE9uQXV0aENvbXBsZXRlZChvbkF1dGhDb21wbGV0ZWQpO1xuICB9O1xuXG4gIGNvbnN0IGNsb3NlRGlhbG9nID0gKCkgPT4gc2V0SXNPcGVuKGZhbHNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gKG9wZW46IGJvb2xlYW4pID0+IHNldElzT3BlbihvcGVuKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgaXNPcGVuLFxuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgYXBwRGVzY3JpcHRpb24sXG4gICAgICAgIHRyYWNrT3B0aW9ucyxcbiAgICAgICAgb25BdXRoQ29tcGxldGVkLFxuICAgICAgICBvcGVuRGlhbG9nLFxuICAgICAgICBjbG9zZURpYWxvZyxcbiAgICAgICAgb25PcGVuQ2hhbmdlLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9BdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VBdXRoRGlhbG9nID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBdXRoRGlhbG9nQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQXV0aERpYWxvZyBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIEF1dGhEaWFsb2dQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICByZXR1cm4gKFxuICAgIDxDb25maWdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGNvbmZpZywgZW52aXJvbm1lbnQgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Db25maWdDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUNvbmZpZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ29uZmlnIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBDb25maWdQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImNvbnN0IGRlZmF1bHRIZWFkZXJzID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlY3VyZWRSZXF1ZXN0KHBhcmFtczoge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0O1xuICB0b2tlbjogc3RyaW5nO1xufSkge1xuICBjb25zdCB7IG1ldGhvZCwgdXJsLCBvcHRpb25zID0ge30sIHRva2VuIH0gPSBwYXJhbXM7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIC4uLmRlZmF1bHRIZWFkZXJzLFxuICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgfTtcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHBheWxvYWQpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB0byBwcm9jZXNzIHJlcXVlc3QgLSAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVycm9ycyB9ID0gSlNPTi5wYXJzZSh0ZXh0KSB8fCB7fTtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcnM/LlswXSB8fCAnSW50ZXJuYWwgc2VydmVyIGVycm9yJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICBpZiAoIWNvbnRlbnRUeXBlIHx8ICFjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XG4gIEFOT05ZTU9VUyA9ICdhbm9ueW1vdXMnLFxuICBHVUVTVCA9ICdndWVzdCcsXG4gIFBVQkxJQyA9ICdwdWJsaWMnLFxuICBDVVNUT00gPSAnY3VzdG9tJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblBhaXIge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBUb2tlbnNNYXAgPSBSZWNvcmQ8VG9rZW5UeXBlLCBUb2tlblBhaXI+O1xuXG5leHBvcnQgZW51bSBBdXRoQ29va2llIHtcbiAgUFVCTElDX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLWlkLXRva2VuJyxcbiAgUFVCTElDX1JFRlJFU0hfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtcmVmcmVzaC10b2tlbicsXG4gIEFOT05ZTU9VU19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWFub255bW91cy1pZC10b2tlbicsXG4gIEdVRVNUX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtZ3Vlc3QtaWQtdG9rZW4nLFxuICBDVVNUT01fSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1jdXN0b20taWQtdG9rZW4nLFxuICBDVVNUT01fVVNFUiA9ICdhcmVuYS1hdXRoLWN1c3RvbS11c2VyJyxcbn1cbiIsImltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IFRPS0VOX1VQREFURURfRVZFTlQgPSAnYXJlbmEtYXV0aC10b2tlbi11cGRhdGVkJztcblxuaW50ZXJmYWNlIFRva2VuRXZlbnRQYXJhbXMge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFxuICB0eXBlOiBUb2tlblR5cGUsXG4gIHBhcmFtczogVG9rZW5FdmVudFBhcmFtc1xuKSB7XG4gIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KFRPS0VOX1VQREFURURfRVZFTlQsIHtcbiAgICAgIGRldGFpbDogeyAuLi5wYXJhbXMsIHR5cGUgfSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEF1dGhDb29raWUsIFRva2Vuc01hcCwgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5TdG9yZSB7XG4gIHRva2VuczogVG9rZW5zTWFwO1xuICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgIG9wdGlvbnM/OiBBcnJheTxUb2tlblR5cGU+XG4gICkgPT4geyB0eXBlOiBUb2tlblR5cGU7IGlkVG9rZW46IHN0cmluZyB9IHwgbnVsbDtcbiAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nXG4gICkgPT4gdm9pZDtcbiAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRUb2tlbnM6IFRva2Vuc01hcCA9IHtcbiAgcHVibGljOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pIHx8IG51bGwsXG4gICAgcmVmcmVzaFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBhbm9ueW1vdXM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgZ3Vlc3Q6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBjdXN0b206IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUb2tlblN0b3JlID0gY3JlYXRlPFRva2VuU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+IHtcbiAgICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJlxuICAgICAgICByZWZyZXNoVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMucmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTiwgcmVmcmVzaFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDMwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOLCBpZFRva2VuKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7IGlkVG9rZW46IG51bGwsIHJlZnJlc2hUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7XG4gICAgICAgICAgaWRUb2tlbjogbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckN1c3RvbVRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBkZWZhdWx0VG9rZW5zLFxuXG4gICAgICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5pZFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgICAgIG9wdGlvbnMgPSBbVG9rZW5UeXBlLlBVQkxJQywgVG9rZW5UeXBlLkdVRVNULCBUb2tlblR5cGUuQU5PTllNT1VTXVxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQ1VTVE9NKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQ1VTVE9NLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuUFVCTElDKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuUFVCTElDLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5HVUVTVCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkdVRVNULFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiAmJlxuICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkFOT05ZTU9VUylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5BTk9OWU1PVVMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgICApID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9O1xuICB9KVxuKTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBUT0tFTl9VUERBVEVEX0VWRU5UIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblVwZGF0ZUV2ZW50IHtcbiAgZGV0YWlsOiB7XG4gICAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIHR5cGU6IFRva2VuVHlwZTtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKSB7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUN1c3RvbVRva2VuXG4gICk7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhclB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckFub255bW91c1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJHdWVzdFRva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckN1c3RvbVRva2Vuc1xuICApO1xuXG4gIGNvbnN0IGV2ZW50U291cmNlUmVmID0gdXNlUmVmPHN0cmluZz4oXG4gICAgYHdpZGdldC0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVUb2tlblVwZGF0ZSA9IChcbiAgICAgIGV2ZW50OiBDdXN0b21FdmVudDxUb2tlblVwZGF0ZUV2ZW50WydkZXRhaWwnXT5cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0eXBlLCBzb3VyY2UgfSA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgaWYgKHNvdXJjZSA9PT0gZXZlbnRTb3VyY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFRva2VuVHlwZS5QVUJMSUM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCBmb3IgcHVibGljIHRva2VucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFOT05ZTU9VUzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkdVRVNUOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJHdWVzdFRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5DVVNUT006XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgICApO1xuICAgIH07XG4gIH0sIFtcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnMsXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnMsXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW4sXG4gICAgY2xlYXJUb2tlbnMsXG4gICAgY2xlYXJQdWJsaWNUb2tlbnMsXG4gICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMsXG4gICAgY2xlYXJHdWVzdFRva2VucyxcbiAgICBjbGVhckN1c3RvbVRva2VucyxcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFNvdXJjZTogZXZlbnRTb3VyY2VSZWYuY3VycmVudCxcbiAgfTtcbn1cbiIsImltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgdXNlVG9rZW5FdmVudExpc3RlbmVyIH0gZnJvbSAnLi91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5zKCkge1xuICBjb25zdCBnZXRUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0VG9rZW4pO1xuICBjb25zdCBnZXRNb3N0UHJpdmlsZWdlZFRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5nZXRNb3N0UHJpdmlsZWdlZFRva2VuXG4gICk7XG4gIGNvbnN0IGdldFJlZnJlc2hUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0UmVmcmVzaFRva2VuKTtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVQdWJsaWNUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUN1c3RvbVRva2VuKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyUHVibGljVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyQ3VzdG9tVG9rZW5zKTtcblxuICBjb25zdCB7IGV2ZW50U291cmNlIH0gPSB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKTtcblxuICByZXR1cm4ge1xuICAgIGdldFRva2VuLFxuICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW4sXG4gICAgZ2V0UmVmcmVzaFRva2VuLFxuICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgY2xlYXJUb2tlbnM6ICgpID0+IGNsZWFyVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhclB1YmxpY1Rva2VuczogKCkgPT4gY2xlYXJQdWJsaWNUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiBjbGVhckN1c3RvbVRva2VucyhldmVudFNvdXJjZSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlblZhbHVlKFxuICB0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nXG4pIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5pZFRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbik7XG59XG4iLCJ0eXBlIE51bGxhYmxlPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc1dpZGdldFR5cGUge1xuICBBdmF0YXJQcm9maWxlID0gJ2F2YXRhci1wcm9maWxlJyxcbiAgQXZhdGFyQ2hhdCA9ICdhdmF0YXItY2hhdCcsXG4gIENvbW1lbnRzID0gJ2NvbW1lbnRzJyxcbiAgR2xvYmFsUHJvZmlsZSA9ICdnbG9iYWwtcHJvZmlsZScsXG4gIEdyb3VwQ2hhdCA9ICdncm91cC1jaGF0JyxcbiAgUG9sbHMgPSAncG9sbHMnLFxuICBVbml2ZXJzYWxTbmlwcGV0ID0gJ3VuaXZlcnNhbC1zbmlwcGV0Jyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tPcHRpb25zID0ge1xuICB3aWRnZXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZTtcbiAgc2l0ZUlkOiBzdHJpbmc7XG4gIHJzV3JpdGVLZXk6IHN0cmluZztcbiAgcnNEYXRhUGxhbmVVcmw6IHN0cmluZztcbiAgdHJpZ2dlcjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzRXZlbnQge1xuICBBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCA9ICdBdXRoZW50aWNhdGlvbiBDb21wbGV0ZWQnLFxuICBBdXRoZW50aWNhdGlvblN0YXJ0ZWQgPSAnQXV0aGVudGljYXRpb24gU3RhcnRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uVmlld2VkID0gJ0F1dGhlbnRpY2F0aW9uIFZpZXdlZCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrUHJvcHMgPSBOdWxsYWJsZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlQcm9wcyB7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVkZGVyQ29udGV4dCB7XG4gIGNoYW5uZWw6ICd3ZWInO1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgbG9jYWxlPzogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xuICBvcz86IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gIHBhZ2U/OiB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICByZWZlcnJlcj86IHN0cmluZztcbiAgICByZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJlcj86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gIH07XG4gIHNjcmVlbj86IHtcbiAgICBkZW5zaXR5PzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBpbm5lckhlaWdodD86IG51bWJlcjtcbiAgICBpbm5lcldpZHRoPzogbnVtYmVyO1xuICB9O1xuICBjYW1wYWlnbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG4iLCJpbXBvcnQgeyBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0LCBzZWN1cmVkUmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXVzZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJvZmlsZVNlcnZpY2VzKCkge1xuICBjb25zdCB0b2tlbiA9IHVzZVRva2VuKFRva2VuVHlwZS5QVUJMSUMpO1xuICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNQcm9maWxlKHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8UHVibGljUHJvZmlsZT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9ICdiaW8scGhvdG9VUkwsZGlzcGxheU5hbWUsbG9jYXRpb24saGFuZGxlJztcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9wdWJsaWMvdXNlcnMvJHt1c2VySWR9L3Byb2ZpbGU/ZmllbGRzPSR7ZmllbGRzfWA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVQdWJsaWNQcm9maWxlKFxuICAgIHBhcmFtczogT21pdDxQdWJsaWNQcm9maWxlLCAnbWV0YWRhdGEnPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9tZS9wcm9maWxlL3BlcnNvbmFsYDtcbiAgICBhd2FpdCBzZWN1cmVkUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICAgICAgfSxcbiAgICAgIHRva2VuOiB0b2tlbi5pZFRva2VuISxcbiAgICB9KTtcbiAgICByZWZyZXNoUHVibGljVG9rZW5zKHsgcmVmcmVzaFRva2VuQXBpS2V5OiBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5IH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0UHVibGljUHJvZmlsZSxcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7XG4gIFVzZXJQcm9wcyxcbiAgRmlyZWJhc2VVc2VyLFxuICBTc29Vc2VyUHJvcHMsXG4gIFNzb1YyRXhjaGFuZ2VSZXNwb25zZSxcbn0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tICdqd3QtZGVjb2RlJztcbmltcG9ydCB7IHR5cGUgUHVibGljUHJvZmlsZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdHlwZXMnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4vdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IEVudmlyb25tZW50LCBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgVXNlclN0b3JlIHtcbiAgdXNlcjogVXNlclByb3BzIHwgbnVsbDtcbiAgcHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGw7XG4gIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBib29sZWFuO1xuICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4gdm9pZDtcbiAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB2b2lkO1xuICBsb2dvdXQ6ICgpID0+IHZvaWQ7XG4gIHJlZnJlc2hQdWJsaWNUb2tlbnM6IChjb25maWc6IHtcbiAgICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgbG9hZFN0b3JlZFVzZXI6IChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNzb1YyRXhjaGFuZ2U6IChcbiAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgIGp3dDogc3RyaW5nLFxuICAgIGVudj86IEVudmlyb25tZW50XG4gICkgPT4gUHJvbWlzZTxTc29WMkV4Y2hhbmdlUmVzcG9uc2U+O1xufVxuXG5leHBvcnQgY29uc3QgdXNlVXNlclN0b3JlID0gY3JlYXRlPFVzZXJTdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4gKHtcbiAgICB1c2VyOiBudWxsLFxuICAgIHB1YmxpY1Byb2ZpbGU6IG51bGwsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGZhbHNlLFxuXG4gICAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHVzZXIgfSk7XG4gICAgfSxcblxuICAgIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgcHVibGljUHJvZmlsZSB9KTtcbiAgICB9LFxuXG4gICAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGp3dERlY29kZTxGaXJlYmFzZVVzZXI+KGlkVG9rZW4pO1xuICAgICAgICBjb25zdCB1c2VyUHJvcHM6IFVzZXJQcm9wcyA9IHtcbiAgICAgICAgICB1aWQ6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogdXNlci5zYWZlRGlzcGxheU5hbWUsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgcGhvdG9VUkw6IHVzZXIuc2FmZVBob3RvVVJMLFxuICAgICAgICAgIGhhbmRsZTogdXNlci5oYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHNldCh7IHVzZXI6IHVzZXJQcm9wcyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dvdXQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICBzZXQoeyB1c2VyOiBudWxsIH0pO1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnYXJlbmEtY29tbWVudHMtbG9nb3V0JykpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnM6IGFzeW5jIChjb25maWc6IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggdG9rZW4gZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZWZpeCA9ICdodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZWFwaXMuY29tL3YxL3Rva2VuP2tleT0nO1xuICAgICAgICBjb25zdCBhcGlLZXkgPSBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5O1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcmVmaXh9JHthcGlLZXl9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChkYXRhLmlkX3Rva2VuKTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZVB1YmxpY1Rva2VucyhkYXRhLmlkX3Rva2VuLCBkYXRhLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnN0IHsgbG9nb3V0IH0gPSBnZXQoKTtcbiAgICAgICAgbG9nb3V0KCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvYWRTdG9yZWRVc2VyOiBhc3luYyAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBwdWJsaWNJZFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgY29uc3QgcHVibGljUmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21JZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBpZiAoISFjdXN0b21JZFRva2VuICYmICEhY3VzdG9tVXNlcikge1xuICAgICAgICBjb25zdCBwYXJzZWRVc2VyID0gSlNPTi5wYXJzZShjdXN0b21Vc2VyKTtcblxuICAgICAgICBzZXQoeyB1c2VyOiBwYXJzZWRVc2VyIH0pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4oY3VzdG9tSWRUb2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHVibGljSWRUb2tlbikge1xuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChwdWJsaWNJZFRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChwdWJsaWNSZWZyZXNoVG9rZW4gJiYgY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSBnZXQoKTtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoUHVibGljVG9rZW5zKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0KHsgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIHNzb1YyRXhjaGFuZ2U6IGFzeW5jIChcbiAgICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgICBqd3Q6IHN0cmluZyxcbiAgICAgIGVudj86IEVudmlyb25tZW50XG4gICAgKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoZW52ID8/ICdwcm9kdWN0aW9uJyk7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vc3NvL3NvdXJjZXMvJHtzc29Tb3VyY2VJRH0vdXNlcmA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTc29WMkV4Y2hhbmdlUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsLCB7XG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzaWduZWRVc2VyRGF0YTogand0IH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkVXNlciA9IGp3dERlY29kZTxTc29Vc2VyUHJvcHM+KHJlc3BvbnNlLnRva2VuKTtcblxuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlciwgc2V0UHVibGljUHJvZmlsZSB9ID0gZ2V0KCk7XG5cbiAgICAgICAgICBzZXRVc2VyKHtcbiAgICAgICAgICAgIHVpZDogZGVjb2RlZFVzZXI/LnN1YixcbiAgICAgICAgICAgIGVtYWlsOiBkZWNvZGVkVXNlcj8uZW1haWwsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHNldFB1YmxpY1Byb2ZpbGUoe1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4ocmVzcG9uc2UudG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU1NPIFYyIEV4Y2hhbmdlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gIH0pKVxuKTtcbiIsImltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3VzZXItc3RvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcigpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1YmxpY1Byb2ZpbGUoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoZWRUb2tlbkxvYWRlZCgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyQWN0aW9ucygpIHtcbiAgY29uc3Qgc2V0VXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyKTtcbiAgY29uc3Qgc2V0UHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRQdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgbG9nb3V0ID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvZ291dCk7XG4gIGNvbnN0IHJlZnJlc2hQdWJsaWNUb2tlbnMgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaFB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHNldFVzZXJCeVRva2VuSWQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlckJ5VG9rZW5JZCk7XG4gIGNvbnN0IGxvYWRTdG9yZWRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvYWRTdG9yZWRVc2VyKTtcbiAgY29uc3Qgc3NvVjJFeGNoYW5nZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zc29WMkV4Y2hhbmdlKTtcbiAgXG5cbiAgcmV0dXJuIHtcbiAgICBzZXRVc2VyLFxuICAgIHNldFB1YmxpY1Byb2ZpbGUsXG4gICAgbG9nb3V0LFxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMsXG4gICAgc2V0VXNlckJ5VG9rZW5JZCxcbiAgICBsb2FkU3RvcmVkVXNlcixcbiAgICBzc29WMkV4Y2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXBkYXRlUHJvZmlsZSgpIHtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNQcm9maWxlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcldpdGhQcm9maWxlKCkge1xuICBjb25zdCB1c2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xuICBjb25zdCBwdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCByZWZyZXNoZWRUb2tlbkxvYWRlZCA9IHVzZVVzZXJTdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdXNlcixcbiAgICBwdWJsaWNQcm9maWxlLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkLFxuICB9O1xufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVVzZXIsIHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24gfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VyUHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKCk7XG4gIGNvbnN0IHsgc2V0UHVibGljUHJvZmlsZSwgbG9hZFN0b3JlZFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgZ2V0UHVibGljUHJvZmlsZTogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICBjb25zdCB7IG11dGF0ZUFzeW5jOiBnZXRQdWJsaWNQcm9maWxlIH0gPSB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UsXG4gIH0pO1xuXG4gIGNvbnN0IGxvYWRQdWJsaWNQcm9maWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQdWJsaWNQcm9maWxlKHVzZXIudWlkKTtcbiAgICAgIHNldFB1YmxpY1Byb2ZpbGUocHJvZmlsZSk7XG4gICAgfVxuICB9LCBbdXNlcj8udWlkLCBnZXRQdWJsaWNQcm9maWxlLCBzZXRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkUHVibGljUHJvZmlsZSgpO1xuICB9LCBbbG9hZFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRTdG9yZWRVc2VyKGNvbmZpZyk7XG4gIH0sIFtjb25maWcsIGxvYWRTdG9yZWRVc2VyXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICBBbmFseXRpY3NFdmVudCxcbiAgSWRlbnRpdHlQcm9wcyxcbiAgUnVkZGVyQ29udGV4dCxcbiAgVHJhY2tQcm9wcyxcbn0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW1wb3J0IHsgcmVtb3ZlUGFyYW1zRnJvbVVybCB9IGZyb20gJy4uL3V0aWxzL3VybCc7XG5cbmNvbnN0IEFOT05ZTU9VU19JRF9LRVkgPSAnYXJlbmFBbm9ueW1vdXNJZCc7XG5cbmNvbnN0IExTX0tFWVMgPSB7XG4gIGFub246ICdyc19hbm9ueW1vdXNfaWQnLFxuICBpbml0UmVmZXJyZXI6ICdyc19pbml0aWFsX3JlZmVycmVyJyxcbiAgaW5pdERvbWFpbjogJ3JzX2luaXRpYWxfcmVmZXJyaW5nX2RvbWFpbicsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JTZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICBjb25zdCBleGlzdGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuYW5vbik7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuYW5vbiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk6IHZvaWQge1xuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSkge1xuICAgIGNvbnN0IHJlZiA9IGRvY3VtZW50LnJlZmVycmVyIHx8ICckZGlyZWN0JztcbiAgICBjb25zdCBkb21haW4gPSByZWYgJiYgcmVmICE9PSAnJGRpcmVjdCcgPyBuZXcgVVJMKHJlZikuaG9zdG5hbWUgOiAnJztcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlciwgcmVmKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXREb21haW4sIGRvbWFpbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDYW1wYWlnbih1OiBVUkwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAndXRtX3NvdXJjZScsXG4gICAgJ3V0bV9tZWRpdW0nLFxuICAgICd1dG1fY2FtcGFpZ24nLFxuICAgICd1dG1fdGVybScsXG4gICAgJ3V0bV9jb250ZW50JyxcbiAgXTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGtleXMuZm9yRWFjaChrID0+IHtcbiAgICBjb25zdCB2ID0gdS5zZWFyY2hQYXJhbXMuZ2V0KGspO1xuICAgIGlmICh2KSBvdXRba10gPSB2O1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID8gb3V0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSdWRkZXJDb250ZXh0KCk6IFJ1ZGRlckNvbnRleHQge1xuICBjb25zdCB3ID0gd2luZG93O1xuICBjb25zdCBkID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHMgPSB3aW5kb3cuc2NyZWVuO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHcubG9jYXRpb24uaHJlZik7XG5cbiAgcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTtcblxuICBjb25zdCBpbml0aWFsX3JlZmVycmVyID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikgfHwgJyRkaXJlY3QnO1xuICBjb25zdCBpbml0aWFsX3JlZmVycmluZ19kb21haW4gPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbikgfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsOiAnd2ViJyxcbiAgICBhbm9ueW1vdXNJZDogZ2V0T3JTZXRBbm9ueW1vdXNJZCgpLFxuICAgIGxvY2FsZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgIG9zOiB7IG5hbWU6IG5hdmlnYXRvci5wbGF0Zm9ybSwgdmVyc2lvbjogdW5kZWZpbmVkIH0sXG4gICAgcGFnZToge1xuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcmVmZXJyZXI6IGQucmVmZXJyZXIgfHwgJyRkaXJlY3QnLFxuICAgICAgcmVmZXJyaW5nX2RvbWFpbjogZC5yZWZlcnJlciA/IG5ldyBVUkwoZC5yZWZlcnJlcikuaG9zdG5hbWUgOiAnJyxcbiAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgdXJsOiB1cmwudG9TdHJpbmcoKSxcbiAgICAgIGluaXRpYWxfcmVmZXJyZXIsXG4gICAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4sXG4gICAgfSxcbiAgICBzY3JlZW46IHtcbiAgICAgIGRlbnNpdHk6ICh3LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPz8gMSxcbiAgICAgIGhlaWdodDogcy5oZWlnaHQsXG4gICAgICB3aWR0aDogcy53aWR0aCxcbiAgICAgIGlubmVySGVpZ2h0OiB3LmlubmVySGVpZ2h0LFxuICAgICAgaW5uZXJXaWR0aDogdy5pbm5lcldpZHRoLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHBhcnNlQ2FtcGFpZ24odXJsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SWRlbnRpZmllcihvcHRpb25zOiBJZGVudGl0eVByb3BzID0ge30pOiBJZGVudGl0eVByb3BzIHtcbiAgY29uc3QgaWRlbnRpZmllcjogSWRlbnRpdHlQcm9wcyA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnVzZXJJZCkge1xuICAgIGlkZW50aWZpZXIudXNlcklkID0gb3B0aW9ucy51c2VySWQ7XG4gIH1cblxuICBsZXQgY3VycmVudEFub255bW91c0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGN1cnJlbnRBbm9ueW1vdXNJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFOT05ZTU9VU19JRF9LRVkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFjY2VzcyBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gb3B0aW9ucy5hbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgb3B0aW9ucy5hbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY3VycmVudEFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IGN1cnJlbnRBbm9ueW1vdXNJZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuZXdBbm9ueW1vdXNJZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBuZXdBbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgbmV3QW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIG5ldyBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRDYW5vbmljYWxVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsTWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2xpbmtbcmVsPVwiY2Fub25pY2FsXCJdJ1xuICApIGFzIEhUTUxMaW5rRWxlbWVudDtcbiAgY29uc3QgcmF3VXJsID0gY2Fub25pY2FsTWV0YT8uaHJlZiB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgcmV0dXJuIHJlbW92ZVBhcmFtc0Zyb21VcmwocmF3VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRQcm9wZXJ0aWVzKFxuICB3aWRnZXRUeXBlOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuKSB7XG4gIHJldHVybiB7XG4gICAgcHJvcGVydGllczoge1xuICAgICAgd2lkZ2V0X3R5cGU6IHdpZGdldFR5cGUsXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgZG9tYWluOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICB0aXRsZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgY2Fub25pY2FsX3VybDogZ2V0Q2Fub25pY2FsVXJsKCksXG4gICAgICBzbmlwcGV0X2lkOiB3aW5kb3cuX19BUkVOQV9fPy5zbmlwcGV0SWQgfHwgbnVsbCxcbiAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgfSxcbiAgICBjb250ZXh0OiBidWlsZFJ1ZGRlckNvbnRleHQoKSxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBpbnRlZ3JhdGlvbnM6IHsgQWxsOiB0cnVlIH0sXG4gICAgLi4uZ2V0SWRlbnRpZmllcihpZGVudGl0eSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50SGVhZGVycyh3cml0ZUtleTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIGJ0b2EoYCR7d3JpdGVLZXl9OmApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5hbHl0aWNzKHdyaXRlS2V5OiBzdHJpbmcsIGRhdGFQbGFuZVVybDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgcGFnZTogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS9wYWdlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHBhZ2UgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRyYWNrOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3RyYWNrYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHR5cGU6ICd0cmFjaycsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCB0cmFjayBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVtb3ZlUGFyYW1zRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgdXJsT2JqLnNlYXJjaCA9ICcnO1xuXG4gICAgcmV0dXJuIHVybE9iai5ocmVmO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIHNlYXJjaCBwYXJhbXMgZnJvbSBVUkw6JywgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiIsImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0QW5hbHl0aWNzIH0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50LCBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhY2sodHJhY2tPcHRpb25zPzogVHJhY2tPcHRpb25zKSB7XG4gIGNvbnN0IHRyYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgdXNlcklkPzogc3RyaW5nLFxuICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoIXRyYWNrT3B0aW9ucykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhbmFseXRpY3MgPSBnZXRBbmFseXRpY3MoXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc1dyaXRlS2V5LFxuICAgICAgICB0cmFja09wdGlvbnMucnNEYXRhUGxhbmVVcmxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYWNrUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgICAgIHNpdGVfaWQ6IHRyYWNrT3B0aW9ucy5zaXRlSWQsXG4gICAgICAgIHdpZGdldF9pZDogdHJhY2tPcHRpb25zLndpZGdldElkLFxuICAgICAgICB0cmlnZ2VyOiB0cmFja09wdGlvbnMudHJpZ2dlcixcbiAgICAgICAgLi4ucHJvcGVydGllcyxcbiAgICAgIH07XG5cbiAgICAgIGFuYWx5dGljcy50cmFjayhcbiAgICAgICAgdHJhY2tPcHRpb25zLndpZGdldFR5cGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0cmFja1Byb3BlcnRpZXMsXG4gICAgICAgIHVzZXJJZCA/IHsgdXNlcklkIH0gOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSxcbiAgICBbdHJhY2tPcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB0cmFjaztcbn1cbiIsImltcG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuLi9jb250ZXh0L2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW5zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyB1c2VUcmFjayB9IGZyb20gJy4uL2hvb2tzL3VzZS10cmFjayc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEF1dGhEaWFsb2coKSB7XG4gIGNvbnN0IHtcbiAgICBhcHBOYW1lLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIGxhbmd1YWdlLFxuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBpc09wZW4sXG4gICAgY2xvc2VEaWFsb2csXG4gICAgb25BdXRoQ29tcGxldGVkLFxuICB9ID0gdXNlQXV0aERpYWxvZygpO1xuICBjb25zdCBmcmFtZUFwcE5hbWUgPSBhcHBOYW1lIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgZnJhbWVBcHBEZXNjcmlwdGlvbiA9IGFwcERlc2NyaXB0aW9uIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgeyBzZXRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Rva2VucyB9ID0gdXNlVG9rZW5zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcblxuICBjb25zdCB0cmFjayA9IHVzZVRyYWNrKHRyYWNrT3B0aW9ucyk7XG5cbiAgY29uc3QgaWZyYW1lVXJsID0gYCR7Y29uZmlnLmF1dGhJZnJhbWVVcmx9Lz9hcHAtbmFtZT0ke2ZyYW1lQXBwTmFtZX0mYXBwLWRlc2NyaXB0aW9uPSR7ZnJhbWVBcHBEZXNjcmlwdGlvbn0mbGFuZ3VhZ2U9JHtsYW5ndWFnZSA/PyAnZW4nfWA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8uc291cmNlICE9PSAnYXJlbmEtYXV0aGVudGljYXRpb24nKSByZXR1cm47XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdjYW5jZWxlZCcpIHtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tdmlld2VkJykge1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblZpZXdlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXN0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgYXV0aFR5cGUgfSA9IG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25TdGFydGVkLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBhdXRoVHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1jb21wbGV0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB1c2VyLCBhdXRoVHlwZSwgaXNTaWdudXAgfSA9XG4gICAgICAgICAgbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuXG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGNvbXBsZXRlZCBidXQgdXNlciBkYXRhIGlzIG1pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvbkNvbXBsZXRlZCwgdXNlci51aWQsIHtcbiAgICAgICAgICBpc19zaWdudXA6IGlzU2lnbnVwLFxuICAgICAgICAgIGF1dGhfdHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBvbkF1dGhDb21wbGV0ZWQ/Lih1c2VyKTtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgIHNldFVzZXIodXNlcik7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICB9LCBbc2V0VXNlciwgdXBkYXRlUHVibGljVG9rZW5zLCBvbkF1dGhDb21wbGV0ZWQsIHRyYWNrLCBjbG9zZURpYWxvZ10pO1xuXG4gIHJldHVybiBpc09wZW4gPyAoXG4gICAgPGlmcmFtZVxuICAgICAgc3JjPXtpZnJhbWVVcmx9XG4gICAgICB0aXRsZT1cIkFyZW5hIEF1dGhlbnRpY2F0aW9uXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHdpZHRoOiAnMTAwdncnLFxuICAgICAgICBoZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgIHpJbmRleDogOTk5OTk5OTk5OSxcbiAgICAgIH19XG4gICAgPjwvaWZyYW1lPlxuICApIDogbnVsbDtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IHVzZUF1dGhTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdXNlLWF1dGgtc2VydmljZXMnO1xuaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQW5vbnltb3VzVG9rZW5Qcm92aWRlcih7XG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkge1xuICBjb25zdCB0b2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB7IGdldEFub255bW91c0lkZW50aXR5VG9rZW4gfSA9IHVzZUF1dGhTZXJ2aWNlcygpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKS50aGVuKCh0b2tlbjogRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSkgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbih0b2tlbi5hY2Nlc3NfdG9rZW4pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXG4gICAgdG9rZW5zLmFub255bW91cy5pZFRva2VuLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIF0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dGhTZXJ2aWNlcygpIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBpZGVudGl0eVVybCA9IGNvbmZpZy5pZGVudGl0eVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpOiBQcm9taXNlPEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtpZGVudGl0eVVybH0vYW5vbnltb3VzLXRva2VuYDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIH07XG59XG4iLCJpbXBvcnQgeyBBdXRoRGlhbG9nUHJvdmlkZXIgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUNsaWVudFByb3ZpZGVyIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IFVzZXJQcm92aWRlciB9IGZyb20gJy4vdXNlci1wcm92aWRlcic7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBBdXRoRGlhbG9nIGZyb20gJy4uL2RpYWxvZyc7XG5pbXBvcnQgeyBBbm9ueW1vdXNUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi9hbm9ueW1vdXMtdG9rZW4tcHJvdmlkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aFByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG4gIHF1ZXJ5Q2xpZW50LFxuICBlbnZpcm9ubWVudCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgcXVlcnlDbGllbnQ/OiBRdWVyeUNsaWVudDtcbiAgZW52aXJvbm1lbnQ/OiAncHJvZHVjdGlvbicgfCAnZGV2ZWxvcG1lbnQnO1xufSkge1xuICBxdWVyeUNsaWVudCA9IHF1ZXJ5Q2xpZW50IHx8IG5ldyBRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiAoXG4gICAgPFF1ZXJ5Q2xpZW50UHJvdmlkZXIgY2xpZW50PXtxdWVyeUNsaWVudH0+XG4gICAgICA8Q29uZmlnUHJvdmlkZXIgZW52aXJvbm1lbnQ9e2Vudmlyb25tZW50fT5cbiAgICAgICAgPFVzZXJQcm92aWRlcj5cbiAgICAgICAgICA8QXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICAgICAgPEFub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPEF1dGhEaWFsb2cgLz5cbiAgICAgICAgICAgIDwvQW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICA8L0F1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgPC9Vc2VyUHJvdmlkZXI+XG4gICAgICA8L0NvbmZpZ1Byb3ZpZGVyPlxuICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuIl0sIm5hbWVzIjpbIkF1dGhEaWFsb2dDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsIkF1dGhEaWFsb2dQcm92aWRlciIsImNoaWxkcmVuIiwiaXNPcGVuIiwic2V0SXNPcGVuIiwidXNlU3RhdGUiLCJhcHBOYW1lIiwic2V0QXBwTmFtZSIsImFwcERlc2NyaXB0aW9uIiwic2V0QXBwRGVzY3JpcHRpb24iLCJvbkF1dGhDb21wbGV0ZWQiLCJzZXRPbkF1dGhDb21wbGV0ZWQiLCJ0cmFja09wdGlvbnMiLCJzZXRUcmFja09wdGlvbnMiLCJsYW5ndWFnZSIsInNldExhbmd1YWdlIiwiX2pzeCIsIlByb3ZpZGVyIiwidmFsdWUiLCJvcGVuRGlhbG9nIiwiY2xvc2VEaWFsb2ciLCJvbk9wZW5DaGFuZ2UiLCJvcGVuIiwidXNlQXV0aERpYWxvZyIsImNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRXJyb3IiLCJnZXRDb25maWciLCJlbnZpcm9ubWVudCIsImlzRGV2IiwicHJvZmlsZVNlcnZpY2VVcmwiLCJpZGVudGl0eVNlcnZpY2VVcmwiLCJyZWZyZXNoVG9rZW5BcGlLZXkiLCJhdXRoSWZyYW1lVXJsIiwiZGVidWciLCJDb25maWdDb250ZXh0IiwiQ29uZmlnUHJvdmlkZXIiLCJjb25maWciLCJ1c2VDb25maWciLCJkZWZhdWx0SGVhZGVycyIsImFzeW5jIiwicmVxdWVzdCIsIm1ldGhvZCIsInVybCIsIm9wdGlvbnMiLCJyZXNwb25zZSIsImZldGNoIiwiaGVhZGVycyIsIm9rIiwic3RhdHVzVGV4dCIsImpzb24iLCJUb2tlblR5cGUiLCJBdXRoQ29va2llIiwiVE9LRU5fVVBEQVRFRF9FVkVOVCIsImRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQiLCJ0eXBlIiwicGFyYW1zIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkZWZhdWx0VG9rZW5zIiwicHVibGljIiwiaWRUb2tlbiIsIkNvb2tpZXMiLCJnZXQiLCJQVUJMSUNfSURfVE9LRU4iLCJyZWZyZXNoVG9rZW4iLCJQVUJMSUNfUkVGUkVTSF9UT0tFTiIsImFub255bW91cyIsIkFOT05ZTU9VU19JRF9UT0tFTiIsImd1ZXN0IiwiR1VFU1RfSURfVE9LRU4iLCJjdXN0b20iLCJDVVNUT01fSURfVE9LRU4iLCJ1c2VUb2tlblN0b3JlIiwiY3JlYXRlIiwic3Vic2NyaWJlV2l0aFNlbGVjdG9yIiwic2V0IiwidXBkYXRlUHVibGljVG9rZW5zSGVscGVyIiwic291cmNlIiwidG9rZW5zIiwic3RhdGUiLCJleHBpcmVzIiwiUFVCTElDIiwidXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIiLCJBTk9OWU1PVVMiLCJ1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciIsIkdVRVNUIiwidXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIiLCJDVVNUT00iLCJjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciIsInJlbW92ZSIsImNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyIiwiY2xlYXJHdWVzdFRva2Vuc0hlbHBlciIsImNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyIiwibG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsIkNVU1RPTV9VU0VSIiwiZ2V0VG9rZW4iLCJnZXRNb3N0UHJpdmlsZWdlZFRva2VuIiwiaW5jbHVkZXMiLCJnZXRSZWZyZXNoVG9rZW4iLCJ1cGRhdGVQdWJsaWNUb2tlbnMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbiIsInVwZGF0ZUd1ZXN0VG9rZW5zIiwidXBkYXRlQ3VzdG9tVG9rZW4iLCJjbGVhclRva2VucyIsImNsZWFyUHVibGljVG9rZW5zIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJjbGVhckd1ZXN0VG9rZW5zIiwiY2xlYXJDdXN0b21Ub2tlbnMiLCJzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnMiLCJzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbiIsInNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zIiwic2lsZW50VXBkYXRlQ3VzdG9tVG9rZW4iLCJzaWxlbnRDbGVhclB1YmxpY1Rva2VucyIsInNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zIiwic2lsZW50Q2xlYXJHdWVzdFRva2VucyIsInNpbGVudENsZWFyQ3VzdG9tVG9rZW5zIiwidXNlVG9rZW5FdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2VSZWYiLCJ1c2VSZWYiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHIiLCJ1c2VFZmZlY3QiLCJoYW5kbGVUb2tlblVwZGF0ZSIsImV2ZW50IiwiY3VycmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2UiLCJ1c2VUb2tlbnMiLCJ1c2VUb2tlbiIsInVzZVRva2VuVmFsdWUiLCJ1c2VSZWZyZXNoVG9rZW4iLCJBbmFseXRpY3NXaWRnZXRUeXBlIiwiQW5hbHl0aWNzRXZlbnQiLCJ1c2VQcm9maWxlU2VydmljZXMiLCJ0b2tlbiIsInJlZnJlc2hQdWJsaWNUb2tlbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInByb2ZpbGVVcmwiLCJnZXRQdWJsaWNQcm9maWxlIiwidXNlcklkIiwidXBkYXRlUHVibGljUHJvZmlsZSIsIkF1dGhvcml6YXRpb24iLCJwYXlsb2FkIiwidGV4dCIsInN0YXR1cyIsImVycm9ycyIsIkpTT04iLCJwYXJzZSIsImNvbnRlbnRUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwic2VjdXJlZFJlcXVlc3QiLCJib2R5Iiwic3RyaW5naWZ5IiwidXNlVXNlclN0b3JlIiwidXNlciIsInB1YmxpY1Byb2ZpbGUiLCJyZWZyZXNoZWRUb2tlbkxvYWRlZCIsInNldFVzZXIiLCJzZXRQdWJsaWNQcm9maWxlIiwic2V0VXNlckJ5VG9rZW5JZCIsImp3dERlY29kZSIsInVzZXJQcm9wcyIsInVpZCIsInVzZXJfaWQiLCJkaXNwbGF5TmFtZSIsInNhZmVEaXNwbGF5TmFtZSIsImVtYWlsIiwicGhvdG9VUkwiLCJzYWZlUGhvdG9VUkwiLCJoYW5kbGUiLCJsb2dvdXQiLCJ0b2tlblN0b3JlIiwiZ2V0U3RhdGUiLCJFdmVudCIsIlVSTFNlYXJjaFBhcmFtcyIsInJlZnJlc2hfdG9rZW4iLCJncmFudF90eXBlIiwiZGF0YSIsImlkX3Rva2VuIiwibG9hZFN0b3JlZFVzZXIiLCJwdWJsaWNJZFRva2VuIiwicHVibGljUmVmcmVzaFRva2VuIiwiY3VzdG9tSWRUb2tlbiIsImdldEl0ZW0iLCJjdXN0b21Vc2VyIiwicGFyc2VkVXNlciIsInNzb1YyRXhjaGFuZ2UiLCJzc29Tb3VyY2VJRCIsImp3dCIsImVudiIsInNpZ25lZFVzZXJEYXRhIiwiZGVjb2RlZFVzZXIiLCJzdWIiLCJ1c2VVc2VyIiwidXNlUHVibGljUHJvZmlsZSIsInVzZVJlZnJlc2hlZFRva2VuTG9hZGVkIiwidXNlVXBkYXRlUHJvZmlsZSIsInVzZVVzZXJXaXRoUHJvZmlsZSIsIlVzZXJQcm92aWRlciIsImdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIiwibXV0YXRlQXN5bmMiLCJ1c2VNdXRhdGlvbiIsIm11dGF0aW9uRm4iLCJsb2FkUHVibGljUHJvZmlsZSIsInVzZUNhbGxiYWNrIiwicHJvZmlsZSIsIkFOT05ZTU9VU19JRF9LRVkiLCJMU19LRVlTIiwiZ2V0T3JTZXRBbm9ueW1vdXNJZCIsImV4aXN0aW5nIiwiaWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic2V0SXRlbSIsInBhcnNlQ2FtcGFpZ24iLCJ1Iiwib3V0IiwiZm9yRWFjaCIsImsiLCJ2Iiwic2VhcmNoUGFyYW1zIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImJ1aWxkUnVkZGVyQ29udGV4dCIsInciLCJ3aW5kb3ciLCJkIiwicyIsInNjcmVlbiIsIlVSTCIsImxvY2F0aW9uIiwiaHJlZiIsInJlZiIsInJlZmVycmVyIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJyZW1lbWJlckluaXRpYWxSZWZlcnJlciIsImluaXRpYWxfcmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmluZ19kb21haW4iLCJjaGFubmVsIiwiYW5vbnltb3VzSWQiLCJsb2NhbGUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0aW1lem9uZSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInJlc29sdmVkT3B0aW9ucyIsInRpbWVab25lIiwib3MiLCJuYW1lIiwicGxhdGZvcm0iLCJ2ZXJzaW9uIiwicGFnZSIsInBhdGgiLCJwYXRobmFtZSIsInJlZmVycmluZ19kb21haW4iLCJzZWFyY2giLCJ0aXRsZSIsImRlbnNpdHkiLCJkZXZpY2VQaXhlbFJhdGlvIiwiaGVpZ2h0Iiwid2lkdGgiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJjYW1wYWlnbiIsImdldElkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiY3VycmVudEFub255bW91c0lkIiwid2FybiIsIm5ld0Fub255bW91c0lkIiwicmVwbGFjZSIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJpZGVudGl0eSIsIndpZGdldF90eXBlIiwiY2Fub25pY2FsX3VybCIsInNuaXBwZXRfaWQiLCJfX0FSRU5BX18iLCJzbmlwcGV0SWQiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJpbnRlZ3JhdGlvbnMiLCJBbGwiLCJnZXRFdmVudEhlYWRlcnMiLCJ3cml0ZUtleSIsImJ0b2EiLCJ1c2VUcmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrIiwidHJhY2tQcm9wZXJ0aWVzIiwic2l0ZV9pZCIsInNpdGVJZCIsIndpZGdldF9pZCIsIndpZGdldElkIiwidHJpZ2dlciIsIkF1dGhEaWFsb2ciLCJmcmFtZUFwcE5hbWUiLCJmcmFtZUFwcERlc2NyaXB0aW9uIiwiaWZyYW1lVXJsIiwiaGFuZGxlciIsIm1lc3NhZ2UiLCJhdXRoVHlwZSIsIkF1dGhlbnRpY2F0aW9uU3RhcnRlZCIsImlzU2lnbnVwIiwiQXV0aGVudGljYXRpb25Db21wbGV0ZWQiLCJpc19zaWdudXAiLCJhdXRoX3R5cGUiLCJBdXRoZW50aWNhdGlvblZpZXdlZCIsInNyYyIsInN0eWxlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiekluZGV4IiwiQW5vbnltb3VzVG9rZW5Qcm92aWRlciIsImdldEFub255bW91c0lkZW50aXR5VG9rZW4iLCJpZGVudGl0eVVybCIsInVzZUF1dGhTZXJ2aWNlcyIsInRoZW4iLCJhY2Nlc3NfdG9rZW4iLCJBdXRoUHJvdmlkZXIiLCJxdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnRQ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
|