From 91c86d23d48ce91f773dbbd1ce2ad414a27a2cfa Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 09:25:03 +1000 Subject: [PATCH 01/30] typo!(open menu event): Change from bl_sprite to bl_appearance --- data/zones.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/zones.lua b/data/zones.lua index 4fa599e..3881c2c 100644 --- a/data/zones.lua +++ b/data/zones.lua @@ -202,7 +202,7 @@ AddEventHandler('onResourceStop', function(resource) RegisterCommand('+openAppearance', function() - TriggerEvent('bl_sprites:client:useZone', currentZone) + TriggerEvent('bl_appearance:client:useZone', currentZone) end, false) RegisterKeyMapping('+openAppearance', 'Open Appearance', 'keyboard', key) \ No newline at end of file From e208fc6e2a84a72846dd273d69388b9357736965 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 09:32:10 +1000 Subject: [PATCH 02/30] ref(openMenu): Can take it zone and zoneType Only passing in zoneType will not show any blacklists --- data/zones.lua | 3 ++- src/client/init.ts | 11 +---------- src/client/menu.ts | 26 ++++++++++++++++++++------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/data/zones.lua b/data/zones.lua index 3881c2c..b0799b0 100644 --- a/data/zones.lua +++ b/data/zones.lua @@ -202,7 +202,8 @@ AddEventHandler('onResourceStop', function(resource) RegisterCommand('+openAppearance', function() - TriggerEvent('bl_appearance:client:useZone', currentZone) + if not currentZone then return end + TriggerEvent('bl_appearance:client:useZone', currentZone.type) end, false) RegisterKeyMapping('+openAppearance', 'Open Appearance', 'keyboard', key) \ No newline at end of file diff --git a/src/client/init.ts b/src/client/init.ts index b8808e7..2f82a1b 100644 --- a/src/client/init.ts +++ b/src/client/init.ts @@ -1,4 +1,4 @@ -import { TAppearance, TAppearanceZone, TMenuTypes } from "@typings/appearance" +import { TAppearance, TAppearanceZone } from "@typings/appearance" import { openMenu } from "./menu" import { setPedAppearance, setPlayerPedAppearance } from "./appearance/setters" import { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from "@utils" @@ -6,15 +6,6 @@ import { QBBridge } from "./bridge/qb" import { ESXBridge } from "./bridge/esx" import { illeniumCompat } from "./compat/illenium" -RegisterCommand('openMenu', async (_, args: string[]) => { - const type = args[0] - if (!type) { - exports.bl_appearance.InitialCreation() - } else { - const zone = type.toLowerCase() as TMenuTypes - openMenu({ type: zone, coords: [0, 0, 0, 0] }) - } -}, true) exports('SetPedAppearance', async (ped: number, appearance: TAppearance) => { await setPedAppearance(ped, appearance) diff --git a/src/client/menu.ts b/src/client/menu.ts index 4979c72..638a6ac 100644 --- a/src/client/menu.ts +++ b/src/client/menu.ts @@ -1,6 +1,6 @@ import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from "@utils" import { startCamera, stopCamera } from "./camera" -import type { TAppearanceZone } from "@typings/appearance" +import type { TAppearanceZone, TMenuTypes } from "@typings/appearance" import { Outfit } from "@typings/outfits" import { Send } from "@events" import { getAppearance, getTattooData } from "./appearance/getters" @@ -14,7 +14,7 @@ let open = false let resolvePromise = null; let promise = null; -export async function openMenu(zone: TAppearanceZone, creation: boolean = false) { +export async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) { if (zone === null || open) { return; } @@ -22,14 +22,15 @@ export async function openMenu(zone: TAppearanceZone, creation: boolean = false) let pedHandle = PlayerPedId() const configMenus = config.menus() - const type = zone.type + const isString = typeof zone === 'string' + + const type = isString ? zone : zone.type const menu = configMenus[type] if (!menu) return updatePed(pedHandle) - const frameworkdId = getFrameworkID() const tabs = menu.tabs let allowExit = creation ? false : menu.allowExit @@ -54,7 +55,7 @@ export async function openMenu(zone: TAppearanceZone, creation: boolean = false) tattoos = getTattooData() } - const blacklist = getBlacklist(zone) + const blacklist = !isString ? getBlacklist(zone) : {} if (creation) { const model = GetHashKey(getPlayerGenderModel()); @@ -82,8 +83,10 @@ export async function openMenu(zone: TAppearanceZone, creation: boolean = false) job: getJobInfo(), locale: await requestLocale('locale') }) + SetNuiFocus(true, true) sendNUIEvent(Send.visible, true) + open = true exports.bl_appearance.hideHud(true) @@ -98,7 +101,18 @@ export async function openMenu(zone: TAppearanceZone, creation: boolean = false) return true } -exports('openMenu', openMenu) +exports('OpenMenu', openMenu) + +RegisterCommand('appearance', async (_, args: string[]) => { + const type = args[0] + if (!type) { + exports.bl_appearance.InitialCreation() + } else { + const zone = type.toLowerCase() as TMenuTypes + openMenu(zone) + } +}, true) + function getBlacklist(zone: TAppearanceZone) { if (!zone) return {} From 9f35eb6bfccecb8dd3cc97bdd2a45dfa25b4eb8c Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:00:41 +1000 Subject: [PATCH 03/30] ref(exports and callback): Refactor to export and onClientCallback all server functions --- build/index.js | 2 +- data/config.lua | 2 + dist/client/init.js | 2 +- dist/server/init.js | 2 +- src/client/events.ts | 2 +- src/client/handlers.ts | 23 ++- src/server/init.ts | 303 ++++++++++++++++++++--------------- src/server/utils/index.ts | 18 ++- web/src/enums/events.ts | 2 +- web/src/stores/appearance.ts | 2 +- 10 files changed, 213 insertions(+), 145 deletions(-) diff --git a/build/index.js b/build/index.js index aed0f4c..8c4b5b9 100644 --- a/build/index.js +++ b/build/index.js @@ -1,7 +1,7 @@ var Ir=Object.defineProperty;var kr=(t,e,r)=>e in t?Ir(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var Je=(t,e,r)=>(kr(t,typeof e!="symbol"?e+"":e,r),r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();const yr="modulepreload",Lr=function(t,e){return new URL(t,e).href},kt={},d=function(e,r,n){if(!r||r.length===0)return e();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=Lr(o,n),o in kt)return;kt[o]=!0;const l=o.endsWith(".css"),s=l?'[rel="stylesheet"]':"";if(!!n)for(let f=i.length-1;f>=0;f--){const _=i[f];if(_.href===o&&(!l||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${s}`))return;const u=document.createElement("link");if(u.rel=l?"stylesheet":yr,l||(u.as="script",u.crossOrigin=""),u.href=o,document.head.appendChild(u),l)return new Promise((f,_)=>{u.addEventListener("load",f),u.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>e()).catch(o=>{const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o})};function w(){}const Ge=t=>t;function te(t,e){for(const r in e)t[r]=e[r];return t}function Or(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}function Xt(t){return t()}function yt(){return Object.create(null)}function ge(t){t.forEach(Xt)}function Ze(t){return typeof t=="function"}function Q(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}function Tr(t){return Object.keys(t).length===0}function Yt(t,...e){if(t==null){for(const n of e)n(void 0);return w}const r=t.subscribe(...e);return r.unsubscribe?()=>r.unsubscribe():r}function Ie(t){let e;return Yt(t,r=>e=r)(),e}function _e(t,e,r){t.$$.on_destroy.push(Yt(e,r))}function Pr(t,e,r,n){if(t){const i=Qt(t,e,r,n);return t[0](i)}}function Qt(t,e,r,n){return t[1]&&n?te(r.ctx.slice(),t[1](n(e))):r.ctx}function Cr(t,e,r,n){if(t[2]&&n){const i=t[2](n(r));if(e.dirty===void 0)return i;if(typeof i=="object"){const o=[],l=Math.max(e.dirty.length,i.length);for(let s=0;s32){const e=[],r=t.ctx.length/32;for(let n=0;nwindow.performance.now():()=>Date.now(),ot=xt?t=>requestAnimationFrame(t):w;const Pe=new Set;function er(t){Pe.forEach(e=>{e.c(t)||(Pe.delete(e),e.f())}),Pe.size!==0&&ot(er)}function lt(t){let e;return Pe.size===0&&ot(er),{promise:new Promise(r=>{Pe.add(e={c:t,f:r})}),abort(){Pe.delete(e)}}}function h(t,e){t.appendChild(e)}function tr(t){if(!t)return document;const e=t.getRootNode?t.getRootNode():t.ownerDocument;return e&&e.host?e:t.ownerDocument}function Rr(t){const e=T("style");return e.textContent="/* empty */",Dr(tr(t),e),e.sheet}function Dr(t,e){return h(t.head||t,e),e.sheet}function P(t,e,r){t.insertBefore(e,r||null)}function O(t){t.parentNode&&t.parentNode.removeChild(t)}function Mr(t,e){for(let r=0;rt.removeEventListener(e,r,n)}function c(t,e,r){r==null?t.removeAttribute(e):t.getAttribute(e)!==r&&t.setAttribute(e,r)}function Pi(t){return t===""?null:+t}function Sr(t){return Array.from(t.childNodes)}function pe(t,e){e=""+e,t.data!==e&&(t.data=e)}function Ci(t,e){t.value=e??""}function he(t,e,r,n){r==null?t.style.removeProperty(e):t.style.setProperty(e,r,n?"important":"")}function rr(t,e,{bubbles:r=!1,cancelable:n=!1}={}){return new CustomEvent(t,{detail:e,bubbles:r,cancelable:n})}function Ot(t,e){return new t(e)}const Be=new Map;let Fe=0;function Hr(t){let e=5381,r=t.length;for(;r--;)e=(e<<5)-e^t.charCodeAt(r);return e>>>0}function jr(t,e){const r={stylesheet:Rr(e),rules:{}};return Be.set(t,r),r}function Ye(t,e,r,n,i,o,l,s=0){const a=16.666/n;let u=`{ `;for(let I=0;I<=1;I+=a){const k=e+(r-e)*o(I);u+=I*100+`%{${l(k,1-k)}} `}const f=u+`100% {${l(r,1-r)}} -}`,_=`__svelte_${Hr(f)}_${s}`,p=tr(t),{stylesheet:g,rules:m}=Be.get(p)||jr(p,t);m[_]||(m[_]=!0,g.insertRule(`@keyframes ${_} ${f}`,g.cssRules.length));const E=t.style.animation||"";return t.style.animation=`${E?`${E}, `:""}${_} ${n}ms linear ${i}ms 1 both`,Fe+=1,_}function nr(t,e){const r=(t.style.animation||"").split(", "),n=r.filter(e?o=>o.indexOf(e)<0:o=>o.indexOf("__svelte")===-1),i=r.length-n.length;i&&(t.style.animation=n.join(", "),Fe-=i,Fe||Nr())}function Nr(){ot(()=>{Fe||(Be.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&O(e)}),Be.clear())})}let Re;function Ee(t){Re=t}function qe(){if(!Re)throw new Error("Function called outside component initialization");return Re}function Ue(t){qe().$$.on_mount.push(t)}function Br(t){qe().$$.on_destroy.push(t)}function Fr(){const t=qe();return(e,r,{cancelable:n=!1}={})=>{const i=t.$$.callbacks[e];if(i){const o=rr(e,r,{cancelable:n});return i.slice().forEach(l=>{l.call(t,o)}),!o.defaultPrevented}return!0}}const Te=[],Tt=[];let Ce=[];const Qe=[],Ur=Promise.resolve();let xe=!1;function Wr(){xe||(xe=!0,Ur.then(st))}function ee(t){Ce.push(t)}function $i(t){Qe.push(t)}const Ke=new Set;let Le=0;function st(){if(Le!==0)return;const t=Re;do{try{for(;Let.indexOf(n)===-1?e.push(n):r.push(n)),r.forEach(n=>n()),Ce=e}let Ae;function ir(){return Ae||(Ae=Promise.resolve(),Ae.then(()=>{Ae=null})),Ae}function Ve(t,e,r){t.dispatchEvent(rr(`${e?"intro":"outro"}${r}`))}const Ne=new Set;let ve;function re(){ve={r:0,c:[],p:ve}}function ne(){ve.r||ge(ve.c),ve=ve.p}function v(t,e){t&&t.i&&(Ne.delete(t),t.i(e))}function b(t,e,r,n){if(t&&t.o){if(Ne.has(t))return;Ne.add(t),ve.c.push(()=>{Ne.delete(t),n&&(r&&t.d(1),n())}),t.o(e)}else n&&n()}const or={duration:0};function Zr(t,e,r){const n={direction:"out"};let i=e(t,r,n),o=!0,l;const s=ve;s.r+=1;let a;function u(){const{delay:f=0,duration:_=300,easing:p=Ge,tick:g=w,css:m}=i||or;m&&(l=Ye(t,1,0,_,f,p,m));const E=it()+f,I=E+_;ee(()=>Ve(t,!1,"start")),"inert"in t&&(a=t.inert,t.inert=!0),lt(k=>{if(o){if(k>=I)return g(0,1),Ve(t,!1,"end"),--s.r||ge(s.c),!1;if(k>=E){const L=p((k-E)/_);g(1-L,L)}}return o})}return Ze(i)?ir().then(()=>{i=i(n),u()}):u(),{end(f){f&&"inert"in t&&(t.inert=a),f&&i.tick&&i.tick(1,0),o&&(l&&nr(t,l),o=!1)}}}function N(t,e,r,n){let o=e(t,r,{direction:"both"}),l=n?0:1,s=null,a=null,u=null,f;function _(){u&&nr(t,u)}function p(m,E){const I=m.b-l;return E*=Math.abs(I),{a:l,b:m.b,d:I,duration:E,start:m.start,end:m.start+E,group:m.group}}function g(m){const{delay:E=0,duration:I=300,easing:k=Ge,tick:L=w,css:R}=o||or,A={start:it()+E,b:m};m||(A.group=ve,ve.r+=1),"inert"in t&&(m?f!==void 0&&(t.inert=f):(f=t.inert,t.inert=!0)),s||a?a=A:(R&&(_(),u=Ye(t,l,m,I,E,k,R)),m&&L(0,1),s=p(A,I),ee(()=>Ve(t,m,"start")),lt(C=>{if(a&&C>a.start&&(s=p(a,I),a=null,Ve(t,s.b,"start"),R&&(_(),u=Ye(t,l,s.b,s.duration,0,k,o.css))),s){if(C>=s.end)L(l=s.b,1-l),Ve(t,s.b,"end"),a||(s.b?_():--s.group.r||ge(s.group.c)),s=null;else if(C>=s.start){const M=C-s.start;l=s.a+s.d*k(M/s.duration),L(l,1-l)}}return!!(s||a)}))}return{run(m){Ze(o)?ir().then(()=>{o=o({direction:m?"in":"out"}),g(m)}):g(m)},end(){_(),s=a=null}}}function et(t,e){const r=e.token={};function n(i,o,l,s){if(e.token!==r)return;e.resolved=s;let a=e.ctx;l!==void 0&&(a=a.slice(),a[l]=s);const u=i&&(e.current=i)(a);let f=!1;e.block&&(e.blocks?e.blocks.forEach((_,p)=>{p!==o&&_&&(re(),b(_,1,1,()=>{e.blocks[p]===_&&(e.blocks[p]=null)}),ne())}):e.block.d(1),u.c(),v(u,1),u.m(e.mount(),e.anchor),f=!0),e.block=u,e.blocks&&(e.blocks[o]=u),f&&st()}if(Or(t)){const i=qe();if(t.then(o=>{Ee(i),n(e.then,1,e.value,o),Ee(null)},o=>{if(Ee(i),n(e.catch,2,e.error,o),Ee(null),!e.hasCatch)throw o}),e.current!==e.pending)return n(e.pending,0),!0}else{if(e.current!==e.then)return n(e.then,1,e.value,t),!0;e.resolved=t}}function qr(t,e,r){const n=e.slice(),{resolved:i}=t;t.current===t.then&&(n[t.value]=i),t.current===t.catch&&(n[t.error]=i),t.block.p(n,r)}function We(t){return(t==null?void 0:t.length)!==void 0?t:Array.from(t)}function Ai(t,e){t.d(1),e.delete(t.key)}function Jr(t,e){b(t,1,1,()=>{e.delete(t.key)})}function Kr(t,e,r,n,i,o,l,s,a,u,f,_){let p=t.length,g=o.length,m=p;const E={};for(;m--;)E[t[m].key]=m;const I=[],k=new Map,L=new Map,R=[];for(m=g;m--;){const $=_(i,o,m),x=r($);let H=l.get(x);H?n&&R.push(()=>H.p($,e)):(H=u(x,$),H.c()),k.set(x,I[m]=H),x in E&&L.set(x,Math.abs(m-E[x]))}const A=new Set,C=new Set;function M($){v($,1),$.m(s,f),l.set($.key,$),f=$.first,g--}for(;p&&g;){const $=I[g-1],x=t[p-1],H=$.key,V=x.key;$===x?(f=$.first,p--,g--):k.has(V)?!l.has(H)||A.has(H)?M($):C.has(V)?p--:L.get(H)>L.get(V)?(C.add(H),M($)):(A.add(V),p--):(a(x,l),p--)}for(;p--;){const $=t[p];k.has($.key)||a($,l)}for(;g;)M(I[g-1]);return ge(R),I}function Vi(t,e,r){const n=t.$$.props[e];n!==void 0&&(t.$$.bound[n]=r,r(t.$$.ctx[n]))}function z(t){t&&t.c()}function B(t,e,r){const{fragment:n,after_update:i}=t.$$;n&&n.m(e,r),ee(()=>{const o=t.$$.on_mount.map(Xt).filter(Ze);t.$$.on_destroy?t.$$.on_destroy.push(...o):ge(o),t.$$.on_mount=[]}),i.forEach(ee)}function F(t,e){const r=t.$$;r.fragment!==null&&(Gr(r.after_update),ge(r.on_destroy),r.fragment&&r.fragment.d(e),r.on_destroy=r.fragment=null,r.ctx=[])}function Xr(t,e){t.$$.dirty[0]===-1&&(Te.push(t),Wr(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const m=g.length?g[0]:p;return u.ctx&&i(u.ctx[_],u.ctx[_]=m)&&(!u.skip_bound&&u.bound[_]&&u.bound[_](m),f&&Xr(t,_)),p}):[],u.update(),f=!0,ge(u.before_update),u.fragment=n?n(u.ctx):!1,e.target){if(e.hydrate){const _=Sr(e.target);u.fragment&&u.fragment.l(_),_.forEach(O)}else u.fragment&&u.fragment.c();e.intro&&v(t.$$.fragment),B(t,e.target,e.anchor),st()}Ee(a)}class le{constructor(){Je(this,"$$");Je(this,"$$set")}$destroy(){F(this,1),this.$destroy=w}$on(e,r){if(!Ze(r))return w;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(r),()=>{const i=n.indexOf(r);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!Tr(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const Yr="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Yr);const Oe=[];function se(t,e=w){let r;const n=new Set;function i(s){if(Q(t,s)&&(t=s,r)){const a=!Oe.length;for(const u of n)u[1](),Oe.push(u,t);if(a){for(let u=0;u{n.delete(u),n.size===0&&r&&(r(),r=null)}}return{set:i,update:o,subscribe:l}}const lr=se({fallbackResourceName:"debug",allowEscapeKey:!0}),Qr=se(window.GetParentResourceName?window.GetParentResourceName():Ie(lr).DEBUG_RESOURCE_NAME),sr=se(!window.invokeNative),Pt=se(!1);var ze=(t=>(t.visible="appearance:visible",t.data="appearance:data",t))(ze||{}),q=(t=>(t.setModel="appearance:setModel",t.setHeadStructure="appearance:setHeadStructure",t.setHeadOverlay="appearance:setHeadOverlay",t.setHeadBlend="appearance:setHeadBlend",t.setProp="appearance:setProp",t.setDrawable="appearance:setDrawable",t.setTattoos="appearance:setTattoos",t.getModelTattoos="appearance:getModelTattoos",t.toggleItem="appearance:toggleItem",t.useOutfit="appearance:useOutfit",t.itemOutfit="appearance:itemOutfit",t.renameOutfit="appearance:renameOutfit",t.deleteOutfit="appearance:deleteOutfit",t.saveOutfit="appearance:saveOutfit",t.importOutfit="appearance:importOutfit",t.grabOutfit="appearance:grabOutfit",t.save="appearance:save",t.cancel="appearance:cancel",t.camZoom="appearance:camZoom",t.camMove="appearance:camMove",t.camSection="appearance:camSection",t))(q||{});const cr=Ie(sr),xr=Ie(Qr),en=[];async function J(t,e={}){if(cr==!0){const i=await tn(t,e);return Promise.resolve(i)}const r={method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(e)};return await(await fetch(`https://${xr}/${t}`,r)).json()}function ur(t,e){const r=n=>{const{action:i,data:o}=n.data;i===t&&e(o)};Ue(()=>window.addEventListener("message",r)),Br(()=>window.removeEventListener("message",r))}async function tn(t,e){if(!cr)return;const r=en[t];return r===void 0?(console.log(`[DEBUG] ${t} event does not have a debugger.`),{}):await r(e)}const rn=[{id:"heritage",label:"Heritage",icon:"IconFamily",src:"Heritage"},{id:"face",label:"Face",icon:"IconFace",src:"Face"},{id:"hair",label:"Hair",icon:"IconHair",src:"Hair"},{id:"clothes",label:"Clothes",icon:"IconShirt",src:"Clothes"},{id:"accessories",label:"Accessories",icon:"IconWatch",src:"Accessories"},{id:"makeup",label:"Make Up",icon:"IconMakeup",src:"MakeUp"},{id:"tattoos",label:"Tattoos",icon:"IconTattoos",src:"Tattoos"},{id:"outfits",label:"Outfits",icon:"IconHanger",src:"Outfits"}],ar=se([]),ct=se(null),De=se(null),nn=se({models:!0,drawables:!0}),tt=se(!0),on=se(null),ln=se({name:"",isBoss:!1}),ut=se(null),sn=se(null),cn=()=>{const t=se(null),e={get:()=>Ie(t),set:r=>t.set(r),reset:()=>t.set(null),save:(r,n)=>{const i=Me.get(),o={drawables:i.drawables,props:i.props,headOverlay:i.headOverlay};J(q.saveOutfit,{label:r,outfit:o,job:n}).then(l=>{if(!l)return;const s=e.get();s.push({id:s.length+1,label:r,outfit:JSON.parse(JSON.stringify(o))}),t.set(s)})},edit:r=>{const{label:n,id:i}=r;J(q.renameOutfit,{label:n,id:i}).then(o=>{o&&t.update(l=>{const s=l.findIndex(a=>a.id===i);return l[s].label=n,l})})},delete:r=>{J(q.deleteOutfit,{id:r}).then(n=>{n&&t.update(i=>i.filter(o=>o.id!==r))})},use:r=>{J(q.useOutfit,r).then(n=>{n&&Me.update(i=>({...i,drawables:r.drawables,props:r.props,headOverlay:r.headOverlay}))})},import:r=>{const n=e.get(),i=`Imported Outfit ${n.length+1}`;let o=null;J(q.importOutfit,{id:r,outfitName:i}).then(({success:l,newId:s})=>{if(l)return o=s,J(q.grabOutfit,{id:o})}).then(l=>{!o||!l||(n.push({id:o,label:i,outfit:l}),t.set(n))})},share:r=>{const n=document.createElement("textarea");n.value=r.toString(),document.body.appendChild(n),n.select(),navigator.clipboard.writeText("copy"),document.body.removeChild(n)},item:(r,n)=>{J(q.itemOutfit,{outfit:r,label:n})}};return{...t,...e}},un=cn(),an=()=>{const t=se(null);return{...t,...{get:()=>Ie(t),set:r=>t.set(r),setPlayerTattoos:r=>{J(q.setTattoos,r).then(n=>{n&&Me.update(i=>(i.tattoos=r,i))})},reset:()=>t.set(null)}}},rt=an(),fn=()=>{const t=se(null),e={get:()=>Ie(t),reset:()=>t.set(null),cancel:()=>{J(q.cancel,Ie(ut))},save:()=>{J(q.save,e.get())},setModel:r=>{J(q.setModel,r).then(i=>{t.set(i)}),rt.get()&&J(q.getModelTattoos,[]).then(i=>{rt.set(i)})},setHeadBlend:r=>{J(q.setHeadBlend,r)},setHeadStructure:r=>{J(q.setHeadStructure,r)},setHeadOverlay:r=>{J(q.setHeadOverlay,r)},setEyeColor:r=>{J(q.setHeadOverlay,r)},setHairColor:r=>{J(q.setHeadOverlay,{hairColor:r.color,hairHighlight:r.highlight,id:"hairColor"})},isPropFetching:!1,setProp:(r,n,i)=>{e.isPropFetching||(e.isPropFetching=!0,i?r.texture=n:r.value=n,J(q.setProp,{value:r.value,index:r.index,texture:r.texture,isTexture:i}).then(o=>{t.update(l=>(i||(l.propTotal[r.id].textures=o,r.texture=0),l.props[r.id]=r,l)),e.isPropFetching=!1}))},isDrawableFetching:!1,setDrawable:async(r,n,i)=>{e.isDrawableFetching||(e.isDrawableFetching=!0,i?r.texture=n:r.value=n,J(q.setDrawable,{value:r.value,index:r.index,texture:r.texture,isTexture:i}).then(o=>{t.update(l=>(i||(l.drawTotal[r.id].textures=o,r.texture=0),l.drawables[r.id]=r,l)),e.isDrawableFetching=!1}))}};return{...t,...e}},Me=fn(),_n=()=>{const t=se({hats:!1,masks:!1,glasses:!1,shirts:!1,jackets:!1,vest:!1,legs:!1,shoes:!1}),e={get:()=>Ie(t),isToggling:!1,toggle:(r,n,i,o,l)=>{e.isToggling||(e.isToggling=!0,J(q.toggleItem,{item:r,toggle:n,data:i,hook:o,hookData:l}).then(s=>{t.update(a=>(a[r]=s,a)),e.isToggling=!1}))}};return{...t,...e}},Ct=_n(),dn=t=>JSON.parse(JSON.stringify(t));function Ri(){return Math.floor(Math.random()*1e10)}const mn=[{action:ze.visible,handler:t=>{}},{action:ze.data,handler:t=>{let e=[];t.locale&&ct.set(JSON.parse(t.locale)),t.tabs&&(Array.isArray(t.tabs)||(t.tabs=[t.tabs]),e=rn.filter(r=>t.tabs.includes(r.id)).reverse(),ar.set(e),De.set(e[e.length-1])),t.appearance&&(Me.set(t.appearance),ut.set(dn(t.appearance))),t.blacklist&&on.set(t.blacklist),t.tattoos&&rt.set(t.tattoos),t.models&&sn.set(t.models),t.outfits&&un.set(t.outfits),t.job&&ln.set(t.job||null),t.allowExit!==void 0?tt.set(t.allowExit):tt.set(!0)}}];function pn(){for(const t of mn)ur(t.action,t.handler)}function $t(t){let e,r;const n=t[2].default,i=Pr(n,t,t[1],null);return{c(){e=T("main"),i&&i.c(),c(e,"class","svelte-1w09ye1")},m(o,l){P(o,e,l),i&&i.m(e,null),r=!0},p(o,l){i&&i.p&&(!r||l&2)&&$r(i,n,o,o[1],r?Cr(n,o[1],l,null):Ar(o[1]),null)},i(o){r||(v(i,o),r=!0)},o(o){b(i,o),r=!1},d(o){o&&O(e),i&&i.d(o)}}}function hn(t){let e,r,n=t[0]&&$t(t);return{c(){n&&n.c(),e=ye()},m(i,o){n&&n.m(i,o),P(i,e,o),r=!0},p(i,[o]){i[0]?n?(n.p(i,o),o&1&&v(n,1)):(n=$t(i),n.c(),v(n,1),n.m(e.parentNode,e)):n&&(re(),b(n,1,1,()=>{n=null}),ne())},i(i){r||(v(n),r=!0)},o(i){b(n),r=!1},d(i){i&&O(e),n&&n.d(i)}}}function vn(t,e,r){let n;_e(t,Pt,l=>r(0,n=l));let{$$slots:i={},$$scope:o}=e;return ur(ze.visible,l=>{Vr(Pt,n=l,n)}),t.$$set=l=>{"$$scope"in l&&r(1,o=l.$$scope)},[n,o,i]}class gn extends le{constructor(e){super(),oe(this,e,vn,hn,Q,{})}}const Se=(t,e)=>{const r=t[e];return r?typeof r=="function"?r():Promise.resolve(r):new Promise((n,i)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(i.bind(null,new Error("Unknown variable dynamic import: "+e)))})};function En(t){let e,r,n,i,o,l,s,a,u;return{c(){e=W("svg"),r=W("g"),n=W("g"),i=W("g"),o=W("path"),c(r,"id","SVGRepo_bgCarrier"),c(r,"stroke-width","0"),c(n,"id","SVGRepo_tracerCarrier"),c(n,"stroke-linecap","round"),c(n,"stroke-linejoin","round"),c(o,"stroke",t[10]),c(o,"stroke-width",l=t[3]||t[4]?"0":t[5]),c(o,"d","M0,92.375l46.188-80h92.378l46.185,80l-46.185,80H46.188L0,92.375z"),c(i,"id","SVGRepo_iconCarrier"),c(e,"width",t[0]),c(e,"height",t[1]),c(e,"version","1.1"),he(e,"filter",t[6]),he(e,"transform","scale("+t[2]+")"),c(e,"class",s="origin-center transition-all duration-200 "+(t[3]?t[8]:t[7])),c(e,"xmlns","http://www.w3.org/2000/svg"),c(e,"xmlns:xlink","http://www.w3.org/1999/xlink"),c(e,"viewBox","0 0 184.751 184.751"),c(e,"xml:space","preserve")},m(f,_){P(f,e,_),h(e,r),h(e,n),h(e,i),h(i,o),a||(u=ue(e,"click",t[12]),a=!0)},p(f,[_]){_&56&&l!==(l=f[3]||f[4]?"0":f[5])&&c(o,"stroke-width",l),_&1&&c(e,"width",f[0]),_&2&&c(e,"height",f[1]),_&64&&he(e,"filter",f[6]),_&4&&he(e,"transform","scale("+f[2]+")"),_&392&&s!==(s="origin-center transition-all duration-200 "+(f[3]?f[8]:f[7]))&&c(e,"class",s)},i:w,o:w,d(f){f&&O(e),a=!1,u()}}}function bn(t,e,r){let n,i,o;const l=Fr();let{width:s="98%"}=e,{height:a="98%"}=e,{scale:u="1"}=e,{active:f=!1}=e,{disabled:_=!1}=e,{strokeWidth:p="0.5vh"}=e,{variant:g="accent"}=e,m=`var(--${g})`;const E={accent:"fill-accent",success:"fill-success",error:"fill-error"},I={accent:"fill-accent/25",success:"fill-success/25",error:"fill-error/25"},k=()=>l("click");return t.$$set=L=>{"width"in L&&r(0,s=L.width),"height"in L&&r(1,a=L.height),"scale"in L&&r(2,u=L.scale),"active"in L&&r(3,f=L.active),"disabled"in L&&r(4,_=L.disabled),"strokeWidth"in L&&r(5,p=L.strokeWidth),"variant"in L&&r(11,g=L.variant)},t.$$.update=()=>{t.$$.dirty&2048&&r(8,n=E[g]),t.$$.dirty&2048&&r(7,i=I[g]),t.$$.dirty&24&&r(6,o=f?`drop-shadow(0 0 0.5vh ${m})`:_?"":`drop-shadow(0 0 0.1vw ${m})`)},[s,a,u,f,_,p,o,i,n,l,m,g,k]}class we extends le{constructor(e){super(),oe(this,e,bn,En,Q,{width:0,height:1,scale:2,active:3,disabled:4,strokeWidth:5,variant:11})}}function At(t){return Object.prototype.toString.call(t)==="[object Date]"}function wn(t){return t<.5?4*t*t*t:.5*Math.pow(2*t-2,3)+1}function at(t){const e=t-1;return e*e*e+1}function nt(t,e){if(t===e||t!==t)return()=>t;const r=typeof t;if(r!==typeof e||Array.isArray(t)!==Array.isArray(e))throw new Error("Cannot interpolate values of different type");if(Array.isArray(t)){const n=e.map((i,o)=>nt(t[o],i));return i=>n.map(o=>o(i))}if(r==="object"){if(!t||!e)throw new Error("Object cannot be null");if(At(t)&&At(e)){t=t.getTime(),e=e.getTime();const o=e-t;return l=>new Date(t+l*o)}const n=Object.keys(e),i={};return n.forEach(o=>{i[o]=nt(t[o],e[o])}),o=>{const l={};return n.forEach(s=>{l[s]=i[s](o)}),l}}if(r==="number"){const n=e-t;return i=>t+i*n}throw new Error(`Cannot interpolate ${r} values`)}function In(t,e={}){const r=se(t);let n,i=t;function o(l,s){if(t==null)return r.set(t=l),Promise.resolve();i=l;let a=n,u=!1,{delay:f=0,duration:_=400,easing:p=Ge,interpolate:g=nt}=te(te({},e),s);if(_===0)return a&&(a.abort(),a=null),r.set(t=i),Promise.resolve();const m=it()+f;let E;return n=lt(I=>{if(I_?(r.set(t=l),!1):(r.set(t=E(p(k/_))),!0)}),n.promise}return{set:o,update:(l,s)=>o(l(i,t),s),subscribe:r.subscribe}}function He(t,{delay:e=0,duration:r=400,easing:n=Ge}={}){const i=+getComputedStyle(t).opacity;return{delay:e,duration:r,easing:n,css:o=>`opacity: ${o*i}`}}function $e(t,{delay:e=0,duration:r=400,easing:n=at,x:i=0,y:o=0,opacity:l=0}={}){const s=getComputedStyle(t),a=+s.opacity,u=s.transform==="none"?"":s.transform,f=a*(1-l),[_,p]=Lt(i),[g,m]=Lt(o);return{delay:e,duration:r,easing:n,css:(E,I)=>` +}`,_=`__svelte_${Hr(f)}_${s}`,p=tr(t),{stylesheet:g,rules:m}=Be.get(p)||jr(p,t);m[_]||(m[_]=!0,g.insertRule(`@keyframes ${_} ${f}`,g.cssRules.length));const E=t.style.animation||"";return t.style.animation=`${E?`${E}, `:""}${_} ${n}ms linear ${i}ms 1 both`,Fe+=1,_}function nr(t,e){const r=(t.style.animation||"").split(", "),n=r.filter(e?o=>o.indexOf(e)<0:o=>o.indexOf("__svelte")===-1),i=r.length-n.length;i&&(t.style.animation=n.join(", "),Fe-=i,Fe||Nr())}function Nr(){ot(()=>{Fe||(Be.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&O(e)}),Be.clear())})}let Re;function Ee(t){Re=t}function qe(){if(!Re)throw new Error("Function called outside component initialization");return Re}function Ue(t){qe().$$.on_mount.push(t)}function Br(t){qe().$$.on_destroy.push(t)}function Fr(){const t=qe();return(e,r,{cancelable:n=!1}={})=>{const i=t.$$.callbacks[e];if(i){const o=rr(e,r,{cancelable:n});return i.slice().forEach(l=>{l.call(t,o)}),!o.defaultPrevented}return!0}}const Te=[],Tt=[];let Ce=[];const Qe=[],Ur=Promise.resolve();let xe=!1;function Wr(){xe||(xe=!0,Ur.then(st))}function ee(t){Ce.push(t)}function $i(t){Qe.push(t)}const Ke=new Set;let Le=0;function st(){if(Le!==0)return;const t=Re;do{try{for(;Let.indexOf(n)===-1?e.push(n):r.push(n)),r.forEach(n=>n()),Ce=e}let Ae;function ir(){return Ae||(Ae=Promise.resolve(),Ae.then(()=>{Ae=null})),Ae}function Ve(t,e,r){t.dispatchEvent(rr(`${e?"intro":"outro"}${r}`))}const Ne=new Set;let ve;function re(){ve={r:0,c:[],p:ve}}function ne(){ve.r||ge(ve.c),ve=ve.p}function v(t,e){t&&t.i&&(Ne.delete(t),t.i(e))}function b(t,e,r,n){if(t&&t.o){if(Ne.has(t))return;Ne.add(t),ve.c.push(()=>{Ne.delete(t),n&&(r&&t.d(1),n())}),t.o(e)}else n&&n()}const or={duration:0};function Zr(t,e,r){const n={direction:"out"};let i=e(t,r,n),o=!0,l;const s=ve;s.r+=1;let a;function u(){const{delay:f=0,duration:_=300,easing:p=Ge,tick:g=w,css:m}=i||or;m&&(l=Ye(t,1,0,_,f,p,m));const E=it()+f,I=E+_;ee(()=>Ve(t,!1,"start")),"inert"in t&&(a=t.inert,t.inert=!0),lt(k=>{if(o){if(k>=I)return g(0,1),Ve(t,!1,"end"),--s.r||ge(s.c),!1;if(k>=E){const L=p((k-E)/_);g(1-L,L)}}return o})}return Ze(i)?ir().then(()=>{i=i(n),u()}):u(),{end(f){f&&"inert"in t&&(t.inert=a),f&&i.tick&&i.tick(1,0),o&&(l&&nr(t,l),o=!1)}}}function N(t,e,r,n){let o=e(t,r,{direction:"both"}),l=n?0:1,s=null,a=null,u=null,f;function _(){u&&nr(t,u)}function p(m,E){const I=m.b-l;return E*=Math.abs(I),{a:l,b:m.b,d:I,duration:E,start:m.start,end:m.start+E,group:m.group}}function g(m){const{delay:E=0,duration:I=300,easing:k=Ge,tick:L=w,css:R}=o||or,A={start:it()+E,b:m};m||(A.group=ve,ve.r+=1),"inert"in t&&(m?f!==void 0&&(t.inert=f):(f=t.inert,t.inert=!0)),s||a?a=A:(R&&(_(),u=Ye(t,l,m,I,E,k,R)),m&&L(0,1),s=p(A,I),ee(()=>Ve(t,m,"start")),lt(C=>{if(a&&C>a.start&&(s=p(a,I),a=null,Ve(t,s.b,"start"),R&&(_(),u=Ye(t,l,s.b,s.duration,0,k,o.css))),s){if(C>=s.end)L(l=s.b,1-l),Ve(t,s.b,"end"),a||(s.b?_():--s.group.r||ge(s.group.c)),s=null;else if(C>=s.start){const M=C-s.start;l=s.a+s.d*k(M/s.duration),L(l,1-l)}}return!!(s||a)}))}return{run(m){Ze(o)?ir().then(()=>{o=o({direction:m?"in":"out"}),g(m)}):g(m)},end(){_(),s=a=null}}}function et(t,e){const r=e.token={};function n(i,o,l,s){if(e.token!==r)return;e.resolved=s;let a=e.ctx;l!==void 0&&(a=a.slice(),a[l]=s);const u=i&&(e.current=i)(a);let f=!1;e.block&&(e.blocks?e.blocks.forEach((_,p)=>{p!==o&&_&&(re(),b(_,1,1,()=>{e.blocks[p]===_&&(e.blocks[p]=null)}),ne())}):e.block.d(1),u.c(),v(u,1),u.m(e.mount(),e.anchor),f=!0),e.block=u,e.blocks&&(e.blocks[o]=u),f&&st()}if(Or(t)){const i=qe();if(t.then(o=>{Ee(i),n(e.then,1,e.value,o),Ee(null)},o=>{if(Ee(i),n(e.catch,2,e.error,o),Ee(null),!e.hasCatch)throw o}),e.current!==e.pending)return n(e.pending,0),!0}else{if(e.current!==e.then)return n(e.then,1,e.value,t),!0;e.resolved=t}}function qr(t,e,r){const n=e.slice(),{resolved:i}=t;t.current===t.then&&(n[t.value]=i),t.current===t.catch&&(n[t.error]=i),t.block.p(n,r)}function We(t){return(t==null?void 0:t.length)!==void 0?t:Array.from(t)}function Ai(t,e){t.d(1),e.delete(t.key)}function Jr(t,e){b(t,1,1,()=>{e.delete(t.key)})}function Kr(t,e,r,n,i,o,l,s,a,u,f,_){let p=t.length,g=o.length,m=p;const E={};for(;m--;)E[t[m].key]=m;const I=[],k=new Map,L=new Map,R=[];for(m=g;m--;){const $=_(i,o,m),x=r($);let H=l.get(x);H?n&&R.push(()=>H.p($,e)):(H=u(x,$),H.c()),k.set(x,I[m]=H),x in E&&L.set(x,Math.abs(m-E[x]))}const A=new Set,C=new Set;function M($){v($,1),$.m(s,f),l.set($.key,$),f=$.first,g--}for(;p&&g;){const $=I[g-1],x=t[p-1],H=$.key,V=x.key;$===x?(f=$.first,p--,g--):k.has(V)?!l.has(H)||A.has(H)?M($):C.has(V)?p--:L.get(H)>L.get(V)?(C.add(H),M($)):(A.add(V),p--):(a(x,l),p--)}for(;p--;){const $=t[p];k.has($.key)||a($,l)}for(;g;)M(I[g-1]);return ge(R),I}function Vi(t,e,r){const n=t.$$.props[e];n!==void 0&&(t.$$.bound[n]=r,r(t.$$.ctx[n]))}function z(t){t&&t.c()}function B(t,e,r){const{fragment:n,after_update:i}=t.$$;n&&n.m(e,r),ee(()=>{const o=t.$$.on_mount.map(Xt).filter(Ze);t.$$.on_destroy?t.$$.on_destroy.push(...o):ge(o),t.$$.on_mount=[]}),i.forEach(ee)}function F(t,e){const r=t.$$;r.fragment!==null&&(Gr(r.after_update),ge(r.on_destroy),r.fragment&&r.fragment.d(e),r.on_destroy=r.fragment=null,r.ctx=[])}function Xr(t,e){t.$$.dirty[0]===-1&&(Te.push(t),Wr(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const m=g.length?g[0]:p;return u.ctx&&i(u.ctx[_],u.ctx[_]=m)&&(!u.skip_bound&&u.bound[_]&&u.bound[_](m),f&&Xr(t,_)),p}):[],u.update(),f=!0,ge(u.before_update),u.fragment=n?n(u.ctx):!1,e.target){if(e.hydrate){const _=Sr(e.target);u.fragment&&u.fragment.l(_),_.forEach(O)}else u.fragment&&u.fragment.c();e.intro&&v(t.$$.fragment),B(t,e.target,e.anchor),st()}Ee(a)}class le{constructor(){Je(this,"$$");Je(this,"$$set")}$destroy(){F(this,1),this.$destroy=w}$on(e,r){if(!Ze(r))return w;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(r),()=>{const i=n.indexOf(r);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!Tr(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const Yr="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Yr);const Oe=[];function se(t,e=w){let r;const n=new Set;function i(s){if(Q(t,s)&&(t=s,r)){const a=!Oe.length;for(const u of n)u[1](),Oe.push(u,t);if(a){for(let u=0;u{n.delete(u),n.size===0&&r&&(r(),r=null)}}return{set:i,update:o,subscribe:l}}const lr=se({fallbackResourceName:"debug",allowEscapeKey:!0}),Qr=se(window.GetParentResourceName?window.GetParentResourceName():Ie(lr).DEBUG_RESOURCE_NAME),sr=se(!window.invokeNative),Pt=se(!1);var ze=(t=>(t.visible="appearance:visible",t.data="appearance:data",t))(ze||{}),q=(t=>(t.setModel="appearance:setModel",t.setHeadStructure="appearance:setHeadStructure",t.setHeadOverlay="appearance:setHeadOverlay",t.setHeadBlend="appearance:setHeadBlend",t.setProp="appearance:setProp",t.setDrawable="appearance:setDrawable",t.setTattoos="appearance:setTattoos",t.getModelTattoos="appearance:getModelTattoos",t.toggleItem="appearance:toggleItem",t.useOutfit="appearance:useOutfit",t.itemOutfit="appearance:itemOutfit",t.renameOutfit="appearance:renameOutfit",t.deleteOutfit="appearance:deleteOutfit",t.saveOutfit="appearance:saveOutfit",t.importOutfit="appearance:importOutfit",t.fetchOutfit="appearance:fetchOutfit",t.save="appearance:save",t.cancel="appearance:cancel",t.camZoom="appearance:camZoom",t.camMove="appearance:camMove",t.camSection="appearance:camSection",t))(q||{});const cr=Ie(sr),xr=Ie(Qr),en=[];async function J(t,e={}){if(cr==!0){const i=await tn(t,e);return Promise.resolve(i)}const r={method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(e)};return await(await fetch(`https://${xr}/${t}`,r)).json()}function ur(t,e){const r=n=>{const{action:i,data:o}=n.data;i===t&&e(o)};Ue(()=>window.addEventListener("message",r)),Br(()=>window.removeEventListener("message",r))}async function tn(t,e){if(!cr)return;const r=en[t];return r===void 0?(console.log(`[DEBUG] ${t} event does not have a debugger.`),{}):await r(e)}const rn=[{id:"heritage",label:"Heritage",icon:"IconFamily",src:"Heritage"},{id:"face",label:"Face",icon:"IconFace",src:"Face"},{id:"hair",label:"Hair",icon:"IconHair",src:"Hair"},{id:"clothes",label:"Clothes",icon:"IconShirt",src:"Clothes"},{id:"accessories",label:"Accessories",icon:"IconWatch",src:"Accessories"},{id:"makeup",label:"Make Up",icon:"IconMakeup",src:"MakeUp"},{id:"tattoos",label:"Tattoos",icon:"IconTattoos",src:"Tattoos"},{id:"outfits",label:"Outfits",icon:"IconHanger",src:"Outfits"}],ar=se([]),ct=se(null),De=se(null),nn=se({models:!0,drawables:!0}),tt=se(!0),on=se(null),ln=se({name:"",isBoss:!1}),ut=se(null),sn=se(null),cn=()=>{const t=se(null),e={get:()=>Ie(t),set:r=>t.set(r),reset:()=>t.set(null),save:(r,n)=>{const i=Me.get(),o={drawables:i.drawables,props:i.props,headOverlay:i.headOverlay};J(q.saveOutfit,{label:r,outfit:o,job:n}).then(l=>{if(!l)return;const s=e.get();s.push({id:s.length+1,label:r,outfit:JSON.parse(JSON.stringify(o))}),t.set(s)})},edit:r=>{const{label:n,id:i}=r;J(q.renameOutfit,{label:n,id:i}).then(o=>{o&&t.update(l=>{const s=l.findIndex(a=>a.id===i);return l[s].label=n,l})})},delete:r=>{J(q.deleteOutfit,{id:r}).then(n=>{n&&t.update(i=>i.filter(o=>o.id!==r))})},use:r=>{J(q.useOutfit,r).then(n=>{n&&Me.update(i=>({...i,drawables:r.drawables,props:r.props,headOverlay:r.headOverlay}))})},import:r=>{const n=e.get(),i=`Imported Outfit ${n.length+1}`;let o=null;J(q.importOutfit,{id:r,outfitName:i}).then(({success:l,newId:s})=>{if(l)return o=s,J(q.fetchOutfit,{id:o})}).then(l=>{!o||!l||(n.push({id:o,label:i,outfit:l}),t.set(n))})},share:r=>{const n=document.createElement("textarea");n.value=r.toString(),document.body.appendChild(n),n.select(),navigator.clipboard.writeText("copy"),document.body.removeChild(n)},item:(r,n)=>{J(q.itemOutfit,{outfit:r,label:n})}};return{...t,...e}},un=cn(),an=()=>{const t=se(null);return{...t,...{get:()=>Ie(t),set:r=>t.set(r),setPlayerTattoos:r=>{J(q.setTattoos,r).then(n=>{n&&Me.update(i=>(i.tattoos=r,i))})},reset:()=>t.set(null)}}},rt=an(),fn=()=>{const t=se(null),e={get:()=>Ie(t),reset:()=>t.set(null),cancel:()=>{J(q.cancel,Ie(ut))},save:()=>{J(q.save,e.get())},setModel:r=>{J(q.setModel,r).then(i=>{t.set(i)}),rt.get()&&J(q.getModelTattoos,[]).then(i=>{rt.set(i)})},setHeadBlend:r=>{J(q.setHeadBlend,r)},setHeadStructure:r=>{J(q.setHeadStructure,r)},setHeadOverlay:r=>{J(q.setHeadOverlay,r)},setEyeColor:r=>{J(q.setHeadOverlay,r)},setHairColor:r=>{J(q.setHeadOverlay,{hairColor:r.color,hairHighlight:r.highlight,id:"hairColor"})},isPropFetching:!1,setProp:(r,n,i)=>{e.isPropFetching||(e.isPropFetching=!0,i?r.texture=n:r.value=n,J(q.setProp,{value:r.value,index:r.index,texture:r.texture,isTexture:i}).then(o=>{t.update(l=>(i||(l.propTotal[r.id].textures=o,r.texture=0),l.props[r.id]=r,l)),e.isPropFetching=!1}))},isDrawableFetching:!1,setDrawable:async(r,n,i)=>{e.isDrawableFetching||(e.isDrawableFetching=!0,i?r.texture=n:r.value=n,J(q.setDrawable,{value:r.value,index:r.index,texture:r.texture,isTexture:i}).then(o=>{t.update(l=>(i||(l.drawTotal[r.id].textures=o,r.texture=0),l.drawables[r.id]=r,l)),e.isDrawableFetching=!1}))}};return{...t,...e}},Me=fn(),_n=()=>{const t=se({hats:!1,masks:!1,glasses:!1,shirts:!1,jackets:!1,vest:!1,legs:!1,shoes:!1}),e={get:()=>Ie(t),isToggling:!1,toggle:(r,n,i,o,l)=>{e.isToggling||(e.isToggling=!0,J(q.toggleItem,{item:r,toggle:n,data:i,hook:o,hookData:l}).then(s=>{t.update(a=>(a[r]=s,a)),e.isToggling=!1}))}};return{...t,...e}},Ct=_n(),dn=t=>JSON.parse(JSON.stringify(t));function Ri(){return Math.floor(Math.random()*1e10)}const mn=[{action:ze.visible,handler:t=>{}},{action:ze.data,handler:t=>{let e=[];t.locale&&ct.set(JSON.parse(t.locale)),t.tabs&&(Array.isArray(t.tabs)||(t.tabs=[t.tabs]),e=rn.filter(r=>t.tabs.includes(r.id)).reverse(),ar.set(e),De.set(e[e.length-1])),t.appearance&&(Me.set(t.appearance),ut.set(dn(t.appearance))),t.blacklist&&on.set(t.blacklist),t.tattoos&&rt.set(t.tattoos),t.models&&sn.set(t.models),t.outfits&&un.set(t.outfits),t.job&&ln.set(t.job||null),t.allowExit!==void 0?tt.set(t.allowExit):tt.set(!0)}}];function pn(){for(const t of mn)ur(t.action,t.handler)}function $t(t){let e,r;const n=t[2].default,i=Pr(n,t,t[1],null);return{c(){e=T("main"),i&&i.c(),c(e,"class","svelte-1w09ye1")},m(o,l){P(o,e,l),i&&i.m(e,null),r=!0},p(o,l){i&&i.p&&(!r||l&2)&&$r(i,n,o,o[1],r?Cr(n,o[1],l,null):Ar(o[1]),null)},i(o){r||(v(i,o),r=!0)},o(o){b(i,o),r=!1},d(o){o&&O(e),i&&i.d(o)}}}function hn(t){let e,r,n=t[0]&&$t(t);return{c(){n&&n.c(),e=ye()},m(i,o){n&&n.m(i,o),P(i,e,o),r=!0},p(i,[o]){i[0]?n?(n.p(i,o),o&1&&v(n,1)):(n=$t(i),n.c(),v(n,1),n.m(e.parentNode,e)):n&&(re(),b(n,1,1,()=>{n=null}),ne())},i(i){r||(v(n),r=!0)},o(i){b(n),r=!1},d(i){i&&O(e),n&&n.d(i)}}}function vn(t,e,r){let n;_e(t,Pt,l=>r(0,n=l));let{$$slots:i={},$$scope:o}=e;return ur(ze.visible,l=>{Vr(Pt,n=l,n)}),t.$$set=l=>{"$$scope"in l&&r(1,o=l.$$scope)},[n,o,i]}class gn extends le{constructor(e){super(),oe(this,e,vn,hn,Q,{})}}const Se=(t,e)=>{const r=t[e];return r?typeof r=="function"?r():Promise.resolve(r):new Promise((n,i)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(i.bind(null,new Error("Unknown variable dynamic import: "+e)))})};function En(t){let e,r,n,i,o,l,s,a,u;return{c(){e=W("svg"),r=W("g"),n=W("g"),i=W("g"),o=W("path"),c(r,"id","SVGRepo_bgCarrier"),c(r,"stroke-width","0"),c(n,"id","SVGRepo_tracerCarrier"),c(n,"stroke-linecap","round"),c(n,"stroke-linejoin","round"),c(o,"stroke",t[10]),c(o,"stroke-width",l=t[3]||t[4]?"0":t[5]),c(o,"d","M0,92.375l46.188-80h92.378l46.185,80l-46.185,80H46.188L0,92.375z"),c(i,"id","SVGRepo_iconCarrier"),c(e,"width",t[0]),c(e,"height",t[1]),c(e,"version","1.1"),he(e,"filter",t[6]),he(e,"transform","scale("+t[2]+")"),c(e,"class",s="origin-center transition-all duration-200 "+(t[3]?t[8]:t[7])),c(e,"xmlns","http://www.w3.org/2000/svg"),c(e,"xmlns:xlink","http://www.w3.org/1999/xlink"),c(e,"viewBox","0 0 184.751 184.751"),c(e,"xml:space","preserve")},m(f,_){P(f,e,_),h(e,r),h(e,n),h(e,i),h(i,o),a||(u=ue(e,"click",t[12]),a=!0)},p(f,[_]){_&56&&l!==(l=f[3]||f[4]?"0":f[5])&&c(o,"stroke-width",l),_&1&&c(e,"width",f[0]),_&2&&c(e,"height",f[1]),_&64&&he(e,"filter",f[6]),_&4&&he(e,"transform","scale("+f[2]+")"),_&392&&s!==(s="origin-center transition-all duration-200 "+(f[3]?f[8]:f[7]))&&c(e,"class",s)},i:w,o:w,d(f){f&&O(e),a=!1,u()}}}function bn(t,e,r){let n,i,o;const l=Fr();let{width:s="98%"}=e,{height:a="98%"}=e,{scale:u="1"}=e,{active:f=!1}=e,{disabled:_=!1}=e,{strokeWidth:p="0.5vh"}=e,{variant:g="accent"}=e,m=`var(--${g})`;const E={accent:"fill-accent",success:"fill-success",error:"fill-error"},I={accent:"fill-accent/25",success:"fill-success/25",error:"fill-error/25"},k=()=>l("click");return t.$$set=L=>{"width"in L&&r(0,s=L.width),"height"in L&&r(1,a=L.height),"scale"in L&&r(2,u=L.scale),"active"in L&&r(3,f=L.active),"disabled"in L&&r(4,_=L.disabled),"strokeWidth"in L&&r(5,p=L.strokeWidth),"variant"in L&&r(11,g=L.variant)},t.$$.update=()=>{t.$$.dirty&2048&&r(8,n=E[g]),t.$$.dirty&2048&&r(7,i=I[g]),t.$$.dirty&24&&r(6,o=f?`drop-shadow(0 0 0.5vh ${m})`:_?"":`drop-shadow(0 0 0.1vw ${m})`)},[s,a,u,f,_,p,o,i,n,l,m,g,k]}class we extends le{constructor(e){super(),oe(this,e,bn,En,Q,{width:0,height:1,scale:2,active:3,disabled:4,strokeWidth:5,variant:11})}}function At(t){return Object.prototype.toString.call(t)==="[object Date]"}function wn(t){return t<.5?4*t*t*t:.5*Math.pow(2*t-2,3)+1}function at(t){const e=t-1;return e*e*e+1}function nt(t,e){if(t===e||t!==t)return()=>t;const r=typeof t;if(r!==typeof e||Array.isArray(t)!==Array.isArray(e))throw new Error("Cannot interpolate values of different type");if(Array.isArray(t)){const n=e.map((i,o)=>nt(t[o],i));return i=>n.map(o=>o(i))}if(r==="object"){if(!t||!e)throw new Error("Object cannot be null");if(At(t)&&At(e)){t=t.getTime(),e=e.getTime();const o=e-t;return l=>new Date(t+l*o)}const n=Object.keys(e),i={};return n.forEach(o=>{i[o]=nt(t[o],e[o])}),o=>{const l={};return n.forEach(s=>{l[s]=i[s](o)}),l}}if(r==="number"){const n=e-t;return i=>t+i*n}throw new Error(`Cannot interpolate ${r} values`)}function In(t,e={}){const r=se(t);let n,i=t;function o(l,s){if(t==null)return r.set(t=l),Promise.resolve();i=l;let a=n,u=!1,{delay:f=0,duration:_=400,easing:p=Ge,interpolate:g=nt}=te(te({},e),s);if(_===0)return a&&(a.abort(),a=null),r.set(t=i),Promise.resolve();const m=it()+f;let E;return n=lt(I=>{if(I_?(r.set(t=l),!1):(r.set(t=E(p(k/_))),!0)}),n.promise}return{set:o,update:(l,s)=>o(l(i,t),s),subscribe:r.subscribe}}function He(t,{delay:e=0,duration:r=400,easing:n=Ge}={}){const i=+getComputedStyle(t).opacity;return{delay:e,duration:r,easing:n,css:o=>`opacity: ${o*i}`}}function $e(t,{delay:e=0,duration:r=400,easing:n=at,x:i=0,y:o=0,opacity:l=0}={}){const s=getComputedStyle(t),a=+s.opacity,u=s.transform==="none"?"":s.transform,f=a*(1-l),[_,p]=Lt(i),[g,m]=Lt(o);return{delay:e,duration:r,easing:n,css:(E,I)=>` transform: ${u} translate(${(1-E)*_}${p}, ${(1-E)*g}${m}); opacity: ${a-f*I}`}}function Di(t,{delay:e=0,duration:r=400,easing:n=at,axis:i="y"}={}){const o=getComputedStyle(t),l=+o.opacity,s=i==="y"?"height":"width",a=parseFloat(o[s]),u=i==="y"?["top","bottom"]:["left","right"],f=u.map(k=>`${k[0].toUpperCase()}${k.slice(1)}`),_=parseFloat(o[`padding${f[0]}`]),p=parseFloat(o[`padding${f[1]}`]),g=parseFloat(o[`margin${f[0]}`]),m=parseFloat(o[`margin${f[1]}`]),E=parseFloat(o[`border${f[0]}Width`]),I=parseFloat(o[`border${f[1]}Width`]);return{delay:e,duration:r,easing:n,css:k=>`overflow: hidden;opacity: ${Math.min(k*20,1)*l};${s}: ${k*a}px;padding-${u[0]}: ${k*_}px;padding-${u[1]}: ${k*p}px;margin-${u[0]}: ${k*g}px;margin-${u[1]}: ${k*m}px;border-${u[0]}-width: ${k*E}px;border-${u[1]}-width: ${k*I}px;`}}function X(t,{delay:e=0,duration:r=400,easing:n=at,start:i=0,opacity:o=0}={}){const l=getComputedStyle(t),s=+l.opacity,a=l.transform==="none"?"":l.transform,u=1-i,f=s*(1-o);return{delay:e,duration:r,easing:n,css:(_,p)=>` transform: ${a} scale(${1-u*p}); diff --git a/data/config.lua b/data/config.lua index ea21a03..8ce7913 100644 --- a/data/config.lua +++ b/data/config.lua @@ -2,6 +2,8 @@ Config = { locale = 'en', openControl = 'E', previousClothing = 'qb', -- 'illenium' | 'qb' | 'esx' | 'fivem-appearance' + + outfitItem = 'clothes', -- Item given to the player when they want to make outfit an item to use } exports('config', function() diff --git a/dist/client/init.js b/dist/client/init.js index 1fde474..9f9a8a9 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1 +1 @@ -var n=0,g=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(o=>{let a=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(a),o())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ke(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ke(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(o=>{X[r]=o})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,o,...a)=>{let s;try{s=await t(...a)}catch(i){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${i.stack}^0`)}emitNet(`_bl_cb_${r}`,o,s)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let o=exports.bl_appearance.config().locale,a=LoadResourceFile(j,`locale/${o}.json`);a||(console.error(`${o}.json not found in locale, please verify!, we used english for now!`),a=LoadResourceFile(j,"locale/en.json")),t(a)}else setTimeout(r,100)};r()});var E=exports.bl_bridge,H=()=>E.core().getPlayerData(),f=()=>H().cid,Ce=()=>H().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=H().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,oe=1,L=!1,y=1.8,h=null,C=0,I=0,x=null,te=null,ae=!1;var V="head",qe={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*y,t=(re(I)*G(C)+G(C)*re(I))/2*y,r=re(C)*y;return[e,t,r]},se=(e,t)=>{if(!L||!x||ae)return;e=e??0,t=t??0,I-=e,C+=t;let o=V==="whole"||V==="head"?89:70;C=Math.min(Math.max(C,V==="shoes"?5:-20),o);let[i,c,u]=Ae();SetCamCoord(h,x.x+i,x.y+c,x.z+u),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,ae=!0,y=t,I=r;let[o,a,s]=Ae(),i=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+o,e.y+a,e.z+s,0,0,0,70,!1,0);x=e,ae=!1,te=h,h=i,PointCamAtCoord(i,e.x,e.y,e.z),SetCamActiveWithInterp(i,te,250,0,0),await M(250),SetCamUseShallowDofMode(i,!0),SetCamNearDof(i,.4),SetCamFarDof(i,1.2),SetCamDofStrength(i,.3),Oe(i),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(L)return;L=!0,y=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",y)},Me=()=>{L&&(L=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=y)=>{let r=qe[e],o=Array.isArray(r);if(V=e,!o&&r===0){let[c,u,l]=GetEntityCoords(n,!1);ve({x:c,y:u,z:l+0},t);return}if(t>oe&&(t=oe),o){let[c,u,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,b,J]=GetPedBoneCoords(n,r[1],0,0,0);var a=(c+m)/2,s=(u+b)/2,i=(l+J)/2}else var[a,s,i]=GetPedBoneCoords(n,r,0,0,0);ve({x:a,y:s,z:i+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=V==="whole"?ne:oe,o=y+.05;y=o>=r?r:o}else if(e==="up"){let r=y-.05;y=r<=.3?.3:r}y=y,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function Ue(e){return exports.bl_appearance.models().findIndex(o=>GetHashKey(o)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:o,4:a,6:s,8:i,18:c,10:u}=new Uint32Array(t),{0:l,2:m,4:b}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:o,shapeThird:a,skinFirst:s,skinSecond:i,skinThird:u,shapeMix:l,thirdMix:b,skinMix:m,hasParent:!!c}}function Ie(e){let t={},r={};for(let o=0;o(g(PlayerPedId()),w(n)));function We(e){let[t]=K(e),[r]=Z(e),[o]=Ie(e);return{headOverlay:o,drawables:t,props:r}}exports("GetPedClothes",We);function $e(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",$e);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let a=0;a{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Ye=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Ye,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),g(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),o=N(t.shapeSecond),a=N(t.shapeThird),s=N(t.skinFirst),i=N(t.skinSecond),c=N(t.skinThird),u=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,b=t.hasParent;SetPedHeadBlendData(e,r,o,a,s,i,c,u,l,m,b)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let o=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,o,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[o,a]of Object.entries(U)){let s=a.type,i=a.index;s==="drawable"&&t[o]?GetPedDrawableVariation(n,i)!==t[o].value&&SetPedComponentVariation(n,i,t[o].value,0,0):s==="prop"&&r[o]&&GetPedPropIndex(n,i)!==r[o].value&&SetPedPropIndex(n,i,r[o].value,0,!1)}}function B(e,t){let r=t.drawables,o=t.props,a=t.headOverlay;for(let s in r){let i=r[s];_(e,i)}for(let s in o){let i=o[s];v(e,i)}for(let s in a){let i=a[s];me(e,i)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,o=t.headBlend;if(o&&W(e,o),r)for(let a in r){let s=r[a];pe(e,s)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",f(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let o=await A(n,r);g(o);let a=await w(n);a.tattoos=[],T(n,[]),t(a)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let o=e.data,a=r.type,s=r.index,i=r.hook,c=e.hookData;if(!o)return t(!1);if(a==="prop")if(GetPedPropIndex(n,s)===-1){v(n,o),t(!1);return}else{ClearPedProp(n,s),t(!0);return}else if(a==="drawable"){let u=GetPedDrawableVariation(n,s);if(o.value===r.off){t(!1);return}if(o.value===u){if(SetPedComponentVariation(n,s,r.off,0,0),i)for(let l=0;l{let r=f(),o=await d("bl_appearance:server:saveOutfit",r,e);t(o)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=f(),o=await d("bl_appearance:server:deleteOutfit",r,e);t(o)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=f(),o=await d("bl_appearance:server:renameOutfit",r,e);t(o)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let o=f(),a=await d("bl_appearance:server:importOutfit",o,e,t);r(a)});RegisterNuiCallback("appearance:grabOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:grabOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfit",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),o=ge.menus(),a=e.type,s=o[a];if(!s)return;g(r);let i=f(),c=s.tabs,u=t?!1:s.allowExit;Ee=GetPedArmour(r);let l=[];c.includes("outfits")&&(l=await d("bl_appearance:server:getOutfits",i));let b=[];c.includes("heritage")&&(b=ge.models());let R=c.includes("tattoos"),S;R&&(S=q());let D=Je(e);if(t){let je=GetHashKey(Ce());r=await A(r,je),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(ze=>{Y=ze}),g(r)}let Pe=await w(r);return De(),z("appearance:data",{tabs:c,appearance:Pe,blacklist:D,tattoos:S,outfits:l,models:b,allowExit:u,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("openMenu",O);function Je(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let o={...r},a=H();for(let s in t){let i=t[s];for(let c in i){let u=!1;if(s=="jobs"&&e.jobs&&(u=e.jobs.includes(a.job.name)),s=="gangs"&&e.gangs&&(u=e.gangs.includes(a.gang.name)),!u){let l=i[c];o=Object.assign({},o,l,{drawables:Object.assign({},o.drawables,l.drawables)})}}}return o}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await f(),o=await d("bl_appearance:server:getAppearance",r);t(o)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let o of t){let a=t[o];r.push({component_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let o of t){let a=t[o];r.push({prop_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{g(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let o={index:r.component_id,value:r.drawable,texture:r.texture};_(e,o)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let o={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,o)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}RegisterCommand("openMenu",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let o=r.toLowerCase();O({type:o,coords:[0,0,0,0]})}},!0);exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await f();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await f(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!E.core().playerLoaded();)await _e(100);let e=await f(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&E.core().playerLoaded()){let t=await f(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=E.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await f(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),o=GetPedArmour(n),a=await d("bl_appearance:server:getAppearance",e);a&&(await P(a),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,o))},!1); +var n=0,g=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(o=>{let a=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(a),o())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ke(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ke(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(o=>{X[r]=o})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,o,...a)=>{let s;try{s=await t(...a)}catch(i){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${i.stack}^0`)}emitNet(`_bl_cb_${r}`,o,s)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let o=exports.bl_appearance.config().locale,a=LoadResourceFile(j,`locale/${o}.json`);a||(console.error(`${o}.json not found in locale, please verify!, we used english for now!`),a=LoadResourceFile(j,"locale/en.json")),t(a)}else setTimeout(r,100)};r()});var E=exports.bl_bridge,H=()=>E.core().getPlayerData(),f=()=>H().cid,Ce=()=>H().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=H().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,oe=1,L=!1,y=1.8,h=null,C=0,I=0,x=null,te=null,ae=!1;var V="head",qe={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*y,t=(re(I)*G(C)+G(C)*re(I))/2*y,r=re(C)*y;return[e,t,r]},se=(e,t)=>{if(!L||!x||ae)return;e=e??0,t=t??0,I-=e,C+=t;let o=V==="whole"||V==="head"?89:70;C=Math.min(Math.max(C,V==="shoes"?5:-20),o);let[i,c,u]=Ae();SetCamCoord(h,x.x+i,x.y+c,x.z+u),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,ae=!0,y=t,I=r;let[o,a,s]=Ae(),i=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+o,e.y+a,e.z+s,0,0,0,70,!1,0);x=e,ae=!1,te=h,h=i,PointCamAtCoord(i,e.x,e.y,e.z),SetCamActiveWithInterp(i,te,250,0,0),await M(250),SetCamUseShallowDofMode(i,!0),SetCamNearDof(i,.4),SetCamFarDof(i,1.2),SetCamDofStrength(i,.3),Oe(i),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(L)return;L=!0,y=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",y)},Me=()=>{L&&(L=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=y)=>{let r=qe[e],o=Array.isArray(r);if(V=e,!o&&r===0){let[c,u,l]=GetEntityCoords(n,!1);ve({x:c,y:u,z:l+0},t);return}if(t>oe&&(t=oe),o){let[c,u,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,b,J]=GetPedBoneCoords(n,r[1],0,0,0);var a=(c+m)/2,s=(u+b)/2,i=(l+J)/2}else var[a,s,i]=GetPedBoneCoords(n,r,0,0,0);ve({x:a,y:s,z:i+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=V==="whole"?ne:oe,o=y+.05;y=o>=r?r:o}else if(e==="up"){let r=y-.05;y=r<=.3?.3:r}y=y,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function Ue(e){return exports.bl_appearance.models().findIndex(o=>GetHashKey(o)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:o,4:a,6:s,8:i,18:c,10:u}=new Uint32Array(t),{0:l,2:m,4:b}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:o,shapeThird:a,skinFirst:s,skinSecond:i,skinThird:u,shapeMix:l,thirdMix:b,skinMix:m,hasParent:!!c}}function Ie(e){let t={},r={};for(let o=0;o(g(PlayerPedId()),w(n)));function We(e){let[t]=K(e),[r]=Z(e),[o]=Ie(e);return{headOverlay:o,drawables:t,props:r}}exports("GetPedClothes",We);function $e(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",$e);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let a=0;a{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Ye=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Ye,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),g(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),o=N(t.shapeSecond),a=N(t.shapeThird),s=N(t.skinFirst),i=N(t.skinSecond),c=N(t.skinThird),u=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,b=t.hasParent;SetPedHeadBlendData(e,r,o,a,s,i,c,u,l,m,b)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let o=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,o,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[o,a]of Object.entries(U)){let s=a.type,i=a.index;s==="drawable"&&t[o]?GetPedDrawableVariation(n,i)!==t[o].value&&SetPedComponentVariation(n,i,t[o].value,0,0):s==="prop"&&r[o]&&GetPedPropIndex(n,i)!==r[o].value&&SetPedPropIndex(n,i,r[o].value,0,!1)}}function B(e,t){let r=t.drawables,o=t.props,a=t.headOverlay;for(let s in r){let i=r[s];_(e,i)}for(let s in o){let i=o[s];v(e,i)}for(let s in a){let i=a[s];me(e,i)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,o=t.headBlend;if(o&&W(e,o),r)for(let a in r){let s=r[a];pe(e,s)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",f(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let o=await A(n,r);g(o);let a=await w(n);a.tattoos=[],T(n,[]),t(a)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let o=e.data,a=r.type,s=r.index,i=r.hook,c=e.hookData;if(!o)return t(!1);if(a==="prop")if(GetPedPropIndex(n,s)===-1){v(n,o),t(!1);return}else{ClearPedProp(n,s),t(!0);return}else if(a==="drawable"){let u=GetPedDrawableVariation(n,s);if(o.value===r.off){t(!1);return}if(o.value===u){if(SetPedComponentVariation(n,s,r.off,0,0),i)for(let l=0;l{let r=f(),o=await d("bl_appearance:server:saveOutfit",r,e);t(o)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=f(),o=await d("bl_appearance:server:deleteOutfit",r,e);t(o)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=f(),o=await d("bl_appearance:server:renameOutfit",r,e);t(o)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let o=f(),a=await d("bl_appearance:server:importOutfit",o,e,t);r(a)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfit",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),o=ge.menus(),a=e.type,s=o[a];if(!s)return;g(r);let i=f(),c=s.tabs,u=t?!1:s.allowExit;Ee=GetPedArmour(r);let l=[];c.includes("outfits")&&(l=await d("bl_appearance:server:getOutfits",i));let b=[];c.includes("heritage")&&(b=ge.models());let R=c.includes("tattoos"),S;R&&(S=q());let D=Je(e);if(t){let je=GetHashKey(Ce());r=await A(r,je),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(ze=>{Y=ze}),g(r)}let Pe=await w(r);return De(),z("appearance:data",{tabs:c,appearance:Pe,blacklist:D,tattoos:S,outfits:l,models:b,allowExit:u,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("openMenu",O);function Je(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let o={...r},a=H();for(let s in t){let i=t[s];for(let c in i){let u=!1;if(s=="jobs"&&e.jobs&&(u=e.jobs.includes(a.job.name)),s=="gangs"&&e.gangs&&(u=e.gangs.includes(a.gang.name)),!u){let l=i[c];o=Object.assign({},o,l,{drawables:Object.assign({},o.drawables,l.drawables)})}}}return o}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await f(),o=await d("bl_appearance:server:getAppearance",r);t(o)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let o of t){let a=t[o];r.push({component_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let o of t){let a=t[o];r.push({prop_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{g(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let o={index:r.component_id,value:r.drawable,texture:r.texture};_(e,o)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let o={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,o)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}RegisterCommand("openMenu",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let o=r.toLowerCase();O({type:o,coords:[0,0,0,0]})}},!0);exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await f();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await f(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!E.core().playerLoaded();)await _e(100);let e=await f(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&E.core().playerLoaded()){let t=await f(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=E.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await f(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),o=GetPedArmour(n),a=await d("bl_appearance:server:getAppearance",e);a&&(await P(a),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,o))},!1); diff --git a/dist/server/init.js b/dist/server/init.js index 87e7abb..0c50781 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var W=Object.create;var v=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var A=r=>t=>{var e=r[t];if(e)return e();throw new Error("Module not found in bundle: "+t)};var m=(r,t)=>()=>(r&&(t=r(r=0)),t);var G=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports),O=(r,t)=>{for(var e in t)v(r,e,{get:t[e],enumerable:!0})},V=(r,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of U(t))!B.call(r,n)&&n!==e&&v(r,n,{get:()=>t[n],enumerable:!(a=F(t,n))||a.enumerable});return r};var g=(r,t,e)=>(e=r!=null?W(D(r)):{},V(t||!r||!r.__esModule?v(e,"default",{value:r,enumerable:!0}):e,r));function c(r,t,...e){let a;do a=`${r}:${Math.floor(Math.random()*100001)}:${t}`;while(T[a]);return emitNet(`_bl_cb_${r}`,t,R,a,...e),new Promise(n=>{T[a]=n})}function s(r,t){onNet(`_bl_cb_${r}`,async(e,a,...n)=>{let i=source,f;try{f=await t(i,...n)}catch(H){console.error(`an error occurred while handling callback event ${r}`),console.log(`^3${H.stack}^0`)}emitNet(`_bl_cb_${e}`,i,a,f)})}var R,T,y,E=m(()=>{R=GetCurrentResourceName(),T={};onNet(`_bl_cb_${R}`,(r,...t)=>{let e=T[r];return e&&e(...t)});y=exports.bl_bridge.core()});var d=G(S=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});S.oxmysql=void 0;var k=[];function w(r,t){if(!r)throw new TypeError(t)}var l=(r,t,e,a)=>{if(typeof r=="number"&&(r=k[r]),a?w(typeof r=="object",`First argument expected object, recieved ${typeof r}`):w(typeof r=="string",`First argument expected string, received ${typeof r}`),t){let n=typeof t;w(n==="object"||n==="function",`Second argument expected object or function, received ${n}`),!e&&n==="function"&&(e=t,t=void 0)}return e!==void 0&&w(typeof e=="function",`Third argument expected function, received ${typeof e}`),[r,t,e]},_=global.exports.oxmysql,z=GetCurrentResourceName();function p(r,t,e){return new Promise((a,n)=>{_[r](t,e,(i,f)=>{if(f)return n(f);a(i)},z,!0)})}S.oxmysql={store(r){return w(typeof r!="string",`Query expects a string, received ${typeof r}`),k.push(r)},ready(r){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));r()})},async query(r,t,e){[r,t,e]=l(r,t,e);let a=await p("query",r,t);return e?e(a):a},async single(r,t,e){[r,t,e]=l(r,t,e);let a=await p("single",r,t);return e?e(a):a},async scalar(r,t,e){[r,t,e]=l(r,t,e);let a=await p("scalar",r,t);return e?e(a):a},async update(r,t,e){[r,t,e]=l(r,t,e);let a=await p("update",r,t);return e?e(a):a},async insert(r,t,e){[r,t,e]=l(r,t,e);let a=await p("insert",r,t);return e?e(a):a},async prepare(r,t,e){[r,t,e]=l(r,t,e);let a=await p("prepare",r,t);return e?e(a):a},async rawExecute(r,t,e){[r,t,e]=l(r,t,e);let a=await p("rawExecute",r,t);return e?e(a):a},async transaction(r,t,e){[r,t,e]=l(r,t,e,!0);let a=await p("transaction",r,t);return e?e(a):a},isReady(){return _.isReady()},async awaitConnection(){return await _.awaitConnection()}}});var C,u,b=m(()=>{C=g(d(),1),u=async(r,t,e)=>{let a={drawables:e.drawables,props:e.props,headOverlay:e.headOverlay},n={headBlend:e.headBlend,headStructure:e.headStructure,hairColor:e.hairColor,model:e.model},i=e.tattoos||[];return await C.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(a),JSON.stringify(n),JSON.stringify(i)])}});var Q={};var N=m(()=>{});var x={};O(x,{default:()=>X});var h,K,Y,X,j=m(()=>{h=g(d(),1);E();b();K=r=>new Promise(t=>setTimeout(t,r)),Y=async r=>{let t=await h.oxmysql.query("SELECT * FROM `players`");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"fivem",data:JSON.parse(e.skin)}),await K(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},X=Y});var P={};O(P,{default:()=>ee});var L,Z,q,ee,I=m(()=>{L=g(d(),1);E();b();Z=r=>new Promise(t=>setTimeout(t,r)),q=async r=>{let t=await L.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"illenium",data:JSON.parse(e.skin)}),await Z(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ee=q});var M={};O(M,{default:()=>ae});var J,te,re,ae,$=m(()=>{J=g(d(),1);E();b();te=r=>new Promise(t=>setTimeout(t,r)),re=async r=>{let t=await J.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t){emitNet("qb-clothes:loadSkin",r,0,e.model,e.skin),await te(200);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ae=re});E();var o=g(d(),1);b();var ne=A({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(N(),Q)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(j(),x)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(I(),P)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>($(),M))});s("bl_appearance:server:getOutfits",async(r,t)=>{let e=y.GetPlayer(r).job||{name:"unknown",grade:{name:"unknown"}},a=await o.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,e.name,e.grade.name]);return a?(Array.isArray(a)||(a=[a]),a.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]});s("bl_appearance:server:renameOutfit",async(r,t,e)=>{let a=e.id,n=e.label;return await o.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[n,t,a])});s("bl_appearance:server:deleteOutfit",async(r,t,e)=>await o.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[t,e])>0);s("bl_appearance:server:saveOutfit",async(r,t,e)=>{let a=null,n=0;return e.job&&(a=e.job.name,n=e.job.rank),await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[t,e.label,JSON.stringify(e.outfit),a,n])});s("bl_appearance:server:grabOutfit",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:itemOutfit",async(r,t)=>{y.GetPlayer(r).addItem("cloth",1,t)});s("bl_appearance:server:importOutfit",async(r,t,e,a)=>{let[n]=await o.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[e]);return n?{success:!0,newId:await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,a,n.outfit])}:{success:!1,message:"Outfit not found"}});s("bl_appearance:server:saveSkin",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveClothes",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveAppearance",u);s("bl_appearance:server:saveTattoos",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:getSkin",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getClothes",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getTattoos",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(e)||[]});s("bl_appearance:server:getAppearance",async(r,t)=>{let e=await o.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!e)return null;let a={...JSON.parse(e.skin),...JSON.parse(e.clothes),...JSON.parse(e.tattoos)};return a.id=e.id,a});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async r=>{r=r!==0?r:parseInt(getPlayers()[0]);let e=exports.bl_appearance.config();(await ne(`./migrate/${e.previousClothing==="fivem-appearance"?"fivem":e.previousClothing}.ts`)).default(r)},!1);y.RegisterUsableItem("cloth",async(r,t,e)=>{y.GetPlayer(r)?.removeItem("cloth",1,t)&&emitNet("bl_appearance:server:useOutfit",r,e.outfit)}); +var W=Object.create;var v=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var A=r=>t=>{var e=r[t];if(e)return e();throw new Error("Module not found in bundle: "+t)};var m=(r,t)=>()=>(r&&(t=r(r=0)),t);var G=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports),O=(r,t)=>{for(var e in t)v(r,e,{get:t[e],enumerable:!0})},V=(r,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of U(t))!B.call(r,n)&&n!==e&&v(r,n,{get:()=>t[n],enumerable:!(a=F(t,n))||a.enumerable});return r};var g=(r,t,e)=>(e=r!=null?W(D(r)):{},V(t||!r||!r.__esModule?v(e,"default",{value:r,enumerable:!0}):e,r));function c(r,t,...e){let a;do a=`${r}:${Math.floor(Math.random()*100001)}:${t}`;while(T[a]);return emitNet(`_bl_cb_${r}`,t,R,a,...e),new Promise(n=>{T[a]=n})}function s(r,t){onNet(`_bl_cb_${r}`,async(e,a,...n)=>{let i=source,f;try{f=await t(i,...n)}catch(H){console.error(`an error occurred while handling callback event ${r}`),console.log(`^3${H.stack}^0`)}emitNet(`_bl_cb_${e}`,i,a,f)})}var R,T,y,E=m(()=>{R=GetCurrentResourceName(),T={};onNet(`_bl_cb_${R}`,(r,...t)=>{let e=T[r];return e&&e(...t)});y=exports.bl_bridge.core()});var d=G(S=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});S.oxmysql=void 0;var k=[];function w(r,t){if(!r)throw new TypeError(t)}var l=(r,t,e,a)=>{if(typeof r=="number"&&(r=k[r]),a?w(typeof r=="object",`First argument expected object, recieved ${typeof r}`):w(typeof r=="string",`First argument expected string, received ${typeof r}`),t){let n=typeof t;w(n==="object"||n==="function",`Second argument expected object or function, received ${n}`),!e&&n==="function"&&(e=t,t=void 0)}return e!==void 0&&w(typeof e=="function",`Third argument expected function, received ${typeof e}`),[r,t,e]},_=global.exports.oxmysql,z=GetCurrentResourceName();function p(r,t,e){return new Promise((a,n)=>{_[r](t,e,(i,f)=>{if(f)return n(f);a(i)},z,!0)})}S.oxmysql={store(r){return w(typeof r!="string",`Query expects a string, received ${typeof r}`),k.push(r)},ready(r){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));r()})},async query(r,t,e){[r,t,e]=l(r,t,e);let a=await p("query",r,t);return e?e(a):a},async single(r,t,e){[r,t,e]=l(r,t,e);let a=await p("single",r,t);return e?e(a):a},async scalar(r,t,e){[r,t,e]=l(r,t,e);let a=await p("scalar",r,t);return e?e(a):a},async update(r,t,e){[r,t,e]=l(r,t,e);let a=await p("update",r,t);return e?e(a):a},async insert(r,t,e){[r,t,e]=l(r,t,e);let a=await p("insert",r,t);return e?e(a):a},async prepare(r,t,e){[r,t,e]=l(r,t,e);let a=await p("prepare",r,t);return e?e(a):a},async rawExecute(r,t,e){[r,t,e]=l(r,t,e);let a=await p("rawExecute",r,t);return e?e(a):a},async transaction(r,t,e){[r,t,e]=l(r,t,e,!0);let a=await p("transaction",r,t);return e?e(a):a},isReady(){return _.isReady()},async awaitConnection(){return await _.awaitConnection()}}});var C,u,b=m(()=>{C=g(d(),1),u=async(r,t,e)=>{let a={drawables:e.drawables,props:e.props,headOverlay:e.headOverlay},n={headBlend:e.headBlend,headStructure:e.headStructure,hairColor:e.hairColor,model:e.model},i=e.tattoos||[];return await C.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(a),JSON.stringify(n),JSON.stringify(i)])}});var Q={};var N=m(()=>{});var x={};O(x,{default:()=>X});var h,K,Y,X,j=m(()=>{h=g(d(),1);E();b();K=r=>new Promise(t=>setTimeout(t,r)),Y=async r=>{let t=await h.oxmysql.query("SELECT * FROM `players`");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"fivem",data:JSON.parse(e.skin)}),await K(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},X=Y});var P={};O(P,{default:()=>ee});var L,Z,q,ee,I=m(()=>{L=g(d(),1);E();b();Z=r=>new Promise(t=>setTimeout(t,r)),q=async r=>{let t=await L.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"illenium",data:JSON.parse(e.skin)}),await Z(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ee=q});var M={};O(M,{default:()=>ae});var J,te,re,ae,$=m(()=>{J=g(d(),1);E();b();te=r=>new Promise(t=>setTimeout(t,r)),re=async r=>{let t=await J.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t){emitNet("qb-clothes:loadSkin",r,0,e.model,e.skin),await te(200);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ae=re});E();var o=g(d(),1);b();var ne=A({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(N(),Q)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(j(),x)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(I(),P)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>($(),M))});s("bl_appearance:server:getOutfits",async(r,t)=>{let e=y.GetPlayer(r).job||{name:"unknown",grade:{name:"unknown"}},a=await o.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,e.name,e.grade.name]);return a?(Array.isArray(a)||(a=[a]),a.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]});s("bl_appearance:server:renameOutfit",async(r,t,e)=>{let a=e.id,n=e.label;return await o.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[n,t,a])});s("bl_appearance:server:deleteOutfit",async(r,t,e)=>await o.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[t,e])>0);s("bl_appearance:server:saveOutfit",async(r,t,e)=>{let a=null,n=0;return e.job&&(a=e.job.name,n=e.job.rank),await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[t,e.label,JSON.stringify(e.outfit),a,n])});s("bl_appearance:server:fetchOutfit",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:itemOutfit",async(r,t)=>{y.GetPlayer(r).addItem("cloth",1,t)});s("bl_appearance:server:importOutfit",async(r,t,e,a)=>{let[n]=await o.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[e]);return n?{success:!0,newId:await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,a,n.outfit])}:{success:!1,message:"Outfit not found"}});s("bl_appearance:server:saveSkin",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveClothes",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveAppearance",u);s("bl_appearance:server:saveTattoos",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:getSkin",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getClothes",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getTattoos",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(e)||[]});s("bl_appearance:server:getAppearance",async(r,t)=>{let e=await o.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!e)return null;let a={...JSON.parse(e.skin),...JSON.parse(e.clothes),...JSON.parse(e.tattoos)};return a.id=e.id,a});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async r=>{r=r!==0?r:parseInt(getPlayers()[0]);let e=exports.bl_appearance.config();(await ne(`./migrate/${e.previousClothing==="fivem-appearance"?"fivem":e.previousClothing}.ts`)).default(r)},!1);y.RegisterUsableItem("cloth",async(r,t,e)=>{y.GetPlayer(r)?.removeItem("cloth",1,t)&&emitNet("bl_appearance:server:useOutfit",r,e.outfit)}); diff --git a/src/client/events.ts b/src/client/events.ts index abd2af5..b464746 100644 --- a/src/client/events.ts +++ b/src/client/events.ts @@ -29,5 +29,5 @@ export enum Receive { deleteOutfit = 'appearance:deleteOutfit', saveOutfit = 'appearance:saveOutfit', importOutfit = 'appearance:importOutfit', - grabOutfit = 'appearance:grabOutfit', + fetchOutfit = 'appearance:fetchOutfit', } diff --git a/src/client/handlers.ts b/src/client/handlers.ts index 547441b..b7547ef 100644 --- a/src/client/handlers.ts +++ b/src/client/handlers.ts @@ -16,7 +16,7 @@ import { TAppearance, TToggleData, TValue } from '@typings/appearance'; import { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils'; import { getAppearance, getTattooData } from './appearance/getters'; import TOGGLE_INDEXES from '@data/toggles'; -import { Outfit } from '@typings/outfits'; +import { Outfit, TOutfitData } from '@typings/outfits'; import { TTattoo } from '@typings/tattoos'; RegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => { @@ -151,24 +151,21 @@ RegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) ); RegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => { - const frameworkdId = getFrameworkID(); - const result = await triggerServerCallback('bl_appearance:server:saveOutfit', frameworkdId, data); + const result = await triggerServerCallback('bl_appearance:server:saveOutfit', data); cb(result); }); RegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => { - const frameworkdId = getFrameworkID(); - const result = await triggerServerCallback('bl_appearance:server:deleteOutfit', frameworkdId, id); + const result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id); cb(result); }); RegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => { - const frameworkdId = getFrameworkID(); - const result = await triggerServerCallback('bl_appearance:server:renameOutfit', frameworkdId, data); + const result = await triggerServerCallback('bl_appearance:server:renameOutfit', data); cb(result); }); -RegisterNuiCallback(Receive.useOutfit, async (outfit: Outfit, cb: Function) => { +RegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => { setPedClothes(ped, outfit); cb(1); }); @@ -179,16 +176,16 @@ RegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Functio cb(result); }); -RegisterNuiCallback(Receive.grabOutfit, async ({ id }, cb: Function) => { - const result = await triggerServerCallback('bl_appearance:server:grabOutfit', id); +RegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => { + const result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id); cb(result); }); -RegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: Outfit, label: string}, cb: Function) => { - const result = await triggerServerCallback('bl_appearance:server:itemOutfit',data); +RegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => { + const result = await triggerServerCallback('bl_appearance:server:itemOutfit', data); cb(result); }); -onNet('bl_appearance:server:useOutfit', (outfit: Outfit) => { +onNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => { setPedClothes(ped, outfit); }) \ No newline at end of file diff --git a/src/server/init.ts b/src/server/init.ts index c7bf5ad..9363db8 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -1,10 +1,9 @@ -import { core, onClientCallback } from './utils'; +import { core, getFrameworkID, onClientCallback, config, getPlayerData } from './utils'; import { oxmysql } from '@overextended/oxmysql'; import { Outfit } from '@typings/outfits'; -import { saveAppearance } from './appearance'; import { SkinDB } from '@typings/appearance'; -onClientCallback('bl_appearance:server:getOutfits', async (src, frameworkId) => { +async function getOutfits(src: number, frameworkId: string) { const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } } let response = await oxmysql.prepare( 'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)', @@ -12,77 +11,83 @@ onClientCallback('bl_appearance:server:getOutfits', async (src, frameworkId) => ); if (!response) return []; - if (!Array.isArray(response)) { - response = [response]; - } - - const outfits = response.map( - (outfit: { id: number; label: string; outfit: string; jobname?: string }) => { - return { - id: outfit.id, - label: outfit.label, - outfit: JSON.parse(outfit.outfit), - jobname: outfit.jobname, - }; - } - ); - - return outfits; -}); - -onClientCallback('bl_appearance:server:renameOutfit', async (src, frameworkId, data) => { - const id = data.id; - const label = data.label; + if (!Array.isArray(response)) { + response = [response]; + } - const result = await oxmysql.update( - 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?', - [label, frameworkId, id] - ); - return result; -}); + const outfits = response.map( + (outfit: { id: number; label: string; outfit: string; jobname?: string }) => { + return { + id: outfit.id, + label: outfit.label, + outfit: JSON.parse(outfit.outfit), + jobname: outfit.jobname, + }; + } + ); -onClientCallback('bl_appearance:server:deleteOutfit', async (src, frameworkId, id) => { - const result = await oxmysql.update( - 'DELETE FROM outfits WHERE player_id = ? AND id = ?', - [frameworkId, id] - ); - return result > 0; -}); + return outfits; +} +onClientCallback('bl_appearance:server:getOutfits', getOutfits); +exports('GetOutfits', getOutfits); -onClientCallback('bl_appearance:server:saveOutfit', async (src, frameworkId, data: Outfit) => { - let jobname = null - let jobrank = 0 +async function renameOutfit(src: number, data: { id: number; label: string }) { + const frameworkId = getFrameworkID(src); + const result = await oxmysql.update( + 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?', + [data.label, frameworkId, data.id] + ); + return result; +} +onClientCallback('bl_appearance:server:renameOutfit', renameOutfit); +exports('RenameOutfit', renameOutfit); + +async function deleteOutfit(src: number, id: number) { + const frameworkId = getFrameworkID(src); + const result = await oxmysql.update( + 'DELETE FROM outfits WHERE player_id = ? AND id = ?', + [frameworkId, id] + ); + return result > 0; +} +onClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit); +exports('DeleteOutfit', deleteOutfit); + +async function saveOutfit(src: number, data: Outfit) { + const frameworkId = getFrameworkID(src); + let jobname = null; + let jobrank = 0; if (data.job) { jobname = data.job.name; jobrank = data.job.rank; } - const id = await oxmysql.insert( - 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)', - [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank] - ); - return id; -}); + const id = await oxmysql.insert( + 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)', + [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank] + ); + return id; +} +onClientCallback('bl_appearance:server:saveOutfit', saveOutfit); +exports('SaveOutfit', saveOutfit); -onClientCallback('bl_appearance:server:grabOutfit', async (src, id) => { - const response = await oxmysql.prepare( - 'SELECT outfit FROM outfits WHERE id = ?', - [id] - ); - return JSON.parse(response); -}); -onClientCallback('bl_appearance:server:itemOutfit', async (src, data) => { - const player = core.GetPlayer(src) - player.addItem('cloth', 1, data) -}); +async function fetchOutfit(_: number, id: number) { + const response = await oxmysql.prepare( + 'SELECT outfit FROM outfits WHERE id = ?', + [id] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit); +exports('FetchOutfit', fetchOutfit); -onClientCallback('bl_appearance:server:importOutfit', async (src, frameworkId, outfitId, outfitName) => { - const [result] = await oxmysql.query( +async function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) { + const result = await oxmysql.query( 'SELECT label, outfit FROM outfits WHERE id = ?', [outfitId] ); - if (!result) { + if (!result || typeof result !== 'object' || Object.keys(result).length === 0) { return { success: false, message: 'Outfit not found' }; } @@ -92,74 +97,111 @@ onClientCallback('bl_appearance:server:importOutfit', async (src, frameworkId, o ); return { success: true, newId: newId }; -}); +} +onClientCallback('bl_appearance:server:importOutfit', importOutfit); +exports('ImportOutfit', importOutfit); -onClientCallback('bl_appearance:server:saveSkin', async (src, frameworkId, skin) => { - const result = await oxmysql.update( - 'UPDATE appearance SET skin = ? WHERE id = ?', - [JSON.stringify(skin), frameworkId] - ); - return result; -}); +async function saveSkin(src: number, skin: any) { + const frameworkId = getFrameworkID(src); -onClientCallback('bl_appearance:server:saveClothes', async (src, frameworkId, clothes) => { - const result = await oxmysql.update( - 'UPDATE appearance SET clothes = ? WHERE id = ?', - [JSON.stringify(clothes), frameworkId] - ); - return result; - } -); - -onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); - -onClientCallback('bl_appearance:server:saveTattoos', async (src, frameworkId, tattoos) => { - const result = await oxmysql.update( - 'UPDATE appearance SET tattoos = ? WHERE id = ?', - [JSON.stringify(tattoos), frameworkId] - ); - return result; -}); + const result = await oxmysql.update( + 'UPDATE appearance SET skin = ? WHERE id = ?', + [JSON.stringify(skin), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveSkin', saveSkin); +exports('SaveSkin', saveSkin); -onClientCallback('bl_appearance:server:getSkin', async (src, frameworkId) => { - const response = await oxmysql.prepare( - 'SELECT skin FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response); -}); +async function saveClothes(src: number, clothes: any) { + const frameworkId = getFrameworkID(src); -onClientCallback('bl_appearance:server:getClothes', async (src, frameworkId) => { - const response = await oxmysql.prepare( - 'SELECT clothes FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response); -}); + const result = await oxmysql.update( + 'UPDATE appearance SET clothes = ? WHERE id = ?', + [JSON.stringify(clothes), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveClothes', saveClothes); +exports('SaveClothes', saveClothes); + +async function saveTattoos(src: number, tattoos: any) { + const frameworkId = getFrameworkID(src); + + const result = await oxmysql.update( + 'UPDATE appearance SET tattoos = ? WHERE id = ?', + [JSON.stringify(tattoos), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveTattoos', saveTattoos); +exports('SaveTattoos', saveTattoos); + +async function getSkin(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } -onClientCallback('bl_appearance:server:getTattoos', async (src, frameworkId) => { - const response = await oxmysql.prepare( - 'SELECT tattoos FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response) || []; -}); + const response = await oxmysql.prepare( + 'SELECT skin FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:getSkin', getSkin); +exports('GetSkin', getSkin); + +async function getClothes(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(source); + } -onClientCallback('bl_appearance:server:getAppearance', async (src, frameworkId) => { - const response: SkinDB = await oxmysql.single( - 'SELECT * FROM appearance WHERE id = ? LIMIT 1', - [frameworkId] - ); + const response = await oxmysql.prepare( + 'SELECT clothes FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:getClothes', getClothes); +exports('GetClothes', getClothes); + +async function getTattoos(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } - if (!response) return null; - let appearance = { - ...JSON.parse(response.skin), - ...JSON.parse(response.clothes), - ...JSON.parse(response.tattoos), - } - appearance.id = response.id - return appearance; -}); + const response = await oxmysql.prepare( + 'SELECT tattoos FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response) || []; +} +onClientCallback('bl_appearance:server:getTattoos', getTattoos); +exports('GetTattoos', getTattoos); + +async function getAppearance(src: number, frameworkId: string) { + if (!frameworkId && !src) return null; + + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const response: SkinDB = await oxmysql.single( + 'SELECT * FROM appearance WHERE id = ? LIMIT 1', + [frameworkId] + ); + + if (!response) return null; + let appearance = { + ...JSON.parse(response.skin), + ...JSON.parse(response.clothes), + ...JSON.parse(response.tattoos), + } + appearance.id = response.id + return appearance; +} +onClientCallback('bl_appearance:server:getAppearance', getAppearance); +exports('GetAppearance', getAppearance); onNet('bl_appearance:server:setroutingbucket', () => { SetPlayerRoutingBucket(source.toString(), source) @@ -177,8 +219,19 @@ RegisterCommand('migrate', async (source: number) => { importedModule.default(source) }, false); -core.RegisterUsableItem('cloth', async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => { - const player = core.GetPlayer(source) - if (player?.removeItem('cloth', 1, slot)) - emitNet('bl_appearance:server:useOutfit', source, metadata.outfit) +const outfitItem = config.outfitItem + +if (!outfitItem) { + console.warn('bl_appearance: No outfit item configured, please set it in config.lua') +} + +onClientCallback('bl_appearance:server:itemOutfit', async (src, data) => { + const player = core.GetPlayer(src) + player.addItem(outfitItem, 1, data) +}); + +core.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => { + const player = getPlayerData(source) + if (player?.removeItem(outfitItem, 1, slot)) + emitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit) }) \ No newline at end of file diff --git a/src/server/utils/index.ts b/src/server/utils/index.ts index 5e80639..ca432a3 100644 --- a/src/server/utils/index.ts +++ b/src/server/utils/index.ts @@ -35,4 +35,20 @@ export function onClientCallback(eventName: string, cb: (playerId: number, ...ar }); } -export const core = exports.bl_bridge.core() \ No newline at end of file +const bl_bridge = exports.bl_bridge + +export const core = bl_bridge.core() + +export const getPlayerData = (src: number) => { + return core.GetPlayer(src) +} + +export const getFrameworkID = (src: number) => { + const player = core.GetPlayer(src) + if (!player) return null + return player.id +} + + +const bl_config = exports.bl_appearance.config() +export const config = bl_config \ No newline at end of file diff --git a/web/src/enums/events.ts b/web/src/enums/events.ts index 1cd63d7..2ba6f92 100644 --- a/web/src/enums/events.ts +++ b/web/src/enums/events.ts @@ -23,7 +23,7 @@ export enum Send { deleteOutfit = 'appearance:deleteOutfit', saveOutfit = 'appearance:saveOutfit', importOutfit = 'appearance:importOutfit', - grabOutfit = 'appearance:grabOutfit', + fetchOutfit = 'appearance:fetchOutfit', save = 'appearance:save', cancel = 'appearance:cancel', diff --git a/web/src/stores/appearance.ts b/web/src/stores/appearance.ts index 128a4bb..37ab97f 100644 --- a/web/src/stores/appearance.ts +++ b/web/src/stores/appearance.ts @@ -126,7 +126,7 @@ const OUTFITS_INIT = () => { if (!success) return; importedId = newId; - return SendEvent(Send.grabOutfit, { id: importedId }); + return SendEvent(Send.fetchOutfit, { id: importedId }); }) .then((outfitData: TOutfitData | undefined) => { if (!importedId || !outfitData) return; From c9463c644adb82a67777e7c39e6a3a8c9099dea4 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:07:02 +1000 Subject: [PATCH 04/30] ref(saveAppearance): Put in init.ts --- src/server/appearance.ts | 31 --------------------- src/server/init.ts | 49 +++++++++++++++++++++++++++++++++- src/server/migrate/fivem.ts | 5 ++-- src/server/migrate/illenium.ts | 5 ++-- src/server/migrate/qb.ts | 5 ++-- 5 files changed, 57 insertions(+), 38 deletions(-) delete mode 100644 src/server/appearance.ts diff --git a/src/server/appearance.ts b/src/server/appearance.ts deleted file mode 100644 index 3483f6b..0000000 --- a/src/server/appearance.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TAppearance } from '@typings/appearance'; -import { oxmysql } from '@overextended/oxmysql'; - -export const saveAppearance = async (src: string | number, frameworkId: string, appearance: TAppearance) => { - const clothes = { - drawables: appearance.drawables, - props: appearance.props, - headOverlay: appearance.headOverlay, - }; - - const skin = { - headBlend: appearance.headBlend, - headStructure: appearance.headStructure, - hairColor: appearance.hairColor, - model: appearance.model, - }; - - const tattoos = appearance.tattoos || []; - - const result = await oxmysql.prepare( - 'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);', - [ - frameworkId, - JSON.stringify(clothes), - JSON.stringify(skin), - JSON.stringify(tattoos), - ] - ); - - return result; -} \ No newline at end of file diff --git a/src/server/init.ts b/src/server/init.ts index 9363db8..a3064d1 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -1,7 +1,7 @@ import { core, getFrameworkID, onClientCallback, config, getPlayerData } from './utils'; import { oxmysql } from '@overextended/oxmysql'; import { Outfit } from '@typings/outfits'; -import { SkinDB } from '@typings/appearance'; +import { SkinDB, TAppearance } from '@typings/appearance'; async function getOutfits(src: number, frameworkId: string) { const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } } @@ -151,6 +151,53 @@ async function getSkin(src: number, frameworkId: string) { onClientCallback('bl_appearance:server:getSkin', getSkin); exports('GetSkin', getSkin); +export const saveAppearance = async (src: number, frameworkId: string, appearance: TAppearance) => { + + if (src && frameworkId) { + const playerId = getFrameworkID(src); + + if (frameworkId !== playerId) { + console.warn('You are trying to save an appearance for a different player', src, frameworkId); + return; + } + } + + + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const clothes = { + drawables: appearance.drawables, + props: appearance.props, + headOverlay: appearance.headOverlay, + }; + + const skin = { + headBlend: appearance.headBlend, + headStructure: appearance.headStructure, + hairColor: appearance.hairColor, + model: appearance.model, + }; + + const tattoos = appearance.tattoos || []; + + const result = await oxmysql.prepare( + 'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);', + [ + frameworkId, + JSON.stringify(clothes), + JSON.stringify(skin), + JSON.stringify(tattoos), + ] + ); + + return result; +} +onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); +exports('SaveAppearance', saveAppearance); + + async function getClothes(src: number, frameworkId: string) { if (!frameworkId) { frameworkId = getFrameworkID(source); diff --git a/src/server/migrate/fivem.ts b/src/server/migrate/fivem.ts index 0e334cc..d65d692 100644 --- a/src/server/migrate/fivem.ts +++ b/src/server/migrate/fivem.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; -import { saveAppearance } from '../appearance'; import { TAppearance } from '@typings/appearance'; +import { saveAppearance } from '../init'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -17,7 +17,8 @@ const migrate = async (src: string) => { }) as TAppearance await delay(100); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance - await saveAppearance(src, element.citizenid, response) + const playerSrc = parseInt(src) + await saveAppearance(playerSrc, element.citizenid, response) } } console.log('Converted '+ response.length + ' appearances') diff --git a/src/server/migrate/illenium.ts b/src/server/migrate/illenium.ts index 6d6eb66..f36fb20 100644 --- a/src/server/migrate/illenium.ts +++ b/src/server/migrate/illenium.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; -import { saveAppearance } from '../appearance'; import { TAppearance } from '@typings/appearance'; +import { saveAppearance } from '../init'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -17,7 +17,8 @@ const migrate = async (src: string) => { }) await delay(100); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance - await saveAppearance(src, element.citizenid, response) + const playerSrc = parseInt(src) + await saveAppearance(playerSrc, element.citizenid, response) } } console.log('Converted '+ response.length + ' appearances') diff --git a/src/server/migrate/qb.ts b/src/server/migrate/qb.ts index 723ef21..d35c079 100644 --- a/src/server/migrate/qb.ts +++ b/src/server/migrate/qb.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; -import { saveAppearance } from '../appearance'; import { TAppearance } from '@typings/appearance'; +import { saveAppearance } from '../init'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -13,7 +13,8 @@ const migrate = async (src: string) => { emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin); await delay(200); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance - await saveAppearance(src, element.citizenid, response) + const playerSrc = parseInt(src) + await saveAppearance(playerSrc, element.citizenid, response) } console.log('Converted '+ response.length + ' appearances') }; From 7520648858bafd996cecbfcc7101948dcfcca95f Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:07:13 +1000 Subject: [PATCH 05/30] Delete Installation.md --- Installation.md | 78 ------------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 Installation.md diff --git a/Installation.md b/Installation.md deleted file mode 100644 index 08d0315..0000000 --- a/Installation.md +++ /dev/null @@ -1,78 +0,0 @@ -## BL APPEARANCE - -### Dependencies -- [`bl_bridge`](https://github.com/Byte-Labs-Studio/bl_bridge) -- [`bl_sprites`](https://github.com/Byte-Labs-Studio/bl_sprites) - -### Installation Steps - -1. **Download the `fivem-builders`** - - [`fivem-builders`](https://github.com/Z3rio/fivem-builders) - - Replace the contents of the `[builders]` directory with the downloaded files from `fivem-builders`. - - **Relative Path:** `resources\[cfx-default]\[system]\[builders]` -2. **Download And Install All The Dependencies** --------------------------------- - ## **For QBCore** - - **Remove** the older appearance/clothing system and related dependencies from your scripts. - - Update the server-side code: - - **Modify** the SQL query in the `qb-multiCharacter` resource: - - Open `Server/main.lua` around line 199. - - Change: - ```lua - local result = MySQL.query.await('SELECT * FROM playerskins WHERE citizenid = ? AND active = ?', {cid, 1}) - ``` - To: - ```lua - local result = MySQL.query.await('SELECT * FROM appearance WHERE id = ?', {cid}) - ``` - - **Update** the client-side code: - - Open `client/main.lua` around line 45. - - Change: - ```lua - local function initializePedModel(model, data) - CreateThread(function() - if not model then - model = joaat(randommodels[math.random(#randommodels)]) - end - loadModel(model) - charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) - SetPedComponentVariation(charPed, 0, 0, 0, 2) - FreezeEntityPosition(charPed, false) - SetEntityInvincible(charPed, true) - PlaceObjectOnGroundProperly(charPed) - SetBlockingOfNonTemporaryEvents(charPed, true) - if data then - TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed) - end - end) - end - ``` - To: - ```lua - local function initializePedModel(model, data) - CreateThread(function() - if not model then - model = joaat(randommodels[math.random(#randommodels)]) - end - loadModel(model) - charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) - SetPedComponentVariation(charPed, 0, 0, 0, 2) - FreezeEntityPosition(charPed, false) - SetEntityInvincible(charPed, true) - PlaceObjectOnGroundProperly(charPed) - SetBlockingOfNonTemporaryEvents(charPed, true) - exports['bl_appearance']:SetPedAppearance(charPed, data) - if data then - TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed) - end - end) - end - ``` -------------------- - ## **For ESX** - - **Installation Completed** - -### Additional Tips -- **Backup Files**: Before replacing or modifying files, make sure to backup your current setup to avoid accidental data loss. -- **Test Thoroughly**: After installation, test the functionality thoroughly to ensure everything works as expected with the new appearance system. -- **Check Compatibility**: Verify that all related scripts and dependencies are compatible with the new `bl_appearance` system to prevent conflicts. From e34c44d9e0004e20ef8c581d3d2ef105c914fa23 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:24:54 +1000 Subject: [PATCH 06/30] fix(setPedAppearance): Return after rerouting to setPlayerPedAppearance --- dist/client/init.js | 2 +- dist/server/init.js | 2 +- src/client/appearance/setters.ts | 1 + src/client/handlers.ts | 2 +- src/server/init.ts | 7 ++----- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 9f9a8a9..08f334e 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1 +1 @@ -var n=0,g=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(o=>{let a=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(a),o())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ke(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ke(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(o=>{X[r]=o})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,o,...a)=>{let s;try{s=await t(...a)}catch(i){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${i.stack}^0`)}emitNet(`_bl_cb_${r}`,o,s)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let o=exports.bl_appearance.config().locale,a=LoadResourceFile(j,`locale/${o}.json`);a||(console.error(`${o}.json not found in locale, please verify!, we used english for now!`),a=LoadResourceFile(j,"locale/en.json")),t(a)}else setTimeout(r,100)};r()});var E=exports.bl_bridge,H=()=>E.core().getPlayerData(),f=()=>H().cid,Ce=()=>H().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=H().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,oe=1,L=!1,y=1.8,h=null,C=0,I=0,x=null,te=null,ae=!1;var V="head",qe={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*y,t=(re(I)*G(C)+G(C)*re(I))/2*y,r=re(C)*y;return[e,t,r]},se=(e,t)=>{if(!L||!x||ae)return;e=e??0,t=t??0,I-=e,C+=t;let o=V==="whole"||V==="head"?89:70;C=Math.min(Math.max(C,V==="shoes"?5:-20),o);let[i,c,u]=Ae();SetCamCoord(h,x.x+i,x.y+c,x.z+u),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,ae=!0,y=t,I=r;let[o,a,s]=Ae(),i=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+o,e.y+a,e.z+s,0,0,0,70,!1,0);x=e,ae=!1,te=h,h=i,PointCamAtCoord(i,e.x,e.y,e.z),SetCamActiveWithInterp(i,te,250,0,0),await M(250),SetCamUseShallowDofMode(i,!0),SetCamNearDof(i,.4),SetCamFarDof(i,1.2),SetCamDofStrength(i,.3),Oe(i),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(L)return;L=!0,y=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",y)},Me=()=>{L&&(L=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=y)=>{let r=qe[e],o=Array.isArray(r);if(V=e,!o&&r===0){let[c,u,l]=GetEntityCoords(n,!1);ve({x:c,y:u,z:l+0},t);return}if(t>oe&&(t=oe),o){let[c,u,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,b,J]=GetPedBoneCoords(n,r[1],0,0,0);var a=(c+m)/2,s=(u+b)/2,i=(l+J)/2}else var[a,s,i]=GetPedBoneCoords(n,r,0,0,0);ve({x:a,y:s,z:i+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=V==="whole"?ne:oe,o=y+.05;y=o>=r?r:o}else if(e==="up"){let r=y-.05;y=r<=.3?.3:r}y=y,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function Ue(e){return exports.bl_appearance.models().findIndex(o=>GetHashKey(o)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:o,4:a,6:s,8:i,18:c,10:u}=new Uint32Array(t),{0:l,2:m,4:b}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:o,shapeThird:a,skinFirst:s,skinSecond:i,skinThird:u,shapeMix:l,thirdMix:b,skinMix:m,hasParent:!!c}}function Ie(e){let t={},r={};for(let o=0;o(g(PlayerPedId()),w(n)));function We(e){let[t]=K(e),[r]=Z(e),[o]=Ie(e);return{headOverlay:o,drawables:t,props:r}}exports("GetPedClothes",We);function $e(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",$e);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let a=0;a{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Ye=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Ye,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),g(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),o=N(t.shapeSecond),a=N(t.shapeThird),s=N(t.skinFirst),i=N(t.skinSecond),c=N(t.skinThird),u=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,b=t.hasParent;SetPedHeadBlendData(e,r,o,a,s,i,c,u,l,m,b)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let o=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,o,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[o,a]of Object.entries(U)){let s=a.type,i=a.index;s==="drawable"&&t[o]?GetPedDrawableVariation(n,i)!==t[o].value&&SetPedComponentVariation(n,i,t[o].value,0,0):s==="prop"&&r[o]&&GetPedPropIndex(n,i)!==r[o].value&&SetPedPropIndex(n,i,r[o].value,0,!1)}}function B(e,t){let r=t.drawables,o=t.props,a=t.headOverlay;for(let s in r){let i=r[s];_(e,i)}for(let s in o){let i=o[s];v(e,i)}for(let s in a){let i=a[s];me(e,i)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,o=t.headBlend;if(o&&W(e,o),r)for(let a in r){let s=r[a];pe(e,s)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",f(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let o=await A(n,r);g(o);let a=await w(n);a.tattoos=[],T(n,[]),t(a)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let o=e.data,a=r.type,s=r.index,i=r.hook,c=e.hookData;if(!o)return t(!1);if(a==="prop")if(GetPedPropIndex(n,s)===-1){v(n,o),t(!1);return}else{ClearPedProp(n,s),t(!0);return}else if(a==="drawable"){let u=GetPedDrawableVariation(n,s);if(o.value===r.off){t(!1);return}if(o.value===u){if(SetPedComponentVariation(n,s,r.off,0,0),i)for(let l=0;l{let r=f(),o=await d("bl_appearance:server:saveOutfit",r,e);t(o)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=f(),o=await d("bl_appearance:server:deleteOutfit",r,e);t(o)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=f(),o=await d("bl_appearance:server:renameOutfit",r,e);t(o)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let o=f(),a=await d("bl_appearance:server:importOutfit",o,e,t);r(a)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfit",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),o=ge.menus(),a=e.type,s=o[a];if(!s)return;g(r);let i=f(),c=s.tabs,u=t?!1:s.allowExit;Ee=GetPedArmour(r);let l=[];c.includes("outfits")&&(l=await d("bl_appearance:server:getOutfits",i));let b=[];c.includes("heritage")&&(b=ge.models());let R=c.includes("tattoos"),S;R&&(S=q());let D=Je(e);if(t){let je=GetHashKey(Ce());r=await A(r,je),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(ze=>{Y=ze}),g(r)}let Pe=await w(r);return De(),z("appearance:data",{tabs:c,appearance:Pe,blacklist:D,tattoos:S,outfits:l,models:b,allowExit:u,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("openMenu",O);function Je(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let o={...r},a=H();for(let s in t){let i=t[s];for(let c in i){let u=!1;if(s=="jobs"&&e.jobs&&(u=e.jobs.includes(a.job.name)),s=="gangs"&&e.gangs&&(u=e.gangs.includes(a.gang.name)),!u){let l=i[c];o=Object.assign({},o,l,{drawables:Object.assign({},o.drawables,l.drawables)})}}}return o}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await f(),o=await d("bl_appearance:server:getAppearance",r);t(o)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let o of t){let a=t[o];r.push({component_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let o of t){let a=t[o];r.push({prop_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{g(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let o={index:r.component_id,value:r.drawable,texture:r.texture};_(e,o)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let o={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,o)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}RegisterCommand("openMenu",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let o=r.toLowerCase();O({type:o,coords:[0,0,0,0]})}},!0);exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await f();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await f(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!E.core().playerLoaded();)await _e(100);let e=await f(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&E.core().playerLoaded()){let t=await f(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=E.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await f(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),o=GetPedArmour(n),a=await d("bl_appearance:server:getAppearance",e);a&&(await P(a),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,o))},!1); +var n=0,f=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(a=>{let o=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(o),a())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(a=>{X[r]=a})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,a,...o)=>{let i;try{i=await t(...o)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,a,i)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let a=exports.bl_appearance.config().locale,o=LoadResourceFile(j,`locale/${a}.json`);o||(console.error(`${a}.json not found in locale, please verify!, we used english for now!`),o=LoadResourceFile(j,"locale/en.json")),t(o)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,Ce=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,ae=1,R=!1,g=1.8,h=null,C=0,I=0,x=null,te=null,oe=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*g,t=(re(I)*G(C)+G(C)*re(I))/2*g,r=re(C)*g;return[e,t,r]},se=(e,t)=>{if(!R||!x||oe)return;e=e??0,t=t??0,I-=e,C+=t;let a=L==="whole"||L==="head"?89:70;C=Math.min(Math.max(C,L==="shoes"?5:-20),a);let[s,u,c]=Ae();SetCamCoord(h,x.x+s,x.y+u,x.z+c),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,oe=!0,g=t,I=r;let[a,o,i]=Ae(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+a,e.y+o,e.z+i,0,0,0,70,!1,0);x=e,oe=!1,te=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,te,250,0,0),await M(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Oe(s),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(R)return;R=!0,g=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",g)},Me=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=g)=>{let r=Ue[e],a=Array.isArray(r);if(L=e,!a&&r===0){let[u,c,l]=GetEntityCoords(n,!1);ve({x:u,y:c,z:l+0},t);return}if(t>ae&&(t=ae),a){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var o=(u+m)/2,i=(c+y)/2,s=(l+E)/2}else var[o,i,s]=GetPedBoneCoords(n,r,0,0,0);ve({x:o,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ne:ae,a=g+.05;g=a>=r?r:a}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(a=>GetHashKey(a)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:a,4:o,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:m,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:a,shapeThird:o,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:m,hasParent:!!u}}function Ie(e){let t={},r={};for(let a=0;a(f(PlayerPedId()),w(n)));function $e(e){let[t]=K(e),[r]=Z(e),[a]=Ie(e);return{headOverlay:a,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let o=0;o{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Je=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),a=N(t.shapeSecond),o=N(t.shapeThird),i=N(t.skinFirst),s=N(t.skinSecond),u=N(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,a,o,i,s,u,c,l,m,y)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let a=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,a,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[a,o]of Object.entries(U)){let i=o.type,s=o.index;i==="drawable"&&t[a]?GetPedDrawableVariation(n,s)!==t[a].value&&SetPedComponentVariation(n,s,t[a].value,0,0):i==="prop"&&r[a]&&GetPedPropIndex(n,s)!==r[a].value&&SetPedPropIndex(n,s,r[a].value,0,!1)}}function B(e,t){let r=t.drawables,a=t.props,o=t.headOverlay;for(let i in r){let s=r[i];_(e,s)}for(let i in a){let s=a[i];v(e,s)}for(let i in o){let s=o[i];me(e,s)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,a=t.headBlend;if(a&&W(e,a),r)for(let o in r){let i=r[o];pe(e,i)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",b(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let a=await A(n,r);f(a);let o=await w(n);o.tattoos=[],T(n,[]),t(o)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let a=e.data,o=r.type,i=r.index,s=r.hook,u=e.hookData;if(!a)return t(!1);if(o==="prop")if(GetPedPropIndex(n,i)===-1){v(n,a),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(o==="drawable"){let c=GetPedDrawableVariation(n,i);if(a.value===r.off){t(!1);return}if(a.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await d("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await d("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let a=b(),o=await d("bl_appearance:server:importOutfit",a,e,t);r(o)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),a=ge.menus(),o=typeof e=="string",i=o?e:e.type,s=a[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let m=[];c.includes("outfits")&&(m=await d("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=ge.models());let D=c.includes("tattoos"),S;D&&(S=q());let Pe=o?{}:Xe(e);if(t){let ze=GetHashKey(Ce());r=await A(r,ze),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(Ke=>{Y=Ke}),f(r)}let je=await w(r);return De(),z("appearance:data",{tabs:c,appearance:je,blacklist:Pe,tattoos:S,outfits:m,models:E,allowExit:l,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("OpenMenu",O);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let a=r.toLowerCase();O(a)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let a={...r},o=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(o.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(o.gang.name)),!c){let l=s[u];a=Object.assign({},a,l,{drawables:Object.assign({},a.drawables,l.drawables)})}}}return a}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),a=await d("bl_appearance:server:getAppearance",r);t(a)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let a of t){let o=t[a];r.push({component_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let a of t){let o=t[a];r.push({prop_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{f(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let a={index:r.component_id,value:r.drawable,texture:r.texture};_(e,a)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let a={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,a)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await _e(100);let e=await b(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),a=GetPedArmour(n),o=await d("bl_appearance:server:getAppearance",e);o&&(await P(o),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,a))},!1); diff --git a/dist/server/init.js b/dist/server/init.js index 0c50781..ace6f8a 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var W=Object.create;var v=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var A=r=>t=>{var e=r[t];if(e)return e();throw new Error("Module not found in bundle: "+t)};var m=(r,t)=>()=>(r&&(t=r(r=0)),t);var G=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports),O=(r,t)=>{for(var e in t)v(r,e,{get:t[e],enumerable:!0})},V=(r,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of U(t))!B.call(r,n)&&n!==e&&v(r,n,{get:()=>t[n],enumerable:!(a=F(t,n))||a.enumerable});return r};var g=(r,t,e)=>(e=r!=null?W(D(r)):{},V(t||!r||!r.__esModule?v(e,"default",{value:r,enumerable:!0}):e,r));function c(r,t,...e){let a;do a=`${r}:${Math.floor(Math.random()*100001)}:${t}`;while(T[a]);return emitNet(`_bl_cb_${r}`,t,R,a,...e),new Promise(n=>{T[a]=n})}function s(r,t){onNet(`_bl_cb_${r}`,async(e,a,...n)=>{let i=source,f;try{f=await t(i,...n)}catch(H){console.error(`an error occurred while handling callback event ${r}`),console.log(`^3${H.stack}^0`)}emitNet(`_bl_cb_${e}`,i,a,f)})}var R,T,y,E=m(()=>{R=GetCurrentResourceName(),T={};onNet(`_bl_cb_${R}`,(r,...t)=>{let e=T[r];return e&&e(...t)});y=exports.bl_bridge.core()});var d=G(S=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});S.oxmysql=void 0;var k=[];function w(r,t){if(!r)throw new TypeError(t)}var l=(r,t,e,a)=>{if(typeof r=="number"&&(r=k[r]),a?w(typeof r=="object",`First argument expected object, recieved ${typeof r}`):w(typeof r=="string",`First argument expected string, received ${typeof r}`),t){let n=typeof t;w(n==="object"||n==="function",`Second argument expected object or function, received ${n}`),!e&&n==="function"&&(e=t,t=void 0)}return e!==void 0&&w(typeof e=="function",`Third argument expected function, received ${typeof e}`),[r,t,e]},_=global.exports.oxmysql,z=GetCurrentResourceName();function p(r,t,e){return new Promise((a,n)=>{_[r](t,e,(i,f)=>{if(f)return n(f);a(i)},z,!0)})}S.oxmysql={store(r){return w(typeof r!="string",`Query expects a string, received ${typeof r}`),k.push(r)},ready(r){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));r()})},async query(r,t,e){[r,t,e]=l(r,t,e);let a=await p("query",r,t);return e?e(a):a},async single(r,t,e){[r,t,e]=l(r,t,e);let a=await p("single",r,t);return e?e(a):a},async scalar(r,t,e){[r,t,e]=l(r,t,e);let a=await p("scalar",r,t);return e?e(a):a},async update(r,t,e){[r,t,e]=l(r,t,e);let a=await p("update",r,t);return e?e(a):a},async insert(r,t,e){[r,t,e]=l(r,t,e);let a=await p("insert",r,t);return e?e(a):a},async prepare(r,t,e){[r,t,e]=l(r,t,e);let a=await p("prepare",r,t);return e?e(a):a},async rawExecute(r,t,e){[r,t,e]=l(r,t,e);let a=await p("rawExecute",r,t);return e?e(a):a},async transaction(r,t,e){[r,t,e]=l(r,t,e,!0);let a=await p("transaction",r,t);return e?e(a):a},isReady(){return _.isReady()},async awaitConnection(){return await _.awaitConnection()}}});var C,u,b=m(()=>{C=g(d(),1),u=async(r,t,e)=>{let a={drawables:e.drawables,props:e.props,headOverlay:e.headOverlay},n={headBlend:e.headBlend,headStructure:e.headStructure,hairColor:e.hairColor,model:e.model},i=e.tattoos||[];return await C.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(a),JSON.stringify(n),JSON.stringify(i)])}});var Q={};var N=m(()=>{});var x={};O(x,{default:()=>X});var h,K,Y,X,j=m(()=>{h=g(d(),1);E();b();K=r=>new Promise(t=>setTimeout(t,r)),Y=async r=>{let t=await h.oxmysql.query("SELECT * FROM `players`");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"fivem",data:JSON.parse(e.skin)}),await K(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},X=Y});var P={};O(P,{default:()=>ee});var L,Z,q,ee,I=m(()=>{L=g(d(),1);E();b();Z=r=>new Promise(t=>setTimeout(t,r)),q=async r=>{let t=await L.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t)if(e.skin){await c("bl_appearance:client:migration:setAppearance",r,{type:"illenium",data:JSON.parse(e.skin)}),await Z(100);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ee=q});var M={};O(M,{default:()=>ae});var J,te,re,ae,$=m(()=>{J=g(d(),1);E();b();te=r=>new Promise(t=>setTimeout(t,r)),re=async r=>{let t=await J.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let e of t){emitNet("qb-clothes:loadSkin",r,0,e.model,e.skin),await te(200);let a=await c("bl_appearance:client:getAppearance",r);await u(r,e.citizenid,a)}console.log("Converted "+t.length+" appearances")}},ae=re});E();var o=g(d(),1);b();var ne=A({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(N(),Q)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(j(),x)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(I(),P)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>($(),M))});s("bl_appearance:server:getOutfits",async(r,t)=>{let e=y.GetPlayer(r).job||{name:"unknown",grade:{name:"unknown"}},a=await o.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,e.name,e.grade.name]);return a?(Array.isArray(a)||(a=[a]),a.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]});s("bl_appearance:server:renameOutfit",async(r,t,e)=>{let a=e.id,n=e.label;return await o.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[n,t,a])});s("bl_appearance:server:deleteOutfit",async(r,t,e)=>await o.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[t,e])>0);s("bl_appearance:server:saveOutfit",async(r,t,e)=>{let a=null,n=0;return e.job&&(a=e.job.name,n=e.job.rank),await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[t,e.label,JSON.stringify(e.outfit),a,n])});s("bl_appearance:server:fetchOutfit",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:itemOutfit",async(r,t)=>{y.GetPlayer(r).addItem("cloth",1,t)});s("bl_appearance:server:importOutfit",async(r,t,e,a)=>{let[n]=await o.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[e]);return n?{success:!0,newId:await o.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,a,n.outfit])}:{success:!1,message:"Outfit not found"}});s("bl_appearance:server:saveSkin",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveClothes",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:saveAppearance",u);s("bl_appearance:server:saveTattoos",async(r,t,e)=>await o.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),t]));s("bl_appearance:server:getSkin",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getClothes",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(e)});s("bl_appearance:server:getTattoos",async(r,t)=>{let e=await o.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(e)||[]});s("bl_appearance:server:getAppearance",async(r,t)=>{let e=await o.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!e)return null;let a={...JSON.parse(e.skin),...JSON.parse(e.clothes),...JSON.parse(e.tattoos)};return a.id=e.id,a});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async r=>{r=r!==0?r:parseInt(getPlayers()[0]);let e=exports.bl_appearance.config();(await ne(`./migrate/${e.previousClothing==="fivem-appearance"?"fivem":e.previousClothing}.ts`)).default(r)},!1);y.RegisterUsableItem("cloth",async(r,t,e)=>{y.GetPlayer(r)?.removeItem("cloth",1,t)&&emitNet("bl_appearance:server:useOutfit",r,e.outfit)}); +var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=t=>e=>{var n=t[e];if(n)return n();throw new Error("Module not found in bundle: "+e)};var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),x=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},pe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of oe(e))!ie.call(t,a)&&a!==n&&T(t,a,{get:()=>e[a],enumerable:!(r=ae(e,a))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?re(se(t)):{},pe(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t));function p(t,e,...n){let r;do r=`${t}:${Math.floor(Math.random()*100001)}:${e}`;while(h[r]);return emitNet(`_bl_cb_${t}`,e,N,r,...n),new Promise(a=>{h[r]=a})}function o(t,e){onNet(`_bl_cb_${t}`,async(n,r,...a)=>{let i=source,g;try{g=await e(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${t}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(t,...e)=>{let n=h[t];return n&&n(...e)});le=exports.bl_bridge,y=le.core(),k=t=>y.GetPlayer(t),c=t=>{let e=y.GetPlayer(t);return e?e.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(t,e){if(!t)throw new TypeError(e)}var l=(t,e,n,r)=>{if(typeof t=="number"&&(t=j[t]),r?b(typeof t=="object",`First argument expected object, recieved ${typeof t}`):b(typeof t=="string",`First argument expected string, received ${typeof t}`),e){let a=typeof e;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=e,e=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[t,e,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(t,e,n){return new Promise((r,a)=>{A[t](e,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(t){return b(typeof t!="string",`Query expects a string, received ${typeof t}`),j.push(t)},ready(t){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(e=>setTimeout(e,50));t()})},async query(t,e,n){[t,e,n]=l(t,e,n);let r=await u("query",t,e);return n?n(r):r},async single(t,e,n){[t,e,n]=l(t,e,n);let r=await u("single",t,e);return n?n(r):r},async scalar(t,e,n){[t,e,n]=l(t,e,n);let r=await u("scalar",t,e);return n?n(r):r},async update(t,e,n){[t,e,n]=l(t,e,n);let r=await u("update",t,e);return n?n(r):r},async insert(t,e,n){[t,e,n]=l(t,e,n);let r=await u("insert",t,e);return n?n(r):r},async prepare(t,e,n){[t,e,n]=l(t,e,n);let r=await u("prepare",t,e);return n?n(r):r},async rawExecute(t,e,n){[t,e,n]=l(t,e,n);let r=await u("rawExecute",t,e);return n?n(r):r},async transaction(t,e,n){[t,e,n]=l(t,e,n,!0);let r=await u("transaction",t,e);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=t=>new Promise(e=>setTimeout(e,t)),ye=async t=>{let e=await L.oxmysql.query("SELECT * FROM `players`");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=t=>new Promise(e=>setTimeout(e,t)),Ee=async t=>{let e=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=t=>new Promise(e=>setTimeout(e,t)),ve=async t=>{let e=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e){emitNet("qb-clothes:loadSkin",t,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(t,e){let n=y.GetPlayer(t).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[e,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(t,e){let n=c(t);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[e.label,n,e.id])}async function V(t,e){let n=c(t);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,e])>0}async function z(t,e){let n=c(t),r=null,a=0;return e.job&&(r=e.job.name,a=e.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,e.label,JSON.stringify(e.outfit),r,a])}async function Q(t,e){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[e]);return JSON.parse(n)}async function Y(t,e,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[e,r,a.outfit])}}async function K(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),n])}async function X(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),n])}async function Z(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),n])}async function q(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function ee(t,e){e||(e=c(source));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function te(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[e]);return JSON.parse(n)||[]}async function ne(t,e){if(!e&&!t)return null;e||(e=c(t));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[e]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),...JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",q);f=async(t,e,n)=>{if(t&&e){let _=c(t);if(e!==_){console.warn("You are trying to save an appearance for a different player",t,e);return}}e||(e=c(t));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[e,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",f);o("bl_appearance:server:getClothes",ee);exports("GetClothes",ee);o("bl_appearance:server:getTattoos",te);exports("GetTattoos",te);o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",ne);onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async t=>{t=t!==0?t:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(t)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(t,e)=>{y.GetPlayer(t).addItem(w,1,e)});y.RegisterUsableItem(w,async(t,e,n)=>{k(t)?.removeItem(w,1,e)&&emitNet("bl_appearance:server:useOutfitItem",t,n.outfit)})});v();export{f as saveAppearance}; diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index 6f7cb38..11791a4 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -197,6 +197,7 @@ export function setPedHairColors(pedHandle: number, data: THairColor) { export async function setPedAppearance(pedHandle: number, data: TAppearance) { if (IsPedAPlayer(pedHandle)) { setPlayerPedAppearance(data) + return } await setPedSkin(pedHandle, data) setPedClothes(pedHandle, data) diff --git a/src/client/handlers.ts b/src/client/handlers.ts index b7547ef..68bc2a5 100644 --- a/src/client/handlers.ts +++ b/src/client/handlers.ts @@ -16,7 +16,7 @@ import { TAppearance, TToggleData, TValue } from '@typings/appearance'; import { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils'; import { getAppearance, getTattooData } from './appearance/getters'; import TOGGLE_INDEXES from '@data/toggles'; -import { Outfit, TOutfitData } from '@typings/outfits'; +import { TOutfitData } from '@typings/outfits'; import { TTattoo } from '@typings/tattoos'; RegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => { diff --git a/src/server/init.ts b/src/server/init.ts index a3064d1..9eee18a 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -152,7 +152,6 @@ onClientCallback('bl_appearance:server:getSkin', getSkin); exports('GetSkin', getSkin); export const saveAppearance = async (src: number, frameworkId: string, appearance: TAppearance) => { - if (src && frameworkId) { const playerId = getFrameworkID(src); @@ -162,7 +161,6 @@ export const saveAppearance = async (src: number, frameworkId: string, appearanc } } - if (!frameworkId) { frameworkId = getFrameworkID(src); } @@ -197,10 +195,9 @@ export const saveAppearance = async (src: number, frameworkId: string, appearanc onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); exports('SaveAppearance', saveAppearance); - async function getClothes(src: number, frameworkId: string) { if (!frameworkId) { - frameworkId = getFrameworkID(source); + frameworkId = getFrameworkID(src); } const response = await oxmysql.prepare( @@ -242,7 +239,7 @@ async function getAppearance(src: number, frameworkId: string) { let appearance = { ...JSON.parse(response.skin), ...JSON.parse(response.clothes), - ...JSON.parse(response.tattoos), + tattoos: JSON.parse(response.tattoos), } appearance.id = response.id return appearance; From 0f1fc93cfc6de5e4dd1995d145a940442eb9e612 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:47:52 +1000 Subject: [PATCH 07/30] build(update) --- dist/client/init.js | 2 +- dist/server/init.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 08f334e..981a379 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1 +1 @@ -var n=0,f=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(a=>{let o=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(o),a())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(a=>{X[r]=a})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,a,...o)=>{let i;try{i=await t(...o)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,a,i)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let a=exports.bl_appearance.config().locale,o=LoadResourceFile(j,`locale/${a}.json`);o||(console.error(`${a}.json not found in locale, please verify!, we used english for now!`),o=LoadResourceFile(j,"locale/en.json")),t(o)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,Ce=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,ae=1,R=!1,g=1.8,h=null,C=0,I=0,x=null,te=null,oe=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*g,t=(re(I)*G(C)+G(C)*re(I))/2*g,r=re(C)*g;return[e,t,r]},se=(e,t)=>{if(!R||!x||oe)return;e=e??0,t=t??0,I-=e,C+=t;let a=L==="whole"||L==="head"?89:70;C=Math.min(Math.max(C,L==="shoes"?5:-20),a);let[s,u,c]=Ae();SetCamCoord(h,x.x+s,x.y+u,x.z+c),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,oe=!0,g=t,I=r;let[a,o,i]=Ae(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+a,e.y+o,e.z+i,0,0,0,70,!1,0);x=e,oe=!1,te=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,te,250,0,0),await M(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Oe(s),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(R)return;R=!0,g=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",g)},Me=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=g)=>{let r=Ue[e],a=Array.isArray(r);if(L=e,!a&&r===0){let[u,c,l]=GetEntityCoords(n,!1);ve({x:u,y:c,z:l+0},t);return}if(t>ae&&(t=ae),a){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var o=(u+m)/2,i=(c+y)/2,s=(l+E)/2}else var[o,i,s]=GetPedBoneCoords(n,r,0,0,0);ve({x:o,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ne:ae,a=g+.05;g=a>=r?r:a}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(a=>GetHashKey(a)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:a,4:o,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:m,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:a,shapeThird:o,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:m,hasParent:!!u}}function Ie(e){let t={},r={};for(let a=0;a(f(PlayerPedId()),w(n)));function $e(e){let[t]=K(e),[r]=Z(e),[a]=Ie(e);return{headOverlay:a,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let o=0;o{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Je=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),a=N(t.shapeSecond),o=N(t.shapeThird),i=N(t.skinFirst),s=N(t.skinSecond),u=N(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,a,o,i,s,u,c,l,m,y)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let a=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,a,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[a,o]of Object.entries(U)){let i=o.type,s=o.index;i==="drawable"&&t[a]?GetPedDrawableVariation(n,s)!==t[a].value&&SetPedComponentVariation(n,s,t[a].value,0,0):i==="prop"&&r[a]&&GetPedPropIndex(n,s)!==r[a].value&&SetPedPropIndex(n,s,r[a].value,0,!1)}}function B(e,t){let r=t.drawables,a=t.props,o=t.headOverlay;for(let i in r){let s=r[i];_(e,s)}for(let i in a){let s=a[i];v(e,s)}for(let i in o){let s=o[i];me(e,s)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,a=t.headBlend;if(a&&W(e,a),r)for(let o in r){let i=r[o];pe(e,i)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",b(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let a=await A(n,r);f(a);let o=await w(n);o.tattoos=[],T(n,[]),t(o)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let a=e.data,o=r.type,i=r.index,s=r.hook,u=e.hookData;if(!a)return t(!1);if(o==="prop")if(GetPedPropIndex(n,i)===-1){v(n,a),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(o==="drawable"){let c=GetPedDrawableVariation(n,i);if(a.value===r.off){t(!1);return}if(a.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await d("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await d("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let a=b(),o=await d("bl_appearance:server:importOutfit",a,e,t);r(o)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),a=ge.menus(),o=typeof e=="string",i=o?e:e.type,s=a[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let m=[];c.includes("outfits")&&(m=await d("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=ge.models());let D=c.includes("tattoos"),S;D&&(S=q());let Pe=o?{}:Xe(e);if(t){let ze=GetHashKey(Ce());r=await A(r,ze),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(Ke=>{Y=Ke}),f(r)}let je=await w(r);return De(),z("appearance:data",{tabs:c,appearance:je,blacklist:Pe,tattoos:S,outfits:m,models:E,allowExit:l,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("OpenMenu",O);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let a=r.toLowerCase();O(a)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let a={...r},o=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(o.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(o.gang.name)),!c){let l=s[u];a=Object.assign({},a,l,{drawables:Object.assign({},a.drawables,l.drawables)})}}}return a}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),a=await d("bl_appearance:server:getAppearance",r);t(a)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let a of t){let o=t[a];r.push({component_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let a of t){let o=t[a];r.push({prop_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{f(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let a={index:r.component_id,value:r.drawable,texture:r.texture};_(e,a)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let a={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,a)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await _e(100);let e=await b(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),a=GetPedArmour(n),o=await d("bl_appearance:server:getAppearance",e);o&&(await P(o),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,a))},!1); +var n=0,f=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(a=>{let o=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(o),a())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(a=>{X[r]=a})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,a,...o)=>{let i;try{i=await t(...o)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,a,i)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let a=exports.bl_appearance.config().locale,o=LoadResourceFile(j,`locale/${a}.json`);o||(console.error(`${a}.json not found in locale, please verify!, we used english for now!`),o=LoadResourceFile(j,"locale/en.json")),t(o)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,Ce=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,ae=1,R=!1,g=1.8,h=null,C=0,I=0,x=null,te=null,oe=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*g,t=(re(I)*G(C)+G(C)*re(I))/2*g,r=re(C)*g;return[e,t,r]},se=(e,t)=>{if(!R||!x||oe)return;e=e??0,t=t??0,I-=e,C+=t;let a=L==="whole"||L==="head"?89:70;C=Math.min(Math.max(C,L==="shoes"?5:-20),a);let[s,u,c]=Ae();SetCamCoord(h,x.x+s,x.y+u,x.z+c),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,oe=!0,g=t,I=r;let[a,o,i]=Ae(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+a,e.y+o,e.z+i,0,0,0,70,!1,0);x=e,oe=!1,te=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,te,250,0,0),await M(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Oe(s),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(R)return;R=!0,g=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",g)},Me=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=g)=>{let r=Ue[e],a=Array.isArray(r);if(L=e,!a&&r===0){let[u,c,l]=GetEntityCoords(n,!1);ve({x:u,y:c,z:l+0},t);return}if(t>ae&&(t=ae),a){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var o=(u+m)/2,i=(c+y)/2,s=(l+E)/2}else var[o,i,s]=GetPedBoneCoords(n,r,0,0,0);ve({x:o,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ne:ae,a=g+.05;g=a>=r?r:a}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(a=>GetHashKey(a)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:a,4:o,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:m,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:a,shapeThird:o,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:m,hasParent:!!u}}function Ie(e){let t={},r={};for(let a=0;a(f(PlayerPedId()),w(n)));function $e(e){let[t]=K(e),[r]=Z(e),[a]=Ie(e);return{headOverlay:a,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let o=0;o{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Je=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),a=N(t.shapeSecond),o=N(t.shapeThird),i=N(t.skinFirst),s=N(t.skinSecond),u=N(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,a,o,i,s,u,c,l,m,y)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let a=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,a,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[a,o]of Object.entries(U)){let i=o.type,s=o.index;i==="drawable"&&t[a]?GetPedDrawableVariation(n,s)!==t[a].value&&SetPedComponentVariation(n,s,t[a].value,0,0):i==="prop"&&r[a]&&GetPedPropIndex(n,s)!==r[a].value&&SetPedPropIndex(n,s,r[a].value,0,!1)}}function B(e,t){let r=t.drawables,a=t.props,o=t.headOverlay;for(let i in r){let s=r[i];_(e,s)}for(let i in a){let s=a[i];v(e,s)}for(let i in o){let s=o[i];me(e,s)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,a=t.headBlend;if(a&&W(e,a),r)for(let o in r){let i=r[o];pe(e,i)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",b(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let a=await A(n,r);f(a);let o=await w(n);o.tattoos=[],T(n,[]),t(o)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let a=e.data,o=r.type,i=r.index,s=r.hook,u=e.hookData;if(!a)return t(!1);if(o==="prop")if(GetPedPropIndex(n,i)===-1){v(n,a),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(o==="drawable"){let c=GetPedDrawableVariation(n,i);if(a.value===r.off){t(!1);return}if(a.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await d("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await d("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let a=b(),o=await d("bl_appearance:server:importOutfit",a,e,t);r(o)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),a=ge.menus(),o=typeof e=="string",i=o?e:e.type,s=a[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let m=[];c.includes("outfits")&&(m=await d("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=ge.models());let D=c.includes("tattoos"),S;D&&(S=q());let Pe=o?{}:Xe(e);if(t){let ze=GetHashKey(Ce());r=await A(r,ze),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(Ke=>{Y=Ke}),f(r)}let je=await w(r);return De(),z("appearance:data",{tabs:c,appearance:je,blacklist:Pe,tattoos:S,outfits:m,models:E,allowExit:l,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("OpenMenu",O);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let a=r.toLowerCase();O(a)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let a={...r},o=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(o.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(o.gang.name)),!c){let l=s[u];a=Object.assign({},a,l,{drawables:Object.assign({},a.drawables,l.drawables)})}}}return a}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),a=await d("bl_appearance:server:getAppearance",r);t(a)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let a of t){let o=t[a];r.push({component_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let a of t){let o=t[a];r.push({prop_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{f(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let a={index:r.component_id,value:r.drawable,texture:r.texture};_(e,a)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let a={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,a)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await _e(100);let e=await b(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),a=GetPedArmour(n),o=await d("bl_appearance:server:getAppearance",e);o&&(await P(o),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,a))},!1); diff --git a/dist/server/init.js b/dist/server/init.js index ace6f8a..d2874e1 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=t=>e=>{var n=t[e];if(n)return n();throw new Error("Module not found in bundle: "+e)};var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),x=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},pe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of oe(e))!ie.call(t,a)&&a!==n&&T(t,a,{get:()=>e[a],enumerable:!(r=ae(e,a))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?re(se(t)):{},pe(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t));function p(t,e,...n){let r;do r=`${t}:${Math.floor(Math.random()*100001)}:${e}`;while(h[r]);return emitNet(`_bl_cb_${t}`,e,N,r,...n),new Promise(a=>{h[r]=a})}function o(t,e){onNet(`_bl_cb_${t}`,async(n,r,...a)=>{let i=source,g;try{g=await e(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${t}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(t,...e)=>{let n=h[t];return n&&n(...e)});le=exports.bl_bridge,y=le.core(),k=t=>y.GetPlayer(t),c=t=>{let e=y.GetPlayer(t);return e?e.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(t,e){if(!t)throw new TypeError(e)}var l=(t,e,n,r)=>{if(typeof t=="number"&&(t=j[t]),r?b(typeof t=="object",`First argument expected object, recieved ${typeof t}`):b(typeof t=="string",`First argument expected string, received ${typeof t}`),e){let a=typeof e;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=e,e=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[t,e,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(t,e,n){return new Promise((r,a)=>{A[t](e,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(t){return b(typeof t!="string",`Query expects a string, received ${typeof t}`),j.push(t)},ready(t){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(e=>setTimeout(e,50));t()})},async query(t,e,n){[t,e,n]=l(t,e,n);let r=await u("query",t,e);return n?n(r):r},async single(t,e,n){[t,e,n]=l(t,e,n);let r=await u("single",t,e);return n?n(r):r},async scalar(t,e,n){[t,e,n]=l(t,e,n);let r=await u("scalar",t,e);return n?n(r):r},async update(t,e,n){[t,e,n]=l(t,e,n);let r=await u("update",t,e);return n?n(r):r},async insert(t,e,n){[t,e,n]=l(t,e,n);let r=await u("insert",t,e);return n?n(r):r},async prepare(t,e,n){[t,e,n]=l(t,e,n);let r=await u("prepare",t,e);return n?n(r):r},async rawExecute(t,e,n){[t,e,n]=l(t,e,n);let r=await u("rawExecute",t,e);return n?n(r):r},async transaction(t,e,n){[t,e,n]=l(t,e,n,!0);let r=await u("transaction",t,e);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=t=>new Promise(e=>setTimeout(e,t)),ye=async t=>{let e=await L.oxmysql.query("SELECT * FROM `players`");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=t=>new Promise(e=>setTimeout(e,t)),Ee=async t=>{let e=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=t=>new Promise(e=>setTimeout(e,t)),ve=async t=>{let e=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e){emitNet("qb-clothes:loadSkin",t,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(t,e){let n=y.GetPlayer(t).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[e,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(t,e){let n=c(t);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[e.label,n,e.id])}async function V(t,e){let n=c(t);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,e])>0}async function z(t,e){let n=c(t),r=null,a=0;return e.job&&(r=e.job.name,a=e.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,e.label,JSON.stringify(e.outfit),r,a])}async function Q(t,e){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[e]);return JSON.parse(n)}async function Y(t,e,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[e,r,a.outfit])}}async function K(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),n])}async function X(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),n])}async function Z(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),n])}async function q(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function ee(t,e){e||(e=c(source));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function te(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[e]);return JSON.parse(n)||[]}async function ne(t,e){if(!e&&!t)return null;e||(e=c(t));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[e]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),...JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",q);f=async(t,e,n)=>{if(t&&e){let _=c(t);if(e!==_){console.warn("You are trying to save an appearance for a different player",t,e);return}}e||(e=c(t));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[e,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",f);o("bl_appearance:server:getClothes",ee);exports("GetClothes",ee);o("bl_appearance:server:getTattoos",te);exports("GetTattoos",te);o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",ne);onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async t=>{t=t!==0?t:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(t)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(t,e)=>{y.GetPlayer(t).addItem(w,1,e)});y.RegisterUsableItem(w,async(t,e,n)=>{k(t)?.removeItem(w,1,e)&&emitNet("bl_appearance:server:useOutfitItem",t,n.outfit)})});v();export{f as saveAppearance}; +var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=t=>e=>{var n=t[e];if(n)return n();throw new Error("Module not found in bundle: "+e)};var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),x=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},pe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of oe(e))!ie.call(t,a)&&a!==n&&T(t,a,{get:()=>e[a],enumerable:!(r=ae(e,a))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?re(se(t)):{},pe(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t));function p(t,e,...n){let r;do r=`${t}:${Math.floor(Math.random()*100001)}:${e}`;while(h[r]);return emitNet(`_bl_cb_${t}`,e,N,r,...n),new Promise(a=>{h[r]=a})}function o(t,e){onNet(`_bl_cb_${t}`,async(n,r,...a)=>{let i=source,g;try{g=await e(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${t}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(t,...e)=>{let n=h[t];return n&&n(...e)});le=exports.bl_bridge,y=le.core(),k=t=>y.GetPlayer(t),c=t=>{let e=y.GetPlayer(t);return e?e.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(t,e){if(!t)throw new TypeError(e)}var l=(t,e,n,r)=>{if(typeof t=="number"&&(t=j[t]),r?b(typeof t=="object",`First argument expected object, recieved ${typeof t}`):b(typeof t=="string",`First argument expected string, received ${typeof t}`),e){let a=typeof e;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=e,e=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[t,e,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(t,e,n){return new Promise((r,a)=>{A[t](e,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(t){return b(typeof t!="string",`Query expects a string, received ${typeof t}`),j.push(t)},ready(t){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(e=>setTimeout(e,50));t()})},async query(t,e,n){[t,e,n]=l(t,e,n);let r=await u("query",t,e);return n?n(r):r},async single(t,e,n){[t,e,n]=l(t,e,n);let r=await u("single",t,e);return n?n(r):r},async scalar(t,e,n){[t,e,n]=l(t,e,n);let r=await u("scalar",t,e);return n?n(r):r},async update(t,e,n){[t,e,n]=l(t,e,n);let r=await u("update",t,e);return n?n(r):r},async insert(t,e,n){[t,e,n]=l(t,e,n);let r=await u("insert",t,e);return n?n(r):r},async prepare(t,e,n){[t,e,n]=l(t,e,n);let r=await u("prepare",t,e);return n?n(r):r},async rawExecute(t,e,n){[t,e,n]=l(t,e,n);let r=await u("rawExecute",t,e);return n?n(r):r},async transaction(t,e,n){[t,e,n]=l(t,e,n,!0);let r=await u("transaction",t,e);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=t=>new Promise(e=>setTimeout(e,t)),ye=async t=>{let e=await L.oxmysql.query("SELECT * FROM `players`");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=t=>new Promise(e=>setTimeout(e,t)),Ee=async t=>{let e=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=t=>new Promise(e=>setTimeout(e,t)),ve=async t=>{let e=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e){emitNet("qb-clothes:loadSkin",t,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(t,e){let n=y.GetPlayer(t).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[e,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(t,e){let n=c(t);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[e.label,n,e.id])}async function V(t,e){let n=c(t);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,e])>0}async function z(t,e){let n=c(t),r=null,a=0;return e.job&&(r=e.job.name,a=e.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,e.label,JSON.stringify(e.outfit),r,a])}async function Q(t,e){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[e]);return JSON.parse(n)}async function Y(t,e,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[e,r,a.outfit])}}async function K(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),n])}async function X(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),n])}async function Z(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),n])}async function q(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function ee(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function te(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[e]);return JSON.parse(n)||[]}async function ne(t,e){if(!e&&!t)return null;e||(e=c(t));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[e]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",q);f=async(t,e,n)=>{if(t&&e){let _=c(t);if(e!==_){console.warn("You are trying to save an appearance for a different player",t,e);return}}e||(e=c(t));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[e,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",f);o("bl_appearance:server:getClothes",ee);exports("GetClothes",ee);o("bl_appearance:server:getTattoos",te);exports("GetTattoos",te);o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",ne);onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async t=>{t=t!==0?t:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(t)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(t,e)=>{y.GetPlayer(t).addItem(w,1,e)});y.RegisterUsableItem(w,async(t,e,n)=>{k(t)?.removeItem(w,1,e)&&emitNet("bl_appearance:server:useOutfitItem",t,n.outfit)})});v();export{f as saveAppearance}; From 16c22a09453ce1e511c4acdf8502e6a5e2d44efd Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 10:54:40 +1000 Subject: [PATCH 08/30] fix(server exports): no need to pass source --- dist/server/init.js | 2 +- src/server/init.ts | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/dist/server/init.js b/dist/server/init.js index d2874e1..9faeace 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=t=>e=>{var n=t[e];if(n)return n();throw new Error("Module not found in bundle: "+e)};var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),x=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},pe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of oe(e))!ie.call(t,a)&&a!==n&&T(t,a,{get:()=>e[a],enumerable:!(r=ae(e,a))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?re(se(t)):{},pe(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t));function p(t,e,...n){let r;do r=`${t}:${Math.floor(Math.random()*100001)}:${e}`;while(h[r]);return emitNet(`_bl_cb_${t}`,e,N,r,...n),new Promise(a=>{h[r]=a})}function o(t,e){onNet(`_bl_cb_${t}`,async(n,r,...a)=>{let i=source,g;try{g=await e(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${t}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(t,...e)=>{let n=h[t];return n&&n(...e)});le=exports.bl_bridge,y=le.core(),k=t=>y.GetPlayer(t),c=t=>{let e=y.GetPlayer(t);return e?e.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(t,e){if(!t)throw new TypeError(e)}var l=(t,e,n,r)=>{if(typeof t=="number"&&(t=j[t]),r?b(typeof t=="object",`First argument expected object, recieved ${typeof t}`):b(typeof t=="string",`First argument expected string, received ${typeof t}`),e){let a=typeof e;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=e,e=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[t,e,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(t,e,n){return new Promise((r,a)=>{A[t](e,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(t){return b(typeof t!="string",`Query expects a string, received ${typeof t}`),j.push(t)},ready(t){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(e=>setTimeout(e,50));t()})},async query(t,e,n){[t,e,n]=l(t,e,n);let r=await u("query",t,e);return n?n(r):r},async single(t,e,n){[t,e,n]=l(t,e,n);let r=await u("single",t,e);return n?n(r):r},async scalar(t,e,n){[t,e,n]=l(t,e,n);let r=await u("scalar",t,e);return n?n(r):r},async update(t,e,n){[t,e,n]=l(t,e,n);let r=await u("update",t,e);return n?n(r):r},async insert(t,e,n){[t,e,n]=l(t,e,n);let r=await u("insert",t,e);return n?n(r):r},async prepare(t,e,n){[t,e,n]=l(t,e,n);let r=await u("prepare",t,e);return n?n(r):r},async rawExecute(t,e,n){[t,e,n]=l(t,e,n);let r=await u("rawExecute",t,e);return n?n(r):r},async transaction(t,e,n){[t,e,n]=l(t,e,n,!0);let r=await u("transaction",t,e);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=t=>new Promise(e=>setTimeout(e,t)),ye=async t=>{let e=await L.oxmysql.query("SELECT * FROM `players`");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=t=>new Promise(e=>setTimeout(e,t)),Ee=async t=>{let e=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e)if(n.skin){await p("bl_appearance:client:migration:setAppearance",t,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=t=>new Promise(e=>setTimeout(e,t)),ve=async t=>{let e=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(e){for(let n of e){emitNet("qb-clothes:loadSkin",t,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",t),a=parseInt(t);await f(a,n.citizenid,r)}console.log("Converted "+e.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(t,e){let n=y.GetPlayer(t).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[e,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(t,e){let n=c(t);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[e.label,n,e.id])}async function V(t,e){let n=c(t);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,e])>0}async function z(t,e){let n=c(t),r=null,a=0;return e.job&&(r=e.job.name,a=e.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,e.label,JSON.stringify(e.outfit),r,a])}async function Q(t,e){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[e]);return JSON.parse(n)}async function Y(t,e,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[e,r,a.outfit])}}async function K(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(e),n])}async function X(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(e),n])}async function Z(t,e){let n=c(t);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(e),n])}async function q(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function ee(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[e]);return JSON.parse(n)}async function te(t,e){e||(e=c(t));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[e]);return JSON.parse(n)||[]}async function ne(t,e){if(!e&&!t)return null;e||(e=c(t));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[e]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",q);f=async(t,e,n)=>{if(t&&e){let _=c(t);if(e!==_){console.warn("You are trying to save an appearance for a different player",t,e);return}}e||(e=c(t));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[e,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",f);o("bl_appearance:server:getClothes",ee);exports("GetClothes",ee);o("bl_appearance:server:getTattoos",te);exports("GetTattoos",te);o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",ne);onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async t=>{t=t!==0?t:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(t)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(t,e)=>{y.GetPlayer(t).addItem(w,1,e)});y.RegisterUsableItem(w,async(t,e,n)=>{k(t)?.removeItem(w,1,e)&&emitNet("bl_appearance:server:useOutfitItem",t,n.outfit)})});v();export{f as saveAppearance}; +var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var m=(e,t)=>()=>(e&&(t=e(e=0)),t);var ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),x=(e,t)=>{for(var n in t)T(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of oe(t))!ie.call(e,a)&&a!==n&&T(e,a,{get:()=>t[a],enumerable:!(r=ae(t,a))||r.enumerable});return e};var S=(e,t,n)=>(n=e!=null?re(se(e)):{},pe(t||!e||!e.__esModule?T(n,"default",{value:e,enumerable:!0}):n,e));function p(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(h[r]);return emitNet(`_bl_cb_${e}`,t,N,r,...n),new Promise(a=>{h[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,g;try{g=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(e,...t)=>{let n=h[e];return n&&n(...t)});le=exports.bl_bridge,y=le.core(),k=e=>y.GetPlayer(e),c=e=>{let t=y.GetPlayer(e);return t?t.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(e,t){if(!e)throw new TypeError(t)}var l=(e,t,n,r)=>{if(typeof e=="number"&&(e=j[e]),r?b(typeof e=="object",`First argument expected object, recieved ${typeof e}`):b(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(e){return b(typeof e!="string",`Query expects a string, received ${typeof e}`),j.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=l(e,t,n);let r=await u("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=l(e,t,n);let r=await u("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=l(e,t,n);let r=await u("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=l(e,t,n);let r=await u("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=l(e,t,n);let r=await u("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=l(e,t,n);let r=await u("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=l(e,t,n);let r=await u("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=l(e,t,n,!0);let r=await u("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=e=>new Promise(t=>setTimeout(t,e)),ye=async e=>{let t=await L.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await p("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=e=>new Promise(t=>setTimeout(t,e)),Ee=async e=>{let t=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await p("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(e,t){let n=y.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(e,t){let n=c(e);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}async function V(e,t){let n=c(e);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}async function z(e,t){let n=c(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}async function Q(e,t){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}async function Y(e,t,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}async function K(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function X(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function Z(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function q(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}async function ee(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}async function te(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}async function ne(e,t){if(!t&&!e)return null;t||(t=c(e));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",function(e){return q(null,e)});f=async(e,t,n)=>{if(e&&t){let _=c(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=c(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",function(e,t){return f(null,e,t)});o("bl_appearance:server:getClothes",ee);exports("GetClothes",function(e){return ee(null,e)});o("bl_appearance:server:getTattoos",te);exports("GetTattoos",function(e){return te(null,e)});o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",function(e){return ne(null,e)});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{y.GetPlayer(e).addItem(w,1,t)});y.RegisterUsableItem(w,async(e,t,n)=>{k(e)?.removeItem(w,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)})});v();export{f as saveAppearance}; diff --git a/src/server/init.ts b/src/server/init.ts index 9eee18a..5fe11a4 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -149,7 +149,9 @@ async function getSkin(src: number, frameworkId: string) { return JSON.parse(response); } onClientCallback('bl_appearance:server:getSkin', getSkin); -exports('GetSkin', getSkin); +exports('GetSkin', function(id) { + return getSkin(null, id) +}); export const saveAppearance = async (src: number, frameworkId: string, appearance: TAppearance) => { if (src && frameworkId) { @@ -193,7 +195,9 @@ export const saveAppearance = async (src: number, frameworkId: string, appearanc return result; } onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); -exports('SaveAppearance', saveAppearance); +exports('SaveAppearance', function(id, appearance) { + return saveAppearance(null, id, appearance) +}); async function getClothes(src: number, frameworkId: string) { if (!frameworkId) { @@ -207,7 +211,9 @@ async function getClothes(src: number, frameworkId: string) { return JSON.parse(response); } onClientCallback('bl_appearance:server:getClothes', getClothes); -exports('GetClothes', getClothes); +exports('GetClothes', function(id) { + return getClothes(null, id) +}); async function getTattoos(src: number, frameworkId: string) { if (!frameworkId) { @@ -221,7 +227,9 @@ async function getTattoos(src: number, frameworkId: string) { return JSON.parse(response) || []; } onClientCallback('bl_appearance:server:getTattoos', getTattoos); -exports('GetTattoos', getTattoos); +exports('GetTattoos', function(id) { + return getTattoos(null, id) +}); async function getAppearance(src: number, frameworkId: string) { if (!frameworkId && !src) return null; @@ -245,7 +253,9 @@ async function getAppearance(src: number, frameworkId: string) { return appearance; } onClientCallback('bl_appearance:server:getAppearance', getAppearance); -exports('GetAppearance', getAppearance); +exports('GetAppearance', function(id) { + return getAppearance(null, id) +}); onNet('bl_appearance:server:setroutingbucket', () => { SetPlayerRoutingBucket(source.toString(), source) From 8838a76ef602360835be626d650681ea51b9e3d2 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:15:26 +1000 Subject: [PATCH 09/30] ref(server setters and getters): Split up into individual files --- dist/server/init.js | 2 +- src/server/appearance/getters.ts | 77 +++++++++ src/server/appearance/outfits.ts | 118 +++++++++++++ src/server/appearance/setters.ts | 87 ++++++++++ src/server/init.ts | 278 +------------------------------ src/server/migrate/fivem.ts | 4 +- src/server/migrate/illenium.ts | 4 +- src/server/migrate/qb.ts | 4 +- 8 files changed, 292 insertions(+), 282 deletions(-) create mode 100644 src/server/appearance/getters.ts create mode 100644 src/server/appearance/outfits.ts create mode 100644 src/server/appearance/setters.ts diff --git a/dist/server/init.js b/dist/server/init.js index 9faeace..d2b892c 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var re=Object.create;var T=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var R=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var m=(e,t)=>()=>(e&&(t=e(e=0)),t);var ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),x=(e,t)=>{for(var n in t)T(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of oe(t))!ie.call(e,a)&&a!==n&&T(e,a,{get:()=>t[a],enumerable:!(r=ae(t,a))||r.enumerable});return e};var S=(e,t,n)=>(n=e!=null?re(se(e)):{},pe(t||!e||!e.__esModule?T(n,"default",{value:e,enumerable:!0}):n,e));function p(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(h[r]);return emitNet(`_bl_cb_${e}`,t,N,r,...n),new Promise(a=>{h[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,g;try{g=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,g)})}var N,h,le,y,k,c,ue,P,d=m(()=>{N=GetCurrentResourceName(),h={};onNet(`_bl_cb_${N}`,(e,...t)=>{let n=h[e];return n&&n(...t)});le=exports.bl_bridge,y=le.core(),k=e=>y.GetPlayer(e),c=e=>{let t=y.GetPlayer(e);return t?t.id:null},ue=exports.bl_appearance.config(),P=ue});var E=ce(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.oxmysql=void 0;var j=[];function b(e,t){if(!e)throw new TypeError(t)}var l=(e,t,n,r)=>{if(typeof e=="number"&&(e=j[e]),r?b(typeof e=="object",`First argument expected object, recieved ${typeof e}`):b(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;b(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&b(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function u(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,g)=>{if(g)return a(g);r(i)},fe,!0)})}O.oxmysql={store(e){return b(typeof e!="string",`Query expects a string, received ${typeof e}`),j.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=l(e,t,n);let r=await u("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=l(e,t,n);let r=await u("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=l(e,t,n);let r=await u("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=l(e,t,n);let r=await u("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=l(e,t,n);let r=await u("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=l(e,t,n);let r=await u("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=l(e,t,n);let r=await u("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=l(e,t,n,!0);let r=await u("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});var me={};var I=m(()=>{});var D={};x(D,{default:()=>de});var L,ge,ye,de,J=m(()=>{L=S(E(),1);d();v();ge=e=>new Promise(t=>setTimeout(t,e)),ye=async e=>{let t=await L.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await p("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await ge(100);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},de=ye});var F={};x(F,{default:()=>Se});var M,be,Ee,Se,$=m(()=>{M=S(E(),1);d();v();be=e=>new Promise(t=>setTimeout(t,e)),Ee=async e=>{let t=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await p("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await be(100);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Se=Ee});var W={};x(W,{default:()=>we});var H,Oe,ve,we,U=m(()=>{H=S(E(),1);d();v();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await H.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await p("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=ve});var _e,C=m(()=>{_e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(I(),me)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(J(),D)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>($(),F)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(U(),W))})});async function G(e,t){let n=y.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await s.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}async function B(e,t){let n=c(e);return await s.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}async function V(e,t){let n=c(e);return await s.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}async function z(e,t){let n=c(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}async function Q(e,t){let n=await s.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}async function Y(e,t,n,r){let a=await s.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await s.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}async function K(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function X(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function Z(e,t){let n=c(e);return await s.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function q(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}async function ee(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}async function te(e,t){t||(t=c(e));let n=await s.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}async function ne(e,t){if(!t&&!e)return null;t||(t=c(e));let n=await s.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}var s,f,w,v=m(()=>{d();s=S(E(),1);C();o("bl_appearance:server:getOutfits",G);exports("GetOutfits",G);o("bl_appearance:server:renameOutfit",B);exports("RenameOutfit",B);o("bl_appearance:server:deleteOutfit",V);exports("DeleteOutfit",V);o("bl_appearance:server:saveOutfit",z);exports("SaveOutfit",z);o("bl_appearance:server:fetchOutfit",Q);exports("FetchOutfit",Q);o("bl_appearance:server:importOutfit",Y);exports("ImportOutfit",Y);o("bl_appearance:server:saveSkin",K);exports("SaveSkin",K);o("bl_appearance:server:saveClothes",X);exports("SaveClothes",X);o("bl_appearance:server:saveTattoos",Z);exports("SaveTattoos",Z);o("bl_appearance:server:getSkin",q);exports("GetSkin",function(e){return q(null,e)});f=async(e,t,n)=>{if(e&&t){let _=c(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=c(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await s.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])};o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",function(e,t){return f(null,e,t)});o("bl_appearance:server:getClothes",ee);exports("GetClothes",function(e){return ee(null,e)});o("bl_appearance:server:getTattoos",te);exports("GetTattoos",function(e){return te(null,e)});o("bl_appearance:server:getAppearance",ne);exports("GetAppearance",function(e){return ne(null,e)});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1);w=P.outfitItem;w||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{y.GetPlayer(e).addItem(w,1,t)});y.RegisterUsableItem(w,async(e,t,n)=>{k(e)?.removeItem(w,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)})});v();export{f as saveAppearance}; +var G=Object.create;var h=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var _=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var z=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),E=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},Q=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of W(t))!V.call(e,a)&&a!==n&&h(e,a,{get:()=>t[a],enumerable:!(r=H(t,a))||r.enumerable});return e};var v=(e,t,n)=>(n=e!=null?G(B(e)):{},Q(t||!e||!e.__esModule?h(n,"default",{value:e,enumerable:!0}):n,e));var Y={};var k=u(()=>{});var g=z(T=>{"use strict";Object.defineProperty(T,"__esModule",{value:!0});T.oxmysql=void 0;var b=[];function m(e,t){if(!e)throw new TypeError(t)}var o=(e,t,n,r)=>{if(typeof e=="number"&&(e=b[e]),r?m(typeof e=="object",`First argument expected object, recieved ${typeof e}`):m(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;m(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&m(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,K=GetCurrentResourceName();function s(e,t,n){return new Promise((r,a)=>{A[e](t,n,(p,l)=>{if(l)return a(l);r(p)},K,!0)})}T.oxmysql={store(e){return m(typeof e!="string",`Query expects a string, received ${typeof e}`),b.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=o(e,t,n);let r=await s("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=o(e,t,n);let r=await s("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=o(e,t,n);let r=await s("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=o(e,t,n);let r=await s("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=o(e,t,n);let r=await s("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=o(e,t,n);let r=await s("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=o(e,t,n);let r=await s("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=o(e,t,n,!0);let r=await s("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function i(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(C[r]);return emitNet(`_bl_cb_${e}`,t,N,r,...n),new Promise(a=>{C[r]=a})}function d(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let p=source,l;try{l=await t(p,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,p,r,l)})}var N,C,X,Z,f,ue,y=u(()=>{N=GetCurrentResourceName(),C={};onNet(`_bl_cb_${N}`,(e,...t)=>{let n=C[e];return n&&n(...t)});X=exports.bl_bridge,Z=X.core(),f=e=>{let t=Z.GetPlayer(e);return t?t.id:null},ue=exports.bl_appearance.config()});async function P(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function R(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function O(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function c(e,t,n){if(e&&t){let x=f(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=f(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},p=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(p)])}var w,S=u(()=>{y();w=v(g(),1);d("bl_appearance:server:saveSkin",P);exports("SaveSkin",P);d("bl_appearance:server:saveClothes",R);exports("SaveClothes",R);d("bl_appearance:server:saveTattoos",O);exports("SaveTattoos",O);d("bl_appearance:server:saveAppearance",c);exports("SaveAppearance",function(e,t){return c(null,e,t)})});var I={};E(I,{default:()=>te});var $,q,ee,te,U=u(()=>{$=v(g(),1);y();S();q=e=>new Promise(t=>setTimeout(t,e)),ee=async e=>{let t=await $.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await i("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await q(100);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},te=ee});var J={};E(J,{default:()=>ae});var D,ne,re,ae,L=u(()=>{D=v(g(),1);y();S();ne=e=>new Promise(t=>setTimeout(t,e)),re=async e=>{let t=await D.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await i("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await ne(100);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ae=re});var F={};E(F,{default:()=>ie});var M,oe,se,ie,j=u(()=>{M=v(g(),1);y();S();oe=e=>new Promise(t=>setTimeout(t,e)),se=async e=>{let t=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await oe(200);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ie=se});var ce=_({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(k(),Y)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(U(),I)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(L(),J)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(j(),F))});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await ce(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); diff --git a/src/server/appearance/getters.ts b/src/server/appearance/getters.ts new file mode 100644 index 0000000..cbdb2d8 --- /dev/null +++ b/src/server/appearance/getters.ts @@ -0,0 +1,77 @@ +import { oxmysql } from "@overextended/oxmysql"; +import { getFrameworkID, onClientCallback } from "../utils"; +import { SkinDB } from "@typings/appearance"; + +async function getSkin(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const response = await oxmysql.prepare( + 'SELECT skin FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:getSkin', getSkin); +exports('GetSkin', function(id) { + return getSkin(null, id) +}); + +async function getClothes(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const response = await oxmysql.prepare( + 'SELECT clothes FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:getClothes', getClothes); +exports('GetClothes', function(id) { + return getClothes(null, id) +}); + +async function getTattoos(src: number, frameworkId: string) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const response = await oxmysql.prepare( + 'SELECT tattoos FROM appearance WHERE id = ?', + [frameworkId] + ); + return JSON.parse(response) || []; +} +onClientCallback('bl_appearance:server:getTattoos', getTattoos); +exports('GetTattoos', function(id) { + return getTattoos(null, id) +}); + +async function getAppearance(src: number, frameworkId: string) { + if (!frameworkId && !src) return null; + + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const response: SkinDB = await oxmysql.single( + 'SELECT * FROM appearance WHERE id = ? LIMIT 1', + [frameworkId] + ); + + if (!response) return null; + let appearance = { + ...JSON.parse(response.skin), + ...JSON.parse(response.clothes), + tattoos: JSON.parse(response.tattoos), + } + appearance.id = response.id + return appearance; +} +onClientCallback('bl_appearance:server:getAppearance', getAppearance); +exports('GetAppearance', function(id) { + return getAppearance(null, id) +}); diff --git a/src/server/appearance/outfits.ts b/src/server/appearance/outfits.ts new file mode 100644 index 0000000..ed73ba9 --- /dev/null +++ b/src/server/appearance/outfits.ts @@ -0,0 +1,118 @@ +import { oxmysql } from "@overextended/oxmysql"; +import { config, core, getFrameworkID, getPlayerData, onClientCallback } from "../utils"; +import { Outfit } from "@typings/outfits"; + +async function getOutfits(src: number, frameworkId: string) { + const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } } + let response = await oxmysql.prepare( + 'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)', + [frameworkId, job.name, job.grade.name] + ); + if (!response) return []; + + if (!Array.isArray(response)) { + response = [response]; + } + + const outfits = response.map( + (outfit: { id: number; label: string; outfit: string; jobname?: string }) => { + return { + id: outfit.id, + label: outfit.label, + outfit: JSON.parse(outfit.outfit), + jobname: outfit.jobname, + }; + } + ); + + return outfits; +} +onClientCallback('bl_appearance:server:getOutfits', getOutfits); +exports('GetOutfits', getOutfits); + +async function renameOutfit(src: number, data: { id: number; label: string }) { + const frameworkId = getFrameworkID(src); + const result = await oxmysql.update( + 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?', + [data.label, frameworkId, data.id] + ); + return result; +} +onClientCallback('bl_appearance:server:renameOutfit', renameOutfit); +exports('RenameOutfit', renameOutfit); + +async function deleteOutfit(src: number, id: number) { + const frameworkId = getFrameworkID(src); + const result = await oxmysql.update( + 'DELETE FROM outfits WHERE player_id = ? AND id = ?', + [frameworkId, id] + ); + return result > 0; +} +onClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit); +exports('DeleteOutfit', deleteOutfit); + +async function saveOutfit(src: number, data: Outfit) { + const frameworkId = getFrameworkID(src); + let jobname = null; + let jobrank = 0; + if (data.job) { + jobname = data.job.name; + jobrank = data.job.rank; + } + const id = await oxmysql.insert( + 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)', + [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank] + ); + return id; +} +onClientCallback('bl_appearance:server:saveOutfit', saveOutfit); +exports('SaveOutfit', saveOutfit); + + +async function fetchOutfit(_: number, id: number) { + const response = await oxmysql.prepare( + 'SELECT outfit FROM outfits WHERE id = ?', + [id] + ); + return JSON.parse(response); +} +onClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit); +exports('FetchOutfit', fetchOutfit); + +async function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) { + const result = await oxmysql.query( + 'SELECT label, outfit FROM outfits WHERE id = ?', + [outfitId] + ); + + if (!result || typeof result !== 'object' || Object.keys(result).length === 0) { + return { success: false, message: 'Outfit not found' }; + } + + const newId = await oxmysql.insert( + 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)', + [frameworkId, outfitName, result.outfit] + ); + + return { success: true, newId: newId }; +} +onClientCallback('bl_appearance:server:importOutfit', importOutfit); +exports('ImportOutfit', importOutfit); + +const outfitItem = config.outfitItem + +if (!outfitItem) { + console.warn('bl_appearance: No outfit item configured, please set it in config.lua') +} + +onClientCallback('bl_appearance:server:itemOutfit', async (src, data) => { + const player = core.GetPlayer(src) + player.addItem(outfitItem, 1, data) +}); + +core.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => { + const player = getPlayerData(source) + if (player?.removeItem(outfitItem, 1, slot)) + emitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit) +}) \ No newline at end of file diff --git a/src/server/appearance/setters.ts b/src/server/appearance/setters.ts new file mode 100644 index 0000000..8fde635 --- /dev/null +++ b/src/server/appearance/setters.ts @@ -0,0 +1,87 @@ +import { TAppearance, TClothes, TSkin } from '@typings/appearance'; +import { getFrameworkID, onClientCallback, } from '../utils'; +import { oxmysql } from '@overextended/oxmysql'; +import { TTattoo } from '@typings/tattoos'; + +export async function saveSkin(src: number, skin: TSkin) { + const frameworkId = getFrameworkID(src); + + const result = await oxmysql.update( + 'UPDATE appearance SET skin = ? WHERE id = ?', + [JSON.stringify(skin), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveSkin', saveSkin); +exports('SaveSkin', saveSkin); + +export async function saveClothes(src: number, clothes: TClothes) { + const frameworkId = getFrameworkID(src); + + const result = await oxmysql.update( + 'UPDATE appearance SET clothes = ? WHERE id = ?', + [JSON.stringify(clothes), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveClothes', saveClothes); +exports('SaveClothes', saveClothes); + +export async function saveTattoos(src: number, tattoos: TTattoo[]) { + const frameworkId = getFrameworkID(src); + + const result = await oxmysql.update( + 'UPDATE appearance SET tattoos = ? WHERE id = ?', + [JSON.stringify(tattoos), frameworkId] + ); + return result; +} +onClientCallback('bl_appearance:server:saveTattoos', saveTattoos); +exports('SaveTattoos', saveTattoos); + + +export async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) { + if (src && frameworkId) { + const playerId = getFrameworkID(src); + + if (frameworkId !== playerId) { + console.warn('You are trying to save an appearance for a different player', src, frameworkId); + return; + } + } + + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + + const clothes = { + drawables: appearance.drawables, + props: appearance.props, + headOverlay: appearance.headOverlay, + }; + + const skin = { + headBlend: appearance.headBlend, + headStructure: appearance.headStructure, + hairColor: appearance.hairColor, + model: appearance.model, + }; + + const tattoos = appearance.tattoos || []; + + const result = await oxmysql.prepare( + 'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);', + [ + frameworkId, + JSON.stringify(clothes), + JSON.stringify(skin), + JSON.stringify(tattoos), + ] + ); + + return result; +} +onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); +exports('SaveAppearance', function(id, appearance) { + return saveAppearance(null, id, appearance) +}); diff --git a/src/server/init.ts b/src/server/init.ts index 5fe11a4..cbda973 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -1,261 +1,6 @@ -import { core, getFrameworkID, onClientCallback, config, getPlayerData } from './utils'; -import { oxmysql } from '@overextended/oxmysql'; -import { Outfit } from '@typings/outfits'; -import { SkinDB, TAppearance } from '@typings/appearance'; - -async function getOutfits(src: number, frameworkId: string) { - const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } } - let response = await oxmysql.prepare( - 'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)', - [frameworkId, job.name, job.grade.name] - ); - if (!response) return []; - - if (!Array.isArray(response)) { - response = [response]; - } - - const outfits = response.map( - (outfit: { id: number; label: string; outfit: string; jobname?: string }) => { - return { - id: outfit.id, - label: outfit.label, - outfit: JSON.parse(outfit.outfit), - jobname: outfit.jobname, - }; - } - ); - - return outfits; -} -onClientCallback('bl_appearance:server:getOutfits', getOutfits); -exports('GetOutfits', getOutfits); - -async function renameOutfit(src: number, data: { id: number; label: string }) { - const frameworkId = getFrameworkID(src); - const result = await oxmysql.update( - 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?', - [data.label, frameworkId, data.id] - ); - return result; -} -onClientCallback('bl_appearance:server:renameOutfit', renameOutfit); -exports('RenameOutfit', renameOutfit); - -async function deleteOutfit(src: number, id: number) { - const frameworkId = getFrameworkID(src); - const result = await oxmysql.update( - 'DELETE FROM outfits WHERE player_id = ? AND id = ?', - [frameworkId, id] - ); - return result > 0; -} -onClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit); -exports('DeleteOutfit', deleteOutfit); - -async function saveOutfit(src: number, data: Outfit) { - const frameworkId = getFrameworkID(src); - let jobname = null; - let jobrank = 0; - if (data.job) { - jobname = data.job.name; - jobrank = data.job.rank; - } - const id = await oxmysql.insert( - 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)', - [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank] - ); - return id; -} -onClientCallback('bl_appearance:server:saveOutfit', saveOutfit); -exports('SaveOutfit', saveOutfit); - - -async function fetchOutfit(_: number, id: number) { - const response = await oxmysql.prepare( - 'SELECT outfit FROM outfits WHERE id = ?', - [id] - ); - return JSON.parse(response); -} -onClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit); -exports('FetchOutfit', fetchOutfit); - -async function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) { - const result = await oxmysql.query( - 'SELECT label, outfit FROM outfits WHERE id = ?', - [outfitId] - ); - - if (!result || typeof result !== 'object' || Object.keys(result).length === 0) { - return { success: false, message: 'Outfit not found' }; - } - - const newId = await oxmysql.insert( - 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)', - [frameworkId, outfitName, result.outfit] - ); - - return { success: true, newId: newId }; -} -onClientCallback('bl_appearance:server:importOutfit', importOutfit); -exports('ImportOutfit', importOutfit); - -async function saveSkin(src: number, skin: any) { - const frameworkId = getFrameworkID(src); - - const result = await oxmysql.update( - 'UPDATE appearance SET skin = ? WHERE id = ?', - [JSON.stringify(skin), frameworkId] - ); - return result; -} -onClientCallback('bl_appearance:server:saveSkin', saveSkin); -exports('SaveSkin', saveSkin); - -async function saveClothes(src: number, clothes: any) { - const frameworkId = getFrameworkID(src); - - const result = await oxmysql.update( - 'UPDATE appearance SET clothes = ? WHERE id = ?', - [JSON.stringify(clothes), frameworkId] - ); - return result; -} -onClientCallback('bl_appearance:server:saveClothes', saveClothes); -exports('SaveClothes', saveClothes); - -async function saveTattoos(src: number, tattoos: any) { - const frameworkId = getFrameworkID(src); - - const result = await oxmysql.update( - 'UPDATE appearance SET tattoos = ? WHERE id = ?', - [JSON.stringify(tattoos), frameworkId] - ); - return result; -} -onClientCallback('bl_appearance:server:saveTattoos', saveTattoos); -exports('SaveTattoos', saveTattoos); - -async function getSkin(src: number, frameworkId: string) { - if (!frameworkId) { - frameworkId = getFrameworkID(src); - } - - const response = await oxmysql.prepare( - 'SELECT skin FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response); -} -onClientCallback('bl_appearance:server:getSkin', getSkin); -exports('GetSkin', function(id) { - return getSkin(null, id) -}); - -export const saveAppearance = async (src: number, frameworkId: string, appearance: TAppearance) => { - if (src && frameworkId) { - const playerId = getFrameworkID(src); - - if (frameworkId !== playerId) { - console.warn('You are trying to save an appearance for a different player', src, frameworkId); - return; - } - } - - if (!frameworkId) { - frameworkId = getFrameworkID(src); - } - - const clothes = { - drawables: appearance.drawables, - props: appearance.props, - headOverlay: appearance.headOverlay, - }; - - const skin = { - headBlend: appearance.headBlend, - headStructure: appearance.headStructure, - hairColor: appearance.hairColor, - model: appearance.model, - }; - - const tattoos = appearance.tattoos || []; - - const result = await oxmysql.prepare( - 'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);', - [ - frameworkId, - JSON.stringify(clothes), - JSON.stringify(skin), - JSON.stringify(tattoos), - ] - ); - - return result; -} -onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); -exports('SaveAppearance', function(id, appearance) { - return saveAppearance(null, id, appearance) -}); - -async function getClothes(src: number, frameworkId: string) { - if (!frameworkId) { - frameworkId = getFrameworkID(src); - } - - const response = await oxmysql.prepare( - 'SELECT clothes FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response); -} -onClientCallback('bl_appearance:server:getClothes', getClothes); -exports('GetClothes', function(id) { - return getClothes(null, id) -}); - -async function getTattoos(src: number, frameworkId: string) { - if (!frameworkId) { - frameworkId = getFrameworkID(src); - } - - const response = await oxmysql.prepare( - 'SELECT tattoos FROM appearance WHERE id = ?', - [frameworkId] - ); - return JSON.parse(response) || []; -} -onClientCallback('bl_appearance:server:getTattoos', getTattoos); -exports('GetTattoos', function(id) { - return getTattoos(null, id) -}); - -async function getAppearance(src: number, frameworkId: string) { - if (!frameworkId && !src) return null; - - if (!frameworkId) { - frameworkId = getFrameworkID(src); - } - - const response: SkinDB = await oxmysql.single( - 'SELECT * FROM appearance WHERE id = ? LIMIT 1', - [frameworkId] - ); - - if (!response) return null; - let appearance = { - ...JSON.parse(response.skin), - ...JSON.parse(response.clothes), - tattoos: JSON.parse(response.tattoos), - } - appearance.id = response.id - return appearance; -} -onClientCallback('bl_appearance:server:getAppearance', getAppearance); -exports('GetAppearance', function(id) { - return getAppearance(null, id) -}); +import './appearance/outfits'; +import './appearance/setters'; +import './appearance/getters'; onNet('bl_appearance:server:setroutingbucket', () => { SetPlayerRoutingBucket(source.toString(), source) @@ -272,20 +17,3 @@ RegisterCommand('migrate', async (source: number) => { const importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`) importedModule.default(source) }, false); - -const outfitItem = config.outfitItem - -if (!outfitItem) { - console.warn('bl_appearance: No outfit item configured, please set it in config.lua') -} - -onClientCallback('bl_appearance:server:itemOutfit', async (src, data) => { - const player = core.GetPlayer(src) - player.addItem(outfitItem, 1, data) -}); - -core.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => { - const player = getPlayerData(source) - if (player?.removeItem(outfitItem, 1, slot)) - emitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit) -}) \ No newline at end of file diff --git a/src/server/migrate/fivem.ts b/src/server/migrate/fivem.ts index d65d692..cb6ddcb 100644 --- a/src/server/migrate/fivem.ts +++ b/src/server/migrate/fivem.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; import { TAppearance } from '@typings/appearance'; -import { saveAppearance } from '../init'; +import { saveAppearance } from '../appearance/setters'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -18,7 +18,7 @@ const migrate = async (src: string) => { await delay(100); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance const playerSrc = parseInt(src) - await saveAppearance(playerSrc, element.citizenid, response) + await saveAppearance(playerSrc, element.citizenid, response as TAppearance) } } console.log('Converted '+ response.length + ' appearances') diff --git a/src/server/migrate/illenium.ts b/src/server/migrate/illenium.ts index f36fb20..2d5427b 100644 --- a/src/server/migrate/illenium.ts +++ b/src/server/migrate/illenium.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; import { TAppearance } from '@typings/appearance'; -import { saveAppearance } from '../init'; +import { saveAppearance } from '../appearance/setters'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -18,7 +18,7 @@ const migrate = async (src: string) => { await delay(100); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance const playerSrc = parseInt(src) - await saveAppearance(playerSrc, element.citizenid, response) + await saveAppearance(playerSrc, element.citizenid, response as TAppearance) } } console.log('Converted '+ response.length + ' appearances') diff --git a/src/server/migrate/qb.ts b/src/server/migrate/qb.ts index d35c079..2329ab9 100644 --- a/src/server/migrate/qb.ts +++ b/src/server/migrate/qb.ts @@ -1,7 +1,7 @@ import { oxmysql } from '@overextended/oxmysql'; import { triggerClientCallback } from '../utils'; import { TAppearance } from '@typings/appearance'; -import { saveAppearance } from '../init'; +import { saveAppearance } from '../appearance/setters'; const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); @@ -14,7 +14,7 @@ const migrate = async (src: string) => { await delay(200); const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance const playerSrc = parseInt(src) - await saveAppearance(playerSrc, element.citizenid, response) + await saveAppearance(playerSrc, element.citizenid, response as TAppearance) } console.log('Converted '+ response.length + ' appearances') }; From bbc30b92dbe8896eaafde32cc8abe98b2bd94ab8 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:15:38 +1000 Subject: [PATCH 10/30] Update init.js --- dist/server/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/server/init.js b/dist/server/init.js index d2b892c..eb2aa78 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var G=Object.create;var h=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var _=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var z=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),E=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},Q=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of W(t))!V.call(e,a)&&a!==n&&h(e,a,{get:()=>t[a],enumerable:!(r=H(t,a))||r.enumerable});return e};var v=(e,t,n)=>(n=e!=null?G(B(e)):{},Q(t||!e||!e.__esModule?h(n,"default",{value:e,enumerable:!0}):n,e));var Y={};var k=u(()=>{});var g=z(T=>{"use strict";Object.defineProperty(T,"__esModule",{value:!0});T.oxmysql=void 0;var b=[];function m(e,t){if(!e)throw new TypeError(t)}var o=(e,t,n,r)=>{if(typeof e=="number"&&(e=b[e]),r?m(typeof e=="object",`First argument expected object, recieved ${typeof e}`):m(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;m(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&m(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,K=GetCurrentResourceName();function s(e,t,n){return new Promise((r,a)=>{A[e](t,n,(p,l)=>{if(l)return a(l);r(p)},K,!0)})}T.oxmysql={store(e){return m(typeof e!="string",`Query expects a string, received ${typeof e}`),b.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=o(e,t,n);let r=await s("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=o(e,t,n);let r=await s("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=o(e,t,n);let r=await s("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=o(e,t,n);let r=await s("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=o(e,t,n);let r=await s("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=o(e,t,n);let r=await s("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=o(e,t,n);let r=await s("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=o(e,t,n,!0);let r=await s("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function i(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(C[r]);return emitNet(`_bl_cb_${e}`,t,N,r,...n),new Promise(a=>{C[r]=a})}function d(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let p=source,l;try{l=await t(p,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,p,r,l)})}var N,C,X,Z,f,ue,y=u(()=>{N=GetCurrentResourceName(),C={};onNet(`_bl_cb_${N}`,(e,...t)=>{let n=C[e];return n&&n(...t)});X=exports.bl_bridge,Z=X.core(),f=e=>{let t=Z.GetPlayer(e);return t?t.id:null},ue=exports.bl_appearance.config()});async function P(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function R(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function O(e,t){let n=f(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function c(e,t,n){if(e&&t){let x=f(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=f(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},p=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(p)])}var w,S=u(()=>{y();w=v(g(),1);d("bl_appearance:server:saveSkin",P);exports("SaveSkin",P);d("bl_appearance:server:saveClothes",R);exports("SaveClothes",R);d("bl_appearance:server:saveTattoos",O);exports("SaveTattoos",O);d("bl_appearance:server:saveAppearance",c);exports("SaveAppearance",function(e,t){return c(null,e,t)})});var I={};E(I,{default:()=>te});var $,q,ee,te,U=u(()=>{$=v(g(),1);y();S();q=e=>new Promise(t=>setTimeout(t,e)),ee=async e=>{let t=await $.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await i("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await q(100);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},te=ee});var J={};E(J,{default:()=>ae});var D,ne,re,ae,L=u(()=>{D=v(g(),1);y();S();ne=e=>new Promise(t=>setTimeout(t,e)),re=async e=>{let t=await D.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await i("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await ne(100);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ae=re});var F={};E(F,{default:()=>ie});var M,oe,se,ie,j=u(()=>{M=v(g(),1);y();S();oe=e=>new Promise(t=>setTimeout(t,e)),se=async e=>{let t=await M.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await oe(200);let r=await i("bl_appearance:client:getAppearance",e),a=parseInt(e);await c(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ie=se});var ce=_({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(k(),Y)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(U(),I)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(L(),J)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(j(),F))});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await ce(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var ae=Object.create;var C=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var R=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),A=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},le=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=oe(t,a))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?ae(se(e)):{},le(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var m=ce(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var N=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=N[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},h=global.exports.oxmysql,ue=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{h[e](t,n,(s,d)=>{if(d)return a(d);r(s)},ue,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),N.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return h.isReady()},async awaitConnection(){return await h.awaitConnection()}}});function l(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let s=source,d;try{d=await t(s,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,s,r,d)})}var P,k,fe,E,j,i,me,I,g=y(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});fe=exports.bl_bridge,E=fe.core(),j=e=>E.GetPlayer(e),i=e=>{let t=E.GetPlayer(e);return t?t.id:null},me=exports.bl_appearance.config(),I=me});async function H(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function W(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function f(e,t,n){if(e&&t){let x=i(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=i(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},s=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(s)])}var w,O=y(()=>{g();w=b(m(),1);o("bl_appearance:server:saveSkin",H);exports("SaveSkin",H);o("bl_appearance:server:saveClothes",W);exports("SaveClothes",W);o("bl_appearance:server:saveTattoos",U);exports("SaveTattoos",U);o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",function(e,t){return f(null,e,t)})});var ge={};var Q=y(()=>{});var K={};A(K,{default:()=>be});var Y,de,ye,be,X=y(()=>{Y=b(m(),1);g();O();de=e=>new Promise(t=>setTimeout(t,e)),ye=async e=>{let t=await Y.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await l("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},be=ye});var q={};A(q,{default:()=>we});var Z,Ee,Se,we,ee=y(()=>{Z=b(m(),1);g();O();Ee=e=>new Promise(t=>setTimeout(t,e)),Se=async e=>{let t=await Z.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await l("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Ee(100);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Se});var ne={};A(ne,{default:()=>ve});var te,Oe,Te,ve,re=y(()=>{te=b(m(),1);g();O();Oe=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await te.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ve=Te});var u=b(m(),1);g();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await u.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(s=>({id:s.id,label:s.label,outfit:JSON.parse(s.outfit),jobname:s.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function L(e,t){let n=i(e);return await u.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",L);exports("RenameOutfit",L);async function F(e,t){let n=i(e);return await u.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=i(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await u.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function M(e,t){let n=await u.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",M);exports("FetchOutfit",M);async function $(e,t,n,r){let a=await u.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await u.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",$);exports("ImportOutfit",$);var _=I.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});O();var T=b(m(),1);g();async function G(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",G);exports("GetSkin",function(e){return G(null,e)});async function B(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",B);exports("GetClothes",function(e){return B(null,e)});async function V(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",V);exports("GetTattoos",function(e){return V(null,e)});async function z(e,t){if(!t&&!e)return null;t||(t=i(e));let n=await T.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",z);exports("GetAppearance",function(e){return z(null,e)});var _e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Q(),ge)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(X(),K)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(ee(),q)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(re(),ne))});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); From 0f8e6b8d036b9062d59af1019718df03f386a7b8 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:30:44 +1000 Subject: [PATCH 11/30] chore(sql check): Throw error if appearance table doesnt exist --- dist/server/init.js | 2 +- src/server/init.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/dist/server/init.js b/dist/server/init.js index eb2aa78..e7d9144 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var ae=Object.create;var C=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var R=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),A=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},le=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=oe(t,a))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?ae(se(e)):{},le(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var m=ce(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var N=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=N[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},h=global.exports.oxmysql,ue=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{h[e](t,n,(s,d)=>{if(d)return a(d);r(s)},ue,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),N.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return h.isReady()},async awaitConnection(){return await h.awaitConnection()}}});function l(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let s=source,d;try{d=await t(s,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,s,r,d)})}var P,k,fe,E,j,i,me,I,g=y(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});fe=exports.bl_bridge,E=fe.core(),j=e=>E.GetPlayer(e),i=e=>{let t=E.GetPlayer(e);return t?t.id:null},me=exports.bl_appearance.config(),I=me});async function H(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function W(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=i(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function f(e,t,n){if(e&&t){let x=i(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=i(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},s=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(s)])}var w,O=y(()=>{g();w=b(m(),1);o("bl_appearance:server:saveSkin",H);exports("SaveSkin",H);o("bl_appearance:server:saveClothes",W);exports("SaveClothes",W);o("bl_appearance:server:saveTattoos",U);exports("SaveTattoos",U);o("bl_appearance:server:saveAppearance",f);exports("SaveAppearance",function(e,t){return f(null,e,t)})});var ge={};var Q=y(()=>{});var K={};A(K,{default:()=>be});var Y,de,ye,be,X=y(()=>{Y=b(m(),1);g();O();de=e=>new Promise(t=>setTimeout(t,e)),ye=async e=>{let t=await Y.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await l("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},be=ye});var q={};A(q,{default:()=>we});var Z,Ee,Se,we,ee=y(()=>{Z=b(m(),1);g();O();Ee=e=>new Promise(t=>setTimeout(t,e)),Se=async e=>{let t=await Z.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await l("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Ee(100);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Se});var ne={};A(ne,{default:()=>ve});var te,Oe,Te,ve,re=y(()=>{te=b(m(),1);g();O();Oe=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await te.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await l("bl_appearance:client:getAppearance",e),a=parseInt(e);await f(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},ve=Te});var u=b(m(),1);g();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await u.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(s=>({id:s.id,label:s.label,outfit:JSON.parse(s.outfit),jobname:s.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function L(e,t){let n=i(e);return await u.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",L);exports("RenameOutfit",L);async function F(e,t){let n=i(e);return await u.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=i(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await u.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function M(e,t){let n=await u.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",M);exports("FetchOutfit",M);async function $(e,t,n,r){let a=await u.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await u.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",$);exports("ImportOutfit",$);var _=I.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});O();var T=b(m(),1);g();async function G(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",G);exports("GetSkin",function(e){return G(null,e)});async function B(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",B);exports("GetClothes",function(e){return B(null,e)});async function V(e,t){t||(t=i(e));let n=await T.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",V);exports("GetTattoos",function(e){return V(null,e)});async function z(e,t){if(!t&&!e)return null;t||(t=i(e));let n=await T.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",z);exports("GetAppearance",function(e){return z(null,e)});var _e=R({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Q(),ge)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(X(),K)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(ee(),q)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(re(),ne))});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!ce.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(pe(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,k,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let x=s(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};h(re,{default:()=>_e});var ne,Oe,ve,_e,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},_e=ve});var f=g(l(),1);y();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",F);exports("RenameOutfit",F);async function M(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",M);exports("DeleteOutfit",M);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var _=L.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var xe=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{if(!await R.oxmysql.query("SELECT * FROM appearance LIMIT 1"))throw new Error("No appearance table found")});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await xe(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); diff --git a/src/server/init.ts b/src/server/init.ts index cbda973..dfc1ffa 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -1,6 +1,15 @@ import './appearance/outfits'; import './appearance/setters'; import './appearance/getters'; +import { oxmysql } from '@overextended/oxmysql'; + +oxmysql.ready(async () => { + // see if there is a table called appearance + const result = await oxmysql.query('SELECT * FROM appearance LIMIT 1'); + if (!result) { + throw new Error('No appearance table found'); + } +}); onNet('bl_appearance:server:setroutingbucket', () => { SetPlayerRoutingBucket(source.toString(), source) From e959597adb7145e3d504b93878b088753ec68ffa Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:34:02 +1000 Subject: [PATCH 12/30] Update init.ts --- src/server/init.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/init.ts b/src/server/init.ts index dfc1ffa..ff62505 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -5,7 +5,7 @@ import { oxmysql } from '@overextended/oxmysql'; oxmysql.ready(async () => { // see if there is a table called appearance - const result = await oxmysql.query('SELECT * FROM appearance LIMIT 1'); + const result = await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); if (!result) { throw new Error('No appearance table found'); } From 9221184696968b2c49106c83ab636275df333735 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:34:18 +1000 Subject: [PATCH 13/30] Update init.js --- dist/server/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/server/init.js b/dist/server/init.js index e7d9144..b66f4a9 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!ce.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(pe(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,k,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let x=s(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};h(re,{default:()=>_e});var ne,Oe,ve,_e,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},_e=ve});var f=g(l(),1);y();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",F);exports("RenameOutfit",F);async function M(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",M);exports("DeleteOutfit",M);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var _=L.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var xe=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{if(!await R.oxmysql.query("SELECT * FROM appearance LIMIT 1"))throw new Error("No appearance table found")});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await xe(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!ce.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(pe(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,k,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let x=s(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};h(re,{default:()=>_e});var ne,Oe,ve,_e,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},_e=ve});var f=g(l(),1);y();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",F);exports("RenameOutfit",F);async function M(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",M);exports("DeleteOutfit",M);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var _=L.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var xe=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{if(!await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1"))throw new Error("No appearance table found")});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await xe(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); From 3f57c42e443dc7ef2eb7667b1e3a58963461a891 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:36:08 +1000 Subject: [PATCH 14/30] try catch --- dist/server/init.js | 2 +- src/server/init.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/dist/server/init.js b/dist/server/init.js index b66f4a9..bd3f6f4 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!ce.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(pe(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var p=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},A=global.exports.oxmysql,fe=GetCurrentResourceName();function c(e,t,n){return new Promise((r,a)=>{A[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=p(e,t,n);let r=await c("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=p(e,t,n);let r=await c("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=p(e,t,n);let r=await c("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=p(e,t,n);let r=await c("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=p(e,t,n);let r=await c("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=p(e,t,n);let r=await c("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=p(e,t,n);let r=await c("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=p(e,t,n,!0);let r=await c("transaction",e,t);return n?n(r):r},isReady(){return A.isReady()},async awaitConnection(){return await A.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(k[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{k[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(x){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${x.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,k,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),k={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=k[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let x=s(e);if(t!==x){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};h(re,{default:()=>_e});var ne,Oe,ve,_e,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},_e=ve});var f=g(l(),1);y();async function D(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",D);exports("GetOutfits",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",F);exports("RenameOutfit",F);async function M(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",M);exports("DeleteOutfit",M);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var _=L.outfitItem;_||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(_,1,t)});E.RegisterUsableItem(_,async(e,t,n)=>{j(e)?.removeItem(_,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var xe=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{if(!await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1"))throw new Error("No appearance table found")});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await xe(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var oe=Object.create;var h=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),C=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&h(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?h(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};C(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};C(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};C(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{let e=await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1");if(!e||e.length===0)throw new Error("No appearance table found")}catch{console.error("Error checking appearance table. Most likely the table does not exist.")}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); diff --git a/src/server/init.ts b/src/server/init.ts index ff62505..0da3db6 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -5,9 +5,14 @@ import { oxmysql } from '@overextended/oxmysql'; oxmysql.ready(async () => { // see if there is a table called appearance - const result = await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); - if (!result) { - throw new Error('No appearance table found'); + try { + const result = await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); + if (!result || result.length === 0) { + throw new Error('No appearance table found'); + } + } catch (error) { + console.error('Error checking appearance table. Most likely the table does not exist.'); + // You can add additional error handling or recovery logic here if needed } }); From 00401f81eea2dbc7831242d0181b5bcb32aa6753 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:39:19 +1000 Subject: [PATCH 15/30] fix() --- .yarn.installed | 0 yarn.lock | 561 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 561 insertions(+) create mode 100644 .yarn.installed create mode 100644 yarn.lock diff --git a/.yarn.installed b/.yarn.installed new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..a614a10 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,561 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.21.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@citizenfx/client@2.0.7827-1": + version "2.0.7827-1" + resolved "https://registry.yarnpkg.com/@citizenfx/client/-/client-2.0.7827-1.tgz#4b898a39256c5ed5e62c9bf4d37e1f808c06ae8a" + integrity sha512-PlFwBf/p+Pw9pENudYs3EPjoHsIAgRL/uOuUiYs09tMSSd+cCQz7tOuEblwWCMdANzjvT+2a3SULJPaFsSNTFg== + +"@citizenfx/server@2.0.7827-1": + version "2.0.7827-1" + resolved "https://registry.yarnpkg.com/@citizenfx/server/-/server-2.0.7827-1.tgz#1d585a1e328cff23416de087e589d2232760d118" + integrity sha512-4M25BsX4hDv6GATk/O8In4a6lNBHp1s1/g7TJ4y/Z/pCHkdidPKxThypxHiFgCLXmvfP4BbrNqKbcYl8GC/g7g== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@overextended/oxmysql@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@overextended/oxmysql/-/oxmysql-1.3.0.tgz#c3661499de26fc057a615696652ada72ee610c9e" + integrity sha512-dpbcAT8HHUQiXyQMb0ei46tUEeCbh9mAgDf4y2vofPp+E3g4QEW8rh0/LuI510VLzJQ7gvTbalQSL84IiCncCw== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@types/node@^20.12.5": + version "20.14.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.15.tgz#e59477ab7bc7db1f80c85540bfd192a0becc588b" + integrity sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw== + dependencies: + undici-types "~5.26.4" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concurrently@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== + dependencies: + chalk "^4.1.2" + date-fns "^2.30.0" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +esbuild@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +tslib@^2.1.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +typescript@^5.4.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" From eecec06d8541310209df7790edcd6e2821cbaaa5 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:39:29 +1000 Subject: [PATCH 16/30] Revert "fix()" This reverts commit 00401f81eea2dbc7831242d0181b5bcb32aa6753. --- .yarn.installed | 0 yarn.lock | 561 ------------------------------------------------ 2 files changed, 561 deletions(-) delete mode 100644 .yarn.installed delete mode 100644 yarn.lock diff --git a/.yarn.installed b/.yarn.installed deleted file mode 100644 index e69de29..0000000 diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index a614a10..0000000 --- a/yarn.lock +++ /dev/null @@ -1,561 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.21.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== - dependencies: - regenerator-runtime "^0.14.0" - -"@citizenfx/client@2.0.7827-1": - version "2.0.7827-1" - resolved "https://registry.yarnpkg.com/@citizenfx/client/-/client-2.0.7827-1.tgz#4b898a39256c5ed5e62c9bf4d37e1f808c06ae8a" - integrity sha512-PlFwBf/p+Pw9pENudYs3EPjoHsIAgRL/uOuUiYs09tMSSd+cCQz7tOuEblwWCMdANzjvT+2a3SULJPaFsSNTFg== - -"@citizenfx/server@2.0.7827-1": - version "2.0.7827-1" - resolved "https://registry.yarnpkg.com/@citizenfx/server/-/server-2.0.7827-1.tgz#1d585a1e328cff23416de087e589d2232760d118" - integrity sha512-4M25BsX4hDv6GATk/O8In4a6lNBHp1s1/g7TJ4y/Z/pCHkdidPKxThypxHiFgCLXmvfP4BbrNqKbcYl8GC/g7g== - -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== - -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== - -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== - -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== - -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== - -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== - -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== - -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== - -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== - -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== - -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== - -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== - -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== - -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== - -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== - -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== - -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== - -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== - -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== - -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== - -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== - -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== - -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@overextended/oxmysql@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@overextended/oxmysql/-/oxmysql-1.3.0.tgz#c3661499de26fc057a615696652ada72ee610c9e" - integrity sha512-dpbcAT8HHUQiXyQMb0ei46tUEeCbh9mAgDf4y2vofPp+E3g4QEW8rh0/LuI510VLzJQ7gvTbalQSL84IiCncCw== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@types/node@^20.12.5": - version "20.14.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.15.tgz#e59477ab7bc7db1f80c85540bfd192a0becc588b" - integrity sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw== - dependencies: - undici-types "~5.26.4" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concurrently@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== - dependencies: - chalk "^4.1.2" - date-fns "^2.30.0" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - spawn-command "0.0.2" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -esbuild@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== - optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob@^10.3.7: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -rimraf@^5.0.5: - version "5.0.10" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" - integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== - dependencies: - glob "^10.3.7" - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -tslib@^2.1.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -typescript@^5.4.4: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" From 0d880ebc7ca1a05b25687e7e81f4c8619578fcd7 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:39:49 +1000 Subject: [PATCH 17/30] fix --- dist/server/init.js | 2 +- src/server/init.ts | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dist/server/init.js b/dist/server/init.js index bd3f6f4..1005d2f 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var oe=Object.create;var h=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),C=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&h(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?h(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await w.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await w.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var w,T=b(()=>{y();w=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};C(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();T();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};C(ee,{default:()=>Te});var q,Se,we,Te,te=b(()=>{q=g(l(),1);y();T();Se=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Te=we});var re={};C(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();T();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});T();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{let e=await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1");if(!e||e.length===0)throw new Error("No appearance table found")}catch{console.error("Error checking appearance table. Most likely the table does not exist.")}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await T.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var T,w=b(()=>{y();T=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();w();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>we});var q,Se,Te,we,te=b(()=>{q=g(l(),1);y();w();Se=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Te});var re={};h(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();w();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});w();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1")}catch{console.error("Error checking appearance table. Most likely the table does not exist.")}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); diff --git a/src/server/init.ts b/src/server/init.ts index 0da3db6..f4ca2c2 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -6,10 +6,7 @@ import { oxmysql } from '@overextended/oxmysql'; oxmysql.ready(async () => { // see if there is a table called appearance try { - const result = await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); - if (!result || result.length === 0) { - throw new Error('No appearance table found'); - } + await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); } catch (error) { console.error('Error checking appearance table. Most likely the table does not exist.'); // You can add additional error handling or recovery logic here if needed From 9a94681a7f4a3c271001c6310ea2196c7f701052 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 11:40:53 +1000 Subject: [PATCH 18/30] update --- dist/server/init.js | 2 +- src/server/init.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/server/init.js b/dist/server/init.js index 1005d2f..3a17c25 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1 @@ -var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await T.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var T,w=b(()=>{y();T=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();w();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>we});var q,Se,Te,we,te=b(()=>{q=g(l(),1);y();w();Se=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Te});var re={};h(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();w();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});w();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1")}catch{console.error("Error checking appearance table. Most likely the table does not exist.")}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await T.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var T,w=b(()=>{y();T=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();w();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>we});var q,Se,Te,we,te=b(()=>{q=g(l(),1);y();w();Se=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Te});var re={};h(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();w();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});w();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1")}catch(e){console.error("Error checking appearance table. Most likely the table does not exist: ",e)}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); diff --git a/src/server/init.ts b/src/server/init.ts index f4ca2c2..e064971 100644 --- a/src/server/init.ts +++ b/src/server/init.ts @@ -8,7 +8,7 @@ oxmysql.ready(async () => { try { await oxmysql.query('SELECT 1 FROM appearance LIMIT 1'); } catch (error) { - console.error('Error checking appearance table. Most likely the table does not exist.'); + console.error('Error checking appearance table. Most likely the table does not exist: ', error); // You can add additional error handling or recovery logic here if needed } }); From 95b19a2a82a65d6edf6387ab8e8b81a6a33228a4 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 12:40:09 +1000 Subject: [PATCH 19/30] chore(client exports) --- src/client/appearance/getters.ts | 13 +++++++++++-- src/client/appearance/setters.ts | 13 ++++++++++++- src/client/init.ts | 7 +------ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/client/appearance/getters.ts b/src/client/appearance/getters.ts index e2e3548..30c042f 100644 --- a/src/client/appearance/getters.ts +++ b/src/client/appearance/getters.ts @@ -3,7 +3,7 @@ import HEAD_OVERLAYS from "@data/head" import FACE_FEATURES from "@data/face" import DRAWABLE_NAMES from "@data/drawables" import PROP_NAMES from "@data/props" -import { ped, onServerCallback, updatePed } from '@utils'; +import { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils'; export function findModelIndex(target: number) { const config = exports.bl_appearance @@ -18,6 +18,7 @@ export function getHair(pedHandle: number): THairData { highlight: GetPedHairHighlightColor(pedHandle) } } +exports('GetHair', getHair); export function getHeadBlendData(pedHandle: number) { // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67 @@ -53,6 +54,7 @@ export function getHeadBlendData(pedHandle: number) { hasParent: Boolean(hasParent), }; } +exports('GetHeadBlend', getHeadBlendData); export function getHeadOverlay(pedHandle: number) { let totals: THeadOverlayTotal = {}; @@ -84,6 +86,7 @@ export function getHeadOverlay(pedHandle: number) { return [headData, totals]; } +exports('GetHeadOverlay', getHeadOverlay); export function getHeadStructure(pedHandle: number) { const pedModel = GetEntityModel(pedHandle) @@ -102,6 +105,7 @@ export function getHeadStructure(pedHandle: number) { return faceStruct } +exports('GetHeadStructure', getHeadStructure); export function getDrawables(pedHandle: number) { let drawables = {} @@ -127,6 +131,7 @@ export function getDrawables(pedHandle: number) { return [drawables, totalDrawables] } +exports('GetDrawables', getDrawables); export function getProps(pedHandle: number) { let props = {} @@ -153,6 +158,7 @@ export function getProps(pedHandle: number) { return [props, totalProps] } +exports('GetProps', getProps); export async function getAppearance(pedHandle: number): Promise { @@ -272,7 +278,10 @@ export function getTattooData() { return tattooZones } - +exports('GetTattoos', async () => { + const tattoos = await triggerServerCallback('bl_appearance:server:getTattoos') + return tattoos +}); //migration onServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => { diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index 11791a4..7054bc9 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -7,6 +7,7 @@ export function setDrawable(pedHandle: number, data: TValue) { SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0) return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value) } +exports('SetDrawable', setDrawable); export function setProp(pedHandle: number, data: TValue) { if (data.value === -1) { @@ -17,10 +18,10 @@ export function setProp(pedHandle: number, data: TValue) { SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false) return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value) } +exports('SetProp', setProp); const defMaleHash = GetHashKey("mp_m_freemode_01") - export const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => { if (data == null || data === undefined) return pedHandle; @@ -67,10 +68,12 @@ export const setModel = async (pedHandle: number, data: TAppearance | TSkin | nu return pedHandle; }; +exports('SetModel', setModel); export function SetFaceFeature(pedHandle: number, data: TValue) { SetPedFaceFeature(pedHandle, data.index, data.value + 0.0) } +exports('SetFaceFeature', SetFaceFeature); const isPositive = (val: number) => val >= 0 ? val : 0 @@ -92,6 +95,7 @@ export function setHeadBlend(pedHandle: number, data) { SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent) } +exports('SetHeadBlend', setHeadBlend); export function setHeadOverlay(pedHandle: number, data) { const index = data.index @@ -112,6 +116,7 @@ export function setHeadOverlay(pedHandle: number, data) { SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0) SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor) } +exports('SetHeadOverlay', setHeadOverlay); export function resetToggles(data) { @@ -135,6 +140,7 @@ export function resetToggles(data) { } } } +exports('SetPedClothes', setPedClothes); export function setPedClothes(pedHandle: number, data: TClothes) { const drawables = data.drawables @@ -155,6 +161,7 @@ export function setPedClothes(pedHandle: number, data: TClothes) { setHeadOverlay(pedHandle, overlay) } } +exports('SetPedClothes', setPedClothes); export const setPedSkin = async (pedHandle: number, data: TSkin) => { if (!data) return @@ -171,6 +178,7 @@ export const setPedSkin = async (pedHandle: number, data: TSkin) => { SetFaceFeature(pedHandle, value) } } +exports('SetPedSkin', setPedSkin); export function setPedTattoos(pedHandle: number, data: TTattoo[]) { if (!data) return @@ -186,6 +194,7 @@ export function setPedTattoos(pedHandle: number, data: TTattoo[]) { } } } +exports('SetPedTattoos', setPedTattoos); export function setPedHairColors(pedHandle: number, data: THairColor) { if (!data) return @@ -193,6 +202,7 @@ export function setPedHairColors(pedHandle: number, data: THairColor) { const highlight = data.highlight SetPedHairColor(pedHandle, color, highlight) } +exports('SetPedHairColors', setPedHairColors); export async function setPedAppearance(pedHandle: number, data: TAppearance) { if (IsPedAPlayer(pedHandle)) { @@ -204,6 +214,7 @@ export async function setPedAppearance(pedHandle: number, data: TAppearance) { setPedHairColors(pedHandle, data.hairColor) setPedTattoos(pedHandle, data.tattoos) } +exports('SetPedAppearance', setPedAppearance); export async function setPlayerPedAppearance(data: TAppearance) { // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance diff --git a/src/client/init.ts b/src/client/init.ts index 2f82a1b..1168f33 100644 --- a/src/client/init.ts +++ b/src/client/init.ts @@ -1,16 +1,11 @@ import { TAppearance, TAppearanceZone } from "@typings/appearance" import { openMenu } from "./menu" -import { setPedAppearance, setPlayerPedAppearance } from "./appearance/setters" +import { setPlayerPedAppearance } from "./appearance/setters" import { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from "@utils" import { QBBridge } from "./bridge/qb" import { ESXBridge } from "./bridge/esx" import { illeniumCompat } from "./compat/illenium" - -exports('SetPedAppearance', async (ped: number, appearance: TAppearance) => { - await setPedAppearance(ped, appearance) -}) - exports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => { let resolvedAppearance: TAppearance; From 22f2c8f157ad21475c826351c1fe3f52c4266da7 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 12:40:52 +1000 Subject: [PATCH 20/30] build() --- dist/client/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/client/init.js b/dist/client/init.js index 981a379..ca132db 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1 +1 @@ -var n=0,f=e=>{n=e};var z=(e,t)=>{SendNUIMessage({action:e,data:t})},M=e=>new Promise(t=>setTimeout(t,e)),we=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(a=>{let o=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(o),a())},100)})),t)},j=GetCurrentResourceName(),xe={},X={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((xe[e]||0)>r)return!1;xe[e]=r+t}return!0}onNet(`_bl_cb_${j}`,(e,...t)=>{let r=X[e];return r&&r(...t)});function d(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(X[r]);return emitNet(`_bl_cb_${e}`,j,r,...t),new Promise(a=>{X[r]=a})}function Q(e,t){onNet(`_bl_cb_${e}`,async(r,a,...o)=>{let i;try{i=await t(...o)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,a,i)})}var Te=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let a=exports.bl_appearance.config().locale,o=LoadResourceFile(j,`locale/${a}.json`);o||(console.error(`${a}.json not found in locale, please verify!, we used english for now!`),o=LoadResourceFile(j,"locale/en.json")),t(o)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,Ce=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function _e(e){return new Promise(t=>setTimeout(t,e))}function ke(e){return e.includes("'")?e.replace(/'/g,""):e}function Se(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ee(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ne=2,ae=1,R=!1,g=1.8,h=null,C=0,I=0,x=null,te=null,oe=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},G=e=>Math.cos(e*Math.PI/180),re=e=>Math.sin(e*Math.PI/180),Ae=()=>{let e=(G(I)*G(C)+G(C)*G(I))/2*g,t=(re(I)*G(C)+G(C)*re(I))/2*g,r=re(C)*g;return[e,t,r]},se=(e,t)=>{if(!R||!x||oe)return;e=e??0,t=t??0,I-=e,C+=t;let a=L==="whole"||L==="head"?89:70;C=Math.min(Math.max(C,L==="shoes"?5:-20),a);let[s,u,c]=Ae();SetCamCoord(h,x.x+s,x.y+u,x.z+c),PointCamAtCoord(h,x.x,x.y,x.z)},ve=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,oe=!0,g=t,I=r;let[a,o,i]=Ae(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+a,e.y+o,e.z+i,0,0,0,70,!1,0);x=e,oe=!1,te=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,te,250,0,0),await M(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Oe(s),DestroyCam(te,!0)},Oe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Oe,0))},De=()=>{if(R)return;R=!0,g=ne,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),F("whole",g)},Me=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,x=null)},F=(e,t=g)=>{let r=Ue[e],a=Array.isArray(r);if(L=e,!a&&r===0){let[u,c,l]=GetEntityCoords(n,!1);ve({x:u,y:c,z:l+0},t);return}if(t>ae&&(t=ae),a){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[m,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var o=(u+m)/2,i=(c+y)/2,s=(l+E)/2}else var[o,i,s]=GetPedBoneCoords(n,r,0,0,0);ve({x:o,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{se(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":F("whole",ne);break;case"head":F("head");break;case"torso":F("torso");break;case"legs":F("legs");break;case"shoes":F("shoes"),se();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ne:ae,a=g+.05;g=a>=r?r:a}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,se(),t(1)});var ie=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var le=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var ce=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var ue=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(a=>GetHashKey(a)===e)}function Ge(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}function Fe(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:a,4:o,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:m,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:a,shapeThird:o,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:m,hasParent:!!u}}function Ie(e){let t={},r={};for(let a=0;a(f(PlayerPedId()),w(n)));function $e(e){let[t]=K(e),[r]=Z(e),[a]=Ie(e);return{headOverlay:a,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:Fe(e),headStructure:Ne(e),hairColor:Ge(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function q(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let o=0;o{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var U={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function _(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}function v(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}var Je=GetHashKey("mp_m_freemode_01"),A=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await we(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ee(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(W(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};function pe(e,t){SetPedFaceFeature(e,t.index,t.value+0)}var N=e=>e>=0?e:0;function W(e,t){if(e=e||n,!ee(e))return;let r=N(t.shapeFirst),a=N(t.shapeSecond),o=N(t.shapeThird),i=N(t.skinFirst),s=N(t.skinSecond),u=N(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,m=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,a,o,i,s,u,c,l,m,y)}function me(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let a=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,a,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}function Be(e){let t=e.drawables,r=e.props;for(let[a,o]of Object.entries(U)){let i=o.type,s=o.index;i==="drawable"&&t[a]?GetPedDrawableVariation(n,s)!==t[a].value&&SetPedComponentVariation(n,s,t[a].value,0,0):i==="prop"&&r[a]&&GetPedPropIndex(n,s)!==r[a].value&&SetPedPropIndex(n,s,r[a].value,0,!1)}}function B(e,t){let r=t.drawables,a=t.props,o=t.headOverlay;for(let i in r){let s=r[i];_(e,s)}for(let i in a){let s=a[i];v(e,s)}for(let i in o){let s=o[i];me(e,s)}}var de=async(e,t)=>{if(!t)return;e=await A(e,t);let r=t.headStructure,a=t.headBlend;if(a&&W(e,a),r)for(let o in r){let i=r[o];pe(e,i)}};function T(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),be(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await M(100);let r=await w(n);r.tattoos=e.tattoos,d("bl_appearance:server:saveAppearance",b(),r),T(n,r.tattoos),be(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let a=await A(n,r);f(a);let o=await w(n);o.tattoos=[],T(n,[]),t(o)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=q();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{pe(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{me(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{W(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{T(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=v(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=_(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=U[e.item];if(!r)return t(!1);let a=e.data,o=r.type,i=r.index,s=r.hook,u=e.hookData;if(!a)return t(!1);if(o==="prop")if(GetPedPropIndex(n,i)===-1){v(n,a),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(o==="drawable"){let c=GetPedDrawableVariation(n,i);if(a.value===r.off){t(!1);return}if(a.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await d("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await d("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{B(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let a=b(),o=await d("bl_appearance:server:importOutfit",a,e,t);r(o)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await d("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await d("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{B(n,e)});var ge=exports.bl_appearance,Ee=0,ye=!1,Y=null,$=null;async function O(e,t=!1){if(e===null||ye)return;let r=PlayerPedId(),a=ge.menus(),o=typeof e=="string",i=o?e:e.type,s=a[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let m=[];c.includes("outfits")&&(m=await d("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=ge.models());let D=c.includes("tattoos"),S;D&&(S=q());let Pe=o?{}:Xe(e);if(t){let ze=GetHashKey(Ce());r=await A(r,ze),emitNet("bl_appearance:server:setroutingbucket"),$=new Promise(Ke=>{Y=Ke}),f(r)}let je=await w(r);return De(),z("appearance:data",{tabs:c,appearance:je,blacklist:Pe,tattoos:S,outfits:m,models:E,allowExit:l,job:Se(),locale:await Te("locale")}),SetNuiFocus(!0,!0),z("appearance:visible",!0),ye=!0,exports.bl_appearance.hideHud(!0),$&&(await $,emitNet("bl_appearance:server:resetroutingbucket")),$=null,Y=null,!0}exports("OpenMenu",O);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let a=r.toLowerCase();O(a)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=ge.blacklist();if(!t)return{};if(!r)return{};let a={...r},o=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(o.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(o.gang.name)),!c){let l=s[u];a=Object.assign({},a,l,{drawables:Object.assign({},a.drawables,l.drawables)})}}}return a}function be(){SetPedArmour(n,Ee),Me(),SetNuiFocus(!1,!1),z("appearance:visible",!1),exports.bl_appearance.hideHud(!1),Y&&Y(),ye=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await k(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{O({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await k(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),a=await d("bl_appearance:server:getAppearance",r);t(a)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=K(e)[0],r=[];for(let a of t){let o=t[a];r.push({component_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedProps",e=>{let t=Z(e)[0],r=[];for(let a of t){let o=t[a];r.push({prop_id:o.index,drawable:o.value,texture:o.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>w(e)),p("setPlayerModel",e=>{f(PlayerPedId()),A(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};_(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let a={index:r.component_id,value:r.drawable,texture:r.texture};_(e,a)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};v(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let a={index:r.prop_id,value:r.drawable,texture:r.texture};v(e,a)}}),p("setPedAppearance",(e,t)=>{k(e,t)}),p("setPedTattoos",(e,t)=>{T(e,t)})}exports("SetPedAppearance",async(e,t)=>{await k(e,t)});exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await d("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await d("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await O({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{O(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await _e(100);let e=await b(),t=await d("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await d("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),he=ke(GetConvar("bl:framework","qb"));he=="qb"||he=="qbx"&&GetResourceState(Re)=="started"?He():he=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),a=GetPedArmour(n),o=await d("bl_appearance:server:getAppearance",e);o&&(await P(o),SetPedMaxHealth(n,r),M(1e3),SetEntityHealth(n,t),SetPedArmour(n,a))},!1); +var n=0,f=e=>{n=e};var q=(e,t)=>{SendNUIMessage({action:e,data:t})},G=e=>new Promise(t=>setTimeout(t,e)),Se=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(o=>{let a=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(a),o())},100)})),t)},Z=GetCurrentResourceName(),_e={},re={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((_e[e]||0)>r)return!1;_e[e]=r+t}return!0}onNet(`_bl_cb_${Z}`,(e,...t)=>{let r=re[e];return r&&r(...t)});function m(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(re[r]);return emitNet(`_bl_cb_${e}`,Z,r,...t),new Promise(o=>{re[r]=o})}function oe(e,t){onNet(`_bl_cb_${e}`,async(r,o,...a)=>{let i;try{i=await t(...a)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,o,i)})}var ke=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let o=exports.bl_appearance.config().locale,a=LoadResourceFile(Z,`locale/${o}.json`);a||(console.error(`${o}.json not found in locale, please verify!, we used english for now!`),a=LoadResourceFile(Z,"locale/en.json")),t(a)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,ve=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function Ae(e){return new Promise(t=>setTimeout(t,e))}function Oe(e){return e.includes("'")?e.replace(/'/g,""):e}function De(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ae(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ce=2,ie=1,R=!1,g=1.8,h=null,_=0,N=0,w=null,ne=null,le=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},F=e=>Math.cos(e*Math.PI/180),se=e=>Math.sin(e*Math.PI/180),Ge=()=>{let e=(F(N)*F(_)+F(_)*F(N))/2*g,t=(se(N)*F(_)+F(_)*se(N))/2*g,r=se(_)*g;return[e,t,r]},ue=(e,t)=>{if(!R||!w||le)return;e=e??0,t=t??0,N-=e,_+=t;let o=L==="whole"||L==="head"?89:70;_=Math.min(Math.max(_,L==="shoes"?5:-20),o);let[s,u,c]=Ge();SetCamCoord(h,w.x+s,w.y+u,w.z+c),PointCamAtCoord(h,w.x,w.y,w.z)},Me=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,le=!0,g=t,N=r;let[o,a,i]=Ge(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+o,e.y+a,e.z+i,0,0,0,70,!1,0);w=e,le=!1,ne=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,ne,250,0,0),await G(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Fe(s),DestroyCam(ne,!0)},Fe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Fe,0))},Ie=()=>{if(R)return;R=!0,g=ce,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),I("whole",g)},Ne=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,w=null)},I=(e,t=g)=>{let r=Ue[e],o=Array.isArray(r);if(L=e,!o&&r===0){let[u,c,l]=GetEntityCoords(n,!1);Me({x:u,y:c,z:l+0},t);return}if(t>ie&&(t=ie),o){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[d,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var a=(u+d)/2,i=(c+y)/2,s=(l+E)/2}else var[a,i,s]=GetPedBoneCoords(n,r,0,0,0);Me({x:a,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{ue(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":I("whole",ce);break;case"head":I("head");break;case"torso":I("torso");break;case"legs":I("legs");break;case"shoes":I("shoes"),ue();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ce:ie,o=g+.05;g=o>=r?r:o}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,ue(),t(1)});var pe=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var de=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var me=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var fe=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(o=>GetHashKey(o)===e)}function be(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}exports("GetHair",be);function ge(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:o,4:a,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:d,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:o,shapeThird:a,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:d,hasParent:!!u}}exports("GetHeadBlend",ge);function ye(e){let t={},r={};for(let o=0;o(f(PlayerPedId()),T(n)));function $e(e){let[t]=j(e),[r]=z(e),[o]=ye(e);return{headOverlay:o,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:ge(e),headStructure:he(e),hairColor:be(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function U(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let a=0;aawait m("bl_appearance:server:getTattoos"));oe("bl_appearance:client:migration:setAppearance",e=>{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var W={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function C(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}exports("SetDrawable",C);function S(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}exports("SetProp",S);var Je=GetHashKey("mp_m_freemode_01"),k=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await Se(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ae(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(K(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};exports("SetModel",k);function $(e,t){SetPedFaceFeature(e,t.index,t.value+0)}exports("SetFaceFeature",$);var B=e=>e>=0?e:0;function K(e,t){if(e=e||n,!ae(e))return;let r=B(t.shapeFirst),o=B(t.shapeSecond),a=B(t.shapeThird),i=B(t.skinFirst),s=B(t.skinSecond),u=B(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,d=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,o,a,i,s,u,c,l,d,y)}exports("SetHeadBlend",K);function Y(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let o=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,o,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}exports("SetHeadOverlay",Y);function Be(e){let t=e.drawables,r=e.props;for(let[o,a]of Object.entries(W)){let i=a.type,s=a.index;i==="drawable"&&t[o]?GetPedDrawableVariation(n,s)!==t[o].value&&SetPedComponentVariation(n,s,t[o].value,0,0):i==="prop"&&r[o]&&GetPedPropIndex(n,s)!==r[o].value&&SetPedPropIndex(n,s,r[o].value,0,!1)}}exports("SetPedClothes",v);function v(e,t){let r=t.drawables,o=t.props,a=t.headOverlay;for(let i in r){let s=r[i];C(e,s)}for(let i in o){let s=o[i];S(e,s)}for(let i in a){let s=a[i];Y(e,s)}}exports("SetPedClothes",v);var J=async(e,t)=>{if(!t)return;e=await k(e,t);let r=t.headStructure,o=t.headBlend;if(o&&K(e,o),r)for(let a in r){let i=r[a];$(e,i)}};exports("SetPedSkin",J);function x(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),xe(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await G(100);let r=await T(n);r.tattoos=e.tattoos,m("bl_appearance:server:saveAppearance",b(),r),x(n,r.tattoos),xe(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let o=await k(n,r);f(o);let a=await T(n);a.tattoos=[],x(n,[]),t(a)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=U();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{$(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{Y(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{K(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{x(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=S(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=C(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=W[e.item];if(!r)return t(!1);let o=e.data,a=r.type,i=r.index,s=r.hook,u=e.hookData;if(!o)return t(!1);if(a==="prop")if(GetPedPropIndex(n,i)===-1){S(n,o),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(a==="drawable"){let c=GetPedDrawableVariation(n,i);if(o.value===r.off){t(!1);return}if(o.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await m("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await m("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await m("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{v(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let o=b(),a=await m("bl_appearance:server:importOutfit",o,e,t);r(a)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await m("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await m("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{v(n,e)});var Pe=exports.bl_appearance,Ee=0,we=!1,ee=null,Q=null;async function D(e,t=!1){if(e===null||we)return;let r=PlayerPedId(),o=Pe.menus(),a=typeof e=="string",i=a?e:e.type,s=o[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let d=[];c.includes("outfits")&&(d=await m("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=Pe.models());let M=c.includes("tattoos"),A;M&&(A=U());let Ce=a?{}:Xe(e);if(t){let ze=GetHashKey(ve());r=await k(r,ze),emitNet("bl_appearance:server:setroutingbucket"),Q=new Promise(Ke=>{ee=Ke}),f(r)}let je=await T(r);return Ie(),q("appearance:data",{tabs:c,appearance:je,blacklist:Ce,tattoos:A,outfits:d,models:E,allowExit:l,job:De(),locale:await ke("locale")}),SetNuiFocus(!0,!0),q("appearance:visible",!0),we=!0,exports.bl_appearance.hideHud(!0),Q&&(await Q,emitNet("bl_appearance:server:resetroutingbucket")),Q=null,ee=null,!0}exports("OpenMenu",D);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let o=r.toLowerCase();D(o)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=Pe.blacklist();if(!t)return{};if(!r)return{};let o={...r},a=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(a.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(a.gang.name)),!c){let l=s[u];o=Object.assign({},o,l,{drawables:Object.assign({},o.drawables,l.drawables)})}}}return o}function xe(){SetPedArmour(n,Ee),Ne(),SetNuiFocus(!1,!1),q("appearance:visible",!1),exports.bl_appearance.hideHud(!1),ee&&ee(),we=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await O(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{D({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await O(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),o=await m("bl_appearance:server:getAppearance",r);t(o)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=j(e)[0],r=[];for(let o of t){let a=t[o];r.push({component_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedProps",e=>{let t=z(e)[0],r=[];for(let o of t){let a=t[o];r.push({prop_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>T(e)),p("setPlayerModel",e=>{f(PlayerPedId()),k(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};C(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let o={index:r.component_id,value:r.drawable,texture:r.texture};C(e,o)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};S(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let o={index:r.prop_id,value:r.drawable,texture:r.texture};S(e,o)}}),p("setPedAppearance",(e,t)=>{O(e,t)}),p("setPedTattoos",(e,t)=>{x(e,t)})}exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await m("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await m("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await D({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{D(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await Ae(100);let e=await b(),t=await m("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await m("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),Te=Oe(GetConvar("bl:framework","qb"));Te=="qb"||Te=="qbx"&&GetResourceState(Re)=="started"?He():Te=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),o=GetPedArmour(n),a=await m("bl_appearance:server:getAppearance",e);a&&(await P(a),SetPedMaxHealth(n,r),G(1e3),SetEntityHealth(n,t),SetPedArmour(n,o))},!1); From 35101481f77689e0d013793dc92aec2050867d05 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 13:05:08 +1000 Subject: [PATCH 21/30] fix(blacklist) --- dist/client/init.js | 1348 ++++++++++++++++++++++++++++++++++++++++++- dist/server/init.js | 582 ++++++++++++++++++- dist/shared/init.js | 24 +- src/build.js | 2 +- src/client/menu.ts | 12 +- 5 files changed, 1957 insertions(+), 11 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index ca132db..e558f6d 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1 +1,1347 @@ -var n=0,f=e=>{n=e};var q=(e,t)=>{SendNUIMessage({action:e,data:t})},G=e=>new Promise(t=>setTimeout(t,e)),Se=async e=>{let t=typeof e=="number"?e:GetHashKey(e);return!IsModelValid(t)&&!IsModelInCdimage(t)?(console.warn(`attempted to load invalid model '${e}'`),0):(HasModelLoaded(t)||(RequestModel(t),await new Promise(o=>{let a=setInterval(()=>{HasModelLoaded(t)&&(clearInterval(a),o())},100)})),t)},Z=GetCurrentResourceName(),_e={},re={};function Ze(e,t){if(t&&t>0){let r=GetGameTimer();if((_e[e]||0)>r)return!1;_e[e]=r+t}return!0}onNet(`_bl_cb_${Z}`,(e,...t)=>{let r=re[e];return r&&r(...t)});function m(e,...t){if(!Ze(e,0))return;let r;do r=`${e}:${Math.floor(Math.random()*100001)}`;while(re[r]);return emitNet(`_bl_cb_${e}`,Z,r,...t),new Promise(o=>{re[r]=o})}function oe(e,t){onNet(`_bl_cb_${e}`,async(r,o,...a)=>{let i;try{i=await t(...a)}catch(s){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${s.stack}^0`)}emitNet(`_bl_cb_${r}`,o,i)})}var ke=e=>new Promise(t=>{let r=()=>{if(RequestResourceFileSet(e)){let o=exports.bl_appearance.config().locale,a=LoadResourceFile(Z,`locale/${o}.json`);a||(console.error(`${o}.json not found in locale, please verify!, we used english for now!`),a=LoadResourceFile(Z,"locale/en.json")),t(a)}else setTimeout(r,100)};r()});var H=exports.bl_bridge,V=()=>H.core().getPlayerData(),b=()=>V().cid,ve=()=>V().gender==="male"?"mp_m_freemode_01":"mp_f_freemode_01";function Ae(e){return new Promise(t=>setTimeout(t,e))}function Oe(e){return e.includes("'")?e.replace(/'/g,""):e}function De(){let e=V().job;return e?{name:e.name,isBoss:e.isBoss}:null}function ae(e){let t=GetEntityModel(e);return t===GetHashKey("mp_m_freemode_01")||t===GetHashKey("mp_f_freemode_01")}var ce=2,ie=1,R=!1,g=1.8,h=null,_=0,N=0,w=null,ne=null,le=!1;var L="head",Ue={whole:0,head:31086,torso:24818,legs:[16335,46078],shoes:[14201,52301]},F=e=>Math.cos(e*Math.PI/180),se=e=>Math.sin(e*Math.PI/180),Ge=()=>{let e=(F(N)*F(_)+F(_)*F(N))/2*g,t=(se(N)*F(_)+F(_)*se(N))/2*g,r=se(_)*g;return[e,t,r]},ue=(e,t)=>{if(!R||!w||le)return;e=e??0,t=t??0,N-=e,_+=t;let o=L==="whole"||L==="head"?89:70;_=Math.min(Math.max(_,L==="shoes"?5:-20),o);let[s,u,c]=Ge();SetCamCoord(h,w.x+s,w.y+u,w.z+c),PointCamAtCoord(h,w.x,w.y,w.z)},Me=async(e,t)=>{let r=GetEntityHeading(n)+94;t=t??1,le=!0,g=t,N=r;let[o,a,i]=Ge(),s=CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA",e.x+o,e.y+a,e.z+i,0,0,0,70,!1,0);w=e,le=!1,ne=h,h=s,PointCamAtCoord(s,e.x,e.y,e.z),SetCamActiveWithInterp(s,ne,250,0,0),await G(250),SetCamUseShallowDofMode(s,!0),SetCamNearDof(s,.4),SetCamFarDof(s,1.2),SetCamDofStrength(s,.3),Fe(s),DestroyCam(ne,!0)},Fe=e=>{DoesCamExist(h)&&e==h&&(SetUseHiDof(),setTimeout(Fe,0))},Ie=()=>{if(R)return;R=!0,g=ce,h=CreateCam("DEFAULT_SCRIPTED_CAMERA",!0);let[e,t,r]=GetPedBoneCoords(n,31086,0,0,0);SetCamCoord(h,e,t,r),RenderScriptCams(!0,!0,1e3,!0,!0),I("whole",g)},Ne=()=>{R&&(R=!1,RenderScriptCams(!1,!0,250,!0,!1),DestroyCam(h,!0),h=null,w=null)},I=(e,t=g)=>{let r=Ue[e],o=Array.isArray(r);if(L=e,!o&&r===0){let[u,c,l]=GetEntityCoords(n,!1);Me({x:u,y:c,z:l+0},t);return}if(t>ie&&(t=ie),o){let[u,c,l]=GetPedBoneCoords(n,r[0],0,0,0),[d,y,E]=GetPedBoneCoords(n,r[1],0,0,0);var a=(u+d)/2,i=(c+y)/2,s=(l+E)/2}else var[a,i,s]=GetPedBoneCoords(n,r,0,0,0);Me({x:a,y:i,z:s+0},t)};RegisterNuiCallback("appearance:camMove",(e,t)=>{ue(e.x,e.y),t(1)});RegisterNuiCallback("appearance:camSection",(e,t)=>{switch(e){case"whole":I("whole",ce);break;case"head":I("head");break;case"torso":I("torso");break;case"legs":I("legs");break;case"shoes":I("shoes"),ue();break}t(1)});RegisterNuiCallback("appearance:camZoom",(e,t)=>{if(e==="down"){let r=L==="whole"?ce:ie,o=g+.05;g=o>=r?r:o}else if(e==="up"){let r=g-.05;g=r<=.3?.3:r}g=g,ue(),t(1)});var pe=["Blemishes","FacialHair","Eyebrows","Ageing","Makeup","Blush","Complexion","SunDamage","Lipstick","MolesFreckles","ChestHair","BodyBlemishes","AddBodyBlemishes","EyeColor"];var de=["Nose_Width","Nose_Peak_Height","Nose_Peak_Lenght","Nose_Bone_Height","Nose_Peak_Lowering","Nose_Bone_Twist","EyeBrown_Height","EyeBrown_Forward","Cheeks_Bone_High","Cheeks_Bone_Width","Cheeks_Width","Eyes_Openning","Lips_Thickness","Jaw_Bone_Width","Jaw_Bone_Back_Lenght","Chin_Bone_Lowering","Chin_Bone_Length","Chin_Bone_Width","Chin_Hole","Neck_Thikness"];var me=["face","masks","hair","torsos","legs","bags","shoes","neck","shirts","vest","decals","jackets"];var fe=["hats","glasses","earrings","mouth","lhand","rhand","watches","bracelets"];function We(e){return exports.bl_appearance.models().findIndex(o=>GetHashKey(o)===e)}function be(e){return{color:GetPedHairColor(e),highlight:GetPedHairHighlightColor(e)}}exports("GetHair",be);function ge(e){let t=new ArrayBuffer(80);global.Citizen.invokeNative("0x2746bd9d88c5c5d0",e,new Uint32Array(t));let{0:r,2:o,4:a,6:i,8:s,18:u,10:c}=new Uint32Array(t),{0:l,2:d,4:y}=new Float32Array(t,48);return{shapeFirst:r,shapeSecond:o,shapeThird:a,skinFirst:i,skinSecond:s,skinThird:c,shapeMix:l,thirdMix:y,skinMix:d,hasParent:!!u}}exports("GetHeadBlend",ge);function ye(e){let t={},r={};for(let o=0;o(f(PlayerPedId()),T(n)));function $e(e){let[t]=j(e),[r]=z(e),[o]=ye(e);return{headOverlay:o,drawables:t,props:r}}exports("GetPedClothes",$e);function Ye(e){return{headBlend:ge(e),headStructure:he(e),hairColor:be(e),model:GetEntityModel(e)}}exports("GetPedSkin",Ye);function U(){let e=[],[t,r]=exports.bl_appearance.tattoos();for(let a=0;aawait m("bl_appearance:server:getTattoos"));oe("bl_appearance:client:migration:setAppearance",e=>{e.type==="fivem"&&exports["fivem-appearance"].setPlayerAppearance(e.data),e.type==="illenium"&&exports["illenium-appearance"].setPlayerAppearance(e.data)});var W={hats:{type:"prop",index:0},glasses:{type:"prop",index:1},masks:{type:"drawable",index:1,off:0},shirts:{type:"drawable",index:8,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:8,variant:15,texture:0,id:"shirts"}]}},jackets:{type:"drawable",index:11,off:15,hook:{drawables:[{component:3,variant:15,texture:0,id:"torsos"},{component:11,variant:15,texture:0,id:"jackets"}]}},vest:{type:"drawable",index:9,off:0},legs:{type:"drawable",index:4,off:18},shoes:{type:"drawable",index:6,off:34}};function C(e,t){return SetPedComponentVariation(e,t.index,t.value,t.texture,0),GetNumberOfPedTextureVariations(e,t.index,t.value)}exports("SetDrawable",C);function S(e,t){if(t.value===-1){ClearPedProp(e,t.index);return}return SetPedPropIndex(e,t.index,t.value,t.texture,!1),GetNumberOfPedPropTextureVariations(e,t.index,t.value)}exports("SetProp",S);var Je=GetHashKey("mp_m_freemode_01"),k=async(e,t)=>{if(t==null||t===void 0)return e;let r;return typeof t=="string"?r=GetHashKey(t):typeof t=="number"?r=t:r=t.model||Je,r===0||(await Se(r),IsPedAPlayer(e)?(SetPlayerModel(PlayerId(),r),e=PlayerPedId(),f(e)):SetPlayerModel(e,r),SetModelAsNoLongerNeeded(r),SetPedDefaultComponentVariation(e),!ae(e))||(!(typeof t=="string"||typeof t=="number")&&Object.keys(t.headBlend).length>0?(K(e,t.headBlend),SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1)):r===GetHashKey("mp_m_freemode_01")?SetPedHeadBlendData(e,0,0,0,0,0,0,0,0,0,!1):r===GetHashKey("mp_f_freemode_01")&&SetPedHeadBlendData(e,45,21,0,20,15,0,.3,.1,0,!1)),e};exports("SetModel",k);function $(e,t){SetPedFaceFeature(e,t.index,t.value+0)}exports("SetFaceFeature",$);var B=e=>e>=0?e:0;function K(e,t){if(e=e||n,!ae(e))return;let r=B(t.shapeFirst),o=B(t.shapeSecond),a=B(t.shapeThird),i=B(t.skinFirst),s=B(t.skinSecond),u=B(t.skinThird),c=t.shapeMix+0,l=t.skinMix+0,d=t.thirdMix+0,y=t.hasParent;SetPedHeadBlendData(e,r,o,a,i,s,u,c,l,d,y)}exports("SetHeadBlend",K);function Y(e,t){let r=t.index;if(r===13){SetPedEyeColor(e,t.value);return}let o=t.overlayValue;if(t.id==="hairColor"){SetPedHairTint(e,t.hairColor,t.hairHighlight);return}SetPedHeadOverlay(e,r,o,t.overlayOpacity+0),SetPedHeadOverlayColor(e,r,1,t.firstColor,t.secondColor)}exports("SetHeadOverlay",Y);function Be(e){let t=e.drawables,r=e.props;for(let[o,a]of Object.entries(W)){let i=a.type,s=a.index;i==="drawable"&&t[o]?GetPedDrawableVariation(n,s)!==t[o].value&&SetPedComponentVariation(n,s,t[o].value,0,0):i==="prop"&&r[o]&&GetPedPropIndex(n,s)!==r[o].value&&SetPedPropIndex(n,s,r[o].value,0,!1)}}exports("SetPedClothes",v);function v(e,t){let r=t.drawables,o=t.props,a=t.headOverlay;for(let i in r){let s=r[i];C(e,s)}for(let i in o){let s=o[i];S(e,s)}for(let i in a){let s=a[i];Y(e,s)}}exports("SetPedClothes",v);var J=async(e,t)=>{if(!t)return;e=await k(e,t);let r=t.headStructure,o=t.headBlend;if(o&&K(e,o),r)for(let a in r){let i=r[a];$(e,i)}};exports("SetPedSkin",J);function x(e,t){if(t){ClearPedDecorationsLeaveScars(e);for(let r=0;r{await P(e),xe(),t(1)});RegisterNuiCallback("appearance:save",async(e,t)=>{Be(e),await G(100);let r=await T(n);r.tattoos=e.tattoos,m("bl_appearance:server:saveAppearance",b(),r),x(n,r.tattoos),xe(),t(1)});RegisterNuiCallback("appearance:setModel",async(e,t)=>{let r=GetHashKey(e);if(!IsModelInCdimage(r)||!IsModelValid(r))return t(0);let o=await k(n,r);f(o);let a=await T(n);a.tattoos=[],x(n,[]),t(a)});RegisterNuiCallback("appearance:getModelTattoos",async(e,t)=>{let r=U();t(r)});RegisterNuiCallback("appearance:setHeadStructure",async(e,t)=>{$(n,e),t(1)});RegisterNuiCallback("appearance:setHeadOverlay",async(e,t)=>{Y(n,e),t(1)});RegisterNuiCallback("appearance:setHeadBlend",async(e,t)=>{K(n,e),t(1)});RegisterNuiCallback("appearance:setTattoos",async(e,t)=>{x(n,e),t(1)});RegisterNuiCallback("appearance:setProp",async(e,t)=>{let r=S(n,e);t(r)});RegisterNuiCallback("appearance:setDrawable",async(e,t)=>{let r=C(n,e);t(r)});RegisterNuiCallback("appearance:toggleItem",async(e,t)=>{let r=W[e.item];if(!r)return t(!1);let o=e.data,a=r.type,i=r.index,s=r.hook,u=e.hookData;if(!o)return t(!1);if(a==="prop")if(GetPedPropIndex(n,i)===-1){S(n,o),t(!1);return}else{ClearPedProp(n,i),t(!0);return}else if(a==="drawable"){let c=GetPedDrawableVariation(n,i);if(o.value===r.off){t(!1);return}if(o.value===c){if(SetPedComponentVariation(n,i,r.off,0,0),s)for(let l=0;l{let r=await m("bl_appearance:server:saveOutfit",e);t(r)});RegisterNuiCallback("appearance:deleteOutfit",async({id:e},t)=>{let r=await m("bl_appearance:server:deleteOutfit",e);t(r)});RegisterNuiCallback("appearance:renameOutfit",async(e,t)=>{let r=await m("bl_appearance:server:renameOutfit",e);t(r)});RegisterNuiCallback("appearance:useOutfit",async(e,t)=>{v(n,e),t(1)});RegisterNuiCallback("appearance:importOutfit",async({id:e,outfitName:t},r)=>{let o=b(),a=await m("bl_appearance:server:importOutfit",o,e,t);r(a)});RegisterNuiCallback("appearance:fetchOutfit",async({id:e},t)=>{let r=await m("bl_appearance:server:fetchOutfit",e);t(r)});RegisterNuiCallback("appearance:itemOutfit",async(e,t)=>{let r=await m("bl_appearance:server:itemOutfit",e);t(r)});onNet("bl_appearance:server:useOutfiItem",e=>{v(n,e)});var Pe=exports.bl_appearance,Ee=0,we=!1,ee=null,Q=null;async function D(e,t=!1){if(e===null||we)return;let r=PlayerPedId(),o=Pe.menus(),a=typeof e=="string",i=a?e:e.type,s=o[i];if(!s)return;f(r);let u=b(),c=s.tabs,l=t?!1:s.allowExit;Ee=GetPedArmour(r);let d=[];c.includes("outfits")&&(d=await m("bl_appearance:server:getOutfits",u));let E=[];c.includes("heritage")&&(E=Pe.models());let M=c.includes("tattoos"),A;M&&(A=U());let Ce=a?{}:Xe(e);if(t){let ze=GetHashKey(ve());r=await k(r,ze),emitNet("bl_appearance:server:setroutingbucket"),Q=new Promise(Ke=>{ee=Ke}),f(r)}let je=await T(r);return Ie(),q("appearance:data",{tabs:c,appearance:je,blacklist:Ce,tattoos:A,outfits:d,models:E,allowExit:l,job:De(),locale:await ke("locale")}),SetNuiFocus(!0,!0),q("appearance:visible",!0),we=!0,exports.bl_appearance.hideHud(!0),Q&&(await Q,emitNet("bl_appearance:server:resetroutingbucket")),Q=null,ee=null,!0}exports("OpenMenu",D);RegisterCommand("appearance",async(e,t)=>{let r=t[0];if(!r)exports.bl_appearance.InitialCreation();else{let o=r.toLowerCase();D(o)}},!0);function Xe(e){if(!e)return{};let{groupTypes:t,base:r}=Pe.blacklist();if(!t)return{};if(!r)return{};let o={...r},a=V();for(let i in t){let s=t[i];for(let u in s){let c=!1;if(i=="jobs"&&e.jobs&&(c=e.jobs.includes(a.job.name)),i=="gangs"&&e.gangs&&(c=e.gangs.includes(a.gang.name)),!c){let l=s[u];o=Object.assign({},o,l,{drawables:Object.assign({},o.drawables,l.drawables)})}}}return o}function xe(){SetPedArmour(n,Ee),Ne(),SetNuiFocus(!1,!1),q("appearance:visible",!1),exports.bl_appearance.hideHud(!1),ee&&ee(),we=!1}function He(){onNet("qb-clothing:client:loadPlayerClothing",async(e,t)=>{await O(t,e)}),onNet("qb-clothes:client:CreateFirstCharacter",()=>{exports.bl_appearance.InitialCreation()}),onNet("qb-clothing:client:openOutfitMenu",()=>{D({type:"outfits",coords:[0,0,0,0]})})}function Ve(){let e=!1;on("esx_skin:resetFirstSpawn",()=>{e=!0}),on("esx_skin:playerRegistered",()=>{e&&exports.bl_appearance.InitialCreation()}),onNet("skinchanger:loadSkin2",async(t,r)=>{t.model||(t.model=GetHashKey("mp_m_freemode_01")),await O(r,t)}),onNet("skinchanger:getSkin",async t=>{let r=await b(),o=await m("bl_appearance:server:getAppearance",r);t(o)}),onNet("skinchanger:loadSkin",async(t,r)=>{await P(t),r&&r()}),onNet("esx_skin:openSaveableMenu",async t=>{exports.bl_appearance.InitialCreation(t)})}function p(e,t){on("__cfx_export_illenium-appearance_"+e,r=>{r(t)})}function Le(){p("startPlayerCustomization",()=>{exports.bl_appearance.InitialCreation()}),p("getPedModel",e=>GetEntityModel(e)),p("getPedComponents",e=>{let t=j(e)[0],r=[];for(let o of t){let a=t[o];r.push({component_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedProps",e=>{let t=z(e)[0],r=[];for(let o of t){let a=t[o];r.push({prop_id:a.index,drawable:a.value,texture:a.texture})}}),p("getPedHeadBlend",e=>console.warn("You Still cannot use this function")),p("getPedFaceFeatures",e=>console.warn("You Still cannot use this function")),p("getPedHeadOverlays",e=>console.warn("You Still cannot use this function")),p("getPedHair",e=>console.warn("You Still cannot use this function")),p("getPedAppearance",e=>T(e)),p("setPlayerModel",e=>{f(PlayerPedId()),k(n,e)}),p("setPedHeadBlend",(e,t)=>console.warn("You Still cannot use this function")),p("setPedFaceFeatures",()=>console.warn("You Still cannot use this function")),p("setPedHeadOverlays",(e,t)=>console.warn("You Still cannot use this function")),p("setPedHair",async(e,t,r)=>console.warn("You Still cannot use this function")),p("setPedEyeColor",()=>console.warn("You Still cannot use this function")),p("setPedComponent",(e,t)=>{let r={index:t.component_id,value:t.drawable,texture:t.texture};C(e,r)}),p("setPedComponents",(e,t)=>{for(let r of t){let o={index:r.component_id,value:r.drawable,texture:r.texture};C(e,o)}}),p("setPedProp",(e,t)=>{let r={index:t.prop_id,value:t.drawable,texture:t.texture};S(e,r)}),p("setPedProps",(e,t)=>{for(let r of t){let o={index:r.prop_id,value:r.drawable,texture:r.texture};S(e,o)}}),p("setPedAppearance",(e,t)=>{O(e,t)}),p("setPedTattoos",(e,t)=>{x(e,t)})}exports("SetPlayerPedAppearance",async e=>{let t;if(!e||typeof e=="string"){let r=e||await b();t=await m("bl_appearance:server:getAppearance",r)}else typeof e=="object"&&(t=e);if(!t)throw new Error("No valid appearance found");await P(t)});exports("GetPlayerPedAppearance",async e=>(e=e||await b(),await m("bl_appearance:server:getAppearance",e)));exports("InitialCreation",async e=>{await D({type:"appearance",coords:[0,0,0,0]},!0),e&&e()});on("bl_sprites:client:useZone",e=>{D(e)});onNet("bl_bridge:client:playerLoaded",async()=>{for(;!H.core().playerLoaded();)await Ae(100);let e=await b(),t=await m("bl_appearance:server:getAppearance",e);t&&await P(t)});onNet("onResourceStart",async e=>{if(e===GetCurrentResourceName()&&H.core().playerLoaded()){let t=await b(),r=await m("bl_appearance:server:getAppearance",t);if(!r)return;await P(r)}});var Re=H.getFramework("core"),Te=Oe(GetConvar("bl:framework","qb"));Te=="qb"||Te=="qbx"&&GetResourceState(Re)=="started"?He():Te=="esx"&&GetResourceState(Re)=="started"&&Ve();Le();RegisterCommand("reloadskin",async()=>{let e=await b(),t=GetEntityHealth(n),r=GetEntityMaxHealth(n),o=GetPedArmour(n),a=await m("bl_appearance:server:getAppearance",e);a&&(await P(a),SetPedMaxHealth(n,r),G(1e3),SetEntityHealth(n,t),SetPedArmour(n,o))},!1); +// src/client/utils/index.ts +var ped = 0; +var updatePed = (pedHandle) => { + ped = pedHandle; +}; +var sendNUIEvent = (action, data) => { + SendNUIMessage({ + action, + data + }); +}; +var delay = (ms) => new Promise((res) => setTimeout(res, ms)); +var requestModel = async (model) => { + let modelHash = typeof model === "number" ? model : GetHashKey(model); + if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) { + console.warn(`attempted to load invalid model '${model}'`); + return 0; + } + if (HasModelLoaded(modelHash)) + return modelHash; + RequestModel(modelHash); + const waitForModelLoaded = () => { + return new Promise((resolve) => { + const interval = setInterval(() => { + if (HasModelLoaded(modelHash)) { + clearInterval(interval); + resolve(); + } + }, 100); + }); + }; + await waitForModelLoaded(); + return modelHash; +}; +var resourceName = GetCurrentResourceName(); +var eventTimers = {}; +var activeEvents = {}; +function eventTimer(eventName, delay2) { + if (delay2 && delay2 > 0) { + const currentTime = GetGameTimer(); + if ((eventTimers[eventName] || 0) > currentTime) + return false; + eventTimers[eventName] = currentTime + delay2; + } + return true; +} +onNet(`_bl_cb_${resourceName}`, (key, ...args) => { + const resolve = activeEvents[key]; + return resolve && resolve(...args); +}); +function triggerServerCallback(eventName, ...args) { + if (!eventTimer(eventName, 0)) { + return; + } + let key; + do { + key = `${eventName}:${Math.floor(Math.random() * (1e5 + 1))}`; + } while (activeEvents[key]); + emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args); + return new Promise((resolve) => { + activeEvents[key] = resolve; + }); +} +function onServerCallback(eventName, cb) { + onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => { + let response; + try { + response = await cb(...args); + } catch (e) { + console.error(`an error occurred while handling callback event ${eventName}`); + console.log(`^3${e.stack}^0`); + } + emitNet(`_bl_cb_${resource}`, key, response); + }); +} +var requestLocale = (resourceSetName) => { + return new Promise((resolve) => { + const checkResourceFile = () => { + if (RequestResourceFileSet(resourceSetName)) { + const currentLan = exports.bl_appearance.config().locale; + let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`); + if (!localeFileContent) { + console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`); + localeFileContent = LoadResourceFile(resourceName, `locale/en.json`); + } + resolve(localeFileContent); + } else { + setTimeout(checkResourceFile, 100); + } + }; + checkResourceFile(); + }); +}; +var bl_bridge = exports.bl_bridge; +var getPlayerData = () => { + return bl_bridge.core().getPlayerData(); +}; +var getFrameworkID = () => { + const id = getPlayerData().cid; + return id; +}; +var getPlayerGenderModel = () => { + const gender = getPlayerData().gender; + return gender === "male" ? "mp_m_freemode_01" : "mp_f_freemode_01"; +}; +function Delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +function format(str) { + if (!str.includes("'")) + return str; + return str.replace(/'/g, ""); +} +function getJobInfo() { + const job = getPlayerData().job; + return job ? { name: job.name, isBoss: job.isBoss } : null; +} +function isPedFreemodeModel(ped2) { + const model = GetEntityModel(ped2); + return model === GetHashKey("mp_m_freemode_01") || model === GetHashKey("mp_f_freemode_01"); +} + +// src/client/camera.ts +var WHOLE_BODY_MAX_DISTANCE = 2; +var DEFAULT_MAX_DISTANCE = 1; +var running = false; +var camDistance = 1.8; +var cam = null; +var angleY = 0; +var angleZ = 0; +var targetCoords = null; +var oldCam = null; +var changingCam = false; +var currentBone = "head"; +var CameraBones = { + whole: 0, + head: 31086, + torso: 24818, + legs: [16335, 46078], + shoes: [14201, 52301] +}; +var cos = (degrees) => { + return Math.cos(degrees * Math.PI / 180); +}; +var sin = (degrees) => { + return Math.sin(degrees * Math.PI / 180); +}; +var getAngles = () => { + const x = (cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2 * camDistance; + const y = (sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2 * camDistance; + const z = sin(angleY) * camDistance; + return [x, y, z]; +}; +var setCamPosition = (mouseX, mouseY) => { + if (!running || !targetCoords || changingCam) + return; + mouseX = mouseX ?? 0; + mouseY = mouseY ?? 0; + angleZ -= mouseX; + angleY += mouseY; + const isHeadOrWhole = currentBone === "whole" || currentBone === "head"; + const maxAngle = isHeadOrWhole ? 89 : 70; + const isShoes = currentBone === "shoes"; + const minAngle = isShoes ? 5 : -20; + angleY = Math.min(Math.max(angleY, minAngle), maxAngle); + const [x, y, z] = getAngles(); + SetCamCoord( + cam, + targetCoords.x + x, + targetCoords.y + y, + targetCoords.z + z + ); + PointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z); +}; +var moveCamera = async (coords, distance) => { + const heading = GetEntityHeading(ped) + 94; + distance = distance ?? 1; + changingCam = true; + camDistance = distance; + angleZ = heading; + const [x, y, z] = getAngles(); + const newcam = CreateCamWithParams( + "DEFAULT_SCRIPTED_CAMERA", + coords.x + x, + coords.y + y, + coords.z + z, + 0, + 0, + 0, + 70, + false, + 0 + ); + targetCoords = coords; + changingCam = false; + oldCam = cam; + cam = newcam; + PointCamAtCoord(newcam, coords.x, coords.y, coords.z); + SetCamActiveWithInterp(newcam, oldCam, 250, 0, 0); + await delay(250); + SetCamUseShallowDofMode(newcam, true); + SetCamNearDof(newcam, 0.4); + SetCamFarDof(newcam, 1.2); + SetCamDofStrength(newcam, 0.3); + useHiDof(newcam); + DestroyCam(oldCam, true); +}; +var useHiDof = (currentcam) => { + if (!(DoesCamExist(cam) && currentcam == cam)) + return; + SetUseHiDof(); + setTimeout(useHiDof, 0); +}; +var startCamera = () => { + if (running) + return; + running = true; + camDistance = WHOLE_BODY_MAX_DISTANCE; + cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true); + const [x, y, z] = GetPedBoneCoords(ped, 31086, 0, 0, 0); + SetCamCoord(cam, x, y, z); + RenderScriptCams(true, true, 1e3, true, true); + setCamera("whole", camDistance); +}; +var stopCamera = () => { + if (!running) + return; + running = false; + RenderScriptCams(false, true, 250, true, false); + DestroyCam(cam, true); + cam = null; + targetCoords = null; +}; +var setCamera = (type, distance = camDistance) => { + const bone = CameraBones[type]; + const isBoneArray = Array.isArray(bone); + currentBone = type; + if (!isBoneArray && bone === 0) { + const [x2, y2, z2] = GetEntityCoords(ped, false); + moveCamera( + { + x: x2, + y: y2, + z: z2 + 0 + }, + distance + ); + return; + } + if (distance > DEFAULT_MAX_DISTANCE) + distance = DEFAULT_MAX_DISTANCE; + if (isBoneArray) { + const [x1, y1, z1] = GetPedBoneCoords(ped, bone[0], 0, 0, 0); + const [x2, y2, z2] = GetPedBoneCoords(ped, bone[1], 0, 0, 0); + var x = (x1 + x2) / 2; + var y = (y1 + y2) / 2; + var z = (z1 + z2) / 2; + } else { + var [x, y, z] = GetPedBoneCoords(ped, bone, 0, 0, 0); + } + moveCamera( + { + x, + y, + z: z + 0 + }, + distance + ); +}; +RegisterNuiCallback("appearance:camMove" /* camMove */, (data, cb) => { + setCamPosition(data.x, data.y); + cb(1); +}); +RegisterNuiCallback("appearance:camSection" /* camSection */, (type, cb) => { + switch (type) { + case "whole": + setCamera("whole", WHOLE_BODY_MAX_DISTANCE); + break; + case "head": + setCamera("head"); + break; + case "torso": + setCamera("torso"); + break; + case "legs": + setCamera("legs"); + break; + case "shoes": + setCamera("shoes"); + setCamPosition(); + break; + } + cb(1); +}); +RegisterNuiCallback("appearance:camZoom" /* camZoom */, (data, cb) => { + if (data === "down") { + const maxZoom = currentBone === "whole" ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE; + const newDistance = camDistance + 0.05; + camDistance = newDistance >= maxZoom ? maxZoom : newDistance; + } else if (data === "up") { + const newDistance = camDistance - 0.05; + camDistance = newDistance <= 0.3 ? 0.3 : newDistance; + } + camDistance = camDistance; + setCamPosition(); + cb(1); +}); + +// src/data/head.ts +var head_default = [ + "Blemishes", + "FacialHair", + "Eyebrows", + "Ageing", + "Makeup", + "Blush", + "Complexion", + "SunDamage", + "Lipstick", + "MolesFreckles", + "ChestHair", + "BodyBlemishes", + "AddBodyBlemishes", + "EyeColor" +]; + +// src/data/face.ts +var face_default = [ + "Nose_Width", + "Nose_Peak_Height", + "Nose_Peak_Lenght", + "Nose_Bone_Height", + "Nose_Peak_Lowering", + "Nose_Bone_Twist", + "EyeBrown_Height", + "EyeBrown_Forward", + "Cheeks_Bone_High", + "Cheeks_Bone_Width", + "Cheeks_Width", + "Eyes_Openning", + "Lips_Thickness", + "Jaw_Bone_Width", + "Jaw_Bone_Back_Lenght", + "Chin_Bone_Lowering", + "Chin_Bone_Length", + "Chin_Bone_Width", + "Chin_Hole", + "Neck_Thikness" +]; + +// src/data/drawables.ts +var drawables_default = [ + "face", + "masks", + "hair", + "torsos", + "legs", + "bags", + "shoes", + "neck", + "shirts", + "vest", + "decals", + "jackets" +]; + +// src/data/props.ts +var props_default = [ + "hats", + "glasses", + "earrings", + "mouth", + "lhand", + "rhand", + "watches", + "bracelets" +]; + +// src/client/appearance/getters.ts +function findModelIndex(target) { + const config2 = exports.bl_appearance; + const models = config2.models(); + return models.findIndex((model) => GetHashKey(model) === target); +} +function getHair(pedHandle) { + return { + color: GetPedHairColor(pedHandle), + highlight: GetPedHairHighlightColor(pedHandle) + }; +} +exports("GetHair", getHair); +function getHeadBlendData(pedHandle) { + const buffer = new ArrayBuffer(80); + global.Citizen.invokeNative("0x2746bd9d88c5c5d0", pedHandle, new Uint32Array(buffer)); + const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer); + const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48); + return { + shapeFirst, + // father + shapeSecond, + // mother + shapeThird, + skinFirst, + skinSecond, + skinThird, + shapeMix, + // resemblance + thirdMix, + skinMix, + // skinpercent + hasParent: Boolean(hasParent) + }; +} +exports("GetHeadBlend", getHeadBlendData); +function getHeadOverlay(pedHandle) { + let totals = {}; + let headData = {}; + for (let i = 0; i < head_default.length; i++) { + const overlay = head_default[i]; + totals[overlay] = GetNumHeadOverlayValues(i); + if (overlay === "EyeColor") { + headData[overlay] = { + id: overlay, + index: i, + overlayValue: GetPedEyeColor(pedHandle) + }; + } else { + const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i); + headData[overlay] = { + id: overlay, + index: i, + overlayValue: overlayValue === 255 ? -1 : overlayValue, + colourType, + firstColor, + secondColor, + overlayOpacity + }; + } + } + return [headData, totals]; +} +exports("GetHeadOverlay", getHeadOverlay); +function getHeadStructure(pedHandle) { + const pedModel = GetEntityModel(pedHandle); + if (pedModel !== GetHashKey("mp_m_freemode_01") && pedModel !== GetHashKey("mp_f_freemode_01")) + return; + let faceStruct = {}; + for (let i = 0; i < face_default.length; i++) { + const overlay = face_default[i]; + faceStruct[overlay] = { + id: overlay, + index: i, + value: GetPedFaceFeature(pedHandle, i) + }; + } + return faceStruct; +} +exports("GetHeadStructure", getHeadStructure); +function getDrawables(pedHandle) { + let drawables = {}; + let totalDrawables = {}; + for (let i = 0; i < drawables_default.length; i++) { + const name = drawables_default[i]; + const current = GetPedDrawableVariation(pedHandle, i); + totalDrawables[name] = { + id: name, + index: i, + total: GetNumberOfPedDrawableVariations(pedHandle, i), + textures: GetNumberOfPedTextureVariations(pedHandle, i, current) + }; + drawables[name] = { + id: name, + index: i, + value: GetPedDrawableVariation(pedHandle, i), + texture: GetPedTextureVariation(pedHandle, i) + }; + } + return [drawables, totalDrawables]; +} +exports("GetDrawables", getDrawables); +function getProps(pedHandle) { + let props = {}; + let totalProps = {}; + for (let i = 0; i < props_default.length; i++) { + const name = props_default[i]; + const current = GetPedPropIndex(pedHandle, i); + totalProps[name] = { + id: name, + index: i, + total: GetNumberOfPedPropDrawableVariations(pedHandle, i), + textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current) + }; + props[name] = { + id: name, + index: i, + value: GetPedPropIndex(pedHandle, i), + texture: GetPedPropTextureIndex(pedHandle, i) + }; + } + return [props, totalProps]; +} +exports("GetProps", getProps); +async function getAppearance(pedHandle) { + const [headData, totals] = getHeadOverlay(pedHandle); + const [drawables, drawTotal] = getDrawables(pedHandle); + const [props, propTotal] = getProps(pedHandle); + const model = GetEntityModel(pedHandle); + return { + modelIndex: findModelIndex(model), + model, + hairColor: getHair(pedHandle), + headBlend: getHeadBlendData(pedHandle), + headOverlay: headData, + headOverlayTotal: totals, + headStructure: getHeadStructure(pedHandle), + drawables, + props, + drawTotal, + propTotal, + tattoos: [] + }; +} +exports("GetAppearance", getAppearance); +onServerCallback("bl_appearance:client:getAppearance", () => { + updatePed(PlayerPedId()); + return getAppearance(ped); +}); +function getPedClothes(pedHandle) { + const [drawables] = getDrawables(pedHandle); + const [props] = getProps(pedHandle); + const [headData] = getHeadOverlay(pedHandle); + return { + headOverlay: headData, + drawables, + props + }; +} +exports("GetPedClothes", getPedClothes); +function getPedSkin(pedHandle) { + return { + headBlend: getHeadBlendData(pedHandle), + headStructure: getHeadStructure(pedHandle), + hairColor: getHair(pedHandle), + model: GetEntityModel(pedHandle) + }; +} +exports("GetPedSkin", getPedSkin); +function getTattooData() { + let tattooZones = []; + const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos(); + for (let i = 0; i < TATTOO_CATEGORIES.length; i++) { + const category = TATTOO_CATEGORIES[i]; + const zone = category.zone; + const label = category.label; + const index = category.index; + tattooZones[index] = { + zone, + label, + zoneIndex: index, + dlcs: [] + }; + for (let j = 0; j < TATTOO_LIST.length; j++) { + const dlcData = TATTOO_LIST[j]; + tattooZones[index].dlcs.push({ + label: dlcData.dlc, + dlcIndex: j, + tattoos: [] + }); + } + } + const isFemale = GetEntityModel(ped) === GetHashKey("mp_f_freemode_01"); + for (let i = 0; i < TATTOO_LIST.length; i++) { + const data = TATTOO_LIST[i]; + const { dlc, tattoos } = data; + const dlcHash = GetHashKey(dlc); + for (let j = 0; j < tattoos.length; j++) { + const tattooData = tattoos[j]; + let tattoo = null; + const lowerTattoo = tattooData.toLowerCase(); + const isFemaleTattoo = lowerTattoo.includes("_f"); + if (isFemaleTattoo && isFemale) { + tattoo = tattooData; + } else if (!isFemaleTattoo && !isFemale) { + tattoo = tattooData; + } + let hash = null; + let zone = -1; + if (tattoo) { + hash = GetHashKey(tattoo); + zone = GetPedDecorationZoneFromHashes(dlcHash, hash); + } + if (zone !== -1 && hash) { + const zoneTattoos = tattooZones[zone].dlcs[i].tattoos; + zoneTattoos.push({ + label: tattoo, + hash, + zone, + dlc + }); + } + } + } + return tattooZones; +} +exports("GetTattoos", async () => { + const tattoos = await triggerServerCallback("bl_appearance:server:getTattoos"); + return tattoos; +}); +onServerCallback("bl_appearance:client:migration:setAppearance", (data) => { + if (data.type === "fivem") + exports["fivem-appearance"].setPlayerAppearance(data.data); + if (data.type === "illenium") + exports["illenium-appearance"].setPlayerAppearance(data.data); +}); + +// src/data/toggles.ts +var toggles_default = { + hats: { + type: "prop", + index: 0 + }, + glasses: { + type: "prop", + index: 1 + }, + masks: { + type: "drawable", + index: 1, + off: 0 + }, + shirts: { + type: "drawable", + index: 8, + off: 15, + hook: { + drawables: [ + { component: 3, variant: 15, texture: 0, id: "torsos" }, + { component: 8, variant: 15, texture: 0, id: "shirts" } + ] + } + }, + jackets: { + type: "drawable", + index: 11, + off: 15, + hook: { + drawables: [ + { component: 3, variant: 15, texture: 0, id: "torsos" }, + { component: 11, variant: 15, texture: 0, id: "jackets" } + ] + } + }, + vest: { + type: "drawable", + index: 9, + off: 0 + }, + legs: { + type: "drawable", + index: 4, + off: 18 + }, + shoes: { + type: "drawable", + index: 6, + off: 34 + } +}; + +// src/client/appearance/setters.ts +function setDrawable(pedHandle, data) { + SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0); + return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value); +} +exports("SetDrawable", setDrawable); +function setProp(pedHandle, data) { + if (data.value === -1) { + ClearPedProp(pedHandle, data.index); + return; + } + SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false); + return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value); +} +exports("SetProp", setProp); +var defMaleHash = GetHashKey("mp_m_freemode_01"); +var setModel = async (pedHandle, data) => { + if (data == null || data === void 0) + return pedHandle; + let model; + if (typeof data === "string") { + model = GetHashKey(data); + } else if (typeof data === "number") { + model = data; + } else { + model = data.model || defMaleHash; + } + if (model === 0) + return pedHandle; + await requestModel(model); + const isPlayer = IsPedAPlayer(pedHandle); + if (isPlayer) { + SetPlayerModel(PlayerId(), model); + pedHandle = PlayerPedId(); + updatePed(pedHandle); + } else { + SetPlayerModel(pedHandle, model); + } + SetModelAsNoLongerNeeded(model); + SetPedDefaultComponentVariation(pedHandle); + if (!isPedFreemodeModel(pedHandle)) + return pedHandle; + const isJustModel = typeof data === "string" || typeof data === "number"; + const hasHeadBlend = !isJustModel && Object.keys(data.headBlend).length > 0; + if (hasHeadBlend) { + setHeadBlend(pedHandle, data.headBlend); + SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + } else { + if (model === GetHashKey("mp_m_freemode_01")) { + SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + } else if (model === GetHashKey("mp_f_freemode_01")) { + SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false); + } + } + return pedHandle; +}; +exports("SetModel", setModel); +function SetFaceFeature(pedHandle, data) { + SetPedFaceFeature(pedHandle, data.index, data.value + 0); +} +exports("SetFaceFeature", SetFaceFeature); +var isPositive = (val) => val >= 0 ? val : 0; +function setHeadBlend(pedHandle, data) { + pedHandle = pedHandle || ped; + if (!isPedFreemodeModel(pedHandle)) + return; + const shapeFirst = isPositive(data.shapeFirst); + const shapeSecond = isPositive(data.shapeSecond); + const shapeThird = isPositive(data.shapeThird); + const skinFirst = isPositive(data.skinFirst); + const skinSecond = isPositive(data.skinSecond); + const skinThird = isPositive(data.skinThird); + const shapeMix = data.shapeMix + 0; + const skinMix = data.skinMix + 0; + const thirdMix = data.thirdMix + 0; + const hasParent = data.hasParent; + SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent); +} +exports("SetHeadBlend", setHeadBlend); +function setHeadOverlay(pedHandle, data) { + const index = data.index; + if (index === 13) { + SetPedEyeColor(pedHandle, data.value); + return; + } + const value = data.overlayValue; + if (data.id === "hairColor") { + SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight); + return; + } + SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0); + SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor); +} +exports("SetHeadOverlay", setHeadOverlay); +function resetToggles(data) { + const drawables = data.drawables; + const props = data.props; + for (const [toggleItem, toggleData] of Object.entries(toggles_default)) { + const toggleType = toggleData.type; + const index = toggleData.index; + if (toggleType === "drawable" && drawables[toggleItem]) { + const currentDrawable = GetPedDrawableVariation(ped, index); + if (currentDrawable !== drawables[toggleItem].value) { + SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0); + } + } else if (toggleType === "prop" && props[toggleItem]) { + const currentProp = GetPedPropIndex(ped, index); + if (currentProp !== props[toggleItem].value) { + SetPedPropIndex(ped, index, props[toggleItem].value, 0, false); + } + } + } +} +exports("SetPedClothes", setPedClothes); +function setPedClothes(pedHandle, data) { + const drawables = data.drawables; + const props = data.props; + const headOverlay = data.headOverlay; + for (const id in drawables) { + const drawable = drawables[id]; + setDrawable(pedHandle, drawable); + } + for (const id in props) { + const prop = props[id]; + setProp(pedHandle, prop); + } + for (const id in headOverlay) { + const overlay = headOverlay[id]; + setHeadOverlay(pedHandle, overlay); + } +} +exports("SetPedClothes", setPedClothes); +var setPedSkin = async (pedHandle, data) => { + if (!data) + return; + pedHandle = await setModel(pedHandle, data); + const headStructure = data.headStructure; + const headBlend = data.headBlend; + if (headBlend) + setHeadBlend(pedHandle, headBlend); + if (headStructure) + for (const feature in headStructure) { + const value = headStructure[feature]; + SetFaceFeature(pedHandle, value); + } +}; +exports("SetPedSkin", setPedSkin); +function setPedTattoos(pedHandle, data) { + if (!data) + return; + ClearPedDecorationsLeaveScars(pedHandle); + for (let i = 0; i < data.length; i++) { + const tattooData = data[i].tattoo; + if (tattooData) { + const collection = GetHashKey(tattooData.dlc); + const tattoo = tattooData.hash; + AddPedDecorationFromHashes(pedHandle, collection, tattoo); + } + } +} +exports("SetPedTattoos", setPedTattoos); +function setPedHairColors(pedHandle, data) { + if (!data) + return; + const color = data.color; + const highlight = data.highlight; + SetPedHairColor(pedHandle, color, highlight); +} +exports("SetPedHairColors", setPedHairColors); +async function setPedAppearance(pedHandle, data) { + if (IsPedAPlayer(pedHandle)) { + setPlayerPedAppearance(data); + return; + } + await setPedSkin(pedHandle, data); + setPedClothes(pedHandle, data); + setPedHairColors(pedHandle, data.hairColor); + setPedTattoos(pedHandle, data.tattoos); +} +exports("SetPedAppearance", setPedAppearance); +async function setPlayerPedAppearance(data) { + updatePed(PlayerPedId()); + await setPedSkin(ped, data); + updatePed(PlayerPedId()); + setPedClothes(ped, data); + setPedHairColors(ped, data.hairColor); + setPedTattoos(ped, data.tattoos); +} +exports("SetPedClothes", setPedClothes); +exports("SetPedSkin", setPedSkin); +exports("SetPedTattoos", setPedTattoos); +exports("SetPedHairColors", setPedHairColors); + +// src/client/handlers.ts +RegisterNuiCallback("appearance:cancel" /* cancel */, async (appearance, cb) => { + await setPlayerPedAppearance(appearance); + closeMenu(); + cb(1); +}); +RegisterNuiCallback("appearance:save" /* save */, async (appearance, cb) => { + resetToggles(appearance); + await delay(100); + const newAppearance = await getAppearance(ped); + newAppearance.tattoos = appearance.tattoos; + triggerServerCallback("bl_appearance:server:saveAppearance", getFrameworkID(), newAppearance); + setPedTattoos(ped, newAppearance.tattoos); + closeMenu(); + cb(1); +}); +RegisterNuiCallback("appearance:setModel" /* setModel */, async (model, cb) => { + const hash = GetHashKey(model); + if (!IsModelInCdimage(hash) || !IsModelValid(hash)) { + return cb(0); + } + const newPed = await setModel(ped, hash); + updatePed(newPed); + const appearance = await getAppearance(ped); + appearance.tattoos = []; + setPedTattoos(ped, []); + cb(appearance); +}); +RegisterNuiCallback("appearance:getModelTattoos" /* getModelTattoos */, async (_, cb) => { + const tattoos = getTattooData(); + cb(tattoos); +}); +RegisterNuiCallback("appearance:setHeadStructure" /* setHeadStructure */, async (data, cb) => { + SetFaceFeature(ped, data); + cb(1); +}); +RegisterNuiCallback("appearance:setHeadOverlay" /* setHeadOverlay */, async (data, cb) => { + setHeadOverlay(ped, data); + cb(1); +}); +RegisterNuiCallback("appearance:setHeadBlend" /* setHeadBlend */, async (data, cb) => { + setHeadBlend(ped, data); + cb(1); +}); +RegisterNuiCallback("appearance:setTattoos" /* setTattoos */, async (data, cb) => { + setPedTattoos(ped, data); + cb(1); +}); +RegisterNuiCallback("appearance:setProp" /* setProp */, async (data, cb) => { + let texture = setProp(ped, data); + cb(texture); +}); +RegisterNuiCallback("appearance:setDrawable" /* setDrawable */, async (data, cb) => { + let texture = setDrawable(ped, data); + cb(texture); +}); +RegisterNuiCallback( + "appearance:toggleItem" /* toggleItem */, + async (data, cb) => { + const item = toggles_default[data.item]; + if (!item) + return cb(false); + const current = data.data; + const type = item.type; + const index = item.index; + const hook = item.hook; + const hookData = data.hookData; + if (!current) + return cb(false); + if (type === "prop") { + const currentProp = GetPedPropIndex(ped, index); + if (currentProp === -1) { + setProp(ped, current); + cb(false); + return; + } else { + ClearPedProp(ped, index); + cb(true); + return; + } + } else if (type === "drawable") { + const currentDrawable = GetPedDrawableVariation(ped, index); + if (current.value === item.off) { + cb(false); + return; + } + if (current.value === currentDrawable) { + SetPedComponentVariation(ped, index, item.off, 0, 0); + if (hook) { + for (let i = 0; i < hook.drawables?.length; i++) { + const hookItem = hook.drawables[i]; + SetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0); + } + } + cb(true); + return; + } else { + setDrawable(ped, current); + for (let i = 0; i < hookData?.length; i++) { + setDrawable(ped, hookData[i]); + } + cb(false); + return; + } + } + } +); +RegisterNuiCallback("appearance:saveOutfit" /* saveOutfit */, async (data, cb) => { + const result = await triggerServerCallback("bl_appearance:server:saveOutfit", data); + cb(result); +}); +RegisterNuiCallback("appearance:deleteOutfit" /* deleteOutfit */, async ({ id }, cb) => { + const result = await triggerServerCallback("bl_appearance:server:deleteOutfit", id); + cb(result); +}); +RegisterNuiCallback("appearance:renameOutfit" /* renameOutfit */, async (data, cb) => { + const result = await triggerServerCallback("bl_appearance:server:renameOutfit", data); + cb(result); +}); +RegisterNuiCallback("appearance:useOutfit" /* useOutfit */, async (outfit, cb) => { + setPedClothes(ped, outfit); + cb(1); +}); +RegisterNuiCallback("appearance:importOutfit" /* importOutfit */, async ({ id, outfitName }, cb) => { + const frameworkdId = getFrameworkID(); + const result = await triggerServerCallback("bl_appearance:server:importOutfit", frameworkdId, id, outfitName); + cb(result); +}); +RegisterNuiCallback("appearance:fetchOutfit" /* fetchOutfit */, async ({ id }, cb) => { + const result = await triggerServerCallback("bl_appearance:server:fetchOutfit", id); + cb(result); +}); +RegisterNuiCallback("appearance:itemOutfit" /* itemOutfit */, async (data, cb) => { + const result = await triggerServerCallback("bl_appearance:server:itemOutfit", data); + cb(result); +}); +onNet("bl_appearance:server:useOutfiItem", (outfit) => { + setPedClothes(ped, outfit); +}); + +// src/client/menu.ts +var config = exports.bl_appearance; +var armour = 0; +var open = false; +var resolvePromise = null; +var promise = null; +async function openMenu(zone, creation = false) { + if (zone === null || open) { + return; + } + let pedHandle = PlayerPedId(); + const configMenus = config.menus(); + const isString = typeof zone === "string"; + const type = isString ? zone : zone.type; + const menu = configMenus[type]; + if (!menu) + return; + updatePed(pedHandle); + const frameworkdId = getFrameworkID(); + const tabs = menu.tabs; + let allowExit = creation ? false : menu.allowExit; + armour = GetPedArmour(pedHandle); + let outfits = []; + const hasOutfitTab = tabs.includes("outfits"); + if (hasOutfitTab) + outfits = await triggerServerCallback("bl_appearance:server:getOutfits", frameworkdId); + let models = []; + const hasHeritageTab = tabs.includes("heritage"); + if (hasHeritageTab) { + models = config.models(); + } + const hasTattooTab = tabs.includes("tattoos"); + let tattoos; + if (hasTattooTab) { + tattoos = getTattooData(); + } + const blacklist = getBlacklist(zone); + if (creation) { + const model = GetHashKey(getPlayerGenderModel()); + pedHandle = await setModel(pedHandle, model); + emitNet("bl_appearance:server:setroutingbucket"); + promise = new Promise((resolve) => { + resolvePromise = resolve; + }); + updatePed(pedHandle); + } + const appearance = await getAppearance(pedHandle); + startCamera(); + sendNUIEvent("appearance:data" /* data */, { + tabs, + appearance, + blacklist, + tattoos, + outfits, + models, + allowExit, + job: getJobInfo(), + locale: await requestLocale("locale") + }); + SetNuiFocus(true, true); + sendNUIEvent("appearance:visible" /* visible */, true); + open = true; + exports.bl_appearance.hideHud(true); + if (promise) { + await promise; + emitNet("bl_appearance:server:resetroutingbucket"); + } + promise = null; + resolvePromise = null; + return true; +} +exports("OpenMenu", openMenu); +RegisterCommand("appearance", async (_, args) => { + const type = args[0]; + if (!type) { + exports.bl_appearance.InitialCreation(); + } else { + const zone = type.toLowerCase(); + openMenu(zone); + } +}, true); +function getBlacklist(zone) { + const { groupTypes, base } = config.blacklist(); + if (typeof zone === "string") + return base; + if (!groupTypes) + return base; + let blacklist = { ...base }; + const playerData = getPlayerData(); + for (const type in groupTypes) { + const groups = groupTypes[type]; + for (const group in groups) { + let skip = false; + if (type == "jobs" && zone.jobs) { + skip = zone.jobs.includes(playerData.job.name); + } + if (type == "gangs" && zone.gangs) { + skip = zone.gangs.includes(playerData.gang.name); + } + if (!skip) { + const groupBlacklist = groups[group]; + blacklist = Object.assign({}, blacklist, groupBlacklist, { + drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables) + }); + } + } + } + return blacklist; +} +function closeMenu() { + SetPedArmour(ped, armour); + stopCamera(); + SetNuiFocus(false, false); + sendNUIEvent("appearance:visible" /* visible */, false); + exports.bl_appearance.hideHud(false); + if (resolvePromise) { + resolvePromise(); + } + open = false; +} + +// src/client/bridge/qb.ts +function QBBridge() { + onNet("qb-clothing:client:loadPlayerClothing", async (appearance, ped2) => { + await setPedAppearance(ped2, appearance); + }); + onNet("qb-clothes:client:CreateFirstCharacter", () => { + exports.bl_appearance.InitialCreation(); + }); + onNet("qb-clothing:client:openOutfitMenu", () => { + openMenu({ type: "outfits", coords: [0, 0, 0, 0] }); + }); +} + +// src/client/bridge/esx.ts +function ESXBridge() { + let firstSpawn = false; + on("esx_skin:resetFirstSpawn", () => { + firstSpawn = true; + }); + on("esx_skin:playerRegistered", () => { + if (firstSpawn) + exports.bl_appearance.InitialCreation(); + }); + onNet("skinchanger:loadSkin2", async (appearance, ped2) => { + if (!appearance.model) + appearance.model = GetHashKey("mp_m_freemode_01"); + await setPedAppearance(ped2, appearance); + }); + onNet("skinchanger:getSkin", async (cb) => { + const frameworkID = await getFrameworkID(); + const appearance = await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); + cb(appearance); + }); + onNet("skinchanger:loadSkin", async (appearance, cb) => { + await setPlayerPedAppearance(appearance); + if (cb) + cb(); + }); + onNet("esx_skin:openSaveableMenu", async (onSubmit) => { + exports.bl_appearance.InitialCreation(onSubmit); + }); +} + +// src/client/compat/illenium.ts +function exportHandler(name, cb) { + on("__cfx_export_illenium-appearance_" + name, (setCB) => { + setCB(cb); + }); +} +function illeniumCompat() { + exportHandler("startPlayerCustomization", () => { + exports.bl_appearance.InitialCreation(); + }); + exportHandler("getPedModel", (ped2) => { + return GetEntityModel(ped2); + }); + exportHandler("getPedComponents", (ped2) => { + const drawables = getDrawables(ped2)[0]; + let newdrawable = []; + for (const id of drawables) { + const drawable = drawables[id]; + newdrawable.push({ + component_id: drawable.index, + drawable: drawable.value, + texture: drawable.texture + }); + } + }); + exportHandler("getPedProps", (ped2) => { + const props = getProps(ped2)[0]; + let newProps = []; + for (const id of props) { + const prop = props[id]; + newProps.push({ + prop_id: prop.index, + drawable: prop.value, + texture: prop.texture + }); + } + }); + exportHandler("getPedHeadBlend", (ped2) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("getPedFaceFeatures", (ped2) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("getPedHeadOverlays", (ped2) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("getPedHair", (ped2) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("getPedAppearance", (ped2) => { + return getAppearance(ped2); + }); + exportHandler("setPlayerModel", (model) => { + updatePed(PlayerPedId()); + setModel(ped, model); + }); + exportHandler("setPedHeadBlend", (ped2, blend) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("setPedFaceFeatures", () => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("setPedHeadOverlays", (ped2, overlay) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("setPedHair", async (ped2, hair, tattoo) => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("setPedEyeColor", () => { + return console.warn("You Still cannot use this function"); + }); + exportHandler("setPedComponent", (ped2, drawable) => { + const newDrawable = { + index: drawable.component_id, + value: drawable.drawable, + texture: drawable.texture + }; + setDrawable(ped2, newDrawable); + }); + exportHandler("setPedComponents", (ped2, components) => { + for (const component of components) { + const newDrawable = { + index: component.component_id, + value: component.drawable, + texture: component.texture + }; + setDrawable(ped2, newDrawable); + } + }); + exportHandler("setPedProp", (ped2, prop) => { + const newProp = { + index: prop.prop_id, + value: prop.drawable, + texture: prop.texture + }; + setProp(ped2, newProp); + }); + exportHandler("setPedProps", (ped2, props) => { + for (const prop of props) { + const newProp = { + index: prop.prop_id, + value: prop.drawable, + texture: prop.texture + }; + setProp(ped2, newProp); + } + }); + exportHandler("setPedAppearance", (ped2, appearance) => { + setPedAppearance(ped2, appearance); + }); + exportHandler("setPedTattoos", (ped2, tattoos) => { + setPedTattoos(ped2, tattoos); + }); +} + +// src/client/init.ts +exports("SetPlayerPedAppearance", async (appearance) => { + let resolvedAppearance; + if (!appearance || typeof appearance === "string") { + const frameworkID = appearance || await getFrameworkID(); + resolvedAppearance = await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); + } else if (typeof appearance === "object") + resolvedAppearance = appearance; + if (!resolvedAppearance) { + throw new Error("No valid appearance found"); + } + await setPlayerPedAppearance(resolvedAppearance); +}); +exports("GetPlayerPedAppearance", async (frameworkID) => { + frameworkID = frameworkID || await getFrameworkID(); + return await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); +}); +exports("InitialCreation", async (cb) => { + await openMenu({ type: "appearance", coords: [0, 0, 0, 0] }, true); + if (cb) + cb(); +}); +on("bl_sprites:client:useZone", (zone) => { + openMenu(zone); +}); +onNet("bl_bridge:client:playerLoaded", async () => { + while (!bl_bridge.core().playerLoaded()) { + await Delay(100); + } + const frameworkID = await getFrameworkID(); + const appearance = await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); + if (!appearance) + return; + await setPlayerPedAppearance(appearance); +}); +onNet("onResourceStart", async (resource) => { + if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) { + const frameworkID = await getFrameworkID(); + const appearance = await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); + if (!appearance) + return; + await setPlayerPedAppearance(appearance); + } +}); +var frameworkName = bl_bridge.getFramework("core"); +var core = format(GetConvar("bl:framework", "qb")); +if (core == "qb" || core == "qbx" && GetResourceState(frameworkName) == "started") { + QBBridge(); +} else if (core == "esx" && GetResourceState(frameworkName) == "started") { + ESXBridge(); +} +illeniumCompat(); +RegisterCommand("reloadskin", async () => { + const frameworkID = await getFrameworkID(); + const health = GetEntityHealth(ped); + const maxhealth = GetEntityMaxHealth(ped); + const armor = GetPedArmour(ped); + const appearance = await triggerServerCallback("bl_appearance:server:getAppearance", frameworkID); + if (!appearance) + return; + await setPlayerPedAppearance(appearance); + SetPedMaxHealth(ped, maxhealth); + delay(1e3); + SetEntityHealth(ped, health); + SetPedArmour(ped, armor); +}, false); diff --git a/dist/server/init.js b/dist/server/init.js index 3a17c25..ae4ec19 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -1 +1,581 @@ -var oe=Object.create;var C=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var N=e=>t=>{var n=e[t];if(n)return n();throw new Error("Module not found in bundle: "+t)};var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)C(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!pe.call(e,a)&&a!==n&&C(e,a,{get:()=>t[a],enumerable:!(r=se(t,a))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?oe(ce(e)):{},ue(t||!e||!e.__esModule?C(n,"default",{value:e,enumerable:!0}):n,e));var l=le(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.oxmysql=void 0;var I=[];function S(e,t){if(!e)throw new TypeError(t)}var c=(e,t,n,r)=>{if(typeof e=="number"&&(e=I[e]),r?S(typeof e=="object",`First argument expected object, recieved ${typeof e}`):S(typeof e=="string",`First argument expected string, received ${typeof e}`),t){let a=typeof t;S(a==="object"||a==="function",`Second argument expected object or function, received ${a}`),!n&&a==="function"&&(n=t,t=void 0)}return n!==void 0&&S(typeof n=="function",`Third argument expected function, received ${typeof n}`),[e,t,n]},k=global.exports.oxmysql,fe=GetCurrentResourceName();function p(e,t,n){return new Promise((r,a)=>{k[e](t,n,(i,d)=>{if(d)return a(d);r(i)},fe,!0)})}v.oxmysql={store(e){return S(typeof e!="string",`Query expects a string, received ${typeof e}`),I.push(e)},ready(e){setImmediate(async()=>{for(;GetResourceState("oxmysql")!=="started";)await new Promise(t=>setTimeout(t,50));e()})},async query(e,t,n){[e,t,n]=c(e,t,n);let r=await p("query",e,t);return n?n(r):r},async single(e,t,n){[e,t,n]=c(e,t,n);let r=await p("single",e,t);return n?n(r):r},async scalar(e,t,n){[e,t,n]=c(e,t,n);let r=await p("scalar",e,t);return n?n(r):r},async update(e,t,n){[e,t,n]=c(e,t,n);let r=await p("update",e,t);return n?n(r):r},async insert(e,t,n){[e,t,n]=c(e,t,n);let r=await p("insert",e,t);return n?n(r):r},async prepare(e,t,n){[e,t,n]=c(e,t,n);let r=await p("prepare",e,t);return n?n(r):r},async rawExecute(e,t,n){[e,t,n]=c(e,t,n);let r=await p("rawExecute",e,t);return n?n(r):r},async transaction(e,t,n){[e,t,n]=c(e,t,n,!0);let r=await p("transaction",e,t);return n?n(r):r},isReady(){return k.isReady()},async awaitConnection(){return await k.awaitConnection()}}});function u(e,t,...n){let r;do r=`${e}:${Math.floor(Math.random()*100001)}:${t}`;while(A[r]);return emitNet(`_bl_cb_${e}`,t,P,r,...n),new Promise(a=>{A[r]=a})}function o(e,t){onNet(`_bl_cb_${e}`,async(n,r,...a)=>{let i=source,d;try{d=await t(i,...a)}catch(_){console.error(`an error occurred while handling callback event ${e}`),console.log(`^3${_.stack}^0`)}emitNet(`_bl_cb_${n}`,i,r,d)})}var P,A,me,E,j,s,ge,L,y=b(()=>{P=GetCurrentResourceName(),A={};onNet(`_bl_cb_${P}`,(e,...t)=>{let n=A[e];return n&&n(...t)});me=exports.bl_bridge,E=me.core(),j=e=>E.GetPlayer(e),s=e=>{let t=E.GetPlayer(e);return t?t.id:null},ge=exports.bl_appearance.config(),L=ge});async function W(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET skin = ? WHERE id = ?",[JSON.stringify(t),n])}async function U(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET clothes = ? WHERE id = ?",[JSON.stringify(t),n])}async function G(e,t){let n=s(e);return await T.oxmysql.update("UPDATE appearance SET tattoos = ? WHERE id = ?",[JSON.stringify(t),n])}async function m(e,t,n){if(e&&t){let _=s(e);if(t!==_){console.warn("You are trying to save an appearance for a different player",e,t);return}}t||(t=s(e));let r={drawables:n.drawables,props:n.props,headOverlay:n.headOverlay},a={headBlend:n.headBlend,headStructure:n.headStructure,hairColor:n.hairColor,model:n.model},i=n.tattoos||[];return await T.oxmysql.prepare("INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);",[t,JSON.stringify(r),JSON.stringify(a),JSON.stringify(i)])}var T,w=b(()=>{y();T=g(l(),1);o("bl_appearance:server:saveSkin",W);exports("SaveSkin",W);o("bl_appearance:server:saveClothes",U);exports("SaveClothes",U);o("bl_appearance:server:saveTattoos",G);exports("SaveTattoos",G);o("bl_appearance:server:saveAppearance",m);exports("SaveAppearance",function(e,t){return m(null,e,t)})});var ye={};var Y=b(()=>{});var X={};h(X,{default:()=>Ee});var K,de,be,Ee,Z=b(()=>{K=g(l(),1);y();w();de=e=>new Promise(t=>setTimeout(t,e)),be=async e=>{let t=await K.oxmysql.query("SELECT * FROM `players`");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"fivem",data:JSON.parse(n.skin)}),await de(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},Ee=be});var ee={};h(ee,{default:()=>we});var q,Se,Te,we,te=b(()=>{q=g(l(),1);y();w();Se=e=>new Promise(t=>setTimeout(t,e)),Te=async e=>{let t=await q.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t)if(n.skin){await u("bl_appearance:client:migration:setAppearance",e,{type:"illenium",data:JSON.parse(n.skin)}),await Se(100);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},we=Te});var re={};h(re,{default:()=>xe});var ne,Oe,ve,xe,ae=b(()=>{ne=g(l(),1);y();w();Oe=e=>new Promise(t=>setTimeout(t,e)),ve=async e=>{let t=await ne.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1");if(t){for(let n of t){emitNet("qb-clothes:loadSkin",e,0,n.model,n.skin),await Oe(200);let r=await u("bl_appearance:client:getAppearance",e),a=parseInt(e);await m(a,n.citizenid,r)}console.log("Converted "+t.length+" appearances")}},xe=ve});var f=g(l(),1);y();async function M(e,t){let n=E.GetPlayer(e).job||{name:"unknown",grade:{name:"unknown"}},r=await f.oxmysql.prepare("SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)",[t,n.name,n.grade.name]);return r?(Array.isArray(r)||(r=[r]),r.map(i=>({id:i.id,label:i.label,outfit:JSON.parse(i.outfit),jobname:i.jobname}))):[]}o("bl_appearance:server:getOutfits",M);exports("GetOutfits",M);async function D(e,t){let n=s(e);return await f.oxmysql.update("UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?",[t.label,n,t.id])}o("bl_appearance:server:renameOutfit",D);exports("RenameOutfit",D);async function F(e,t){let n=s(e);return await f.oxmysql.update("DELETE FROM outfits WHERE player_id = ? AND id = ?",[n,t])>0}o("bl_appearance:server:deleteOutfit",F);exports("DeleteOutfit",F);async function J(e,t){let n=s(e),r=null,a=0;return t.job&&(r=t.job.name,a=t.job.rank),await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)",[n,t.label,JSON.stringify(t.outfit),r,a])}o("bl_appearance:server:saveOutfit",J);exports("SaveOutfit",J);async function $(e,t){let n=await f.oxmysql.prepare("SELECT outfit FROM outfits WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:fetchOutfit",$);exports("FetchOutfit",$);async function H(e,t,n,r){let a=await f.oxmysql.query("SELECT label, outfit FROM outfits WHERE id = ?",[n]);return!a||typeof a!="object"||Object.keys(a).length===0?{success:!1,message:"Outfit not found"}:{success:!0,newId:await f.oxmysql.insert("INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)",[t,r,a.outfit])}}o("bl_appearance:server:importOutfit",H);exports("ImportOutfit",H);var x=L.outfitItem;x||console.warn("bl_appearance: No outfit item configured, please set it in config.lua");o("bl_appearance:server:itemOutfit",async(e,t)=>{E.GetPlayer(e).addItem(x,1,t)});E.RegisterUsableItem(x,async(e,t,n)=>{j(e)?.removeItem(x,1,t)&&emitNet("bl_appearance:server:useOutfitItem",e,n.outfit)});w();var O=g(l(),1);y();async function B(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT skin FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getSkin",B);exports("GetSkin",function(e){return B(null,e)});async function V(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT clothes FROM appearance WHERE id = ?",[t]);return JSON.parse(n)}o("bl_appearance:server:getClothes",V);exports("GetClothes",function(e){return V(null,e)});async function z(e,t){t||(t=s(e));let n=await O.oxmysql.prepare("SELECT tattoos FROM appearance WHERE id = ?",[t]);return JSON.parse(n)||[]}o("bl_appearance:server:getTattoos",z);exports("GetTattoos",function(e){return z(null,e)});async function Q(e,t){if(!t&&!e)return null;t||(t=s(e));let n=await O.oxmysql.single("SELECT * FROM appearance WHERE id = ? LIMIT 1",[t]);if(!n)return null;let r={...JSON.parse(n.skin),...JSON.parse(n.clothes),tattoos:JSON.parse(n.tattoos)};return r.id=n.id,r}o("bl_appearance:server:getAppearance",Q);exports("GetAppearance",function(e){return Q(null,e)});var R=g(l(),1);var _e=N({"./migrate/esx.ts":()=>Promise.resolve().then(()=>(Y(),ye)),"./migrate/fivem.ts":()=>Promise.resolve().then(()=>(Z(),X)),"./migrate/illenium.ts":()=>Promise.resolve().then(()=>(te(),ee)),"./migrate/qb.ts":()=>Promise.resolve().then(()=>(ae(),re))});R.oxmysql.ready(async()=>{try{await R.oxmysql.query("SELECT 1 FROM appearance LIMIT 1")}catch(e){console.error("Error checking appearance table. Most likely the table does not exist: ",e)}});onNet("bl_appearance:server:setroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),source)});onNet("bl_appearance:server:resetroutingbucket",()=>{SetPlayerRoutingBucket(source.toString(),0)});RegisterCommand("migrate",async e=>{e=e!==0?e:parseInt(getPlayers()[0]);let n=exports.bl_appearance.config();(await _e(`./migrate/${n.previousClothing==="fivem-appearance"?"fivem":n.previousClothing}.ts`)).default(e)},!1); +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __glob = (map) => (path) => { + var fn = map[path]; + if (fn) + return fn(); + throw new Error("Module not found in bundle: " + path); +}; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/@overextended/oxmysql/MySQL.js +var require_MySQL = __commonJS({ + "node_modules/@overextended/oxmysql/MySQL.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.oxmysql = void 0; + var QueryStore = []; + function assert(condition, message) { + if (!condition) + throw new TypeError(message); + } + var safeArgs = (query, params, cb, transaction) => { + if (typeof query === "number") + query = QueryStore[query]; + if (transaction) { + assert(typeof query === "object", `First argument expected object, recieved ${typeof query}`); + } else { + assert(typeof query === "string", `First argument expected string, received ${typeof query}`); + } + if (params) { + const paramType = typeof params; + assert(paramType === "object" || paramType === "function", `Second argument expected object or function, received ${paramType}`); + if (!cb && paramType === "function") { + cb = params; + params = void 0; + } + } + if (cb !== void 0) + assert(typeof cb === "function", `Third argument expected function, received ${typeof cb}`); + return [query, params, cb]; + }; + var exp = global.exports.oxmysql; + var currentResourceName = GetCurrentResourceName(); + function execute(method, query, params) { + return new Promise((resolve, reject) => { + exp[method](query, params, (result, error) => { + if (error) + return reject(error); + resolve(result); + }, currentResourceName, true); + }); + } + exports2.oxmysql = { + store(query) { + assert(typeof query !== "string", `Query expects a string, received ${typeof query}`); + return QueryStore.push(query); + }, + ready(callback) { + setImmediate(async () => { + while (GetResourceState("oxmysql") !== "started") + await new Promise((resolve) => setTimeout(resolve, 50)); + callback(); + }); + }, + async query(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("query", query, params); + return cb ? cb(result) : result; + }, + async single(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("single", query, params); + return cb ? cb(result) : result; + }, + async scalar(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("scalar", query, params); + return cb ? cb(result) : result; + }, + async update(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("update", query, params); + return cb ? cb(result) : result; + }, + async insert(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("insert", query, params); + return cb ? cb(result) : result; + }, + async prepare(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("prepare", query, params); + return cb ? cb(result) : result; + }, + async rawExecute(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb); + const result = await execute("rawExecute", query, params); + return cb ? cb(result) : result; + }, + async transaction(query, params, cb) { + [query, params, cb] = safeArgs(query, params, cb, true); + const result = await execute("transaction", query, params); + return cb ? cb(result) : result; + }, + isReady() { + return exp.isReady(); + }, + async awaitConnection() { + return await exp.awaitConnection(); + } + }; + } +}); + +// src/server/utils/index.ts +function triggerClientCallback(eventName, playerId, ...args) { + let key; + do { + key = `${eventName}:${Math.floor(Math.random() * (1e5 + 1))}:${playerId}`; + } while (activeEvents[key]); + emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args); + return new Promise((resolve) => { + activeEvents[key] = resolve; + }); +} +function onClientCallback(eventName, cb) { + onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => { + const src = source; + let response; + try { + response = await cb(src, ...args); + } catch (e) { + console.error(`an error occurred while handling callback event ${eventName}`); + console.log(`^3${e.stack}^0`); + } + emitNet(`_bl_cb_${resource}`, src, key, response); + }); +} +var resourceName, activeEvents, bl_bridge, core, getPlayerData, getFrameworkID, bl_config, config; +var init_utils = __esm({ + "src/server/utils/index.ts"() { + resourceName = GetCurrentResourceName(); + activeEvents = {}; + onNet(`_bl_cb_${resourceName}`, (key, ...args) => { + const resolve = activeEvents[key]; + return resolve && resolve(...args); + }); + bl_bridge = exports.bl_bridge; + core = bl_bridge.core(); + getPlayerData = (src) => { + return core.GetPlayer(src); + }; + getFrameworkID = (src) => { + const player = core.GetPlayer(src); + if (!player) + return null; + return player.id; + }; + bl_config = exports.bl_appearance.config(); + config = bl_config; + } +}); + +// src/server/appearance/setters.ts +async function saveSkin(src, skin) { + const frameworkId = getFrameworkID(src); + const result = await import_oxmysql2.oxmysql.update( + "UPDATE appearance SET skin = ? WHERE id = ?", + [JSON.stringify(skin), frameworkId] + ); + return result; +} +async function saveClothes(src, clothes) { + const frameworkId = getFrameworkID(src); + const result = await import_oxmysql2.oxmysql.update( + "UPDATE appearance SET clothes = ? WHERE id = ?", + [JSON.stringify(clothes), frameworkId] + ); + return result; +} +async function saveTattoos(src, tattoos) { + const frameworkId = getFrameworkID(src); + const result = await import_oxmysql2.oxmysql.update( + "UPDATE appearance SET tattoos = ? WHERE id = ?", + [JSON.stringify(tattoos), frameworkId] + ); + return result; +} +async function saveAppearance(src, frameworkId, appearance) { + if (src && frameworkId) { + const playerId = getFrameworkID(src); + if (frameworkId !== playerId) { + console.warn("You are trying to save an appearance for a different player", src, frameworkId); + return; + } + } + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const clothes = { + drawables: appearance.drawables, + props: appearance.props, + headOverlay: appearance.headOverlay + }; + const skin = { + headBlend: appearance.headBlend, + headStructure: appearance.headStructure, + hairColor: appearance.hairColor, + model: appearance.model + }; + const tattoos = appearance.tattoos || []; + const result = await import_oxmysql2.oxmysql.prepare( + "INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);", + [ + frameworkId, + JSON.stringify(clothes), + JSON.stringify(skin), + JSON.stringify(tattoos) + ] + ); + return result; +} +var import_oxmysql2; +var init_setters = __esm({ + "src/server/appearance/setters.ts"() { + init_utils(); + import_oxmysql2 = __toESM(require_MySQL(), 1); + onClientCallback("bl_appearance:server:saveSkin", saveSkin); + exports("SaveSkin", saveSkin); + onClientCallback("bl_appearance:server:saveClothes", saveClothes); + exports("SaveClothes", saveClothes); + onClientCallback("bl_appearance:server:saveTattoos", saveTattoos); + exports("SaveTattoos", saveTattoos); + onClientCallback("bl_appearance:server:saveAppearance", saveAppearance); + exports("SaveAppearance", function(id, appearance) { + return saveAppearance(null, id, appearance); + }); + } +}); + +// src/server/migrate/esx.ts +var esx_exports = {}; +var init_esx = __esm({ + "src/server/migrate/esx.ts"() { + } +}); + +// src/server/migrate/fivem.ts +var fivem_exports = {}; +__export(fivem_exports, { + default: () => fivem_default +}); +var import_oxmysql4, delay, migrate, fivem_default; +var init_fivem = __esm({ + "src/server/migrate/fivem.ts"() { + import_oxmysql4 = __toESM(require_MySQL(), 1); + init_utils(); + init_setters(); + delay = (ms) => new Promise((res) => setTimeout(res, ms)); + migrate = async (src) => { + const response = await import_oxmysql4.oxmysql.query("SELECT * FROM `players`"); + if (!response) + return; + for (const element of response) { + if (element.skin) { + await triggerClientCallback("bl_appearance:client:migration:setAppearance", src, { + type: "fivem", + data: JSON.parse(element.skin) + }); + await delay(100); + const response2 = await triggerClientCallback("bl_appearance:client:getAppearance", src); + const playerSrc = parseInt(src); + await saveAppearance(playerSrc, element.citizenid, response2); + } + } + console.log("Converted " + response.length + " appearances"); + }; + fivem_default = migrate; + } +}); + +// src/server/migrate/illenium.ts +var illenium_exports = {}; +__export(illenium_exports, { + default: () => illenium_default +}); +var import_oxmysql5, delay2, migrate2, illenium_default; +var init_illenium = __esm({ + "src/server/migrate/illenium.ts"() { + import_oxmysql5 = __toESM(require_MySQL(), 1); + init_utils(); + init_setters(); + delay2 = (ms) => new Promise((res) => setTimeout(res, ms)); + migrate2 = async (src) => { + const response = await import_oxmysql5.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1"); + if (!response) + return; + for (const element of response) { + if (element.skin) { + await triggerClientCallback("bl_appearance:client:migration:setAppearance", src, { + type: "illenium", + data: JSON.parse(element.skin) + }); + await delay2(100); + const response2 = await triggerClientCallback("bl_appearance:client:getAppearance", src); + const playerSrc = parseInt(src); + await saveAppearance(playerSrc, element.citizenid, response2); + } + } + console.log("Converted " + response.length + " appearances"); + }; + illenium_default = migrate2; + } +}); + +// src/server/migrate/qb.ts +var qb_exports = {}; +__export(qb_exports, { + default: () => qb_default +}); +var import_oxmysql6, delay3, migrate3, qb_default; +var init_qb = __esm({ + "src/server/migrate/qb.ts"() { + import_oxmysql6 = __toESM(require_MySQL(), 1); + init_utils(); + init_setters(); + delay3 = (ms) => new Promise((res) => setTimeout(res, ms)); + migrate3 = async (src) => { + const response = await import_oxmysql6.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1"); + if (!response) + return; + for (const element of response) { + emitNet("qb-clothes:loadSkin", src, 0, element.model, element.skin); + await delay3(200); + const response2 = await triggerClientCallback("bl_appearance:client:getAppearance", src); + const playerSrc = parseInt(src); + await saveAppearance(playerSrc, element.citizenid, response2); + } + console.log("Converted " + response.length + " appearances"); + }; + qb_default = migrate3; + } +}); + +// src/server/appearance/outfits.ts +var import_oxmysql = __toESM(require_MySQL(), 1); +init_utils(); +async function getOutfits(src, frameworkId) { + const job = core.GetPlayer(src).job || { name: "unknown", grade: { name: "unknown" } }; + let response = await import_oxmysql.oxmysql.prepare( + "SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)", + [frameworkId, job.name, job.grade.name] + ); + if (!response) + return []; + if (!Array.isArray(response)) { + response = [response]; + } + const outfits = response.map( + (outfit) => { + return { + id: outfit.id, + label: outfit.label, + outfit: JSON.parse(outfit.outfit), + jobname: outfit.jobname + }; + } + ); + return outfits; +} +onClientCallback("bl_appearance:server:getOutfits", getOutfits); +exports("GetOutfits", getOutfits); +async function renameOutfit(src, data) { + const frameworkId = getFrameworkID(src); + const result = await import_oxmysql.oxmysql.update( + "UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?", + [data.label, frameworkId, data.id] + ); + return result; +} +onClientCallback("bl_appearance:server:renameOutfit", renameOutfit); +exports("RenameOutfit", renameOutfit); +async function deleteOutfit(src, id) { + const frameworkId = getFrameworkID(src); + const result = await import_oxmysql.oxmysql.update( + "DELETE FROM outfits WHERE player_id = ? AND id = ?", + [frameworkId, id] + ); + return result > 0; +} +onClientCallback("bl_appearance:server:deleteOutfit", deleteOutfit); +exports("DeleteOutfit", deleteOutfit); +async function saveOutfit(src, data) { + const frameworkId = getFrameworkID(src); + let jobname = null; + let jobrank = 0; + if (data.job) { + jobname = data.job.name; + jobrank = data.job.rank; + } + const id = await import_oxmysql.oxmysql.insert( + "INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)", + [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank] + ); + return id; +} +onClientCallback("bl_appearance:server:saveOutfit", saveOutfit); +exports("SaveOutfit", saveOutfit); +async function fetchOutfit(_, id) { + const response = await import_oxmysql.oxmysql.prepare( + "SELECT outfit FROM outfits WHERE id = ?", + [id] + ); + return JSON.parse(response); +} +onClientCallback("bl_appearance:server:fetchOutfit", fetchOutfit); +exports("FetchOutfit", fetchOutfit); +async function importOutfit(_, frameworkId, outfitId, outfitName) { + const result = await import_oxmysql.oxmysql.query( + "SELECT label, outfit FROM outfits WHERE id = ?", + [outfitId] + ); + if (!result || typeof result !== "object" || Object.keys(result).length === 0) { + return { success: false, message: "Outfit not found" }; + } + const newId = await import_oxmysql.oxmysql.insert( + "INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)", + [frameworkId, outfitName, result.outfit] + ); + return { success: true, newId }; +} +onClientCallback("bl_appearance:server:importOutfit", importOutfit); +exports("ImportOutfit", importOutfit); +var outfitItem = config.outfitItem; +if (!outfitItem) { + console.warn("bl_appearance: No outfit item configured, please set it in config.lua"); +} +onClientCallback("bl_appearance:server:itemOutfit", async (src, data) => { + const player = core.GetPlayer(src); + player.addItem(outfitItem, 1, data); +}); +core.RegisterUsableItem(outfitItem, async (source2, slot, metadata) => { + const player = getPlayerData(source2); + if (player?.removeItem(outfitItem, 1, slot)) + emitNet("bl_appearance:server:useOutfitItem", source2, metadata.outfit); +}); + +// src/server/init.ts +init_setters(); + +// src/server/appearance/getters.ts +var import_oxmysql3 = __toESM(require_MySQL(), 1); +init_utils(); +async function getSkin(src, frameworkId) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const response = await import_oxmysql3.oxmysql.prepare( + "SELECT skin FROM appearance WHERE id = ?", + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback("bl_appearance:server:getSkin", getSkin); +exports("GetSkin", function(id) { + return getSkin(null, id); +}); +async function getClothes(src, frameworkId) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const response = await import_oxmysql3.oxmysql.prepare( + "SELECT clothes FROM appearance WHERE id = ?", + [frameworkId] + ); + return JSON.parse(response); +} +onClientCallback("bl_appearance:server:getClothes", getClothes); +exports("GetClothes", function(id) { + return getClothes(null, id); +}); +async function getTattoos(src, frameworkId) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const response = await import_oxmysql3.oxmysql.prepare( + "SELECT tattoos FROM appearance WHERE id = ?", + [frameworkId] + ); + return JSON.parse(response) || []; +} +onClientCallback("bl_appearance:server:getTattoos", getTattoos); +exports("GetTattoos", function(id) { + return getTattoos(null, id); +}); +async function getAppearance(src, frameworkId) { + if (!frameworkId && !src) + return null; + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const response = await import_oxmysql3.oxmysql.single( + "SELECT * FROM appearance WHERE id = ? LIMIT 1", + [frameworkId] + ); + if (!response) + return null; + let appearance = { + ...JSON.parse(response.skin), + ...JSON.parse(response.clothes), + tattoos: JSON.parse(response.tattoos) + }; + appearance.id = response.id; + return appearance; +} +onClientCallback("bl_appearance:server:getAppearance", getAppearance); +exports("GetAppearance", function(id) { + return getAppearance(null, id); +}); + +// src/server/init.ts +var import_oxmysql7 = __toESM(require_MySQL(), 1); + +// import("./migrate/**/*.ts") in src/server/init.ts +var globImport_migrate_ts = __glob({ + "./migrate/esx.ts": () => Promise.resolve().then(() => (init_esx(), esx_exports)), + "./migrate/fivem.ts": () => Promise.resolve().then(() => (init_fivem(), fivem_exports)), + "./migrate/illenium.ts": () => Promise.resolve().then(() => (init_illenium(), illenium_exports)), + "./migrate/qb.ts": () => Promise.resolve().then(() => (init_qb(), qb_exports)) +}); + +// src/server/init.ts +import_oxmysql7.oxmysql.ready(async () => { + try { + await import_oxmysql7.oxmysql.query("SELECT 1 FROM appearance LIMIT 1"); + } catch (error) { + console.error("Error checking appearance table. Most likely the table does not exist: ", error); + } +}); +onNet("bl_appearance:server:setroutingbucket", () => { + SetPlayerRoutingBucket(source.toString(), source); +}); +onNet("bl_appearance:server:resetroutingbucket", () => { + SetPlayerRoutingBucket(source.toString(), 0); +}); +RegisterCommand("migrate", async (source2) => { + source2 = source2 !== 0 ? source2 : parseInt(getPlayers()[0]); + const bl_appearance = exports.bl_appearance; + const config2 = bl_appearance.config(); + const importedModule = await globImport_migrate_ts(`./migrate/${config2.previousClothing === "fivem-appearance" ? "fivem" : config2.previousClothing}.ts`); + importedModule.default(source2); +}, false); diff --git a/dist/shared/init.js b/dist/shared/init.js index d87d57d..deef225 100644 --- a/dist/shared/init.js +++ b/dist/shared/init.js @@ -1 +1,23 @@ -function m(s,r){let e=GetResourceMetadata(s,"version",0);if(e=e&&e?.match(/\d+\.\d+\.\d+/)?.[0]||"unknown",e!=r){let c=e.split("."),o=r.split("."),u=`^1${GetInvokingResource()||GetCurrentResourceName()} requires version '${r}' of '${s}' (current version: ${e})^0`;for(let n=0;n { target: 'esnext', logLevel: 'info', sourcemap: dev ? 'both' : false, - minify: !dev, + // minify: !dev, keepNames: dev, define: { __DEV_MODE__: `${dev}`, diff --git a/src/client/menu.ts b/src/client/menu.ts index 638a6ac..b7eaa42 100644 --- a/src/client/menu.ts +++ b/src/client/menu.ts @@ -55,7 +55,7 @@ export async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], tattoos = getTattooData() } - const blacklist = !isString ? getBlacklist(zone) : {} + const blacklist = getBlacklist(zone) if (creation) { const model = GetHashKey(getPlayerGenderModel()); @@ -100,7 +100,6 @@ export async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], resolvePromise = null; return true } - exports('OpenMenu', openMenu) RegisterCommand('appearance', async (_, args: string[]) => { @@ -114,13 +113,12 @@ RegisterCommand('appearance', async (_, args: string[]) => { }, true) -function getBlacklist(zone: TAppearanceZone) { - if (!zone) return {} - +function getBlacklist(zone: TAppearanceZone | string) { const {groupTypes, base} = config.blacklist() - if (!groupTypes) return {} - if (!base) return {} + if (typeof zone === 'string') return base + + if (!groupTypes) return base let blacklist = {...base} From 9f18135a32dd9bb21bedb871c37fec370d24f19e Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 13:14:09 +1000 Subject: [PATCH 22/30] ref!(change useZone event) --- dist/client/init.js | 2 +- src/client/init.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index e558f6d..1c45247 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1301,7 +1301,7 @@ exports("InitialCreation", async (cb) => { if (cb) cb(); }); -on("bl_sprites:client:useZone", (zone) => { +on("bl_appearance:client:useZone", (zone) => { openMenu(zone); }); onNet("bl_bridge:client:playerLoaded", async () => { diff --git a/src/client/init.ts b/src/client/init.ts index 1168f33..55b31cd 100644 --- a/src/client/init.ts +++ b/src/client/init.ts @@ -32,7 +32,7 @@ exports('InitialCreation', async (cb?: Function) => { if (cb) cb() }) -on('bl_sprites:client:useZone', (zone: TAppearanceZone) => { +on('bl_appearance:client:useZone', (zone: TAppearanceZone) => { openMenu(zone) }) From cf5eb69eb59b317b1d3b81db48febacafe19ff49 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 13:23:27 +1000 Subject: [PATCH 23/30] fix(tattoos): Fix tattoos resetting --- dist/client/init.js | 13 +++++++------ src/client/appearance/getters.ts | 13 ++++++++----- src/client/handlers.ts | 2 +- src/client/menu.ts | 4 ---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 1c45247..8300e2d 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -505,6 +505,7 @@ async function getAppearance(pedHandle) { const [drawables, drawTotal] = getDrawables(pedHandle); const [props, propTotal] = getProps(pedHandle); const model = GetEntityModel(pedHandle); + const tattoos = await getTattoos(); return { modelIndex: findModelIndex(model), model, @@ -517,7 +518,7 @@ async function getAppearance(pedHandle) { props, drawTotal, propTotal, - tattoos: [] + tattoos }; } exports("GetAppearance", getAppearance); @@ -602,10 +603,10 @@ function getTattooData() { } return tattooZones; } -exports("GetTattoos", async () => { - const tattoos = await triggerServerCallback("bl_appearance:server:getTattoos"); - return tattoos; -}); +async function getTattoos() { + return await triggerServerCallback("bl_appearance:server:getTattoos") || []; +} +exports("GetTattoos", getTattoos); onServerCallback("bl_appearance:client:migration:setAppearance", (data) => { if (data.type === "fivem") exports["fivem-appearance"].setPlayerAppearance(data.data); @@ -870,7 +871,7 @@ RegisterNuiCallback("appearance:save" /* save */, async (appearance, cb) => { resetToggles(appearance); await delay(100); const newAppearance = await getAppearance(ped); - newAppearance.tattoos = appearance.tattoos; + newAppearance.tattoos = appearance.tattoos || null; triggerServerCallback("bl_appearance:server:saveAppearance", getFrameworkID(), newAppearance); setPedTattoos(ped, newAppearance.tattoos); closeMenu(); diff --git a/src/client/appearance/getters.ts b/src/client/appearance/getters.ts index 30c042f..4b144bf 100644 --- a/src/client/appearance/getters.ts +++ b/src/client/appearance/getters.ts @@ -4,6 +4,7 @@ import FACE_FEATURES from "@data/face" import DRAWABLE_NAMES from "@data/drawables" import PROP_NAMES from "@data/props" import { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils'; +import { TTattoo } from "@typings/tattoos" export function findModelIndex(target: number) { const config = exports.bl_appearance @@ -166,6 +167,7 @@ export async function getAppearance(pedHandle: number): Promise { const [drawables, drawTotal] = getDrawables(pedHandle) const [props, propTotal] = getProps(pedHandle) const model = GetEntityModel(pedHandle) + const tattoos = await getTattoos() return { modelIndex: findModelIndex(model), @@ -179,7 +181,7 @@ export async function getAppearance(pedHandle: number): Promise { props: props, drawTotal: drawTotal, propTotal: propTotal, - tattoos: [] + tattoos: tattoos } } exports("GetAppearance", getAppearance) @@ -278,10 +280,11 @@ export function getTattooData() { return tattooZones } -exports('GetTattoos', async () => { - const tattoos = await triggerServerCallback('bl_appearance:server:getTattoos') - return tattoos -}); + +export async function getTattoos(): Promise { + return await triggerServerCallback('bl_appearance:server:getTattoos') || [] +} +exports('GetTattoos', getTattoos); //migration onServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => { diff --git a/src/client/handlers.ts b/src/client/handlers.ts index 68bc2a5..0338ab5 100644 --- a/src/client/handlers.ts +++ b/src/client/handlers.ts @@ -31,7 +31,7 @@ RegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) await delay(100); const newAppearance = await getAppearance(ped); - newAppearance.tattoos = appearance.tattoos; + newAppearance.tattoos = appearance.tattoos || null triggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance); setPedTattoos(ped, newAppearance.tattoos); diff --git a/src/client/menu.ts b/src/client/menu.ts index b7eaa42..fa04976 100644 --- a/src/client/menu.ts +++ b/src/client/menu.ts @@ -139,10 +139,6 @@ function getBlacklist(zone: TAppearanceZone | string) { skip = zone.gangs.includes(playerData.gang.name) } - // if (type == 'groups' && zone.groups) { - // skip = !zone.groups.includes(playerData.group.name) - // } - if (!skip) { const groupBlacklist = groups[group] blacklist = Object.assign({}, blacklist, groupBlacklist, { From 716037d2970d25aea9dccfdb706ea2b8a2b94b02 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 15:20:24 +1000 Subject: [PATCH 24/30] fix(headblend check) --- dist/client/init.js | 127 ++++++++++++++++++++----------- dist/client/init.js.map | 7 ++ dist/server/init.js | 50 ++++++++---- dist/server/init.js.map | 7 ++ dist/shared/init.js | 5 ++ dist/shared/init.js.map | 7 ++ src/client/appearance/setters.ts | 2 +- 7 files changed, 146 insertions(+), 59 deletions(-) create mode 100644 dist/client/init.js.map create mode 100644 dist/server/init.js.map create mode 100644 dist/shared/init.js.map diff --git a/dist/client/init.js b/dist/client/init.js index 8300e2d..429ee8e 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -1,16 +1,19 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); + // src/client/utils/index.ts var ped = 0; -var updatePed = (pedHandle) => { +var updatePed = /* @__PURE__ */ __name((pedHandle) => { ped = pedHandle; -}; -var sendNUIEvent = (action, data) => { +}, "updatePed"); +var sendNUIEvent = /* @__PURE__ */ __name((action, data) => { SendNUIMessage({ action, data }); -}; -var delay = (ms) => new Promise((res) => setTimeout(res, ms)); -var requestModel = async (model) => { +}, "sendNUIEvent"); +var delay = /* @__PURE__ */ __name((ms) => new Promise((res) => setTimeout(res, ms)), "delay"); +var requestModel = /* @__PURE__ */ __name(async (model) => { let modelHash = typeof model === "number" ? model : GetHashKey(model); if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) { console.warn(`attempted to load invalid model '${model}'`); @@ -19,7 +22,7 @@ var requestModel = async (model) => { if (HasModelLoaded(modelHash)) return modelHash; RequestModel(modelHash); - const waitForModelLoaded = () => { + const waitForModelLoaded = /* @__PURE__ */ __name(() => { return new Promise((resolve) => { const interval = setInterval(() => { if (HasModelLoaded(modelHash)) { @@ -28,10 +31,10 @@ var requestModel = async (model) => { } }, 100); }); - }; + }, "waitForModelLoaded"); await waitForModelLoaded(); return modelHash; -}; +}, "requestModel"); var resourceName = GetCurrentResourceName(); var eventTimers = {}; var activeEvents = {}; @@ -44,6 +47,7 @@ function eventTimer(eventName, delay2) { } return true; } +__name(eventTimer, "eventTimer"); onNet(`_bl_cb_${resourceName}`, (key, ...args) => { const resolve = activeEvents[key]; return resolve && resolve(...args); @@ -61,6 +65,7 @@ function triggerServerCallback(eventName, ...args) { activeEvents[key] = resolve; }); } +__name(triggerServerCallback, "triggerServerCallback"); function onServerCallback(eventName, cb) { onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => { let response; @@ -73,9 +78,10 @@ function onServerCallback(eventName, cb) { emitNet(`_bl_cb_${resource}`, key, response); }); } -var requestLocale = (resourceSetName) => { +__name(onServerCallback, "onServerCallback"); +var requestLocale = /* @__PURE__ */ __name((resourceSetName) => { return new Promise((resolve) => { - const checkResourceFile = () => { + const checkResourceFile = /* @__PURE__ */ __name(() => { if (RequestResourceFileSet(resourceSetName)) { const currentLan = exports.bl_appearance.config().locale; let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`); @@ -87,38 +93,42 @@ var requestLocale = (resourceSetName) => { } else { setTimeout(checkResourceFile, 100); } - }; + }, "checkResourceFile"); checkResourceFile(); }); -}; +}, "requestLocale"); var bl_bridge = exports.bl_bridge; -var getPlayerData = () => { +var getPlayerData = /* @__PURE__ */ __name(() => { return bl_bridge.core().getPlayerData(); -}; -var getFrameworkID = () => { +}, "getPlayerData"); +var getFrameworkID = /* @__PURE__ */ __name(() => { const id = getPlayerData().cid; return id; -}; -var getPlayerGenderModel = () => { +}, "getFrameworkID"); +var getPlayerGenderModel = /* @__PURE__ */ __name(() => { const gender = getPlayerData().gender; return gender === "male" ? "mp_m_freemode_01" : "mp_f_freemode_01"; -}; +}, "getPlayerGenderModel"); function Delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } +__name(Delay, "Delay"); function format(str) { if (!str.includes("'")) return str; return str.replace(/'/g, ""); } +__name(format, "format"); function getJobInfo() { const job = getPlayerData().job; return job ? { name: job.name, isBoss: job.isBoss } : null; } +__name(getJobInfo, "getJobInfo"); function isPedFreemodeModel(ped2) { const model = GetEntityModel(ped2); return model === GetHashKey("mp_m_freemode_01") || model === GetHashKey("mp_f_freemode_01"); } +__name(isPedFreemodeModel, "isPedFreemodeModel"); // src/client/camera.ts var WHOLE_BODY_MAX_DISTANCE = 2; @@ -139,19 +149,19 @@ var CameraBones = { legs: [16335, 46078], shoes: [14201, 52301] }; -var cos = (degrees) => { +var cos = /* @__PURE__ */ __name((degrees) => { return Math.cos(degrees * Math.PI / 180); -}; -var sin = (degrees) => { +}, "cos"); +var sin = /* @__PURE__ */ __name((degrees) => { return Math.sin(degrees * Math.PI / 180); -}; -var getAngles = () => { +}, "sin"); +var getAngles = /* @__PURE__ */ __name(() => { const x = (cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2 * camDistance; const y = (sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2 * camDistance; const z = sin(angleY) * camDistance; return [x, y, z]; -}; -var setCamPosition = (mouseX, mouseY) => { +}, "getAngles"); +var setCamPosition = /* @__PURE__ */ __name((mouseX, mouseY) => { if (!running || !targetCoords || changingCam) return; mouseX = mouseX ?? 0; @@ -171,8 +181,8 @@ var setCamPosition = (mouseX, mouseY) => { targetCoords.z + z ); PointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z); -}; -var moveCamera = async (coords, distance) => { +}, "setCamPosition"); +var moveCamera = /* @__PURE__ */ __name(async (coords, distance) => { const heading = GetEntityHeading(ped) + 94; distance = distance ?? 1; changingCam = true; @@ -204,14 +214,14 @@ var moveCamera = async (coords, distance) => { SetCamDofStrength(newcam, 0.3); useHiDof(newcam); DestroyCam(oldCam, true); -}; -var useHiDof = (currentcam) => { +}, "moveCamera"); +var useHiDof = /* @__PURE__ */ __name((currentcam) => { if (!(DoesCamExist(cam) && currentcam == cam)) return; SetUseHiDof(); setTimeout(useHiDof, 0); -}; -var startCamera = () => { +}, "useHiDof"); +var startCamera = /* @__PURE__ */ __name(() => { if (running) return; running = true; @@ -221,8 +231,8 @@ var startCamera = () => { SetCamCoord(cam, x, y, z); RenderScriptCams(true, true, 1e3, true, true); setCamera("whole", camDistance); -}; -var stopCamera = () => { +}, "startCamera"); +var stopCamera = /* @__PURE__ */ __name(() => { if (!running) return; running = false; @@ -230,8 +240,8 @@ var stopCamera = () => { DestroyCam(cam, true); cam = null; targetCoords = null; -}; -var setCamera = (type, distance = camDistance) => { +}, "stopCamera"); +var setCamera = /* @__PURE__ */ __name((type, distance = camDistance) => { const bone = CameraBones[type]; const isBoneArray = Array.isArray(bone); currentBone = type; @@ -266,7 +276,7 @@ var setCamera = (type, distance = camDistance) => { }, distance ); -}; +}, "setCamera"); RegisterNuiCallback("appearance:camMove" /* camMove */, (data, cb) => { setCamPosition(data.x, data.y); cb(1); @@ -382,12 +392,14 @@ function findModelIndex(target) { const models = config2.models(); return models.findIndex((model) => GetHashKey(model) === target); } +__name(findModelIndex, "findModelIndex"); function getHair(pedHandle) { return { color: GetPedHairColor(pedHandle), highlight: GetPedHairHighlightColor(pedHandle) }; } +__name(getHair, "getHair"); exports("GetHair", getHair); function getHeadBlendData(pedHandle) { const buffer = new ArrayBuffer(80); @@ -411,6 +423,7 @@ function getHeadBlendData(pedHandle) { hasParent: Boolean(hasParent) }; } +__name(getHeadBlendData, "getHeadBlendData"); exports("GetHeadBlend", getHeadBlendData); function getHeadOverlay(pedHandle) { let totals = {}; @@ -439,6 +452,7 @@ function getHeadOverlay(pedHandle) { } return [headData, totals]; } +__name(getHeadOverlay, "getHeadOverlay"); exports("GetHeadOverlay", getHeadOverlay); function getHeadStructure(pedHandle) { const pedModel = GetEntityModel(pedHandle); @@ -455,6 +469,7 @@ function getHeadStructure(pedHandle) { } return faceStruct; } +__name(getHeadStructure, "getHeadStructure"); exports("GetHeadStructure", getHeadStructure); function getDrawables(pedHandle) { let drawables = {}; @@ -477,6 +492,7 @@ function getDrawables(pedHandle) { } return [drawables, totalDrawables]; } +__name(getDrawables, "getDrawables"); exports("GetDrawables", getDrawables); function getProps(pedHandle) { let props = {}; @@ -499,6 +515,7 @@ function getProps(pedHandle) { } return [props, totalProps]; } +__name(getProps, "getProps"); exports("GetProps", getProps); async function getAppearance(pedHandle) { const [headData, totals] = getHeadOverlay(pedHandle); @@ -521,6 +538,7 @@ async function getAppearance(pedHandle) { tattoos }; } +__name(getAppearance, "getAppearance"); exports("GetAppearance", getAppearance); onServerCallback("bl_appearance:client:getAppearance", () => { updatePed(PlayerPedId()); @@ -536,6 +554,7 @@ function getPedClothes(pedHandle) { props }; } +__name(getPedClothes, "getPedClothes"); exports("GetPedClothes", getPedClothes); function getPedSkin(pedHandle) { return { @@ -545,6 +564,7 @@ function getPedSkin(pedHandle) { model: GetEntityModel(pedHandle) }; } +__name(getPedSkin, "getPedSkin"); exports("GetPedSkin", getPedSkin); function getTattooData() { let tattooZones = []; @@ -603,9 +623,11 @@ function getTattooData() { } return tattooZones; } +__name(getTattooData, "getTattooData"); async function getTattoos() { return await triggerServerCallback("bl_appearance:server:getTattoos") || []; } +__name(getTattoos, "getTattoos"); exports("GetTattoos", getTattoos); onServerCallback("bl_appearance:client:migration:setAppearance", (data) => { if (data.type === "fivem") @@ -673,6 +695,7 @@ function setDrawable(pedHandle, data) { SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0); return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value); } +__name(setDrawable, "setDrawable"); exports("SetDrawable", setDrawable); function setProp(pedHandle, data) { if (data.value === -1) { @@ -682,9 +705,10 @@ function setProp(pedHandle, data) { SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false); return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value); } +__name(setProp, "setProp"); exports("SetProp", setProp); var defMaleHash = GetHashKey("mp_m_freemode_01"); -var setModel = async (pedHandle, data) => { +var setModel = /* @__PURE__ */ __name(async (pedHandle, data) => { if (data == null || data === void 0) return pedHandle; let model; @@ -711,7 +735,7 @@ var setModel = async (pedHandle, data) => { if (!isPedFreemodeModel(pedHandle)) return pedHandle; const isJustModel = typeof data === "string" || typeof data === "number"; - const hasHeadBlend = !isJustModel && Object.keys(data.headBlend).length > 0; + const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0; if (hasHeadBlend) { setHeadBlend(pedHandle, data.headBlend); SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); @@ -723,13 +747,14 @@ var setModel = async (pedHandle, data) => { } } return pedHandle; -}; +}, "setModel"); exports("SetModel", setModel); function SetFaceFeature(pedHandle, data) { SetPedFaceFeature(pedHandle, data.index, data.value + 0); } +__name(SetFaceFeature, "SetFaceFeature"); exports("SetFaceFeature", SetFaceFeature); -var isPositive = (val) => val >= 0 ? val : 0; +var isPositive = /* @__PURE__ */ __name((val) => val >= 0 ? val : 0, "isPositive"); function setHeadBlend(pedHandle, data) { pedHandle = pedHandle || ped; if (!isPedFreemodeModel(pedHandle)) @@ -746,6 +771,7 @@ function setHeadBlend(pedHandle, data) { const hasParent = data.hasParent; SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent); } +__name(setHeadBlend, "setHeadBlend"); exports("SetHeadBlend", setHeadBlend); function setHeadOverlay(pedHandle, data) { const index = data.index; @@ -761,6 +787,7 @@ function setHeadOverlay(pedHandle, data) { SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0); SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor); } +__name(setHeadOverlay, "setHeadOverlay"); exports("SetHeadOverlay", setHeadOverlay); function resetToggles(data) { const drawables = data.drawables; @@ -781,6 +808,7 @@ function resetToggles(data) { } } } +__name(resetToggles, "resetToggles"); exports("SetPedClothes", setPedClothes); function setPedClothes(pedHandle, data) { const drawables = data.drawables; @@ -799,8 +827,9 @@ function setPedClothes(pedHandle, data) { setHeadOverlay(pedHandle, overlay); } } +__name(setPedClothes, "setPedClothes"); exports("SetPedClothes", setPedClothes); -var setPedSkin = async (pedHandle, data) => { +var setPedSkin = /* @__PURE__ */ __name(async (pedHandle, data) => { if (!data) return; pedHandle = await setModel(pedHandle, data); @@ -813,7 +842,7 @@ var setPedSkin = async (pedHandle, data) => { const value = headStructure[feature]; SetFaceFeature(pedHandle, value); } -}; +}, "setPedSkin"); exports("SetPedSkin", setPedSkin); function setPedTattoos(pedHandle, data) { if (!data) @@ -828,6 +857,7 @@ function setPedTattoos(pedHandle, data) { } } } +__name(setPedTattoos, "setPedTattoos"); exports("SetPedTattoos", setPedTattoos); function setPedHairColors(pedHandle, data) { if (!data) @@ -836,6 +866,7 @@ function setPedHairColors(pedHandle, data) { const highlight = data.highlight; SetPedHairColor(pedHandle, color, highlight); } +__name(setPedHairColors, "setPedHairColors"); exports("SetPedHairColors", setPedHairColors); async function setPedAppearance(pedHandle, data) { if (IsPedAPlayer(pedHandle)) { @@ -847,6 +878,7 @@ async function setPedAppearance(pedHandle, data) { setPedHairColors(pedHandle, data.hairColor); setPedTattoos(pedHandle, data.tattoos); } +__name(setPedAppearance, "setPedAppearance"); exports("SetPedAppearance", setPedAppearance); async function setPlayerPedAppearance(data) { updatePed(PlayerPedId()); @@ -856,6 +888,7 @@ async function setPlayerPedAppearance(data) { setPedHairColors(ped, data.hairColor); setPedTattoos(ped, data.tattoos); } +__name(setPlayerPedAppearance, "setPlayerPedAppearance"); exports("SetPedClothes", setPedClothes); exports("SetPedSkin", setPedSkin); exports("SetPedTattoos", setPedTattoos); @@ -1072,6 +1105,7 @@ async function openMenu(zone, creation = false) { resolvePromise = null; return true; } +__name(openMenu, "openMenu"); exports("OpenMenu", openMenu); RegisterCommand("appearance", async (_, args) => { const type = args[0]; @@ -1110,6 +1144,7 @@ function getBlacklist(zone) { } return blacklist; } +__name(getBlacklist, "getBlacklist"); function closeMenu() { SetPedArmour(ped, armour); stopCamera(); @@ -1121,6 +1156,7 @@ function closeMenu() { } open = false; } +__name(closeMenu, "closeMenu"); // src/client/bridge/qb.ts function QBBridge() { @@ -1134,6 +1170,7 @@ function QBBridge() { openMenu({ type: "outfits", coords: [0, 0, 0, 0] }); }); } +__name(QBBridge, "QBBridge"); // src/client/bridge/esx.ts function ESXBridge() { @@ -1164,6 +1201,7 @@ function ESXBridge() { exports.bl_appearance.InitialCreation(onSubmit); }); } +__name(ESXBridge, "ESXBridge"); // src/client/compat/illenium.ts function exportHandler(name, cb) { @@ -1171,6 +1209,7 @@ function exportHandler(name, cb) { setCB(cb); }); } +__name(exportHandler, "exportHandler"); function illeniumCompat() { exportHandler("startPlayerCustomization", () => { exports.bl_appearance.InitialCreation(); @@ -1279,6 +1318,7 @@ function illeniumCompat() { setPedTattoos(ped2, tattoos); }); } +__name(illeniumCompat, "illeniumCompat"); // src/client/init.ts exports("SetPlayerPedAppearance", async (appearance) => { @@ -1346,3 +1386,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKGRhdGEudmFsdWUgPT09IC0xKSB7XHJcbiAgICAgICAgQ2xlYXJQZWRQcm9wKHBlZEhhbmRsZSwgZGF0YS5pbmRleClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRQcm9wSW5kZXgocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIGZhbHNlKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkUHJvcFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXRQcm9wJywgc2V0UHJvcCk7XHJcblxyXG5jb25zdCBkZWZNYWxlSGFzaCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0TW9kZWwgPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlIHwgVFNraW4gfCBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmUnLCBTZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIHBlZEhhbmRsZSA9IHBlZEhhbmRsZSB8fCBwZWRcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBzaGFwZUZpcnN0ID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlRmlyc3QpXHJcbiAgICBjb25zdCBzaGFwZVNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZVNlY29uZClcclxuICAgIGNvbnN0IHNoYXBlVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVUaGlyZClcclxuICAgIGNvbnN0IHNraW5GaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5za2luRmlyc3QpXHJcbiAgICBjb25zdCBza2luU2Vjb25kID0gaXNQb3NpdGl2ZShkYXRhLnNraW5TZWNvbmQpXHJcbiAgICBjb25zdCBza2luVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpblRoaXJkKVxyXG4gICAgY29uc3Qgc2hhcGVNaXggPSBkYXRhLnNoYXBlTWl4ICsgMC4wXHJcbiAgICBjb25zdCBza2luTWl4ID0gZGF0YS5za2luTWl4ICsgMC4wXHJcbiAgICBjb25zdCB0aGlyZE1peCA9IGRhdGEudGhpcmRNaXggKyAwLjBcclxuICAgIGNvbnN0IGhhc1BhcmVudCA9IGRhdGEuaGFzUGFyZW50XHJcblxyXG4gICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIHNoYXBlRmlyc3QsIHNoYXBlU2Vjb25kLCBzaGFwZVRoaXJkLCBza2luRmlyc3QsIHNraW5TZWNvbmQsIHNraW5UaGlyZCwgc2hhcGVNaXgsIHNraW5NaXgsIHRoaXJkTWl4LCBoYXNQYXJlbnQpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZEJsZW5kJywgc2V0SGVhZEJsZW5kKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAxMykge1xyXG4gICAgICAgIFNldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSwgZGF0YS52YWx1ZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGEub3ZlcmxheVZhbHVlXHJcblxyXG4gICAgLyogSGFpciBjb2xvciBkb2VzIG5vdCBoYXZlIGFuIGluZGV4LCBvbmx5IGFuIElEIHNvIHdlJ2xsIGNoZWNrIGZvciB0aGF0ICovXHJcbiAgICBpZiAoZGF0YS5pZCA9PT0gJ2hhaXJDb2xvcicpIHtcclxuICAgICAgICBTZXRQZWRIYWlyVGludChwZWRIYW5kbGUsIGRhdGEuaGFpckNvbG9yLCBkYXRhLmhhaXJIaWdobGlnaHQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZEhlYWRPdmVybGF5KHBlZEhhbmRsZSwgaW5kZXgsIHZhbHVlLCBkYXRhLm92ZXJsYXlPcGFjaXR5ICsgMC4wKVxyXG4gICAgU2V0UGVkSGVhZE92ZXJsYXlDb2xvcihwZWRIYW5kbGUsIGluZGV4LCAxLCBkYXRhLmZpcnN0Q29sb3IsIGRhdGEuc2Vjb25kQ29sb3IpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZE92ZXJsYXknLCBzZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VG9nZ2xlcyhkYXRhKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcblxyXG4gICAgZm9yIChjb25zdCBbdG9nZ2xlSXRlbSwgdG9nZ2xlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoVE9HR0xFX0lOREVYRVMpKSB7XHJcbiAgICAgICAgY29uc3QgdG9nZ2xlVHlwZSA9IHRvZ2dsZURhdGEudHlwZVxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdG9nZ2xlRGF0YS5pbmRleFxyXG5cclxuICAgICAgICBpZiAodG9nZ2xlVHlwZSA9PT0gXCJkcmF3YWJsZVwiICYmIGRyYXdhYmxlc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudERyYXdhYmxlICE9PSBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRvZ2dsZVR5cGUgPT09IFwicHJvcFwiICYmIHByb3BzW3RvZ2dsZUl0ZW1dKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcCAhPT0gcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZFByb3BJbmRleChwZWQsIGluZGV4LCBwcm9wc1t0b2dnbGVJdGVtXS52YWx1ZSwgMCwgZmFsc2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZENsb3RoZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRDbG90aGVzKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIFNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuXHJcbiAgICBjb25zdCBjb2xvciA9IGRhdGEuY29sb3JcclxuICAgIGNvbnN0IGhpZ2hsaWdodCA9IGRhdGEuaGlnaGxpZ2h0XHJcbiAgICBTZXRQZWRIYWlyQ29sb3IocGVkSGFuZGxlLCBjb2xvciwgaGlnaGxpZ2h0KVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEhhaXJDb2xvcnMnLCBzZXRQZWRIYWlyQ29sb3JzKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQZWRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIC8vIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgYWZ0ZXIgc2NyaXB0cyBzZXQgdGhlaXIgb3duIG1vZGVsLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGVkIGJlZm9yZSB3ZSBzZXQgdGhlIGFwcGVhcmFuY2VcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWQsIGRhdGEpXHJcbiAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGVkIGFnYWluIGFmdGVyIHNldHRpbmcgdGhlIHNraW4gYmVjYXVzZSBTZXRQbGF5ZXJNb2RlbCB3aWxsIHNldCBhIG5ldyBQbGF5ZXJQZWRJZFxyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZCwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuXHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKVxyXG5leHBvcnRzKCdTZXRQZWRTa2luJywgc2V0UGVkU2tpbilcclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpXHJcbmV4cG9ydHMoJ1NldFBlZEhhaXJDb2xvcnMnLCBzZXRQZWRIYWlyQ29sb3JzKSIsICJpbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcbmltcG9ydCB7XHJcblx0cmVzZXRUb2dnbGVzLFxyXG5cdHNldERyYXdhYmxlLFxyXG5cdFNldEZhY2VGZWF0dXJlLFxyXG5cdHNldEhlYWRCbGVuZCxcclxuXHRzZXRIZWFkT3ZlcmxheSxcclxuXHRzZXRNb2RlbCxcclxuXHRzZXRQZWRDbG90aGVzLFxyXG5cdHNldFBlZFRhdHRvb3MsXHJcblx0c2V0UGxheWVyUGVkQXBwZWFyYW5jZSxcclxuXHRzZXRQcm9wLFxyXG59IGZyb20gJy4vYXBwZWFyYW5jZS9zZXR0ZXJzJztcclxuaW1wb3J0IHsgY2xvc2VNZW51IH0gZnJvbSAnLi9tZW51JztcclxuaW1wb3J0IHsgVEFwcGVhcmFuY2UsIFRUb2dnbGVEYXRhLCBUVmFsdWUgfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZGVsYXksIGdldEZyYW1ld29ya0lELCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIHBlZCwgdXBkYXRlUGVkIH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0VGF0dG9vRGF0YSB9IGZyb20gJy4vYXBwZWFyYW5jZS9nZXR0ZXJzJztcclxuaW1wb3J0IFRPR0dMRV9JTkRFWEVTIGZyb20gJ0BkYXRhL3RvZ2dsZXMnO1xyXG5pbXBvcnQgeyBUT3V0Zml0RGF0YSB9IGZyb20gJ0B0eXBpbmdzL291dGZpdHMnO1xyXG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSAnQHR5cGluZ3MvdGF0dG9vcyc7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FuY2VsLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSk7XHJcblx0Y2xvc2VNZW51KCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmUsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0cmVzZXRUb2dnbGVzKGFwcGVhcmFuY2UpO1xyXG5cclxuXHRhd2FpdCBkZWxheSgxMDApO1xyXG5cclxuXHRjb25zdCBuZXdBcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWQpO1xyXG5cdG5ld0FwcGVhcmFuY2UudGF0dG9vcyA9IGFwcGVhcmFuY2UudGF0dG9vcyB8fCBudWxsXHJcblx0dHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlQXBwZWFyYW5jZScsIGdldEZyYW1ld29ya0lEKCksIG5ld0FwcGVhcmFuY2UpO1xyXG5cclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgbmV3QXBwZWFyYW5jZS50YXR0b29zKTtcclxuXHJcblx0Y2xvc2VNZW51KCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldE1vZGVsLCBhc3luYyAobW9kZWw6IHN0cmluZywgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgaGFzaCA9IEdldEhhc2hLZXkobW9kZWwpO1xyXG5cdGlmICghSXNNb2RlbEluQ2RpbWFnZShoYXNoKSB8fCAhSXNNb2RlbFZhbGlkKGhhc2gpKSB7XHJcblx0XHRyZXR1cm4gY2IoMCk7XHJcblx0fVxyXG5cclxuXHJcblx0Y29uc3QgbmV3UGVkID0gYXdhaXQgc2V0TW9kZWwocGVkLCBoYXNoKTtcclxuXHJcbiAgICB1cGRhdGVQZWQobmV3UGVkKVxyXG5cclxuXHRjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWQpO1xyXG5cclxuXHRhcHBlYXJhbmNlLnRhdHRvb3MgPSBbXTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIFtdKTtcclxuXHJcblx0Y2IoYXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmdldE1vZGVsVGF0dG9vcywgYXN5bmMgKF86IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgdGF0dG9vcyA9IGdldFRhdHRvb0RhdGEoKTtcclxuXHJcblx0Y2IodGF0dG9vcyk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRTdHJ1Y3R1cmUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdFNldEZhY2VGZWF0dXJlKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRPdmVybGF5LCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkT3ZlcmxheShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkQmxlbmQsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldEhlYWRCbGVuZChwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRUYXR0b29zLCBhc3luYyAoZGF0YTogVFRhdHRvb1tdLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldFByb3AsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0UHJvcChwZWQsIGRhdGEpO1xyXG5cdGNiKHRleHR1cmUpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXREcmF3YWJsZSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0bGV0IHRleHR1cmUgPSBzZXREcmF3YWJsZShwZWQsIGRhdGEpO1xyXG5cdGNiKHRleHR1cmUpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS50b2dnbGVJdGVtLCBhc3luYyAoZGF0YTogVFRvZ2dsZURhdGEsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGl0ZW0gPSBUT0dHTEVfSU5ERVhFU1tkYXRhLml0ZW1dO1xyXG5cdGlmICghaXRlbSkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0Y29uc3QgY3VycmVudCA9IGRhdGEuZGF0YTtcclxuXHRjb25zdCB0eXBlID0gaXRlbS50eXBlO1xyXG5cdGNvbnN0IGluZGV4ID0gaXRlbS5pbmRleDtcclxuXHRjb25zdCBob29rID0gaXRlbS5ob29rO1xyXG5cdGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ob29rRGF0YTtcclxuXHJcblx0aWYgKCFjdXJyZW50KSByZXR1cm4gY2IoZmFsc2UpO1xyXG5cclxuXHRpZiAodHlwZSA9PT0gJ3Byb3AnKSB7XHJcblx0XHRjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KTtcclxuXHJcblx0XHRpZiAoY3VycmVudFByb3AgPT09IC0xKSB7XHJcblx0XHRcdHNldFByb3AocGVkLCBjdXJyZW50KTtcclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRDbGVhclBlZFByb3AocGVkLCBpbmRleCk7XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICh0eXBlID09PSAnZHJhd2FibGUnKSB7XHJcblx0XHRjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KTtcclxuXHJcblx0XHRpZiAoY3VycmVudC52YWx1ZSA9PT0gaXRlbS5vZmYpIHtcclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGN1cnJlbnREcmF3YWJsZSkge1xyXG5cdFx0XHRTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgaXRlbS5vZmYsIDAsIDApO1xyXG5cdFx0XHRpZiAoaG9vaykge1xyXG5cdFx0XHRcdGZvcihsZXQgaT0wOyBpIDwgaG9vay5kcmF3YWJsZXM/Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBob29rSXRlbSA9IGhvb2suZHJhd2FibGVzW2ldO1xyXG5cdFx0XHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaG9va0l0ZW0uY29tcG9uZW50LCBob29rSXRlbS52YXJpYW50LCBob29rSXRlbS50ZXh0dXJlLCAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Y2IodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNldERyYXdhYmxlKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGZvcihsZXQgaT0wOyBpIDwgaG9va0RhdGE/Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0c2V0RHJhd2FibGUocGVkLCBob29rRGF0YVtpXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbik7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2F2ZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZGVsZXRlT3V0Zml0LCBhc3luYyAoe2lkfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUucmVuYW1lT3V0Zml0LCBhc3luYyAoZGF0YTogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnVzZU91dGZpdCwgYXN5bmMgKG91dGZpdDogVE91dGZpdERhdGEsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldFBlZENsb3RoZXMocGVkLCBvdXRmaXQpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5pbXBvcnRPdXRmaXQsIGFzeW5jICh7IGlkLCBvdXRmaXROYW1lIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGZyYW1ld29ya2RJZCA9IGdldEZyYW1ld29ya0lEKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppbXBvcnRPdXRmaXQnLCBmcmFtZXdvcmtkSWQsIGlkLCBvdXRmaXROYW1lKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5mZXRjaE91dGZpdCwgYXN5bmMgKHsgaWQgfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGlkKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5pdGVtT3V0Zml0LCBhc3luYyAoZGF0YToge291dGZpdDogVE91dGZpdERhdGEsIGxhYmVsOiBzdHJpbmd9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOml0ZW1PdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjp1c2VPdXRmaUl0ZW0nLCAob3V0Zml0OiBUT3V0Zml0RGF0YSkgPT4ge1xyXG5cdHNldFBlZENsb3RoZXMocGVkLCBvdXRmaXQpO1xyXG59KSIsICJpbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgcmVxdWVzdExvY2FsZSwgc2VuZE5VSUV2ZW50LCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIHVwZGF0ZVBlZCwgcGVkLCBnZXRQbGF5ZXJEYXRhLCBnZXRKb2JJbmZvLCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBzdGFydENhbWVyYSwgc3RvcENhbWVyYSB9IGZyb20gXCIuL2NhbWVyYVwiXHJcbmltcG9ydCB0eXBlIHsgVEFwcGVhcmFuY2Vab25lLCBUTWVudVR5cGVzIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxyXG5pbXBvcnQgeyBPdXRmaXQgfSBmcm9tIFwiQHR5cGluZ3Mvb3V0Zml0c1wiXHJcbmltcG9ydCB7IFNlbmQgfSBmcm9tIFwiQGV2ZW50c1wiXHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL2dldHRlcnNcIlxyXG5pbXBvcnQgXCIuL2hhbmRsZXJzXCJcclxuaW1wb3J0IHsgc2V0TW9kZWwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5cclxuY29uc3QgY29uZmlnID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlXHJcbmxldCBhcm1vdXIgPSAwXHJcbmxldCBvcGVuID0gZmFsc2VcclxuXHJcbmxldCByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbmxldCBwcm9taXNlID0gbnVsbDtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuTWVudSh6b25lOiBUQXBwZWFyYW5jZVpvbmUgfCBUQXBwZWFyYW5jZVpvbmVbJ3R5cGUnXSwgY3JlYXRpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHpvbmUgPT09IG51bGwgfHwgb3Blbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGVkSGFuZGxlID0gUGxheWVyUGVkSWQoKVxyXG4gICAgY29uc3QgY29uZmlnTWVudXMgPSBjb25maWcubWVudXMoKVxyXG5cclxuICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnXHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGlzU3RyaW5nID8gem9uZSA6IHpvbmUudHlwZVxyXG5cclxuICAgIGNvbnN0IG1lbnUgPSBjb25maWdNZW51c1t0eXBlXVxyXG4gICAgaWYgKCFtZW51KSByZXR1cm5cclxuXHJcbiAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG5cclxuICAgIGNvbnN0IGZyYW1ld29ya2RJZCA9IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IHRhYnMgPSBtZW51LnRhYnNcclxuICAgIGxldCBhbGxvd0V4aXQgPSBjcmVhdGlvbiA/IGZhbHNlIDogbWVudS5hbGxvd0V4aXRcclxuXHJcbiAgICBhcm1vdXIgPSBHZXRQZWRBcm1vdXIocGVkSGFuZGxlKVxyXG5cclxuICAgIGxldCBvdXRmaXRzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNPdXRmaXRUYWIgPSB0YWJzLmluY2x1ZGVzKCdvdXRmaXRzJylcclxuICAgIGlmIChoYXNPdXRmaXRUYWIpIG91dGZpdHMgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8T3V0Zml0W10+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRPdXRmaXRzJywgZnJhbWV3b3JrZElkKSBhcyBPdXRmaXRbXVxyXG5cclxuICAgIGxldCBtb2RlbHMgPSBbXVxyXG5cclxuICAgIGNvbnN0IGhhc0hlcml0YWdlVGFiID0gdGFicy5pbmNsdWRlcygnaGVyaXRhZ2UnKVxyXG4gICAgaWYgKGhhc0hlcml0YWdlVGFiKSB7XHJcbiAgICAgICAgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzVGF0dG9vVGFiID0gdGFicy5pbmNsdWRlcygndGF0dG9vcycpXHJcbiAgICBsZXQgdGF0dG9vc1xyXG4gICAgaWYgKGhhc1RhdHRvb1RhYikge1xyXG4gICAgICAgIHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBibGFja2xpc3QgPSBnZXRCbGFja2xpc3Qoem9uZSlcclxuXHJcbiAgICBpZiAoY3JlYXRpb24pIHtcclxuICAgICAgICBjb25zdCBtb2RlbCA9IEdldEhhc2hLZXkoZ2V0UGxheWVyR2VuZGVyTW9kZWwoKSk7XHJcbiAgICAgICAgcGVkSGFuZGxlID0gYXdhaXQgc2V0TW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2V0cm91dGluZ2J1Y2tldCcpXHJcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkSGFuZGxlKVxyXG5cclxuICAgIHN0YXJ0Q2FtZXJhKClcclxuXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC5kYXRhLCB7XHJcbiAgICAgICAgdGFicyxcclxuICAgICAgICBhcHBlYXJhbmNlLFxyXG4gICAgICAgIGJsYWNrbGlzdCxcclxuICAgICAgICB0YXR0b29zLFxyXG4gICAgICAgIG91dGZpdHMsXHJcbiAgICAgICAgbW9kZWxzLFxyXG4gICAgICAgIGFsbG93RXhpdCxcclxuICAgICAgICBqb2I6IGdldEpvYkluZm8oKSxcclxuICAgICAgICBsb2NhbGU6IGF3YWl0IHJlcXVlc3RMb2NhbGUoJ2xvY2FsZScpXHJcbiAgICB9KVxyXG5cclxuICAgIFNldE51aUZvY3VzKHRydWUsIHRydWUpXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC52aXNpYmxlLCB0cnVlKVxyXG5cclxuICAgIG9wZW4gPSB0cnVlXHJcblxyXG4gICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmhpZGVIdWQodHJ1ZSlcclxuXHJcbiAgICBpZiAocHJvbWlzZSkge1xyXG4gICAgICAgIGF3YWl0IHByb21pc2VcclxuICAgICAgICBlbWl0TmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZXNldHJvdXRpbmdidWNrZXQnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9taXNlID0gbnVsbDtcclxuICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcclxuICAgIHJldHVybiB0cnVlXHJcbn1cclxuZXhwb3J0cygnT3Blbk1lbnUnLCBvcGVuTWVudSlcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgnYXBwZWFyYW5jZScsIGFzeW5jIChfLCBhcmdzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgY29uc3QgdHlwZSA9IGFyZ3NbMF1cclxuICAgIGlmICghdHlwZSkge1xyXG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCB6b25lID0gdHlwZS50b0xvd2VyQ2FzZSgpIGFzIFRNZW51VHlwZXNcclxuICAgICAgICBvcGVuTWVudSh6b25lKVxyXG4gICAgfVxyXG59LCB0cnVlKVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdldEJsYWNrbGlzdCh6b25lOiBUQXBwZWFyYW5jZVpvbmUgfCBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHtncm91cFR5cGVzLCBiYXNlfSA9IGNvbmZpZy5ibGFja2xpc3QoKVxyXG5cclxuICAgIGlmICh0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZycpIHJldHVybiBiYXNlXHJcblxyXG4gICAgaWYgKCFncm91cFR5cGVzKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGxldCBibGFja2xpc3QgPSB7Li4uYmFzZX1cclxuXHJcbiAgICBjb25zdCBwbGF5ZXJEYXRhID0gZ2V0UGxheWVyRGF0YSgpXHJcblxyXG5cclxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBncm91cFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBUeXBlc1t0eXBlXVxyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gZ3JvdXBzKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnam9icycgJiYgem9uZS5qb2JzKSB7XHJcbiAgICAgICAgICAgICAgICBza2lwID0gem9uZS5qb2JzLmluY2x1ZGVzKHBsYXllckRhdGEuam9iLm5hbWUpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09ICdnYW5ncycgJiYgem9uZS5nYW5ncykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuZ2FuZ3MuaW5jbHVkZXMocGxheWVyRGF0YS5nYW5nLm5hbWUpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2tpcCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBCbGFja2xpc3QgPSBncm91cHNbZ3JvdXBdXHJcbiAgICAgICAgICAgICAgICBibGFja2xpc3QgPSBPYmplY3QuYXNzaWduKHt9LCBibGFja2xpc3QsIGdyb3VwQmxhY2tsaXN0LCB7XHJcbiAgICAgICAgICAgICAgICAgIGRyYXdhYmxlczogT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LmRyYXdhYmxlcywgZ3JvdXBCbGFja2xpc3QuZHJhd2FibGVzKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmxhY2tsaXN0XHJcblxyXG4gICAgLy8gcmV0dXJuIGJsYWNrbGlzdFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VNZW51KCkge1xyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3VyKVxyXG5cclxuICAgIHN0b3BDYW1lcmEoKVxyXG4gICAgU2V0TnVpRm9jdXMoZmFsc2UsIGZhbHNlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgZmFsc2UpXHJcblxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKGZhbHNlKVxyXG5cclxuICAgIGlmIChyZXNvbHZlUHJvbWlzZSkge1xyXG4gICAgICAgIHJlc29sdmVQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBvcGVuID0gZmFsc2VcclxufVxyXG4iLCAiXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcbmltcG9ydCB7IHNldFBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4uL21lbnVcIlxuXG5leHBvcnQgZnVuY3Rpb24gUUJCcmlkZ2UoKSB7XG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpsb2FkUGxheWVyQ2xvdGhpbmcnLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pXG5cbiAgICBvbk5ldCgncWItY2xvdGhlczpjbGllbnQ6Q3JlYXRlRmlyc3RDaGFyYWN0ZXInLCAoKSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pXG5cbiAgICBvbk5ldCgncWItY2xvdGhpbmc6Y2xpZW50Om9wZW5PdXRmaXRNZW51JywgKCkgPT4ge1xuICAgICAgICBvcGVuTWVudSh7IHR5cGU6IFwib3V0Zml0c1wiLCBjb29yZHM6IFswLCAwLCAwLCAwXSB9KSAgXG4gICAgfSlcbn0iLCAiXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcbmltcG9ydCB7IHNldFBlZEFwcGVhcmFuY2UsIHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcbmltcG9ydCB7IGdldEZyYW1ld29ya0lELCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2sgfSBmcm9tIFwiQHV0aWxzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIEVTWEJyaWRnZSgpIHtcbiAgICBsZXQgZmlyc3RTcGF3biA9IGZhbHNlXG5cbiAgICBvbihcImVzeF9za2luOnJlc2V0Rmlyc3RTcGF3blwiLCAoKSA9PiB7XG4gICAgICAgIGZpcnN0U3Bhd24gPSB0cnVlXG4gICAgfSk7XG5cbiAgICBvbihcImVzeF9za2luOnBsYXllclJlZ2lzdGVyZWRcIiwgKCkgPT4ge1xuICAgICAgICBpZihmaXJzdFNwYXduKVxuICAgICAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSk7XG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6bG9hZFNraW4yJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWFwcGVhcmFuY2UubW9kZWwpIGFwcGVhcmFuY2UubW9kZWwgPSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKTtcbiAgICAgICAgYXdhaXQgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6Z2V0U2tpbicsIGFzeW5jIChjYjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxuICAgICAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxuICAgICAgICBjYihhcHBlYXJhbmNlKVxuICAgIH0pXG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6bG9hZFNraW4nLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBhbnkpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxuICAgICAgICBpZiAoY2IpIGNiKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ2VzeF9za2luOm9wZW5TYXZlYWJsZU1lbnUnLCBhc3luYyAob25TdWJtaXQ6IGFueSkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKG9uU3VibWl0KVxuICAgIH0pXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldERyYXdhYmxlcywgZ2V0UHJvcHMgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCI7XG5pbXBvcnQgeyBzZXREcmF3YWJsZSwgc2V0TW9kZWwsIHNldFBlZEFwcGVhcmFuY2UsIHNldFBlZFRhdHRvb3MsIHNldFByb3AgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCI7XG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSBcIkB0eXBpbmdzL3RhdHRvb3NcIjtcbmltcG9ydCB7IHBlZCwgdXBkYXRlUGVkIH0gZnJvbSBcIkB1dGlsc1wiO1xuXG5mdW5jdGlvbiBleHBvcnRIYW5kbGVyKG5hbWU6IHN0cmluZywgY2I6IGFueSkge1xuICAgIG9uKCdfX2NmeF9leHBvcnRfaWxsZW5pdW0tYXBwZWFyYW5jZV8nICsgbmFtZSwgKHNldENCOiBhbnkpID0+IHtcbiAgICAgICAgc2V0Q0IoY2IpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbGxlbml1bUNvbXBhdCgpIHtcbiAgICBleHBvcnRIYW5kbGVyKCdzdGFydFBsYXllckN1c3RvbWl6YXRpb24nLCAoKSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkTW9kZWwnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIEdldEVudGl0eU1vZGVsKHBlZClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZENvbXBvbmVudHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZHJhd2FibGVzOiBhbnkgPSBnZXREcmF3YWJsZXMocGVkKVswXTtcbiAgICAgICAgbGV0IG5ld2RyYXdhYmxlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZHJhd2FibGVzKSB7XG4gICAgICAgICAgICBjb25zdCBkcmF3YWJsZSA9IGRyYXdhYmxlc1tpZF07XG4gICAgICAgICAgICBuZXdkcmF3YWJsZS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQ6IGRyYXdhYmxlLmluZGV4LFxuICAgICAgICAgICAgICAgIGRyYXdhYmxlOiBkcmF3YWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRQcm9wcycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwcm9wczogYW55ID0gIGdldFByb3BzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdQcm9wcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaWRdO1xuICAgICAgICAgICAgbmV3UHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgcHJvcF9pZDogcHJvcC5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogcHJvcC52YWx1ZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhlYWRCbGVuZCcsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRCbGVuZERhdGEocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEZhY2VGZWF0dXJlcycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRTdHJ1Y3R1cmUocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRPdmVybGF5KHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIYWlyJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vcmV0dXJuIGdldEhhaXIocGVkKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0QXBwZWFyYW5jZShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGxheWVyTW9kZWwnLCAobW9kZWw6IG51bWJlcikgPT4ge1xuICAgICAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcbiAgICAgICAgc2V0TW9kZWwocGVkLCBtb2RlbCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIsIGJsZW5kOiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRIZWFkQmxlbmQocGVkLCBibGVuZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEZhY2VGZWF0dXJlcycsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZE92ZXJsYXlzJywgKHBlZDogbnVtYmVyLCBvdmVybGF5OiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRIZWFkT3ZlcmxheShwZWQsIG92ZXJsYXkpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIYWlyJywgYXN5bmMgKHBlZDogbnVtYmVyLCBoYWlyOiBhbnksIHRhdHRvbzogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0UGVkSGFpckNvbG9ycyhwZWQsIGhhaXIpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRFeWVDb2xvcicsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQ29tcG9uZW50JywgKHBlZDogbnVtYmVyLCBkcmF3YWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0RyYXdhYmxlID0ge1xuICAgICAgICAgICAgaW5kZXg6IGRyYXdhYmxlLmNvbXBvbmVudF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBkcmF3YWJsZS5kcmF3YWJsZSxcbiAgICAgICAgICAgIHRleHR1cmU6IGRyYXdhYmxlLnRleHR1cmVcbiAgICAgICAgfVxuICAgICAgICBzZXREcmF3YWJsZShwZWQsIG5ld0RyYXdhYmxlKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudHMnLCAocGVkOiBudW1iZXIsIGNvbXBvbmVudHM6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogY29tcG9uZW50LmNvbXBvbmVudF9pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50LmRyYXdhYmxlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IGNvbXBvbmVudC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXREcmF3YWJsZShwZWQsIG5ld0RyYXdhYmxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcCcsIChwZWQ6IG51bWJlciwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Byb3AgPSB7XG4gICAgICAgICAgICBpbmRleDogcHJvcC5wcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRQcm9wcycsIChwZWQ6IG51bWJlciwgcHJvcHM6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Byb3AgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFByb3AocGVkLCBuZXdQcm9wKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZXhwb3J0SGFuZGxlcignc2V0UGxheWVyQXBwZWFyYW5jZScsIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkgPT4ge1xuICAgIC8vICAgICByZXR1cm4gY29uc29sZS53YXJuKCdOZWVkIHRvIGJlIGltcGxlbWVudGVkJyk7XG4gICAgLy8gfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRBcHBlYXJhbmNlJywgKHBlZDogbnVtYmVyLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkgPT4ge1xuICAgICAgICBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFRhdHRvb3MnLCAocGVkOiBudW1iZXIsIHRhdHRvb3M6IFRUYXR0b29bXSkgPT4ge1xuICAgICAgICBzZXRQZWRUYXR0b29zKHBlZCwgdGF0dG9vcylcbiAgICB9KTtcbn0iLCAiaW1wb3J0IHsgVEFwcGVhcmFuY2UsIFRBcHBlYXJhbmNlWm9uZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgb3Blbk1lbnUgfSBmcm9tIFwiLi9tZW51XCJcclxuaW1wb3J0IHsgc2V0UGxheWVyUGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXHJcbmltcG9ydCB7IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgZ2V0RnJhbWV3b3JrSUQsIERlbGF5LCBibF9icmlkZ2UsIHBlZCwgZGVsYXksIGZvcm1hdCwgdXBkYXRlUGVkIH0gZnJvbSBcIkB1dGlsc1wiXHJcbmltcG9ydCB7IFFCQnJpZGdlIH0gZnJvbSBcIi4vYnJpZGdlL3FiXCJcclxuaW1wb3J0IHsgRVNYQnJpZGdlIH0gZnJvbSBcIi4vYnJpZGdlL2VzeFwiXHJcbmltcG9ydCB7IGlsbGVuaXVtQ29tcGF0IH0gZnJvbSBcIi4vY29tcGF0L2lsbGVuaXVtXCJcclxuXHJcbmV4cG9ydHMoJ1NldFBsYXllclBlZEFwcGVhcmFuY2UnLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UgfCBzdHJpbmcpID0+IHtcclxuICAgIGxldCByZXNvbHZlZEFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UgfHwgdHlwZW9mIGFwcGVhcmFuY2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQ6IHN0cmluZyA9IGFwcGVhcmFuY2UgfHwgYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKTtcclxuICAgICAgICByZXNvbHZlZEFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpIGFzIFRBcHBlYXJhbmNlO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXBwZWFyYW5jZSA9PT0gJ29iamVjdCcpIHJlc29sdmVkQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7XHJcbiAgICBcclxuICAgIGlmICghcmVzb2x2ZWRBcHBlYXJhbmNlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB2YWxpZCBhcHBlYXJhbmNlIGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UocmVzb2x2ZWRBcHBlYXJhbmNlKTtcclxufSk7XHJcblxyXG5leHBvcnRzKCdHZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGZyYW1ld29ya0lEOiBzdHJpbmcpID0+IHtcclxuICAgIGZyYW1ld29ya0lEID0gZnJhbWV3b3JrSUQgfHwgYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxufSlcclxuXHJcbmV4cG9ydHMoJ0luaXRpYWxDcmVhdGlvbicsIGFzeW5jIChjYj86IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgbmVlZHMgdG8gYmUgdHlwZSBvZiBUQXBwZWFyYW5jZVpvbmUgbWVhbmluZyBpdCBuZWVkcyBhIGNvb3JkcyBwcm9wZXJ0eSwgYnV0IGluIHRoaXMgY2FzZSBpdCdzIG5vdCB1c2VkXHJcbiAgICBhd2FpdCBvcGVuTWVudSh7IHR5cGU6IFwiYXBwZWFyYW5jZVwiLCBjb29yZHM6IFswLCAwLCAwLCAwXSB9LCB0cnVlKVxyXG4gICAgaWYgKGNiKSBjYigpXHJcbn0pXHJcblxyXG5vbignYmxfYXBwZWFyYW5jZTpjbGllbnQ6dXNlWm9uZScsICh6b25lOiBUQXBwZWFyYW5jZVpvbmUpID0+IHtcclxuICAgIG9wZW5NZW51KHpvbmUpXHJcbn0pXHJcblxyXG5vbk5ldCgnYmxfYnJpZGdlOmNsaWVudDpwbGF5ZXJMb2FkZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICB3aGlsZSAoIWJsX2JyaWRnZS5jb3JlKCkucGxheWVyTG9hZGVkKCkpIHtcclxuICAgICAgICBhd2FpdCBEZWxheSgxMDApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbn0pXHJcblxyXG5vbk5ldCgnb25SZXNvdXJjZVN0YXJ0JywgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChyZXNvdXJjZSA9PT0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpICYmIGJsX2JyaWRnZS5jb3JlKCkucGxheWVyTG9hZGVkKCkpIHtcclxuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgICAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxuICAgIH1cclxufSlcclxuXHJcbmNvbnN0IGZyYW1ld29ya05hbWUgPSBibF9icmlkZ2UuZ2V0RnJhbWV3b3JrKCdjb3JlJylcclxuY29uc3QgY29yZSA9IGZvcm1hdChHZXRDb252YXIoJ2JsOmZyYW1ld29yaycsICdxYicpKVxyXG5cclxuaWYgKGNvcmUgPT0gJ3FiJyB8fCBjb3JlID09ICdxYngnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBRQkJyaWRnZSgpO1xyXG59IGVsc2UgaWYgKGNvcmUgPT0gJ2VzeCcgJiYgR2V0UmVzb3VyY2VTdGF0ZShmcmFtZXdvcmtOYW1lKSA9PSAnc3RhcnRlZCcpIHtcclxuICAgIEVTWEJyaWRnZSgpO1xyXG59XHJcblxyXG5pbGxlbml1bUNvbXBhdCgpO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdyZWxvYWRza2luJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCBoZWFsdGggPSBHZXRFbnRpdHlIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IG1heGhlYWx0aCA9IEdldEVudGl0eU1heEhlYWx0aChwZWQpO1xyXG4gICAgY29uc3QgYXJtb3IgPSBHZXRQZWRBcm1vdXIocGVkKTtcclxuXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcblxyXG4gICAgU2V0UGVkTWF4SGVhbHRoKHBlZCwgbWF4aGVhbHRoKVxyXG4gICAgZGVsYXkoMTAwMCkgXHJcbiAgICBTZXRFbnRpdHlIZWFsdGgocGVkLCBoZWFsdGgpXHJcbiAgICBTZXRQZWRBcm1vdXIocGVkLCBhcm1vcilcclxufSwgZmFsc2UpXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBTyxJQUFJLE1BQU07QUFFVixJQUFNLFlBQVksd0JBQUMsY0FBc0I7QUFDNUMsUUFBTTtBQUNWLEdBRnlCO0FBYWxCLElBQU0sZUFBZSx3QkFBQyxRQUFnQixTQUFjO0FBQ3ZELGlCQUFlO0FBQUEsSUFD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RCxJQUFJLFFBQVEsUUFBUSxRQUFRLFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxXQUFXO0FBQy9FLFdBQVM7QUFDYixXQUFXLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDdEUsWUFBVTtBQUNkO0FBRUEsZUFBZTtBQUVmLGdCQUFnQixjQUFjLFlBQVk7QUFDdEMsUUFBTSxjQUFjLE1BQU0sZUFBZTtBQUN6QyxRQUFNLFNBQVMsZ0JBQWdCLEdBQUc7QUFDbEMsUUFBTSxZQUFZLG1CQUFtQixHQUFHO0FBQ3hDLFFBQU0sUUFBUSxhQUFhLEdBQUc7QUFFOUIsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFFdkMsa0JBQWdCLEtBQUssU0FBUztBQUM5QixRQUFNLEdBQUk7QUFDVixrQkFBZ0IsS0FBSyxNQUFNO0FBQzNCLGVBQWEsS0FBSyxLQUFLO0FBQzNCLEdBQUcsS0FBSzsiLAogICJuYW1lcyI6IFsiZGVsYXkiLCAicGVkIiwgIngiLCAieSIsICJ6IiwgImNvbmZpZyIsICJwZWQiLCAicGVkIiwgInBlZCJdCn0K diff --git a/dist/client/init.js.map b/dist/client/init.js.map new file mode 100644 index 0000000..26f8e2f --- /dev/null +++ b/dist/client/init.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) return pedHandle;\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function SetFaceFeature(pedHandle: number, data: TValue) {\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', SetFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n SetFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tSetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tSetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "mappings": "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", + "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] +} diff --git a/dist/server/init.js b/dist/server/init.js index ae4ec19..5389fd6 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -4,6 +4,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __glob = (map) => (path) => { var fn = map[path]; if (fn) @@ -48,7 +49,8 @@ var require_MySQL = __commonJS({ if (!condition) throw new TypeError(message); } - var safeArgs = (query, params, cb, transaction) => { + __name(assert, "assert"); + var safeArgs = /* @__PURE__ */ __name((query, params, cb, transaction) => { if (typeof query === "number") query = QueryStore[query]; if (transaction) { @@ -67,7 +69,7 @@ var require_MySQL = __commonJS({ if (cb !== void 0) assert(typeof cb === "function", `Third argument expected function, received ${typeof cb}`); return [query, params, cb]; - }; + }, "safeArgs"); var exp = global.exports.oxmysql; var currentResourceName = GetCurrentResourceName(); function execute(method, query, params) { @@ -79,6 +81,7 @@ var require_MySQL = __commonJS({ }, currentResourceName, true); }); } + __name(execute, "execute"); exports2.oxmysql = { store(query) { assert(typeof query !== "string", `Query expects a string, received ${typeof query}`); @@ -174,17 +177,19 @@ var init_utils = __esm({ const resolve = activeEvents[key]; return resolve && resolve(...args); }); + __name(triggerClientCallback, "triggerClientCallback"); + __name(onClientCallback, "onClientCallback"); bl_bridge = exports.bl_bridge; core = bl_bridge.core(); - getPlayerData = (src) => { + getPlayerData = /* @__PURE__ */ __name((src) => { return core.GetPlayer(src); - }; - getFrameworkID = (src) => { + }, "getPlayerData"); + getFrameworkID = /* @__PURE__ */ __name((src) => { const player = core.GetPlayer(src); if (!player) return null; return player.id; - }; + }, "getFrameworkID"); bl_config = exports.bl_appearance.config(); config = bl_config; } @@ -254,12 +259,16 @@ var init_setters = __esm({ "src/server/appearance/setters.ts"() { init_utils(); import_oxmysql2 = __toESM(require_MySQL(), 1); + __name(saveSkin, "saveSkin"); onClientCallback("bl_appearance:server:saveSkin", saveSkin); exports("SaveSkin", saveSkin); + __name(saveClothes, "saveClothes"); onClientCallback("bl_appearance:server:saveClothes", saveClothes); exports("SaveClothes", saveClothes); + __name(saveTattoos, "saveTattoos"); onClientCallback("bl_appearance:server:saveTattoos", saveTattoos); exports("SaveTattoos", saveTattoos); + __name(saveAppearance, "saveAppearance"); onClientCallback("bl_appearance:server:saveAppearance", saveAppearance); exports("SaveAppearance", function(id, appearance) { return saveAppearance(null, id, appearance); @@ -285,8 +294,8 @@ var init_fivem = __esm({ import_oxmysql4 = __toESM(require_MySQL(), 1); init_utils(); init_setters(); - delay = (ms) => new Promise((res) => setTimeout(res, ms)); - migrate = async (src) => { + delay = /* @__PURE__ */ __name((ms) => new Promise((res) => setTimeout(res, ms)), "delay"); + migrate = /* @__PURE__ */ __name(async (src) => { const response = await import_oxmysql4.oxmysql.query("SELECT * FROM `players`"); if (!response) return; @@ -303,7 +312,7 @@ var init_fivem = __esm({ } } console.log("Converted " + response.length + " appearances"); - }; + }, "migrate"); fivem_default = migrate; } }); @@ -319,8 +328,8 @@ var init_illenium = __esm({ import_oxmysql5 = __toESM(require_MySQL(), 1); init_utils(); init_setters(); - delay2 = (ms) => new Promise((res) => setTimeout(res, ms)); - migrate2 = async (src) => { + delay2 = /* @__PURE__ */ __name((ms) => new Promise((res) => setTimeout(res, ms)), "delay"); + migrate2 = /* @__PURE__ */ __name(async (src) => { const response = await import_oxmysql5.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1"); if (!response) return; @@ -337,7 +346,7 @@ var init_illenium = __esm({ } } console.log("Converted " + response.length + " appearances"); - }; + }, "migrate"); illenium_default = migrate2; } }); @@ -353,8 +362,8 @@ var init_qb = __esm({ import_oxmysql6 = __toESM(require_MySQL(), 1); init_utils(); init_setters(); - delay3 = (ms) => new Promise((res) => setTimeout(res, ms)); - migrate3 = async (src) => { + delay3 = /* @__PURE__ */ __name((ms) => new Promise((res) => setTimeout(res, ms)), "delay"); + migrate3 = /* @__PURE__ */ __name(async (src) => { const response = await import_oxmysql6.oxmysql.query("SELECT * FROM `playerskins` WHERE active = 1"); if (!response) return; @@ -366,7 +375,7 @@ var init_qb = __esm({ await saveAppearance(playerSrc, element.citizenid, response2); } console.log("Converted " + response.length + " appearances"); - }; + }, "migrate"); qb_default = migrate3; } }); @@ -397,6 +406,7 @@ async function getOutfits(src, frameworkId) { ); return outfits; } +__name(getOutfits, "getOutfits"); onClientCallback("bl_appearance:server:getOutfits", getOutfits); exports("GetOutfits", getOutfits); async function renameOutfit(src, data) { @@ -407,6 +417,7 @@ async function renameOutfit(src, data) { ); return result; } +__name(renameOutfit, "renameOutfit"); onClientCallback("bl_appearance:server:renameOutfit", renameOutfit); exports("RenameOutfit", renameOutfit); async function deleteOutfit(src, id) { @@ -417,6 +428,7 @@ async function deleteOutfit(src, id) { ); return result > 0; } +__name(deleteOutfit, "deleteOutfit"); onClientCallback("bl_appearance:server:deleteOutfit", deleteOutfit); exports("DeleteOutfit", deleteOutfit); async function saveOutfit(src, data) { @@ -433,6 +445,7 @@ async function saveOutfit(src, data) { ); return id; } +__name(saveOutfit, "saveOutfit"); onClientCallback("bl_appearance:server:saveOutfit", saveOutfit); exports("SaveOutfit", saveOutfit); async function fetchOutfit(_, id) { @@ -442,6 +455,7 @@ async function fetchOutfit(_, id) { ); return JSON.parse(response); } +__name(fetchOutfit, "fetchOutfit"); onClientCallback("bl_appearance:server:fetchOutfit", fetchOutfit); exports("FetchOutfit", fetchOutfit); async function importOutfit(_, frameworkId, outfitId, outfitName) { @@ -458,6 +472,7 @@ async function importOutfit(_, frameworkId, outfitId, outfitName) { ); return { success: true, newId }; } +__name(importOutfit, "importOutfit"); onClientCallback("bl_appearance:server:importOutfit", importOutfit); exports("ImportOutfit", importOutfit); var outfitItem = config.outfitItem; @@ -490,6 +505,7 @@ async function getSkin(src, frameworkId) { ); return JSON.parse(response); } +__name(getSkin, "getSkin"); onClientCallback("bl_appearance:server:getSkin", getSkin); exports("GetSkin", function(id) { return getSkin(null, id); @@ -504,6 +520,7 @@ async function getClothes(src, frameworkId) { ); return JSON.parse(response); } +__name(getClothes, "getClothes"); onClientCallback("bl_appearance:server:getClothes", getClothes); exports("GetClothes", function(id) { return getClothes(null, id); @@ -518,6 +535,7 @@ async function getTattoos(src, frameworkId) { ); return JSON.parse(response) || []; } +__name(getTattoos, "getTattoos"); onClientCallback("bl_appearance:server:getTattoos", getTattoos); exports("GetTattoos", function(id) { return getTattoos(null, id); @@ -542,6 +560,7 @@ async function getAppearance(src, frameworkId) { appearance.id = response.id; return appearance; } +__name(getAppearance, "getAppearance"); onClientCallback("bl_appearance:server:getAppearance", getAppearance); exports("GetAppearance", function(id) { return getAppearance(null, id); @@ -579,3 +598,4 @@ RegisterCommand("migrate", async (source2) => { const importedModule = await globImport_migrate_ts(`./migrate/${config2.previousClothing === "fivem-appearance" ? "fivem" : config2.previousClothing}.ts`); importedModule.default(source2); }, false); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0BvdmVyZXh0ZW5kZWQvb3hteXNxbC9NeVNRTC50cyIsICIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9zZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9lc3gudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9taWdyYXRlL2ZpdmVtLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9pbGxlbml1bS50cyIsICIuLi8uLi9zcmMvc2VydmVyL21pZ3JhdGUvcWIudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9hcHBlYXJhbmNlL291dGZpdHMudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9pbml0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ0eXBlIFF1ZXJ5ID0gc3RyaW5nIHwgbnVtYmVyO1xyXG50eXBlIFBhcmFtcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdIHwgRnVuY3Rpb247XHJcbnR5cGUgQ2FsbGJhY2s8VD4gPSAocmVzdWx0OiBUIHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgVHJhbnNhY3Rpb24gPVxyXG4gIHwgc3RyaW5nW11cclxuICB8IFtzdHJpbmcsIFBhcmFtc11bXVxyXG4gIHwgeyBxdWVyeTogc3RyaW5nOyB2YWx1ZXM6IFBhcmFtcyB9W11cclxuICB8IHsgcXVlcnk6IHN0cmluZzsgcGFyYW1ldGVyczogUGFyYW1zIH1bXTtcclxuXHJcbmludGVyZmFjZSBSZXN1bHQge1xyXG4gIFtjb2x1bW46IHN0cmluZyB8IG51bWJlcl06IGFueTtcclxuICBhZmZlY3RlZFJvd3M/OiBudW1iZXI7XHJcbiAgZmllbGRDb3VudD86IG51bWJlcjtcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGluc2VydElkPzogbnVtYmVyO1xyXG4gIHNlcnZlclN0YXR1cz86IG51bWJlcjtcclxuICB3YXJuaW5nU3RhdHVzPzogbnVtYmVyO1xyXG4gIGNoYW5nZWRSb3dzPzogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm93IHtcclxuICBbY29sdW1uOiBzdHJpbmcgfCBudW1iZXJdOiB1bmtub3duO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT3hNeVNRTCB7XHJcbiAgc3RvcmU6IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgcXVlcnk6IDxUID0gUmVzdWx0IHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBzaW5nbGU6IDxUID0gUm93IHwgbnVsbD4oXHJcbiAgICBxdWVyeTogUXVlcnksXHJcbiAgICBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxFeGNsdWRlPFQsIFtdPj4sXHJcbiAgICBjYj86IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PlxyXG4gICkgPT4gUHJvbWlzZTxFeGNsdWRlPFQsIFtdPj47XHJcbiAgc2NhbGFyOiA8VCA9IHVua25vd24gfCBudWxsPihcclxuICAgIHF1ZXJ5OiBRdWVyeSxcclxuICAgIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PixcclxuICAgIGNiPzogQ2FsbGJhY2s8RXhjbHVkZTxULCBbXT4+XHJcbiAgKSA9PiBQcm9taXNlPEV4Y2x1ZGU8VCwgW10+PjtcclxuICB1cGRhdGU6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBpbnNlcnQ6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBwcmVwYXJlOiA8VCA9IGFueT4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICByYXdFeGVjdXRlOiA8VCA9IFJlc3VsdCB8IG51bGw+KHF1ZXJ5OiBRdWVyeSwgcGFyYW1zPzogUGFyYW1zIHwgQ2FsbGJhY2s8VD4sIGNiPzogQ2FsbGJhY2s8VD4pID0+IFByb21pc2U8VD47XHJcbiAgdHJhbnNhY3Rpb246IChxdWVyeTogVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPGJvb2xlYW4+LCBjYj86IENhbGxiYWNrPGJvb2xlYW4+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIGlzUmVhZHk6ICgpID0+IGJvb2xlYW47XHJcbiAgYXdhaXRDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPHRydWU+O1xyXG59XHJcblxyXG5jb25zdCBRdWVyeVN0b3JlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XHJcbn1cclxuXHJcbmNvbnN0IHNhZmVBcmdzID0gKHF1ZXJ5OiBRdWVyeSB8IFRyYW5zYWN0aW9uLCBwYXJhbXM/OiBhbnksIGNiPzogRnVuY3Rpb24sIHRyYW5zYWN0aW9uPzogdHJ1ZSkgPT4ge1xyXG4gIGlmICh0eXBlb2YgcXVlcnkgPT09ICdudW1iZXInKSBxdWVyeSA9IFF1ZXJ5U3RvcmVbcXVlcnldO1xyXG5cclxuICBpZiAodHJhbnNhY3Rpb24pIHtcclxuICAgIGFzc2VydCh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnLCBgRmlyc3QgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0LCByZWNpZXZlZCAke3R5cGVvZiBxdWVyeX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXNzZXJ0KHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycsIGBGaXJzdCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1UeXBlID0gdHlwZW9mIHBhcmFtcztcclxuICAgIGFzc2VydChcclxuICAgICAgcGFyYW1UeXBlID09PSAnb2JqZWN0JyB8fCBwYXJhbVR5cGUgPT09ICdmdW5jdGlvbicsXHJcbiAgICAgIGBTZWNvbmQgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0IG9yIGZ1bmN0aW9uLCByZWNlaXZlZCAke3BhcmFtVHlwZX1gXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY2IgJiYgcGFyYW1UeXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNiID0gcGFyYW1zO1xyXG4gICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2IgIT09IHVuZGVmaW5lZCkgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJywgYFRoaXJkIGFyZ3VtZW50IGV4cGVjdGVkIGZ1bmN0aW9uLCByZWNlaXZlZCAke3R5cGVvZiBjYn1gKTtcclxuXHJcbiAgcmV0dXJuIFtxdWVyeSwgcGFyYW1zLCBjYl07XHJcbn07XHJcblxyXG5jb25zdCBleHAgPSBnbG9iYWwuZXhwb3J0cy5veG15c3FsO1xyXG5jb25zdCBjdXJyZW50UmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpO1xyXG5cclxuZnVuY3Rpb24gZXhlY3V0ZShtZXRob2Q6IHN0cmluZywgcXVlcnk6IFF1ZXJ5IHwgVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleHBbbWV0aG9kXShcclxuICAgICAgcXVlcnksXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgKHJlc3VsdCwgZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSxcclxuICAgICAgY3VycmVudFJlc291cmNlTmFtZSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KSBhcyBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBveG15c3FsOiBPeE15U1FMID0ge1xyXG4gIHN0b3JlKHF1ZXJ5KSB7XHJcbiAgICBhc3NlcnQodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJywgYFF1ZXJ5IGV4cGVjdHMgYSBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG5cclxuICAgIHJldHVybiBRdWVyeVN0b3JlLnB1c2gocXVlcnkpO1xyXG4gIH0sXHJcbiAgcmVhZHkoY2FsbGJhY2spIHtcclxuICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgIHdoaWxlIChHZXRSZXNvdXJjZVN0YXRlKCdveG15c3FsJykgIT09ICdzdGFydGVkJykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgYXN5bmMgcXVlcnkocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdxdWVyeScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNpbmdsZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NpbmdsZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNjYWxhcihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NjYWxhcicsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHVwZGF0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3VwZGF0ZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIGluc2VydChxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ2luc2VydCcsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHByZXBhcmUocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdwcmVwYXJlJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgYXN5bmMgcmF3RXhlY3V0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3Jhd0V4ZWN1dGUnLCBxdWVyeSwgcGFyYW1zKTtcclxuICAgIHJldHVybiBjYiA/IGNiKHJlc3VsdCkgOiByZXN1bHQ7XHJcbiAgfSxcclxuICBhc3luYyB0cmFuc2FjdGlvbihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiLCB0cnVlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3RyYW5zYWN0aW9uJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgaXNSZWFkeSgpIHtcclxuICAgIHJldHVybiBleHAuaXNSZWFkeSgpO1xyXG4gIH0sXHJcbiAgYXN5bmMgYXdhaXRDb25uZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGV4cC5hd2FpdENvbm5lY3Rpb24oKTtcclxuICB9LFxyXG59O1xyXG4iLCAiLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL3NlcnZlci9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcblxyXG5jb25zdCBhY3RpdmVFdmVudHMgPSB7fTtcclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5LCAuLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zdCByZXNvbHZlID0gYWN0aXZlRXZlbnRzW2tleV07XHJcbiAgICByZXR1cm4gcmVzb2x2ZSAmJiByZXNvbHZlKC4uLmFyZ3MpO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHBsYXllcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQga2V5OiBzdHJpbmc7XHJcbiAgICBkbyB7XHJcbiAgICAgICAga2V5ID0gYCR7ZXZlbnROYW1lfToke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgxMDAwMDAgKyAxKSl9OiR7cGxheWVySWR9YDtcclxuICAgIH0gd2hpbGUgKGFjdGl2ZUV2ZW50c1trZXldKTtcclxuICAgIGVtaXROZXQoYF9ibF9jYl8ke2V2ZW50TmFtZX1gLCBwbGF5ZXJJZCwgcmVzb3VyY2VOYW1lLCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgYWN0aXZlRXZlbnRzW2tleV0gPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkNsaWVudENhbGxiYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBjYjogKHBsYXllcklkOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IHNvdXJjZTtcclxuICAgICAgICBsZXQgcmVzcG9uc2U6IGFueTtcclxuICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNiKHNyYywgLi4uYXJncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyBjYWxsYmFjayBldmVudCAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGVtaXROZXQoYF9ibF9jYl8ke3Jlc291cmNlfWAsIHNyYywga2V5LCByZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBibF9icmlkZ2UgPSBleHBvcnRzLmJsX2JyaWRnZVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcmUgPSBibF9icmlkZ2UuY29yZSgpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyRGF0YSA9IChzcmM6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIGNvcmUuR2V0UGxheWVyKHNyYylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZyYW1ld29ya0lEID0gKHNyYzogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBwbGF5ZXIuaWRcclxufVxyXG5cclxuXHJcbmNvbnN0IGJsX2NvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5jb25maWcoKVxyXG5leHBvcnQgY29uc3QgY29uZmlnID0gYmxfY29uZmlnIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQ2xvdGhlcywgVFNraW4gfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2ssIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTa2luKHNyYzogbnVtYmVyLCBza2luOiBUU2tpbikge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgc2tpbiA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoc2tpbiksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZVNraW4nLCBzYXZlU2tpbik7XHJcbmV4cG9ydHMoJ1NhdmVTa2luJywgc2F2ZVNraW4pO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDbG90aGVzKHNyYzogbnVtYmVyLCBjbG90aGVzOiBUQ2xvdGhlcykge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgY2xvdGhlcyA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoY2xvdGhlcyksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUNsb3RoZXMnLCBzYXZlQ2xvdGhlcyk7XHJcbmV4cG9ydHMoJ1NhdmVDbG90aGVzJywgc2F2ZUNsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUYXR0b29zKHNyYzogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBhcHBlYXJhbmNlIFNFVCB0YXR0b29zID0gPyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeSh0YXR0b29zKSwgZnJhbWV3b3JrSWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlVGF0dG9vcycsIHNhdmVUYXR0b29zKTtcclxuZXhwb3J0cygnU2F2ZVRhdHRvb3MnLCBzYXZlVGF0dG9vcyk7XHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVBcHBlYXJhbmNlKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKHNyYyAmJiBmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXllcklkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZnJhbWV3b3JrSWQgIT09IHBsYXllcklkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignWW91IGFyZSB0cnlpbmcgdG8gc2F2ZSBhbiBhcHBlYXJhbmNlIGZvciBhIGRpZmZlcmVudCBwbGF5ZXInLCBzcmMsIGZyYW1ld29ya0lkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblx0aWYgKCFmcmFtZXdvcmtJZCkge1xyXG5cdFx0ZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgY2xvdGhlcyA9IHtcclxuXHRcdGRyYXdhYmxlczogYXBwZWFyYW5jZS5kcmF3YWJsZXMsXHJcblx0XHRwcm9wczogYXBwZWFyYW5jZS5wcm9wcyxcclxuXHRcdGhlYWRPdmVybGF5OiBhcHBlYXJhbmNlLmhlYWRPdmVybGF5LFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHNraW4gPSB7XHJcblx0XHRoZWFkQmxlbmQ6IGFwcGVhcmFuY2UuaGVhZEJsZW5kLFxyXG5cdFx0aGVhZFN0cnVjdHVyZTogYXBwZWFyYW5jZS5oZWFkU3RydWN0dXJlLFxyXG5cdFx0aGFpckNvbG9yOiBhcHBlYXJhbmNlLmhhaXJDb2xvcixcclxuXHRcdG1vZGVsOiBhcHBlYXJhbmNlLm1vZGVsLFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgW107XHJcblxyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuXHRcdCdJTlNFUlQgSU5UTyBhcHBlYXJhbmNlIChpZCwgY2xvdGhlcywgc2tpbiwgdGF0dG9vcykgVkFMVUVTICg/LCA/LCA/LCA/KSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBjbG90aGVzID0gVkFMVUVTKGNsb3RoZXMpLCBza2luID0gVkFMVUVTKHNraW4pLCB0YXR0b29zID0gVkFMVUVTKHRhdHRvb3MpOycsXHJcblx0XHRbXHJcblx0XHRcdGZyYW1ld29ya0lkLFxyXG5cdFx0XHRKU09OLnN0cmluZ2lmeShjbG90aGVzKSxcclxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoc2tpbiksXHJcblx0XHRcdEpTT04uc3RyaW5naWZ5KHRhdHRvb3MpLFxyXG5cdFx0XVxyXG5cdCk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBzYXZlQXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ1NhdmVBcHBlYXJhbmNlJywgZnVuY3Rpb24oaWQsIGFwcGVhcmFuY2UpIHtcclxuICAgIHJldHVybiBzYXZlQXBwZWFyYW5jZShudWxsLCBpZCwgYXBwZWFyYW5jZSlcclxufSk7XHJcbiIsICIiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2AnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmaXZlbScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbGxlbml1bScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgZW1pdE5ldCgncWItY2xvdGhlczpsb2FkU2tpbicsIHNyYywgMCwgZWxlbWVudC5tb2RlbCwgZWxlbWVudC5za2luKTtcbiAgICAgICAgYXdhaXQgZGVsYXkoMjAwKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCBzcmMpIGFzIFRBcHBlYXJhbmNlXG4gICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tIFwiQG92ZXJleHRlbmRlZC9veG15c3FsXCI7XHJcbmltcG9ydCB7IGNvbmZpZywgY29yZSwgZ2V0RnJhbWV3b3JrSUQsIGdldFBsYXllckRhdGEsIG9uQ2xpZW50Q2FsbGJhY2sgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE91dGZpdHMoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGpvYiA9IGNvcmUuR2V0UGxheWVyKHNyYykuam9iIHx8IHsgbmFtZTogJ3Vua25vd24nLCBncmFkZTogeyBuYW1lOiAndW5rbm93bicgfSB9XHJcblx0bGV0IHJlc3BvbnNlID0gYXdhaXQgb3hteXNxbC5wcmVwYXJlKFxyXG5cdFx0J1NFTEVDVCAqIEZST00gb3V0Zml0cyBXSEVSRSBwbGF5ZXJfaWQgPSA/IE9SIChqb2JuYW1lID0gPyBBTkQgam9icmFuayA8PSA/KScsXHJcblx0XHRbZnJhbWV3b3JrSWQsIGpvYi5uYW1lLCBqb2IuZ3JhZGUubmFtZV1cclxuXHQpO1xyXG5cdGlmICghcmVzcG9uc2UpIHJldHVybiBbXTtcclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcmVzcG9uc2UgPSBbcmVzcG9uc2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG91dGZpdHMgPSByZXNwb25zZS5tYXAoXHJcbiAgICAgICAgKG91dGZpdDogeyBpZDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBvdXRmaXQ6IHN0cmluZzsgam9ibmFtZT86IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogb3V0Zml0LmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IG91dGZpdC5sYWJlbCxcclxuICAgICAgICAgICAgICAgIG91dGZpdDogSlNPTi5wYXJzZShvdXRmaXQub3V0Zml0KSxcclxuICAgICAgICAgICAgICAgIGpvYm5hbWU6IG91dGZpdC5qb2JuYW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG91dGZpdHM7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGdldE91dGZpdHMpO1xyXG5leHBvcnRzKCdHZXRPdXRmaXRzJywgZ2V0T3V0Zml0cyk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZW5hbWVPdXRmaXQoc3JjOiBudW1iZXIsIGRhdGE6IHsgaWQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIG91dGZpdHMgU0VUIGxhYmVsID0gPyBXSEVSRSBwbGF5ZXJfaWQgPSA/IEFORCBpZCA9ID8nLFxyXG4gICAgICAgIFtkYXRhLmxhYmVsLCBmcmFtZXdvcmtJZCwgZGF0YS5pZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcbmV4cG9ydHMoJ1JlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPdXRmaXQoc3JjOiBudW1iZXIsIGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdERUxFVEUgRlJPTSBvdXRmaXRzIFdIRVJFIHBsYXllcl9pZCA9ID8gQU5EIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBpZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0ID4gMDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5leHBvcnRzKCdEZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2F2ZU91dGZpdChzcmM6IG51bWJlciwgZGF0YTogT3V0Zml0KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBsZXQgam9ibmFtZSA9IG51bGw7XHJcbiAgICBsZXQgam9icmFuayA9IDA7XHJcbiAgICBpZiAoZGF0YS5qb2IpIHtcclxuICAgICAgICBqb2JuYW1lID0gZGF0YS5qb2IubmFtZTtcclxuICAgICAgICBqb2JyYW5rID0gZGF0YS5qb2IucmFuaztcclxuICAgIH1cclxuICAgIGNvbnN0IGlkID0gYXdhaXQgb3hteXNxbC5pbnNlcnQoXHJcbiAgICAgICAgJ0lOU0VSVCBJTlRPIG91dGZpdHMgKHBsYXllcl9pZCwgbGFiZWwsIG91dGZpdCwgam9ibmFtZSwgam9icmFuaykgVkFMVUVTICg/LCA/LCA/LCA/LCA/KScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBkYXRhLmxhYmVsLCBKU09OLnN0cmluZ2lmeShkYXRhLm91dGZpdCksIGpvYm5hbWUsIGpvYnJhbmtdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGlkO1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBzYXZlT3V0Zml0KTtcclxuZXhwb3J0cygnU2F2ZU91dGZpdCcsIHNhdmVPdXRmaXQpO1xyXG5cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoT3V0Zml0KF86IG51bWJlciwgaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBvdXRmaXQgRlJPTSBvdXRmaXRzIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGZldGNoT3V0Zml0KTtcclxuZXhwb3J0cygnRmV0Y2hPdXRmaXQnLCBmZXRjaE91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRPdXRmaXQoXzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBvdXRmaXRJZDogbnVtYmVyLCBvdXRmaXROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucXVlcnkoXHJcbiAgICAgICAgJ1NFTEVDVCBsYWJlbCwgb3V0Zml0IEZST00gb3V0Zml0cyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtvdXRmaXRJZF1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ091dGZpdCBub3QgZm91bmQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SWQgPSBhd2FpdCBveG15c3FsLmluc2VydChcclxuICAgICAgICAnSU5TRVJUIElOVE8gb3V0Zml0cyAocGxheWVyX2lkLCBsYWJlbCwgb3V0Zml0KSBWQUxVRVMgKD8sID8sID8pJyxcclxuICAgICAgICBbZnJhbWV3b3JrSWQsIG91dGZpdE5hbWUsIHJlc3VsdC5vdXRmaXRdXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG5ld0lkOiBuZXdJZCB9O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcbmV4cG9ydHMoJ0ltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcblxyXG5jb25zdCBvdXRmaXRJdGVtID0gY29uZmlnLm91dGZpdEl0ZW1cclxuXHJcbmlmICghb3V0Zml0SXRlbSkge1xyXG4gICAgY29uc29sZS53YXJuKCdibF9hcHBlYXJhbmNlOiBObyBvdXRmaXQgaXRlbSBjb25maWd1cmVkLCBwbGVhc2Ugc2V0IGl0IGluIGNvbmZpZy5sdWEnKVxyXG59XHJcblxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgYXN5bmMgKHNyYywgZGF0YSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGNvcmUuR2V0UGxheWVyKHNyYylcclxuXHRwbGF5ZXIuYWRkSXRlbShvdXRmaXRJdGVtLCAxLCBkYXRhKVxyXG59KTtcclxuXHJcbmNvcmUuUmVnaXN0ZXJVc2FibGVJdGVtKG91dGZpdEl0ZW0sIGFzeW5jIChzb3VyY2U6IG51bWJlciwgc2xvdDogbnVtYmVyLCBtZXRhZGF0YToge291dGZpdDogT3V0Zml0LCBsYWJlbDogc3RyaW5nfSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGdldFBsYXllckRhdGEoc291cmNlKVxyXG5cdGlmIChwbGF5ZXI/LnJlbW92ZUl0ZW0ob3V0Zml0SXRlbSwgMSwgc2xvdCkpIFxyXG5cdFx0ZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0Zml0SXRlbScsIHNvdXJjZSwgbWV0YWRhdGEub3V0Zml0KVxyXG59KSIsICJpbXBvcnQgJy4vYXBwZWFyYW5jZS9vdXRmaXRzJztcclxuaW1wb3J0ICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuXHJcbm94bXlzcWwucmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgdGFibGUgY2FsbGVkIGFwcGVhcmFuY2VcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUIDEgRlJPTSBhcHBlYXJhbmNlIExJTUlUIDEnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgYXBwZWFyYW5jZSB0YWJsZS4gTW9zdCBsaWtlbHkgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0OiAnLCBlcnJvcik7XHJcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgYWRkaXRpb25hbCBlcnJvciBoYW5kbGluZyBvciByZWNvdmVyeSBsb2dpYyBoZXJlIGlmIG5lZWRlZFxyXG4gICAgfVxyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIHNvdXJjZSlcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIDApXHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdtaWdyYXRlJywgYXN5bmMgKHNvdXJjZTogbnVtYmVyKSA9PiB7XHJcblx0c291cmNlID0gc291cmNlICE9PSAwID8gc291cmNlIDogcGFyc2VJbnQoZ2V0UGxheWVycygpWzBdKVxyXG5cdGNvbnN0IGJsX2FwcGVhcmFuY2UgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2U7XHJcblx0Y29uc3QgY29uZmlnID0gYmxfYXBwZWFyYW5jZS5jb25maWcoKTtcclxuXHRjb25zdCBpbXBvcnRlZE1vZHVsZSA9IGF3YWl0IGltcG9ydChgLi9taWdyYXRlLyR7Y29uZmlnLnByZXZpb3VzQ2xvdGhpbmcgPT09ICdmaXZlbS1hcHBlYXJhbmNlJyA/ICdmaXZlbScgOiBjb25maWcucHJldmlvdXNDbG90aGluZ30udHNgKVxyXG5cdGltcG9ydGVkTW9kdWxlLmRlZmF1bHQoc291cmNlKVxyXG59LCBmYWxzZSk7XHJcbiIsICJpbXBvcnQgeyBveG15c3FsIH0gZnJvbSBcIkBvdmVyZXh0ZW5kZWQvb3hteXNxbFwiO1xyXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgb25DbGllbnRDYWxsYmFjayB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBTa2luREIgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0U2tpbihzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHNraW4gRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRTa2luJywgZ2V0U2tpbik7XHJcbmV4cG9ydHMoJ0dldFNraW4nLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFNraW4obnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2xvdGhlcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIGNsb3RoZXMgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRDbG90aGVzJywgZ2V0Q2xvdGhlcyk7XHJcbmV4cG9ydHMoJ0dldENsb3RoZXMnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldENsb3RoZXMobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHRhdHRvb3MgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKSB8fCBbXTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRUYXR0b29zJywgZ2V0VGF0dG9vcyk7XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFRhdHRvb3MobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwZWFyYW5jZShzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCAmJiAhc3JjKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZTogU2tpbkRCID0gYXdhaXQgb3hteXNxbC5zaW5nbGUoXHJcbiAgICAgICAgJ1NFTEVDVCAqIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8gTElNSVQgMScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBhcHBlYXJhbmNlID0ge1xyXG4gICAgICAgIC4uLkpTT04ucGFyc2UocmVzcG9uc2Uuc2tpbiksXHJcbiAgICAgICAgLi4uSlNPTi5wYXJzZShyZXNwb25zZS5jbG90aGVzKSxcclxuICAgICAgICB0YXR0b29zOiBKU09OLnBhcnNlKHJlc3BvbnNlLnRhdHRvb3MpLFxyXG4gICAgfVxyXG4gICAgYXBwZWFyYW5jZS5pZCA9IHJlc3BvbnNlLmlkXHJcbiAgICByZXR1cm4gYXBwZWFyYW5jZTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZ2V0QXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ0dldEFwcGVhcmFuY2UnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UobnVsbCwgaWQpXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFFBQU0sYUFBdUIsQ0FBQTtBQUU3QixhQUFTLE9BQU8sV0FBb0IsU0FBZTtBQUNqRCxVQUFJLENBQUM7QUFBVyxjQUFNLElBQUksVUFBVSxPQUFPO0lBQzdDO0FBRlM7QUFJVCxRQUFNLFdBQVcsd0JBQUMsT0FBNEIsUUFBYyxJQUFlLGdCQUFzQjtBQUMvRixVQUFJLE9BQU8sVUFBVTtBQUFVLGdCQUFRLFdBQVcsS0FBSztBQUV2RCxVQUFJLGFBQWE7QUFDZixlQUFPLE9BQU8sVUFBVSxVQUFVLDRDQUE0QyxPQUFPLEtBQUssRUFBRTthQUN2RjtBQUNMLGVBQU8sT0FBTyxVQUFVLFVBQVUsNENBQTRDLE9BQU8sS0FBSyxFQUFFOztBQUc5RixVQUFJLFFBQVE7QUFDVixjQUFNLFlBQVksT0FBTztBQUN6QixlQUNFLGNBQWMsWUFBWSxjQUFjLFlBQ3hDLHlEQUF5RCxTQUFTLEVBQUU7QUFHdEUsWUFBSSxDQUFDLE1BQU0sY0FBYyxZQUFZO0FBQ25DLGVBQUs7QUFDTCxtQkFBUzs7O0FBSWIsVUFBSSxPQUFPO0FBQVcsZUFBTyxPQUFPLE9BQU8sWUFBWSw4Q0FBOEMsT0FBTyxFQUFFLEVBQUU7QUFFaEgsYUFBTyxDQUFDLE9BQU8sUUFBUSxFQUFFO0lBQzNCLEdBekJpQjtBQTJCakIsUUFBTSxNQUFNLE9BQU8sUUFBUTtBQUMzQixRQUFNLHNCQUFzQix1QkFBc0I7QUFFbEQsYUFBUyxRQUFRLFFBQWdCLE9BQTRCLFFBQWU7QUFDMUUsYUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVU7QUFDckMsWUFBSSxNQUFNLEVBQ1IsT0FDQSxRQUNBLENBQUMsUUFBUSxVQUFTO0FBQ2hCLGNBQUk7QUFBTyxtQkFBTyxPQUFPLEtBQUs7QUFDOUIsa0JBQVEsTUFBTTtRQUNoQixHQUNBLHFCQUNBLElBQUk7TUFFUixDQUFDO0lBQ0g7QUFiUztBQWVJLElBQUFBLFNBQUEsVUFBbUI7TUFDOUIsTUFBTSxPQUFLO0FBQ1QsZUFBTyxPQUFPLFVBQVUsVUFBVSxvQ0FBb0MsT0FBTyxLQUFLLEVBQUU7QUFFcEYsZUFBTyxXQUFXLEtBQUssS0FBSztNQUM5QjtNQUNBLE1BQU0sVUFBUTtBQUNaLHFCQUFhLFlBQVc7QUFDdEIsaUJBQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFXLGtCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN4RyxtQkFBUTtRQUNWLENBQUM7TUFDSDtNQUNBLE1BQU0sTUFBTSxPQUFPLFFBQVEsSUFBRTtBQUMzQixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFNBQVMsT0FBTyxNQUFNO0FBQ25ELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBRTtBQUM3QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFdBQVcsT0FBTyxNQUFNO0FBQ3JELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sV0FBVyxPQUFPLFFBQVEsSUFBRTtBQUNoQyxTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLGNBQWMsT0FBTyxNQUFNO0FBQ3hELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMz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RTtBQUNqQyxDQUFDOzs7QUR6RUQsSUFBQUMsa0JBQXdCOzs7Ozs7Ozs7OztBQUV4Qix3QkFBUSxNQUFNLFlBQVk7QUFFdEIsTUFBSTtBQUNBLFVBQU0sd0JBQVEsTUFBTSxrQ0FBa0M7QUFBQSxFQUMxRCxTQUFTLE9BQU87QUFDWixZQUFRLE1BQU0sMkVBQTJFLEtBQUs7QUFBQSxFQUVsRztBQUNKLENBQUM7QUFFRCxNQUFNLHlDQUF5QyxNQUFNO0FBQ3BELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxNQUFNO0FBQ2pELENBQUM7QUFFRCxNQUFNLDJDQUEyQyxNQUFNO0FBQ3RELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxnQkFBZ0IsV0FBVyxPQUFPQyxZQUFtQjtBQUNwRCxFQUFBQSxVQUFTQSxZQUFXLElBQUlBLFVBQVMsU0FBUyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsUUFBTUMsVUFBUyxjQUFjLE9BQU87QUFDcEMsUUFBTSxpQkFBaUIsTUFBYSxtQ0FBYUEsUUFBTyxxQkFBcUIscUJBQXFCLFVBQVVBLFFBQU8sZ0JBQWdCO0FBQ25JLGlCQUFlLFFBQVFELE9BQU07QUFDOUIsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJleHBvcnRzIiwgImltcG9ydF9veG15c3FsIiwgImltcG9ydF9veG15c3FsIiwgInJlc3BvbnNlIiwgImltcG9ydF9veG15c3FsIiwgImRlbGF5IiwgIm1pZ3JhdGUiLCAicmVzcG9uc2UiLCAiaW1wb3J0X294bXlzcWwiLCAiZGVsYXkiLCAibWlncmF0ZSIsICJyZXNwb25zZSIsICJzb3VyY2UiLCAiaW1wb3J0X294bXlzcWwiLCAiaW1wb3J0X294bXlzcWwiLCAic291cmNlIiwgImNvbmZpZyJdCn0K diff --git a/dist/server/init.js.map b/dist/server/init.js.map new file mode 100644 index 0000000..d710dc0 --- /dev/null +++ b/dist/server/init.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../node_modules/@overextended/oxmysql/MySQL.ts", "../../src/server/utils/index.ts", "../../src/server/appearance/setters.ts", "../../src/server/migrate/esx.ts", "../../src/server/migrate/fivem.ts", "../../src/server/migrate/illenium.ts", "../../src/server/migrate/qb.ts", "../../src/server/appearance/outfits.ts", "../../src/server/init.ts", "../../src/server/appearance/getters.ts"], + "sourcesContent": ["type Query = string | number;\r\ntype Params = Record | unknown[] | Function;\r\ntype Callback = (result: T | null) => void;\r\n\r\ntype Transaction =\r\n | string[]\r\n | [string, Params][]\r\n | { query: string; values: Params }[]\r\n | { query: string; parameters: Params }[];\r\n\r\ninterface Result {\r\n [column: string | number]: any;\r\n affectedRows?: number;\r\n fieldCount?: number;\r\n info?: string;\r\n insertId?: number;\r\n serverStatus?: number;\r\n warningStatus?: number;\r\n changedRows?: number;\r\n}\r\n\r\ninterface Row {\r\n [column: string | number]: unknown;\r\n}\r\n\r\ninterface OxMySQL {\r\n store: (query: string) => void;\r\n ready: (callback: () => void) => void;\r\n query: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n single: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n scalar: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n update: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n insert: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n prepare: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n rawExecute: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n transaction: (query: Transaction, params?: Params | Callback, cb?: Callback) => Promise;\r\n isReady: () => boolean;\r\n awaitConnection: () => Promise;\r\n}\r\n\r\nconst QueryStore: string[] = [];\r\n\r\nfunction assert(condition: boolean, message: string) {\r\n if (!condition) throw new TypeError(message);\r\n}\r\n\r\nconst safeArgs = (query: Query | Transaction, params?: any, cb?: Function, transaction?: true) => {\r\n if (typeof query === 'number') query = QueryStore[query];\r\n\r\n if (transaction) {\r\n assert(typeof query === 'object', `First argument expected object, recieved ${typeof query}`);\r\n } else {\r\n assert(typeof query === 'string', `First argument expected string, received ${typeof query}`);\r\n }\r\n\r\n if (params) {\r\n const paramType = typeof params;\r\n assert(\r\n paramType === 'object' || paramType === 'function',\r\n `Second argument expected object or function, received ${paramType}`\r\n );\r\n\r\n if (!cb && paramType === 'function') {\r\n cb = params;\r\n params = undefined;\r\n }\r\n }\r\n\r\n if (cb !== undefined) assert(typeof cb === 'function', `Third argument expected function, received ${typeof cb}`);\r\n\r\n return [query, params, cb];\r\n};\r\n\r\nconst exp = global.exports.oxmysql;\r\nconst currentResourceName = GetCurrentResourceName();\r\n\r\nfunction execute(method: string, query: Query | Transaction, params?: Params) {\r\n return new Promise((resolve, reject) => {\r\n exp[method](\r\n query,\r\n params,\r\n (result, error) => {\r\n if (error) return reject(error);\r\n resolve(result);\r\n },\r\n currentResourceName,\r\n true\r\n );\r\n }) as any;\r\n}\r\n\r\nexport const oxmysql: OxMySQL = {\r\n store(query) {\r\n assert(typeof query !== 'string', `Query expects a string, received ${typeof query}`);\r\n\r\n return QueryStore.push(query);\r\n },\r\n ready(callback) {\r\n setImmediate(async () => {\r\n while (GetResourceState('oxmysql') !== 'started') await new Promise((resolve) => setTimeout(resolve, 50));\r\n callback();\r\n });\r\n },\r\n async query(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('query', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async single(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('single', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async scalar(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('scalar', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async update(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('update', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async insert(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('insert', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async prepare(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('prepare', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async rawExecute(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('rawExecute', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async transaction(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb, true);\r\n const result = await execute('transaction', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n isReady() {\r\n return exp.isReady();\r\n },\r\n async awaitConnection() {\r\n return await exp.awaitConnection();\r\n },\r\n};\r\n", "//https://github.com/overextended/ox_lib/blob/master/package/server/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\n\r\nconst activeEvents = {};\r\nonNet(`_bl_cb_${resourceName}`, (key, ...args) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerClientCallback(eventName: string, playerId: string, ...args: any[]) {\r\n let key: string;\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args);\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n}\r\n\r\nexport function onClientCallback(eventName: string, cb: (playerId: number, ...args: any[]) => any) {\r\n onNet(`_bl_cb_${eventName}`, async (resource: string, key: string, ...args: any[]) => {\r\n const src = source;\r\n let response: any;\r\n \r\n try {\r\n response = await cb(src, ...args);\r\n } catch (e: any) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n \r\n emitNet(`_bl_cb_${resource}`, src, key, response);\r\n });\r\n}\r\n\r\nconst bl_bridge = exports.bl_bridge\r\n\r\nexport const core = bl_bridge.core()\r\n\r\nexport const getPlayerData = (src: number) => {\r\n return core.GetPlayer(src)\r\n}\r\n\r\nexport const getFrameworkID = (src: number) => {\r\n const player = core.GetPlayer(src)\r\n if (!player) return null\r\n return player.id\r\n}\r\n\r\n\r\nconst bl_config = exports.bl_appearance.config()\r\nexport const config = bl_config", "import { TAppearance, TClothes, TSkin } from '@typings/appearance';\r\nimport { getFrameworkID, onClientCallback, } from '../utils';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nexport async function saveSkin(src: number, skin: TSkin) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET skin = ? WHERE id = ?',\r\n [JSON.stringify(skin), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveSkin', saveSkin);\r\nexports('SaveSkin', saveSkin);\r\n\r\nexport async function saveClothes(src: number, clothes: TClothes) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET clothes = ? WHERE id = ?',\r\n [JSON.stringify(clothes), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveClothes', saveClothes);\r\nexports('SaveClothes', saveClothes);\r\n\r\nexport async function saveTattoos(src: number, tattoos: TTattoo[]) {\r\n const frameworkId = getFrameworkID(src);\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET tattoos = ? WHERE id = ?',\r\n [JSON.stringify(tattoos), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveTattoos', saveTattoos);\r\nexports('SaveTattoos', saveTattoos);\r\n\r\n\r\nexport async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) {\r\n if (src && frameworkId) {\r\n const playerId = getFrameworkID(src);\r\n \r\n if (frameworkId !== playerId) {\r\n console.warn('You are trying to save an appearance for a different player', src, frameworkId);\r\n return;\r\n }\r\n }\r\n\r\n\tif (!frameworkId) {\r\n\t\tframeworkId = getFrameworkID(src);\r\n\t}\r\n\r\n\tconst clothes = {\r\n\t\tdrawables: appearance.drawables,\r\n\t\tprops: appearance.props,\r\n\t\theadOverlay: appearance.headOverlay,\r\n\t};\r\n\r\n\tconst skin = {\r\n\t\theadBlend: appearance.headBlend,\r\n\t\theadStructure: appearance.headStructure,\r\n\t\thairColor: appearance.hairColor,\r\n\t\tmodel: appearance.model,\r\n\t};\r\n\r\n\tconst tattoos = appearance.tattoos || [];\r\n\r\n\tconst result = await oxmysql.prepare(\r\n\t\t'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);',\r\n\t\t[\r\n\t\t\tframeworkId,\r\n\t\t\tJSON.stringify(clothes),\r\n\t\t\tJSON.stringify(skin),\r\n\t\t\tJSON.stringify(tattoos),\r\n\t\t]\r\n\t);\r\n\r\n\treturn result;\r\n}\r\nonClientCallback('bl_appearance:server:saveAppearance', saveAppearance);\r\nexports('SaveAppearance', function(id, appearance) {\r\n return saveAppearance(null, id, appearance)\r\n});\r\n", "", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `players`');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'fivem',\n data: JSON.parse(element.skin)\n }) as TAppearance\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'illenium',\n data: JSON.parse(element.skin)\n })\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin);\n await delay(200);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { config, core, getFrameworkID, getPlayerData, onClientCallback } from \"../utils\";\r\nimport { Outfit } from \"@typings/outfits\";\r\n\r\nasync function getOutfits(src: number, frameworkId: string) {\r\n const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } }\r\n\tlet response = await oxmysql.prepare(\r\n\t\t'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)',\r\n\t\t[frameworkId, job.name, job.grade.name]\r\n\t);\r\n\tif (!response) return [];\r\n\r\n if (!Array.isArray(response)) {\r\n response = [response];\r\n }\r\n\r\n const outfits = response.map(\r\n (outfit: { id: number; label: string; outfit: string; jobname?: string }) => {\r\n return {\r\n id: outfit.id,\r\n label: outfit.label,\r\n outfit: JSON.parse(outfit.outfit),\r\n jobname: outfit.jobname,\r\n };\r\n }\r\n );\r\n\r\n return outfits;\r\n}\r\nonClientCallback('bl_appearance:server:getOutfits', getOutfits);\r\nexports('GetOutfits', getOutfits);\r\n\r\nasync function renameOutfit(src: number, data: { id: number; label: string }) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?',\r\n [data.label, frameworkId, data.id]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:renameOutfit', renameOutfit);\r\nexports('RenameOutfit', renameOutfit);\r\n\r\nasync function deleteOutfit(src: number, id: number) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'DELETE FROM outfits WHERE player_id = ? AND id = ?',\r\n [frameworkId, id]\r\n );\r\n return result > 0;\r\n}\r\nonClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit);\r\nexports('DeleteOutfit', deleteOutfit);\r\n\r\nasync function saveOutfit(src: number, data: Outfit) {\r\n const frameworkId = getFrameworkID(src);\r\n let jobname = null;\r\n let jobrank = 0;\r\n if (data.job) {\r\n jobname = data.job.name;\r\n jobrank = data.job.rank;\r\n }\r\n const id = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)',\r\n [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank]\r\n );\r\n return id;\r\n}\r\nonClientCallback('bl_appearance:server:saveOutfit', saveOutfit);\r\nexports('SaveOutfit', saveOutfit);\r\n\r\n\r\nasync function fetchOutfit(_: number, id: number) {\r\n const response = await oxmysql.prepare(\r\n 'SELECT outfit FROM outfits WHERE id = ?',\r\n [id]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit);\r\nexports('FetchOutfit', fetchOutfit);\r\n\r\nasync function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) {\r\n const result = await oxmysql.query(\r\n 'SELECT label, outfit FROM outfits WHERE id = ?',\r\n [outfitId]\r\n );\r\n\r\n if (!result || typeof result !== 'object' || Object.keys(result).length === 0) {\r\n return { success: false, message: 'Outfit not found' };\r\n }\r\n\r\n const newId = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)',\r\n [frameworkId, outfitName, result.outfit]\r\n );\r\n\r\n return { success: true, newId: newId };\r\n}\r\nonClientCallback('bl_appearance:server:importOutfit', importOutfit);\r\nexports('ImportOutfit', importOutfit);\r\n\r\nconst outfitItem = config.outfitItem\r\n\r\nif (!outfitItem) {\r\n console.warn('bl_appearance: No outfit item configured, please set it in config.lua')\r\n}\r\n\r\nonClientCallback('bl_appearance:server:itemOutfit', async (src, data) => {\r\n\tconst player = core.GetPlayer(src)\r\n\tplayer.addItem(outfitItem, 1, data)\r\n});\r\n\r\ncore.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => {\r\n\tconst player = getPlayerData(source)\r\n\tif (player?.removeItem(outfitItem, 1, slot)) \r\n\t\temitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit)\r\n})", "import './appearance/outfits';\r\nimport './appearance/setters';\r\nimport './appearance/getters';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\n\r\noxmysql.ready(async () => {\r\n // see if there is a table called appearance\r\n try {\r\n await oxmysql.query('SELECT 1 FROM appearance LIMIT 1');\r\n } catch (error) {\r\n console.error('Error checking appearance table. Most likely the table does not exist: ', error);\r\n // You can add additional error handling or recovery logic here if needed\r\n }\r\n});\r\n\r\nonNet('bl_appearance:server:setroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), source)\r\n});\r\n\r\nonNet('bl_appearance:server:resetroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), 0)\r\n});\r\n\r\nRegisterCommand('migrate', async (source: number) => {\r\n\tsource = source !== 0 ? source : parseInt(getPlayers()[0])\r\n\tconst bl_appearance = exports.bl_appearance;\r\n\tconst config = bl_appearance.config();\r\n\tconst importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`)\r\n\timportedModule.default(source)\r\n}, false);\r\n", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { getFrameworkID, onClientCallback } from \"../utils\";\r\nimport { SkinDB } from \"@typings/appearance\";\r\n\r\nasync function getSkin(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT skin FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getSkin', getSkin);\r\nexports('GetSkin', function(id) {\r\n return getSkin(null, id)\r\n});\r\n\r\nasync function getClothes(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT clothes FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getClothes', getClothes);\r\nexports('GetClothes', function(id) {\r\n return getClothes(null, id)\r\n});\r\n\r\nasync function getTattoos(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT tattoos FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response) || [];\r\n}\r\nonClientCallback('bl_appearance:server:getTattoos', getTattoos);\r\nexports('GetTattoos', function(id) {\r\n return getTattoos(null, id)\r\n});\r\n\r\nasync function getAppearance(src: number, frameworkId: string) {\r\n if (!frameworkId && !src) return null;\r\n \r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response: SkinDB = await oxmysql.single(\r\n 'SELECT * FROM appearance WHERE id = ? LIMIT 1',\r\n [frameworkId]\r\n );\r\n\r\n if (!response) return null;\r\n let appearance = {\r\n ...JSON.parse(response.skin),\r\n ...JSON.parse(response.clothes),\r\n tattoos: JSON.parse(response.tattoos),\r\n }\r\n appearance.id = response.id\r\n return appearance;\r\n}\r\nonClientCallback('bl_appearance:server:getAppearance', getAppearance);\r\nexports('GetAppearance', function(id) {\r\n return getAppearance(null, id)\r\n});\r\n"], + "mappings": "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", + "names": ["exports", "import_oxmysql", "import_oxmysql", "response", "import_oxmysql", "delay", "migrate", "response", "import_oxmysql", "delay", "migrate", "response", "source", "import_oxmysql", "import_oxmysql", "source", "config"] +} diff --git a/dist/shared/init.js b/dist/shared/init.js index deef225..99c178b 100644 --- a/dist/shared/init.js +++ b/dist/shared/init.js @@ -1,3 +1,6 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); + // src/shared/init.ts function checkDependency(resource, version) { let currentVersion = GetResourceMetadata(resource, "version", 0); @@ -20,4 +23,6 @@ function checkDependency(resource, version) { } } } +__name(checkDependency, "checkDependency"); checkDependency("bl_bridge", "1.2.5"); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NoYXJlZC9pbml0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJmdW5jdGlvbiBjaGVja0RlcGVuZGVuY3kocmVzb3VyY2U6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgbGV0IGN1cnJlbnRWZXJzaW9uID0gR2V0UmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZSwgJ3ZlcnNpb24nLCAwKVxuICAgIGN1cnJlbnRWZXJzaW9uID0gY3VycmVudFZlcnNpb24gJiYgY3VycmVudFZlcnNpb24/Lm1hdGNoKC9cXGQrXFwuXFxkK1xcLlxcZCsvKT8uWzBdIHx8ICd1bmtub3duJ1xuXG5cdGlmIChjdXJyZW50VmVyc2lvbiAhPSB2ZXJzaW9uKSB7XG5cdFx0Y29uc3QgY3YgPSBjdXJyZW50VmVyc2lvbi5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBtdiA9IHZlcnNpb24uc3BsaXQoJy4nKTtcblx0XHRjb25zdCBtc2cgPSBgXjEke0dldEludm9raW5nUmVzb3VyY2UoKSB8fCBHZXRDdXJyZW50UmVzb3VyY2VOYW1lKCl9IHJlcXVpcmVzIHZlcnNpb24gJyR7dmVyc2lvbn0nIG9mICcke3Jlc291cmNlfScgKGN1cnJlbnQgdmVyc2lvbjogJHtjdXJyZW50VmVyc2lvbn0pXjBgO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gTnVtYmVyKGN2W2ldKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbmltdW0gPSBOdW1iZXIobXZbaV0pO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbWluaW11bSkge1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihjdXJyZW50KSB8fCBjdXJyZW50IDwgbWluaW11bSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2hlY2tEZXBlbmRlbmN5KCdibF9icmlkZ2UnLCAnMS4yLjUnKTsiXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQUEsU0FBUyxnQkFBZ0IsVUFBa0IsU0FBaUI7QUFDeEQsTUFBSSxpQkFBaUIsb0JBQW9CLFVBQVUsV0FBVyxDQUFDO0FBQy9ELG1CQUFpQixrQkFBa0IsZ0JBQWdCLE1BQU0sZUFBZSxJQUFJLENBQUMsS0FBSztBQUVyRixNQUFJLGtCQUFrQixTQUFTO0FBQzlCLFVBQU0sS0FBSyxlQUFlLE1BQU0sR0FBRztBQUM3QixVQUFNLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDbEMsVUFBTSxNQUFNLEtBQUssb0JBQW9CLEtBQUssdUJBQXVCLENBQUMsc0JBQXNCLE9BQU8sU0FBUyxRQUFRLHVCQUF1QixjQUFjO0FBQy9JLGFBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxRQUFRLEtBQUs7QUFDaEMsWUFBTSxVQUFVLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDNUIsWUFBTSxVQUFVLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFNUIsVUFBSSxZQUFZLFNBQVM7QUFDckIsWUFBSSxNQUFNLE9BQU8sS0FBSyxVQUFVLFNBQVM7QUFDckMsa0JBQVEsTUFBTSxHQUFHO0FBQ2pCO0FBQUEsUUFDSixPQUFPO0FBQ0g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0o7QUF0QlM7QUF3QlQsZ0JBQWdCLGFBQWEsT0FBTzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/dist/shared/init.js.map b/dist/shared/init.js.map new file mode 100644 index 0000000..21c99da --- /dev/null +++ b/dist/shared/init.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/shared/init.ts"], + "sourcesContent": ["function checkDependency(resource: string, version: string) {\n let currentVersion = GetResourceMetadata(resource, 'version', 0)\n currentVersion = currentVersion && currentVersion?.match(/\\d+\\.\\d+\\.\\d+/)?.[0] || 'unknown'\n\n\tif (currentVersion != version) {\n\t\tconst cv = currentVersion.split('.');\n const mv = version.split('.');\n\t\tconst msg = `^1${GetInvokingResource() || GetCurrentResourceName()} requires version '${version}' of '${resource}' (current version: ${currentVersion})^0`;\n for (let i = 0; i < cv.length; i++) {\n const current = Number(cv[i]);\n const minimum = Number(mv[i]);\n\n if (current !== minimum) {\n if (isNaN(current) || current < minimum) {\n console.error(msg);\n break;\n } else {\n break;\n }\n }\n }\n }\n}\n\ncheckDependency('bl_bridge', '1.2.5');"], + "mappings": ";;;;AAAA,SAAS,gBAAgB,UAAkB,SAAiB;AACxD,MAAI,iBAAiB,oBAAoB,UAAU,WAAW,CAAC;AAC/D,mBAAiB,kBAAkB,gBAAgB,MAAM,eAAe,IAAI,CAAC,KAAK;AAErF,MAAI,kBAAkB,SAAS;AAC9B,UAAM,KAAK,eAAe,MAAM,GAAG;AAC7B,UAAM,KAAK,QAAQ,MAAM,GAAG;AAClC,UAAM,MAAM,KAAK,oBAAoB,KAAK,uBAAuB,CAAC,sBAAsB,OAAO,SAAS,QAAQ,uBAAuB,cAAc;AAC/I,aAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAChC,YAAM,UAAU,OAAO,GAAG,CAAC,CAAC;AAC5B,YAAM,UAAU,OAAO,GAAG,CAAC,CAAC;AAE5B,UAAI,YAAY,SAAS;AACrB,YAAI,MAAM,OAAO,KAAK,UAAU,SAAS;AACrC,kBAAQ,MAAM,GAAG;AACjB;AAAA,QACJ,OAAO;AACH;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;AAtBS;AAwBT,gBAAgB,aAAa,OAAO;", + "names": [] +} diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index 7054bc9..aeb8877 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -53,7 +53,7 @@ export const setModel = async (pedHandle: number, data: TAppearance | TSkin | nu if (!isPedFreemodeModel(pedHandle)) return pedHandle; const isJustModel = typeof data === 'string' || typeof data === 'number'; - const hasHeadBlend = !isJustModel && Object.keys(data.headBlend).length > 0; + const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0; if (hasHeadBlend) { setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend); From 2b859deac75783e2b3ad7629601c1df65a65de7c Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 15:50:26 +1000 Subject: [PATCH 25/30] chore(guard clauses): Return with a console warning if passing in no data to exports --- dist/client/init.js | 40 ++++++++++++++++++++++++-------- dist/client/init.js.map | 4 ++-- src/client/appearance/setters.ts | 35 ++++++++++++++++++++++------ src/client/handlers.ts | 4 ++-- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 429ee8e..aa108c8 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -692,12 +692,16 @@ var toggles_default = { // src/client/appearance/setters.ts function setDrawable(pedHandle, data) { + if (!data) + return console.warn("No data provided for setDrawable"); SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0); return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value); } __name(setDrawable, "setDrawable"); exports("SetDrawable", setDrawable); function setProp(pedHandle, data) { + if (!data) + return console.warn("No data provided for setProp"); if (data.value === -1) { ClearPedProp(pedHandle, data.index); return; @@ -709,8 +713,10 @@ __name(setProp, "setProp"); exports("SetProp", setProp); var defMaleHash = GetHashKey("mp_m_freemode_01"); var setModel = /* @__PURE__ */ __name(async (pedHandle, data) => { - if (data == null || data === void 0) + if (data == null || data === void 0) { + console.warn("No data provided for setModel"); return pedHandle; + } let model; if (typeof data === "string") { model = GetHashKey(data); @@ -749,13 +755,17 @@ var setModel = /* @__PURE__ */ __name(async (pedHandle, data) => { return pedHandle; }, "setModel"); exports("SetModel", setModel); -function SetFaceFeature(pedHandle, data) { +function setFaceFeature(pedHandle, data) { + if (!data) + return console.warn("No data provided for setFaceFeature"); SetPedFaceFeature(pedHandle, data.index, data.value + 0); } -__name(SetFaceFeature, "SetFaceFeature"); -exports("SetFaceFeature", SetFaceFeature); +__name(setFaceFeature, "setFaceFeature"); +exports("setFaceFeature", setFaceFeature); var isPositive = /* @__PURE__ */ __name((val) => val >= 0 ? val : 0, "isPositive"); function setHeadBlend(pedHandle, data) { + if (!data) + return console.warn("No data provided for setHeadBlend"); pedHandle = pedHandle || ped; if (!isPedFreemodeModel(pedHandle)) return; @@ -774,6 +784,8 @@ function setHeadBlend(pedHandle, data) { __name(setHeadBlend, "setHeadBlend"); exports("SetHeadBlend", setHeadBlend); function setHeadOverlay(pedHandle, data) { + if (!data) + return console.warn("No data provided for setHeadOverlay"); const index = data.index; if (index === 13) { SetPedEyeColor(pedHandle, data.value); @@ -811,6 +823,8 @@ function resetToggles(data) { __name(resetToggles, "resetToggles"); exports("SetPedClothes", setPedClothes); function setPedClothes(pedHandle, data) { + if (!data) + return console.warn("No data provided for setPedClothes"); const drawables = data.drawables; const props = data.props; const headOverlay = data.headOverlay; @@ -831,7 +845,9 @@ __name(setPedClothes, "setPedClothes"); exports("SetPedClothes", setPedClothes); var setPedSkin = /* @__PURE__ */ __name(async (pedHandle, data) => { if (!data) - return; + return console.warn("No data provided for setPedSkin"); + if (!pedHandle) + return console.warn("No pedHandle provided for setPedSkin"); pedHandle = await setModel(pedHandle, data); const headStructure = data.headStructure; const headBlend = data.headBlend; @@ -840,13 +856,13 @@ var setPedSkin = /* @__PURE__ */ __name(async (pedHandle, data) => { if (headStructure) for (const feature in headStructure) { const value = headStructure[feature]; - SetFaceFeature(pedHandle, value); + setFaceFeature(pedHandle, value); } }, "setPedSkin"); exports("SetPedSkin", setPedSkin); function setPedTattoos(pedHandle, data) { if (!data) - return; + return console.warn("No data provided for setPedTattoos"); ClearPedDecorationsLeaveScars(pedHandle); for (let i = 0; i < data.length; i++) { const tattooData = data[i].tattoo; @@ -861,7 +877,7 @@ __name(setPedTattoos, "setPedTattoos"); exports("SetPedTattoos", setPedTattoos); function setPedHairColors(pedHandle, data) { if (!data) - return; + return console.warn("No data provided for setPedHairColors"); const color = data.color; const highlight = data.highlight; SetPedHairColor(pedHandle, color, highlight); @@ -869,6 +885,8 @@ function setPedHairColors(pedHandle, data) { __name(setPedHairColors, "setPedHairColors"); exports("SetPedHairColors", setPedHairColors); async function setPedAppearance(pedHandle, data) { + if (!data) + return console.warn("No data provided for setPedAppearance"); if (IsPedAPlayer(pedHandle)) { setPlayerPedAppearance(data); return; @@ -881,6 +899,8 @@ async function setPedAppearance(pedHandle, data) { __name(setPedAppearance, "setPedAppearance"); exports("SetPedAppearance", setPedAppearance); async function setPlayerPedAppearance(data) { + if (!data) + return console.warn("No data provided for setPlayerPedAppearance"); updatePed(PlayerPedId()); await setPedSkin(ped, data); updatePed(PlayerPedId()); @@ -927,7 +947,7 @@ RegisterNuiCallback("appearance:getModelTattoos" /* getModelTattoos */, async (_ cb(tattoos); }); RegisterNuiCallback("appearance:setHeadStructure" /* setHeadStructure */, async (data, cb) => { - SetFaceFeature(ped, data); + setFaceFeature(ped, data); cb(1); }); RegisterNuiCallback("appearance:setHeadOverlay" /* setHeadOverlay */, async (data, cb) => { @@ -1386,4 +1406,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKGRhdGEudmFsdWUgPT09IC0xKSB7XHJcbiAgICAgICAgQ2xlYXJQZWRQcm9wKHBlZEhhbmRsZSwgZGF0YS5pbmRleClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRQcm9wSW5kZXgocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIGZhbHNlKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkUHJvcFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXRQcm9wJywgc2V0UHJvcCk7XHJcblxyXG5jb25zdCBkZWZNYWxlSGFzaCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0TW9kZWwgPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlIHwgVFNraW4gfCBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmUnLCBTZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIHBlZEhhbmRsZSA9IHBlZEhhbmRsZSB8fCBwZWRcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBzaGFwZUZpcnN0ID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlRmlyc3QpXHJcbiAgICBjb25zdCBzaGFwZVNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZVNlY29uZClcclxuICAgIGNvbnN0IHNoYXBlVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVUaGlyZClcclxuICAgIGNvbnN0IHNraW5GaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5za2luRmlyc3QpXHJcbiAgICBjb25zdCBza2luU2Vjb25kID0gaXNQb3NpdGl2ZShkYXRhLnNraW5TZWNvbmQpXHJcbiAgICBjb25zdCBza2luVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpblRoaXJkKVxyXG4gICAgY29uc3Qgc2hhcGVNaXggPSBkYXRhLnNoYXBlTWl4ICsgMC4wXHJcbiAgICBjb25zdCBza2luTWl4ID0gZGF0YS5za2luTWl4ICsgMC4wXHJcbiAgICBjb25zdCB0aGlyZE1peCA9IGRhdGEudGhpcmRNaXggKyAwLjBcclxuICAgIGNvbnN0IGhhc1BhcmVudCA9IGRhdGEuaGFzUGFyZW50XHJcblxyXG4gICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIHNoYXBlRmlyc3QsIHNoYXBlU2Vjb25kLCBzaGFwZVRoaXJkLCBza2luRmlyc3QsIHNraW5TZWNvbmQsIHNraW5UaGlyZCwgc2hhcGVNaXgsIHNraW5NaXgsIHRoaXJkTWl4LCBoYXNQYXJlbnQpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZEJsZW5kJywgc2V0SGVhZEJsZW5kKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAxMykge1xyXG4gICAgICAgIFNldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSwgZGF0YS52YWx1ZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGEub3ZlcmxheVZhbHVlXHJcblxyXG4gICAgLyogSGFpciBjb2xvciBkb2VzIG5vdCBoYXZlIGFuIGluZGV4LCBvbmx5IGFuIElEIHNvIHdlJ2xsIGNoZWNrIGZvciB0aGF0ICovXHJcbiAgICBpZiAoZGF0YS5pZCA9PT0gJ2hhaXJDb2xvcicpIHtcclxuICAgICAgICBTZXRQZWRIYWlyVGludChwZWRIYW5kbGUsIGRhdGEuaGFpckNvbG9yLCBkYXRhLmhhaXJIaWdobGlnaHQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZEhlYWRPdmVybGF5KHBlZEhhbmRsZSwgaW5kZXgsIHZhbHVlLCBkYXRhLm92ZXJsYXlPcGFjaXR5ICsgMC4wKVxyXG4gICAgU2V0UGVkSGVhZE92ZXJsYXlDb2xvcihwZWRIYW5kbGUsIGluZGV4LCAxLCBkYXRhLmZpcnN0Q29sb3IsIGRhdGEuc2Vjb25kQ29sb3IpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZE92ZXJsYXknLCBzZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VG9nZ2xlcyhkYXRhKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcblxyXG4gICAgZm9yIChjb25zdCBbdG9nZ2xlSXRlbSwgdG9nZ2xlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoVE9HR0xFX0lOREVYRVMpKSB7XHJcbiAgICAgICAgY29uc3QgdG9nZ2xlVHlwZSA9IHRvZ2dsZURhdGEudHlwZVxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdG9nZ2xlRGF0YS5pbmRleFxyXG5cclxuICAgICAgICBpZiAodG9nZ2xlVHlwZSA9PT0gXCJkcmF3YWJsZVwiICYmIGRyYXdhYmxlc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudERyYXdhYmxlICE9PSBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRvZ2dsZVR5cGUgPT09IFwicHJvcFwiICYmIHByb3BzW3RvZ2dsZUl0ZW1dKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcCAhPT0gcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZFByb3BJbmRleChwZWQsIGluZGV4LCBwcm9wc1t0b2dnbGVJdGVtXS52YWx1ZSwgMCwgZmFsc2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZENsb3RoZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRDbG90aGVzKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIFNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuXHJcbiAgICBjb25zdCBjb2xvciA9IGRhdGEuY29sb3JcclxuICAgIGNvbnN0IGhpZ2hsaWdodCA9IGRhdGEuaGlnaGxpZ2h0XHJcbiAgICBTZXRQZWRIYWlyQ29sb3IocGVkSGFuZGxlLCBjb2xvciwgaGlnaGxpZ2h0KVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEhhaXJDb2xvcnMnLCBzZXRQZWRIYWlyQ29sb3JzKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQZWRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIC8vIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgYWZ0ZXIgc2NyaXB0cyBzZXQgdGhlaXIgb3duIG1vZGVsLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGVkIGJlZm9yZSB3ZSBzZXQgdGhlIGFwcGVhcmFuY2VcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWQsIGRhdGEpXHJcbiAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGVkIGFnYWluIGFmdGVyIHNldHRpbmcgdGhlIHNraW4gYmVjYXVzZSBTZXRQbGF5ZXJNb2RlbCB3aWxsIHNldCBhIG5ldyBQbGF5ZXJQZWRJZFxyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZCwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuXHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKVxyXG5leHBvcnRzKCdTZXRQZWRTa2luJywgc2V0UGVkU2tpbilcclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpXHJcbmV4cG9ydHMoJ1NldFBlZEhhaXJDb2xvcnMnLCBzZXRQZWRIYWlyQ29sb3JzKSIsICJpbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcbmltcG9ydCB7XHJcblx0cmVzZXRUb2dnbGVzLFxyXG5cdHNldERyYXdhYmxlLFxyXG5cdFNldEZhY2VGZWF0dXJlLFxyXG5cdHNldEhlYWRCbGVuZCxcclxuXHRzZXRIZWFkT3ZlcmxheSxcclxuXHRzZXRNb2RlbCxcclxuXHRzZXRQZWRDbG90aGVzLFxyXG5cdHNldFBlZFRhdHRvb3MsXHJcblx0c2V0UGxheWVyUGVkQXBwZWFyYW5jZSxcclxuXHRzZXRQcm9wLFxyXG59IGZyb20gJy4vYXBwZWFyYW5jZS9zZXR0ZXJzJztcclxuaW1wb3J0IHsgY2xvc2VNZW51IH0gZnJvbSAnLi9tZW51JztcclxuaW1wb3J0IHsgVEFwcGVhcmFuY2UsIFRUb2dnbGVEYXRhLCBUVmFsdWUgfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZGVsYXksIGdldEZyYW1ld29ya0lELCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIHBlZCwgdXBkYXRlUGVkIH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0VGF0dG9vRGF0YSB9IGZyb20gJy4vYXBwZWFyYW5jZS9nZXR0ZXJzJztcclxuaW1wb3J0IFRPR0dMRV9JTkRFWEVTIGZyb20gJ0BkYXRhL3RvZ2dsZXMnO1xyXG5pbXBvcnQgeyBUT3V0Zml0RGF0YSB9IGZyb20gJ0B0eXBpbmdzL291dGZpdHMnO1xyXG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSAnQHR5cGluZ3MvdGF0dG9vcyc7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FuY2VsLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSk7XHJcblx0Y2xvc2VNZW51KCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmUsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0cmVzZXRUb2dnbGVzKGFwcGVhcmFuY2UpO1xyXG5cclxuXHRhd2FpdCBkZWxheSgxMDApO1xyXG5cclxuXHRjb25zdCBuZXdBcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWQpO1xyXG5cdG5ld0FwcGVhcmFuY2UudGF0dG9vcyA9IGFwcGVhcmFuY2UudGF0dG9vcyB8fCBudWxsXHJcblx0dHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlQXBwZWFyYW5jZScsIGdldEZyYW1ld29ya0lEKCksIG5ld0FwcGVhcmFuY2UpO1xyXG5cclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgbmV3QXBwZWFyYW5jZS50YXR0b29zKTtcclxuXHJcblx0Y2xvc2VNZW51KCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldE1vZGVsLCBhc3luYyAobW9kZWw6IHN0cmluZywgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgaGFzaCA9IEdldEhhc2hLZXkobW9kZWwpO1xyXG5cdGlmICghSXNNb2RlbEluQ2RpbWFnZShoYXNoKSB8fCAhSXNNb2RlbFZhbGlkKGhhc2gpKSB7XHJcblx0XHRyZXR1cm4gY2IoMCk7XHJcblx0fVxyXG5cclxuXHJcblx0Y29uc3QgbmV3UGVkID0gYXdhaXQgc2V0TW9kZWwocGVkLCBoYXNoKTtcclxuXHJcbiAgICB1cGRhdGVQZWQobmV3UGVkKVxyXG5cclxuXHRjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWQpO1xyXG5cclxuXHRhcHBlYXJhbmNlLnRhdHRvb3MgPSBbXTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIFtdKTtcclxuXHJcblx0Y2IoYXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmdldE1vZGVsVGF0dG9vcywgYXN5bmMgKF86IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgdGF0dG9vcyA9IGdldFRhdHRvb0RhdGEoKTtcclxuXHJcblx0Y2IodGF0dG9vcyk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRTdHJ1Y3R1cmUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdFNldEZhY2VGZWF0dXJlKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRPdmVybGF5LCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkT3ZlcmxheShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkQmxlbmQsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldEhlYWRCbGVuZChwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRUYXR0b29zLCBhc3luYyAoZGF0YTogVFRhdHRvb1tdLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldFByb3AsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0UHJvcChwZWQsIGRhdGEpO1xyXG5cdGNiKHRleHR1cmUpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXREcmF3YWJsZSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0bGV0IHRleHR1cmUgPSBzZXREcmF3YWJsZShwZWQsIGRhdGEpO1xyXG5cdGNiKHRleHR1cmUpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS50b2dnbGVJdGVtLCBhc3luYyAoZGF0YTogVFRvZ2dsZURhdGEsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGl0ZW0gPSBUT0dHTEVfSU5ERVhFU1tkYXRhLml0ZW1dO1xyXG5cdGlmICghaXRlbSkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0Y29uc3QgY3VycmVudCA9IGRhdGEuZGF0YTtcclxuXHRjb25zdCB0eXBlID0gaXRlbS50eXBlO1xyXG5cdGNvbnN0IGluZGV4ID0gaXRlbS5pbmRleDtcclxuXHRjb25zdCBob29rID0gaXRlbS5ob29rO1xyXG5cdGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ob29rRGF0YTtcclxuXHJcblx0aWYgKCFjdXJyZW50KSByZXR1cm4gY2IoZmFsc2UpO1xyXG5cclxuXHRpZiAodHlwZSA9PT0gJ3Byb3AnKSB7XHJcblx0XHRjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KTtcclxuXHJcblx0XHRpZiAoY3VycmVudFByb3AgPT09IC0xKSB7XHJcblx0XHRcdHNldFByb3AocGVkLCBjdXJyZW50KTtcclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRDbGVhclBlZFByb3AocGVkLCBpbmRleCk7XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICh0eXBlID09PSAnZHJhd2FibGUnKSB7XHJcblx0XHRjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KTtcclxuXHJcblx0XHRpZiAoY3VycmVudC52YWx1ZSA9PT0gaXRlbS5vZmYpIHtcclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGN1cnJlbnREcmF3YWJsZSkge1xyXG5cdFx0XHRTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgaXRlbS5vZmYsIDAsIDApO1xyXG5cdFx0XHRpZiAoaG9vaykge1xyXG5cdFx0XHRcdGZvcihsZXQgaT0wOyBpIDwgaG9vay5kcmF3YWJsZXM/Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBob29rSXRlbSA9IGhvb2suZHJhd2FibGVzW2ldO1xyXG5cdFx0XHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaG9va0l0ZW0uY29tcG9uZW50LCBob29rSXRlbS52YXJpYW50LCBob29rSXRlbS50ZXh0dXJlLCAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Y2IodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNldERyYXdhYmxlKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGZvcihsZXQgaT0wOyBpIDwgaG9va0RhdGE/Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0c2V0RHJhd2FibGUocGVkLCBob29rRGF0YVtpXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2IoZmFsc2UpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbik7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2F2ZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZGVsZXRlT3V0Zml0LCBhc3luYyAoe2lkfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUucmVuYW1lT3V0Zml0LCBhc3luYyAoZGF0YTogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnVzZU91dGZpdCwgYXN5bmMgKG91dGZpdDogVE91dGZpdERhdGEsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldFBlZENsb3RoZXMocGVkLCBvdXRmaXQpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5pbXBvcnRPdXRmaXQsIGFzeW5jICh7IGlkLCBvdXRmaXROYW1lIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGZyYW1ld29ya2RJZCA9IGdldEZyYW1ld29ya0lEKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppbXBvcnRPdXRmaXQnLCBmcmFtZXdvcmtkSWQsIGlkLCBvdXRmaXROYW1lKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5mZXRjaE91dGZpdCwgYXN5bmMgKHsgaWQgfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGlkKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5pdGVtT3V0Zml0LCBhc3luYyAoZGF0YToge291dGZpdDogVE91dGZpdERhdGEsIGxhYmVsOiBzdHJpbmd9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOml0ZW1PdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjp1c2VPdXRmaUl0ZW0nLCAob3V0Zml0OiBUT3V0Zml0RGF0YSkgPT4ge1xyXG5cdHNldFBlZENsb3RoZXMocGVkLCBvdXRmaXQpO1xyXG59KSIsICJpbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgcmVxdWVzdExvY2FsZSwgc2VuZE5VSUV2ZW50LCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIHVwZGF0ZVBlZCwgcGVkLCBnZXRQbGF5ZXJEYXRhLCBnZXRKb2JJbmZvLCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBzdGFydENhbWVyYSwgc3RvcENhbWVyYSB9IGZyb20gXCIuL2NhbWVyYVwiXHJcbmltcG9ydCB0eXBlIHsgVEFwcGVhcmFuY2Vab25lLCBUTWVudVR5cGVzIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxyXG5pbXBvcnQgeyBPdXRmaXQgfSBmcm9tIFwiQHR5cGluZ3Mvb3V0Zml0c1wiXHJcbmltcG9ydCB7IFNlbmQgfSBmcm9tIFwiQGV2ZW50c1wiXHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL2dldHRlcnNcIlxyXG5pbXBvcnQgXCIuL2hhbmRsZXJzXCJcclxuaW1wb3J0IHsgc2V0TW9kZWwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5cclxuY29uc3QgY29uZmlnID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlXHJcbmxldCBhcm1vdXIgPSAwXHJcbmxldCBvcGVuID0gZmFsc2VcclxuXHJcbmxldCByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbmxldCBwcm9taXNlID0gbnVsbDtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuTWVudSh6b25lOiBUQXBwZWFyYW5jZVpvbmUgfCBUQXBwZWFyYW5jZVpvbmVbJ3R5cGUnXSwgY3JlYXRpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHpvbmUgPT09IG51bGwgfHwgb3Blbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGVkSGFuZGxlID0gUGxheWVyUGVkSWQoKVxyXG4gICAgY29uc3QgY29uZmlnTWVudXMgPSBjb25maWcubWVudXMoKVxyXG5cclxuICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnXHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGlzU3RyaW5nID8gem9uZSA6IHpvbmUudHlwZVxyXG5cclxuICAgIGNvbnN0IG1lbnUgPSBjb25maWdNZW51c1t0eXBlXVxyXG4gICAgaWYgKCFtZW51KSByZXR1cm5cclxuXHJcbiAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG5cclxuICAgIGNvbnN0IGZyYW1ld29ya2RJZCA9IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IHRhYnMgPSBtZW51LnRhYnNcclxuICAgIGxldCBhbGxvd0V4aXQgPSBjcmVhdGlvbiA/IGZhbHNlIDogbWVudS5hbGxvd0V4aXRcclxuXHJcbiAgICBhcm1vdXIgPSBHZXRQZWRBcm1vdXIocGVkSGFuZGxlKVxyXG5cclxuICAgIGxldCBvdXRmaXRzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNPdXRmaXRUYWIgPSB0YWJzLmluY2x1ZGVzKCdvdXRmaXRzJylcclxuICAgIGlmIChoYXNPdXRmaXRUYWIpIG91dGZpdHMgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8T3V0Zml0W10+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRPdXRmaXRzJywgZnJhbWV3b3JrZElkKSBhcyBPdXRmaXRbXVxyXG5cclxuICAgIGxldCBtb2RlbHMgPSBbXVxyXG5cclxuICAgIGNvbnN0IGhhc0hlcml0YWdlVGFiID0gdGFicy5pbmNsdWRlcygnaGVyaXRhZ2UnKVxyXG4gICAgaWYgKGhhc0hlcml0YWdlVGFiKSB7XHJcbiAgICAgICAgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzVGF0dG9vVGFiID0gdGFicy5pbmNsdWRlcygndGF0dG9vcycpXHJcbiAgICBsZXQgdGF0dG9vc1xyXG4gICAgaWYgKGhhc1RhdHRvb1RhYikge1xyXG4gICAgICAgIHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBibGFja2xpc3QgPSBnZXRCbGFja2xpc3Qoem9uZSlcclxuXHJcbiAgICBpZiAoY3JlYXRpb24pIHtcclxuICAgICAgICBjb25zdCBtb2RlbCA9IEdldEhhc2hLZXkoZ2V0UGxheWVyR2VuZGVyTW9kZWwoKSk7XHJcbiAgICAgICAgcGVkSGFuZGxlID0gYXdhaXQgc2V0TW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2V0cm91dGluZ2J1Y2tldCcpXHJcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkSGFuZGxlKVxyXG5cclxuICAgIHN0YXJ0Q2FtZXJhKClcclxuXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC5kYXRhLCB7XHJcbiAgICAgICAgdGFicyxcclxuICAgICAgICBhcHBlYXJhbmNlLFxyXG4gICAgICAgIGJsYWNrbGlzdCxcclxuICAgICAgICB0YXR0b29zLFxyXG4gICAgICAgIG91dGZpdHMsXHJcbiAgICAgICAgbW9kZWxzLFxyXG4gICAgICAgIGFsbG93RXhpdCxcclxuICAgICAgICBqb2I6IGdldEpvYkluZm8oKSxcclxuICAgICAgICBsb2NhbGU6IGF3YWl0IHJlcXVlc3RMb2NhbGUoJ2xvY2FsZScpXHJcbiAgICB9KVxyXG5cclxuICAgIFNldE51aUZvY3VzKHRydWUsIHRydWUpXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC52aXNpYmxlLCB0cnVlKVxyXG5cclxuICAgIG9wZW4gPSB0cnVlXHJcblxyXG4gICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmhpZGVIdWQodHJ1ZSlcclxuXHJcbiAgICBpZiAocHJvbWlzZSkge1xyXG4gICAgICAgIGF3YWl0IHByb21pc2VcclxuICAgICAgICBlbWl0TmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZXNldHJvdXRpbmdidWNrZXQnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9taXNlID0gbnVsbDtcclxuICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcclxuICAgIHJldHVybiB0cnVlXHJcbn1cclxuZXhwb3J0cygnT3Blbk1lbnUnLCBvcGVuTWVudSlcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgnYXBwZWFyYW5jZScsIGFzeW5jIChfLCBhcmdzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgY29uc3QgdHlwZSA9IGFyZ3NbMF1cclxuICAgIGlmICghdHlwZSkge1xyXG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCB6b25lID0gdHlwZS50b0xvd2VyQ2FzZSgpIGFzIFRNZW51VHlwZXNcclxuICAgICAgICBvcGVuTWVudSh6b25lKVxyXG4gICAgfVxyXG59LCB0cnVlKVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdldEJsYWNrbGlzdCh6b25lOiBUQXBwZWFyYW5jZVpvbmUgfCBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHtncm91cFR5cGVzLCBiYXNlfSA9IGNvbmZpZy5ibGFja2xpc3QoKVxyXG5cclxuICAgIGlmICh0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZycpIHJldHVybiBiYXNlXHJcblxyXG4gICAgaWYgKCFncm91cFR5cGVzKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGxldCBibGFja2xpc3QgPSB7Li4uYmFzZX1cclxuXHJcbiAgICBjb25zdCBwbGF5ZXJEYXRhID0gZ2V0UGxheWVyRGF0YSgpXHJcblxyXG5cclxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBncm91cFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBUeXBlc1t0eXBlXVxyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gZ3JvdXBzKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnam9icycgJiYgem9uZS5qb2JzKSB7XHJcbiAgICAgICAgICAgICAgICBza2lwID0gem9uZS5qb2JzLmluY2x1ZGVzKHBsYXllckRhdGEuam9iLm5hbWUpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09ICdnYW5ncycgJiYgem9uZS5nYW5ncykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuZ2FuZ3MuaW5jbHVkZXMocGxheWVyRGF0YS5nYW5nLm5hbWUpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2tpcCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBCbGFja2xpc3QgPSBncm91cHNbZ3JvdXBdXHJcbiAgICAgICAgICAgICAgICBibGFja2xpc3QgPSBPYmplY3QuYXNzaWduKHt9LCBibGFja2xpc3QsIGdyb3VwQmxhY2tsaXN0LCB7XHJcbiAgICAgICAgICAgICAgICAgIGRyYXdhYmxlczogT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LmRyYXdhYmxlcywgZ3JvdXBCbGFja2xpc3QuZHJhd2FibGVzKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmxhY2tsaXN0XHJcblxyXG4gICAgLy8gcmV0dXJuIGJsYWNrbGlzdFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VNZW51KCkge1xyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3VyKVxyXG5cclxuICAgIHN0b3BDYW1lcmEoKVxyXG4gICAgU2V0TnVpRm9jdXMoZmFsc2UsIGZhbHNlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgZmFsc2UpXHJcblxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKGZhbHNlKVxyXG5cclxuICAgIGlmIChyZXNvbHZlUHJvbWlzZSkge1xyXG4gICAgICAgIHJlc29sdmVQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBvcGVuID0gZmFsc2VcclxufVxyXG4iLCAiXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcbmltcG9ydCB7IHNldFBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4uL21lbnVcIlxuXG5leHBvcnQgZnVuY3Rpb24gUUJCcmlkZ2UoKSB7XG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpsb2FkUGxheWVyQ2xvdGhpbmcnLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pXG5cbiAgICBvbk5ldCgncWItY2xvdGhlczpjbGllbnQ6Q3JlYXRlRmlyc3RDaGFyYWN0ZXInLCAoKSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pXG5cbiAgICBvbk5ldCgncWItY2xvdGhpbmc6Y2xpZW50Om9wZW5PdXRmaXRNZW51JywgKCkgPT4ge1xuICAgICAgICBvcGVuTWVudSh7IHR5cGU6IFwib3V0Zml0c1wiLCBjb29yZHM6IFswLCAwLCAwLCAwXSB9KSAgXG4gICAgfSlcbn0iLCAiXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcbmltcG9ydCB7IHNldFBlZEFwcGVhcmFuY2UsIHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcbmltcG9ydCB7IGdldEZyYW1ld29ya0lELCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2sgfSBmcm9tIFwiQHV0aWxzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIEVTWEJyaWRnZSgpIHtcbiAgICBsZXQgZmlyc3RTcGF3biA9IGZhbHNlXG5cbiAgICBvbihcImVzeF9za2luOnJlc2V0Rmlyc3RTcGF3blwiLCAoKSA9PiB7XG4gICAgICAgIGZpcnN0U3Bhd24gPSB0cnVlXG4gICAgfSk7XG5cbiAgICBvbihcImVzeF9za2luOnBsYXllclJlZ2lzdGVyZWRcIiwgKCkgPT4ge1xuICAgICAgICBpZihmaXJzdFNwYXduKVxuICAgICAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSk7XG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6bG9hZFNraW4yJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoIWFwcGVhcmFuY2UubW9kZWwpIGFwcGVhcmFuY2UubW9kZWwgPSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKTtcbiAgICAgICAgYXdhaXQgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6Z2V0U2tpbicsIGFzeW5jIChjYjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxuICAgICAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxuICAgICAgICBjYihhcHBlYXJhbmNlKVxuICAgIH0pXG5cbiAgICBvbk5ldCgnc2tpbmNoYW5nZXI6bG9hZFNraW4nLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBhbnkpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxuICAgICAgICBpZiAoY2IpIGNiKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ2VzeF9za2luOm9wZW5TYXZlYWJsZU1lbnUnLCBhc3luYyAob25TdWJtaXQ6IGFueSkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKG9uU3VibWl0KVxuICAgIH0pXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldERyYXdhYmxlcywgZ2V0UHJvcHMgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCI7XG5pbXBvcnQgeyBzZXREcmF3YWJsZSwgc2V0TW9kZWwsIHNldFBlZEFwcGVhcmFuY2UsIHNldFBlZFRhdHRvb3MsIHNldFByb3AgfSBmcm9tIFwiLi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCI7XG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSBcIkB0eXBpbmdzL3RhdHRvb3NcIjtcbmltcG9ydCB7IHBlZCwgdXBkYXRlUGVkIH0gZnJvbSBcIkB1dGlsc1wiO1xuXG5mdW5jdGlvbiBleHBvcnRIYW5kbGVyKG5hbWU6IHN0cmluZywgY2I6IGFueSkge1xuICAgIG9uKCdfX2NmeF9leHBvcnRfaWxsZW5pdW0tYXBwZWFyYW5jZV8nICsgbmFtZSwgKHNldENCOiBhbnkpID0+IHtcbiAgICAgICAgc2V0Q0IoY2IpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbGxlbml1bUNvbXBhdCgpIHtcbiAgICBleHBvcnRIYW5kbGVyKCdzdGFydFBsYXllckN1c3RvbWl6YXRpb24nLCAoKSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkTW9kZWwnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIEdldEVudGl0eU1vZGVsKHBlZClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZENvbXBvbmVudHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZHJhd2FibGVzOiBhbnkgPSBnZXREcmF3YWJsZXMocGVkKVswXTtcbiAgICAgICAgbGV0IG5ld2RyYXdhYmxlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZHJhd2FibGVzKSB7XG4gICAgICAgICAgICBjb25zdCBkcmF3YWJsZSA9IGRyYXdhYmxlc1tpZF07XG4gICAgICAgICAgICBuZXdkcmF3YWJsZS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQ6IGRyYXdhYmxlLmluZGV4LFxuICAgICAgICAgICAgICAgIGRyYXdhYmxlOiBkcmF3YWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRQcm9wcycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwcm9wczogYW55ID0gIGdldFByb3BzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdQcm9wcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaWRdO1xuICAgICAgICAgICAgbmV3UHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgcHJvcF9pZDogcHJvcC5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogcHJvcC52YWx1ZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhlYWRCbGVuZCcsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRCbGVuZERhdGEocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEZhY2VGZWF0dXJlcycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRTdHJ1Y3R1cmUocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8vcmV0dXJuIGdldEhlYWRPdmVybGF5KHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIYWlyJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vcmV0dXJuIGdldEhhaXIocGVkKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0QXBwZWFyYW5jZShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGxheWVyTW9kZWwnLCAobW9kZWw6IG51bWJlcikgPT4ge1xuICAgICAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcbiAgICAgICAgc2V0TW9kZWwocGVkLCBtb2RlbCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIsIGJsZW5kOiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRIZWFkQmxlbmQocGVkLCBibGVuZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEZhY2VGZWF0dXJlcycsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZE92ZXJsYXlzJywgKHBlZDogbnVtYmVyLCBvdmVybGF5OiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRIZWFkT3ZlcmxheShwZWQsIG92ZXJsYXkpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIYWlyJywgYXN5bmMgKHBlZDogbnVtYmVyLCBoYWlyOiBhbnksIHRhdHRvbzogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0UGVkSGFpckNvbG9ycyhwZWQsIGhhaXIpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRFeWVDb2xvcicsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQ29tcG9uZW50JywgKHBlZDogbnVtYmVyLCBkcmF3YWJsZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0RyYXdhYmxlID0ge1xuICAgICAgICAgICAgaW5kZXg6IGRyYXdhYmxlLmNvbXBvbmVudF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBkcmF3YWJsZS5kcmF3YWJsZSxcbiAgICAgICAgICAgIHRleHR1cmU6IGRyYXdhYmxlLnRleHR1cmVcbiAgICAgICAgfVxuICAgICAgICBzZXREcmF3YWJsZShwZWQsIG5ld0RyYXdhYmxlKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudHMnLCAocGVkOiBudW1iZXIsIGNvbXBvbmVudHM6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogY29tcG9uZW50LmNvbXBvbmVudF9pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50LmRyYXdhYmxlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IGNvbXBvbmVudC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXREcmF3YWJsZShwZWQsIG5ld0RyYXdhYmxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcCcsIChwZWQ6IG51bWJlciwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Byb3AgPSB7XG4gICAgICAgICAgICBpbmRleDogcHJvcC5wcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRQcm9wcycsIChwZWQ6IG51bWJlciwgcHJvcHM6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Byb3AgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBwcm9wLnRleHR1cmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFByb3AocGVkLCBuZXdQcm9wKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZXhwb3J0SGFuZGxlcignc2V0UGxheWVyQXBwZWFyYW5jZScsIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkgPT4ge1xuICAgIC8vICAgICByZXR1cm4gY29uc29sZS53YXJuKCdOZWVkIHRvIGJlIGltcGxlbWVudGVkJyk7XG4gICAgLy8gfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRBcHBlYXJhbmNlJywgKHBlZDogbnVtYmVyLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkgPT4ge1xuICAgICAgICBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFRhdHRvb3MnLCAocGVkOiBudW1iZXIsIHRhdHRvb3M6IFRUYXR0b29bXSkgPT4ge1xuICAgICAgICBzZXRQZWRUYXR0b29zKHBlZCwgdGF0dG9vcylcbiAgICB9KTtcbn0iLCAiaW1wb3J0IHsgVEFwcGVhcmFuY2UsIFRBcHBlYXJhbmNlWm9uZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgb3Blbk1lbnUgfSBmcm9tIFwiLi9tZW51XCJcclxuaW1wb3J0IHsgc2V0UGxheWVyUGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXHJcbmltcG9ydCB7IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgZ2V0RnJhbWV3b3JrSUQsIERlbGF5LCBibF9icmlkZ2UsIHBlZCwgZGVsYXksIGZvcm1hdCwgdXBkYXRlUGVkIH0gZnJvbSBcIkB1dGlsc1wiXHJcbmltcG9ydCB7IFFCQnJpZGdlIH0gZnJvbSBcIi4vYnJpZGdlL3FiXCJcclxuaW1wb3J0IHsgRVNYQnJpZGdlIH0gZnJvbSBcIi4vYnJpZGdlL2VzeFwiXHJcbmltcG9ydCB7IGlsbGVuaXVtQ29tcGF0IH0gZnJvbSBcIi4vY29tcGF0L2lsbGVuaXVtXCJcclxuXHJcbmV4cG9ydHMoJ1NldFBsYXllclBlZEFwcGVhcmFuY2UnLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UgfCBzdHJpbmcpID0+IHtcclxuICAgIGxldCByZXNvbHZlZEFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UgfHwgdHlwZW9mIGFwcGVhcmFuY2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQ6IHN0cmluZyA9IGFwcGVhcmFuY2UgfHwgYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKTtcclxuICAgICAgICByZXNvbHZlZEFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpIGFzIFRBcHBlYXJhbmNlO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXBwZWFyYW5jZSA9PT0gJ29iamVjdCcpIHJlc29sdmVkQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7XHJcbiAgICBcclxuICAgIGlmICghcmVzb2x2ZWRBcHBlYXJhbmNlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB2YWxpZCBhcHBlYXJhbmNlIGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UocmVzb2x2ZWRBcHBlYXJhbmNlKTtcclxufSk7XHJcblxyXG5leHBvcnRzKCdHZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGZyYW1ld29ya0lEOiBzdHJpbmcpID0+IHtcclxuICAgIGZyYW1ld29ya0lEID0gZnJhbWV3b3JrSUQgfHwgYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxufSlcclxuXHJcbmV4cG9ydHMoJ0luaXRpYWxDcmVhdGlvbicsIGFzeW5jIChjYj86IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgbmVlZHMgdG8gYmUgdHlwZSBvZiBUQXBwZWFyYW5jZVpvbmUgbWVhbmluZyBpdCBuZWVkcyBhIGNvb3JkcyBwcm9wZXJ0eSwgYnV0IGluIHRoaXMgY2FzZSBpdCdzIG5vdCB1c2VkXHJcbiAgICBhd2FpdCBvcGVuTWVudSh7IHR5cGU6IFwiYXBwZWFyYW5jZVwiLCBjb29yZHM6IFswLCAwLCAwLCAwXSB9LCB0cnVlKVxyXG4gICAgaWYgKGNiKSBjYigpXHJcbn0pXHJcblxyXG5vbignYmxfYXBwZWFyYW5jZTpjbGllbnQ6dXNlWm9uZScsICh6b25lOiBUQXBwZWFyYW5jZVpvbmUpID0+IHtcclxuICAgIG9wZW5NZW51KHpvbmUpXHJcbn0pXHJcblxyXG5vbk5ldCgnYmxfYnJpZGdlOmNsaWVudDpwbGF5ZXJMb2FkZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICB3aGlsZSAoIWJsX2JyaWRnZS5jb3JlKCkucGxheWVyTG9hZGVkKCkpIHtcclxuICAgICAgICBhd2FpdCBEZWxheSgxMDApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbn0pXHJcblxyXG5vbk5ldCgnb25SZXNvdXJjZVN0YXJ0JywgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChyZXNvdXJjZSA9PT0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpICYmIGJsX2JyaWRnZS5jb3JlKCkucGxheWVyTG9hZGVkKCkpIHtcclxuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgICAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxuICAgIH1cclxufSlcclxuXHJcbmNvbnN0IGZyYW1ld29ya05hbWUgPSBibF9icmlkZ2UuZ2V0RnJhbWV3b3JrKCdjb3JlJylcclxuY29uc3QgY29yZSA9IGZvcm1hdChHZXRDb252YXIoJ2JsOmZyYW1ld29yaycsICdxYicpKVxyXG5cclxuaWYgKGNvcmUgPT0gJ3FiJyB8fCBjb3JlID09ICdxYngnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBRQkJyaWRnZSgpO1xyXG59IGVsc2UgaWYgKGNvcmUgPT0gJ2VzeCcgJiYgR2V0UmVzb3VyY2VTdGF0ZShmcmFtZXdvcmtOYW1lKSA9PSAnc3RhcnRlZCcpIHtcclxuICAgIEVTWEJyaWRnZSgpO1xyXG59XHJcblxyXG5pbGxlbml1bUNvbXBhdCgpO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdyZWxvYWRza2luJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCBoZWFsdGggPSBHZXRFbnRpdHlIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IG1heGhlYWx0aCA9IEdldEVudGl0eU1heEhlYWx0aChwZWQpO1xyXG4gICAgY29uc3QgYXJtb3IgPSBHZXRQZWRBcm1vdXIocGVkKTtcclxuXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG4gICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcblxyXG4gICAgU2V0UGVkTWF4SGVhbHRoKHBlZCwgbWF4aGVhbHRoKVxyXG4gICAgZGVsYXkoMTAwMCkgXHJcbiAgICBTZXRFbnRpdHlIZWFsdGgocGVkLCBoZWFsdGgpXHJcbiAgICBTZXRQZWRBcm1vdXIocGVkLCBhcm1vcilcclxufSwgZmFsc2UpXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBTyxJQUFJLE1BQU07QUFFVixJQUFNLFlBQVksd0JBQUMsY0FBc0I7QUFDNUMsUUFBTTtBQUNWLEdBRnlCO0FBYWxCLElBQU0sZUFBZSx3QkFBQyxRQUFnQixTQUFjO0FBQ3ZELGlCQUFlO0FBQUEsSUFD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RCxJQUFJLFFBQVEsUUFBUSxRQUFRLFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxXQUFXO0FBQy9FLFdBQVM7QUFDYixXQUFXLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDdEUsWUFBVTtBQUNkO0FBRUEsZUFBZTtBQUVmLGdCQUFnQixjQUFjLFlBQVk7QUFDdEMsUUFBTSxjQUFjLE1BQU0sZUFBZTtBQUN6QyxRQUFNLFNBQVMsZ0JBQWdCLEdBQUc7QUFDbEMsUUFBTSxZQUFZLG1CQUFtQixHQUFHO0FBQ3hDLFFBQU0sUUFBUSxhQUFhLEdBQUc7QUFFOUIsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFFdkMsa0JBQWdCLEtBQUssU0FBUztBQUM5QixRQUFNLEdBQUk7QUFDVixrQkFBZ0IsS0FBSyxNQUFNO0FBQzNCLGVBQWEsS0FBSyxLQUFLO0FBQzNCLEdBQUcsS0FBSzsiLAogICJuYW1lcyI6IFsiZGVsYXkiLCAicGVkIiwgIngiLCAieSIsICJ6IiwgImNvbmZpZyIsICJwZWQiLCAicGVkIiwgInBlZCJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXREcmF3YWJsZScpXHJcblxyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQcm9wJylcclxuXHJcbiAgICBpZiAoZGF0YS52YWx1ZSA9PT0gLTEpIHtcclxuICAgICAgICBDbGVhclBlZFByb3AocGVkSGFuZGxlLCBkYXRhLmluZGV4KVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZFByb3BJbmRleChwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgZmFsc2UpXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRQcm9wVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFByb3AnLCBzZXRQcm9wKTtcclxuXHJcbmNvbnN0IGRlZk1hbGVIYXNoID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIilcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNb2RlbCA9IGFzeW5jIChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UgfCBUU2tpbiB8IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0TW9kZWwnKVxyXG4gICAgICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlJylcclxuXHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnc2V0RmFjZUZlYXR1cmUnLCBzZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07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QUVELEdBQUcsZ0NBQWdDLENBQUMsU0FBMEI7QUFDMUQsV0FBUyxJQUFJO0FBQ2pCLENBQUM7QUFFRCxNQUFNLGlDQUFpQyxZQUFZO0FBQy9DLFNBQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxhQUFhLEdBQUc7QUFDckMsVUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNuQjtBQUNBLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFDM0MsQ0FBQztBQUVELE1BQU0sbUJBQW1CLE9BQU8sYUFBcUI7QUFDakQsTUFBSSxhQUFhLHVCQUF1QixLQUFLLFVBQVUsS0FBSyxFQUFFLGFBQWEsR0FBRztBQUMxRSxVQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFVBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxRQUFJLENBQUM7QUFBWTtBQUNqQixVQUFNLHVCQUF1QixVQUFVO0FBQUEsRUFDM0M7QUFDSixDQUFDO0FBRUQsSUFBTSxnQkFBZ0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= diff --git a/dist/client/init.js.map b/dist/client/init.js.map index 26f8e2f..fea9511 100644 --- a/dist/client/init.js.map +++ b/dist/client/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], - "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) return pedHandle;\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function SetFaceFeature(pedHandle: number, data: TValue) {\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', SetFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n SetFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tSetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tSetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], - "mappings": "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", + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('setFaceFeature', setFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "mappings": "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", "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] } diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index aeb8877..d0afe0e 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -4,12 +4,16 @@ import { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils'; import { TTattoo } from "@typings/tattoos"; export function setDrawable(pedHandle: number, data: TValue) { + if (!data) return console.warn('No data provided for setDrawable') + SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0) return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value) } exports('SetDrawable', setDrawable); export function setProp(pedHandle: number, data: TValue) { + if (!data) return console.warn('No data provided for setProp') + if (data.value === -1) { ClearPedProp(pedHandle, data.index) return @@ -23,7 +27,10 @@ exports('SetProp', setProp); const defMaleHash = GetHashKey("mp_m_freemode_01") export const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => { - if (data == null || data === undefined) return pedHandle; + if (data == null || data === undefined) { + console.warn('No data provided for setModel') + return pedHandle; + } let model: number; if (typeof data === 'string') { @@ -70,14 +77,18 @@ export const setModel = async (pedHandle: number, data: TAppearance | TSkin | nu }; exports('SetModel', setModel); -export function SetFaceFeature(pedHandle: number, data: TValue) { +export function setFaceFeature(pedHandle: number, data: TValue) { + if (!data) return console.warn('No data provided for setFaceFeature') + SetPedFaceFeature(pedHandle, data.index, data.value + 0.0) } -exports('SetFaceFeature', SetFaceFeature); +exports('setFaceFeature', setFaceFeature); const isPositive = (val: number) => val >= 0 ? val : 0 export function setHeadBlend(pedHandle: number, data) { + if (!data) return console.warn('No data provided for setHeadBlend') + pedHandle = pedHandle || ped if (!isPedFreemodeModel(pedHandle)) return @@ -98,6 +109,8 @@ export function setHeadBlend(pedHandle: number, data) { exports('SetHeadBlend', setHeadBlend); export function setHeadOverlay(pedHandle: number, data) { + if (!data) return console.warn('No data provided for setHeadOverlay') + const index = data.index if (index === 13) { @@ -143,6 +156,8 @@ export function resetToggles(data) { exports('SetPedClothes', setPedClothes); export function setPedClothes(pedHandle: number, data: TClothes) { + if (!data) return console.warn('No data provided for setPedClothes') + const drawables = data.drawables const props = data.props const headOverlay = data.headOverlay @@ -164,7 +179,9 @@ export function setPedClothes(pedHandle: number, data: TClothes) { exports('SetPedClothes', setPedClothes); export const setPedSkin = async (pedHandle: number, data: TSkin) => { - if (!data) return + if (!data) return console.warn('No data provided for setPedSkin') + + if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin') pedHandle = await setModel(pedHandle, data) @@ -175,13 +192,13 @@ export const setPedSkin = async (pedHandle: number, data: TSkin) => { if (headStructure) for (const feature in headStructure) { const value = headStructure[feature] - SetFaceFeature(pedHandle, value) + setFaceFeature(pedHandle, value) } } exports('SetPedSkin', setPedSkin); export function setPedTattoos(pedHandle: number, data: TTattoo[]) { - if (!data) return + if (!data) return console.warn('No data provided for setPedTattoos') ClearPedDecorationsLeaveScars(pedHandle) @@ -197,7 +214,8 @@ export function setPedTattoos(pedHandle: number, data: TTattoo[]) { exports('SetPedTattoos', setPedTattoos); export function setPedHairColors(pedHandle: number, data: THairColor) { - if (!data) return + if (!data) return console.warn('No data provided for setPedHairColors') + const color = data.color const highlight = data.highlight SetPedHairColor(pedHandle, color, highlight) @@ -205,6 +223,8 @@ export function setPedHairColors(pedHandle: number, data: THairColor) { exports('SetPedHairColors', setPedHairColors); export async function setPedAppearance(pedHandle: number, data: TAppearance) { + if (!data) return console.warn('No data provided for setPedAppearance') + if (IsPedAPlayer(pedHandle)) { setPlayerPedAppearance(data) return @@ -217,6 +237,7 @@ export async function setPedAppearance(pedHandle: number, data: TAppearance) { exports('SetPedAppearance', setPedAppearance); export async function setPlayerPedAppearance(data: TAppearance) { + if (!data) return console.warn('No data provided for setPlayerPedAppearance') // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance updatePed(PlayerPedId()) await setPedSkin(ped, data) diff --git a/src/client/handlers.ts b/src/client/handlers.ts index 0338ab5..a9640f3 100644 --- a/src/client/handlers.ts +++ b/src/client/handlers.ts @@ -2,7 +2,7 @@ import { Receive } from '@events'; import { resetToggles, setDrawable, - SetFaceFeature, + setFaceFeature, setHeadBlend, setHeadOverlay, setModel, @@ -67,7 +67,7 @@ RegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => { }); RegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => { - SetFaceFeature(ped, data); + setFaceFeature(ped, data); cb(1); }); From 750fcd09a34cdbee1a4f8957c6de2897f74e1d19 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 15:56:54 +1000 Subject: [PATCH 26/30] fix(SetFaceFeature): export name --- dist/client/init.js | 4 ++-- dist/client/init.js.map | 2 +- src/client/appearance/setters.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index aa108c8..8e71dd3 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -761,7 +761,7 @@ function setFaceFeature(pedHandle, data) { SetPedFaceFeature(pedHandle, data.index, data.value + 0); } __name(setFaceFeature, "setFaceFeature"); -exports("setFaceFeature", setFaceFeature); +exports("SetFaceFeature", setFaceFeature); var isPositive = /* @__PURE__ */ __name((val) => val >= 0 ? val : 0, "isPositive"); function setHeadBlend(pedHandle, data) { if (!data) @@ -1406,4 +1406,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXREcmF3YWJsZScpXHJcblxyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQcm9wJylcclxuXHJcbiAgICBpZiAoZGF0YS52YWx1ZSA9PT0gLTEpIHtcclxuICAgICAgICBDbGVhclBlZFByb3AocGVkSGFuZGxlLCBkYXRhLmluZGV4KVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZFByb3BJbmRleChwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgZmFsc2UpXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRQcm9wVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFByb3AnLCBzZXRQcm9wKTtcclxuXHJcbmNvbnN0IGRlZk1hbGVIYXNoID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIilcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNb2RlbCA9IGFzeW5jIChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UgfCBUU2tpbiB8IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0TW9kZWwnKVxyXG4gICAgICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlJylcclxuXHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnc2V0RmFjZUZlYXR1cmUnLCBzZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07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QUVELEdBQUcsZ0NBQWdDLENBQUMsU0FBMEI7QUFDMUQsV0FBUyxJQUFJO0FBQ2pCLENBQUM7QUFFRCxNQUFNLGlDQUFpQyxZQUFZO0FBQy9DLFNBQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxhQUFhLEdBQUc7QUFDckMsVUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNuQjtBQUNBLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFDM0MsQ0FBQztBQUVELE1BQU0sbUJBQW1CLE9BQU8sYUFBcUI7QUFDakQsTUFBSSxhQUFhLHVCQUF1QixLQUFLLFVBQVUsS0FBSyxFQUFFLGFBQWEsR0FBRztBQUMxRSxVQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFVBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxRQUFJLENBQUM7QUFBWTtBQUNqQixVQUFNLHVCQUF1QixVQUFVO0FBQUEsRUFDM0M7QUFDSixDQUFDO0FBRUQsSUFBTSxnQkFBZ0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXREcmF3YWJsZScpXHJcblxyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQcm9wJylcclxuXHJcbiAgICBpZiAoZGF0YS52YWx1ZSA9PT0gLTEpIHtcclxuICAgICAgICBDbGVhclBlZFByb3AocGVkSGFuZGxlLCBkYXRhLmluZGV4KVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZFByb3BJbmRleChwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgZmFsc2UpXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRQcm9wVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFByb3AnLCBzZXRQcm9wKTtcclxuXHJcbmNvbnN0IGRlZk1hbGVIYXNoID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIilcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNb2RlbCA9IGFzeW5jIChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UgfCBUU2tpbiB8IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0TW9kZWwnKVxyXG4gICAgICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlJylcclxuXHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmUnLCBzZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07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QUVELEdBQUcsZ0NBQWdDLENBQUMsU0FBMEI7QUFDMUQsV0FBUyxJQUFJO0FBQ2pCLENBQUM7QUFFRCxNQUFNLGlDQUFpQyxZQUFZO0FBQy9DLFNBQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxhQUFhLEdBQUc7QUFDckMsVUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNuQjtBQUNBLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFDM0MsQ0FBQztBQUVELE1BQU0sbUJBQW1CLE9BQU8sYUFBcUI7QUFDakQsTUFBSSxhQUFhLHVCQUF1QixLQUFLLFVBQVUsS0FBSyxFQUFFLGFBQWEsR0FBRztBQUMxRSxVQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFVBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxRQUFJLENBQUM7QUFBWTtBQUNqQixVQUFNLHVCQUF1QixVQUFVO0FBQUEsRUFDM0M7QUFDSixDQUFDO0FBRUQsSUFBTSxnQkFBZ0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= diff --git a/dist/client/init.js.map b/dist/client/init.js.map index fea9511..1ef13ef 100644 --- a/dist/client/init.js.map +++ b/dist/client/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], - "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('setFaceFeature', setFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], "mappings": "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", "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] } diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index d0afe0e..75b13fa 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -82,7 +82,7 @@ export function setFaceFeature(pedHandle: number, data: TValue) { SetPedFaceFeature(pedHandle, data.index, data.value + 0.0) } -exports('setFaceFeature', setFaceFeature); +exports('SetFaceFeature', setFaceFeature); const isPositive = (val: number) => val >= 0 ? val : 0 From 0f58c2c3a60b025e113e8b0d3ef65429968f1e58 Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 16:01:23 +1000 Subject: [PATCH 27/30] ref(facefeatures) --- dist/client/init.js | 17 ++++++++++++----- dist/client/init.js.map | 4 ++-- src/client/appearance/setters.ts | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 8e71dd3..90c85b7 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -762,6 +762,16 @@ function setFaceFeature(pedHandle, data) { } __name(setFaceFeature, "setFaceFeature"); exports("SetFaceFeature", setFaceFeature); +function setFaceFeatures(pedHandle, data) { + if (!data) + return console.warn("No data provided for setFaceFeatures"); + for (const feature in data) { + const value = data[feature]; + setFaceFeature(pedHandle, value); + } +} +__name(setFaceFeatures, "setFaceFeatures"); +exports("SetFaceFeatures", setFaceFeatures); var isPositive = /* @__PURE__ */ __name((val) => val >= 0 ? val : 0, "isPositive"); function setHeadBlend(pedHandle, data) { if (!data) @@ -854,10 +864,7 @@ var setPedSkin = /* @__PURE__ */ __name(async (pedHandle, data) => { if (headBlend) setHeadBlend(pedHandle, headBlend); if (headStructure) - for (const feature in headStructure) { - const value = headStructure[feature]; - setFaceFeature(pedHandle, value); - } + setFaceFeatures(pedHandle, headStructure); }, "setPedSkin"); exports("SetPedSkin", setPedSkin); function setPedTattoos(pedHandle, data) { @@ -1406,4 +1413,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tIFwiQGRhdGEvdG9nZ2xlc1wiXHJcbmltcG9ydCB7IHJlcXVlc3RNb2RlbCwgcGVkLCB1cGRhdGVQZWQsIGlzUGVkRnJlZW1vZGVNb2RlbH0gZnJvbSAnQHV0aWxzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RHJhd2FibGUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXREcmF3YWJsZScpXHJcblxyXG4gICAgU2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCAwKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldERyYXdhYmxlJywgc2V0RHJhd2FibGUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3AocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQcm9wJylcclxuXHJcbiAgICBpZiAoZGF0YS52YWx1ZSA9PT0gLTEpIHtcclxuICAgICAgICBDbGVhclBlZFByb3AocGVkSGFuZGxlLCBkYXRhLmluZGV4KVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZFByb3BJbmRleChwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgZmFsc2UpXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRQcm9wVGV4dHVyZVZhcmlhdGlvbnMocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFByb3AnLCBzZXRQcm9wKTtcclxuXHJcbmNvbnN0IGRlZk1hbGVIYXNoID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIilcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNb2RlbCA9IGFzeW5jIChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UgfCBUU2tpbiB8IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0TW9kZWwnKVxyXG4gICAgICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1vZGVsOiBudW1iZXI7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWwgPSBHZXRIYXNoS2V5KGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YS5tb2RlbCB8fCBkZWZNYWxlSGFzaDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kZWwgPT09IDApIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgYXdhaXQgcmVxdWVzdE1vZGVsKG1vZGVsKTtcclxuXHJcbiAgICBjb25zdCBpc1BsYXllciA9IElzUGVkQVBsYXllcihwZWRIYW5kbGUpO1xyXG4gICAgaWYgKGlzUGxheWVyKSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwoUGxheWVySWQoKSwgbW9kZWwpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IFBsYXllclBlZElkKCk7XHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU2V0UGxheWVyTW9kZWwocGVkSGFuZGxlLCBtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TW9kZWxBc05vTG9uZ2VyTmVlZGVkKG1vZGVsKTtcclxuICAgIFNldFBlZERlZmF1bHRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlKTtcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGNvbnN0IGlzSnVzdE1vZGVsID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJztcclxuICAgIGNvbnN0IGhhc0hlYWRCbGVuZCA9ICFpc0p1c3RNb2RlbCAmJiBkYXRhLmhlYWRCbGVuZCAmJiBPYmplY3Qua2V5cyhkYXRhLmhlYWRCbGVuZCkubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzSGVhZEJsZW5kKSB7XHJcbiAgICAgICAgc2V0SGVhZEJsZW5kKHBlZEhhbmRsZSwgKGRhdGEgYXMgVEFwcGVhcmFuY2UgfCBUU2tpbikuaGVhZEJsZW5kKTtcclxuICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDQ1LCAyMSwgMCwgMjAsIDE1LCAwLCAwLjMsIDAuMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG59O1xyXG5leHBvcnRzKCdTZXRNb2RlbCcsIHNldE1vZGVsKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlJylcclxuXHJcbiAgICBTZXRQZWRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUgKyAwLjApXHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmUnLCBzZXRGYWNlRmVhdHVyZSk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gaGVhZFN0cnVjdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZFN0cnVjdHVyZVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07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QUVELEdBQUcsZ0NBQWdDLENBQUMsU0FBMEI7QUFDMUQsV0FBUyxJQUFJO0FBQ2pCLENBQUM7QUFFRCxNQUFNLGlDQUFpQyxZQUFZO0FBQy9DLFNBQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxhQUFhLEdBQUc7QUFDckMsVUFBTSxNQUFNLEdBQUc7QUFBQSxFQUNuQjtBQUNBLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLE1BQUksQ0FBQztBQUFZO0FBQ2pCLFFBQU0sdUJBQXVCLFVBQVU7QUFDM0MsQ0FBQztBQUVELE1BQU0sbUJBQW1CLE9BQU8sYUFBcUI7QUFDakQsTUFBSSxhQUFhLHVCQUF1QixLQUFLLFVBQVUsS0FBSyxFQUFFLGFBQWEsR0FBRztBQUMxRSxVQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFVBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxRQUFJLENBQUM7QUFBWTtBQUNqQixVQUFNLHVCQUF1QixVQUFVO0FBQUEsRUFDM0M7QUFDSixDQUFDO0FBRUQsSUFBTSxnQkFBZ0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSwgVEhlYWRTdHJ1Y3R1cmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5pbXBvcnQgVE9HR0xFX0lOREVYRVMgZnJvbSBcIkBkYXRhL3RvZ2dsZXNcIlxyXG5pbXBvcnQgeyByZXF1ZXN0TW9kZWwsIHBlZCwgdXBkYXRlUGVkLCBpc1BlZEZyZWVtb2RlTW9kZWx9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldERyYXdhYmxlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RHJhd2FibGUnKVxyXG5cclxuICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgMClcclxuICAgIHJldHVybiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXREcmF3YWJsZScsIHNldERyYXdhYmxlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQcm9wKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UHJvcCcpXHJcblxyXG4gICAgaWYgKGRhdGEudmFsdWUgPT09IC0xKSB7XHJcbiAgICAgICAgQ2xlYXJQZWRQcm9wKHBlZEhhbmRsZSwgZGF0YS5pbmRleClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRQcm9wSW5kZXgocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIGZhbHNlKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkUHJvcFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXRQcm9wJywgc2V0UHJvcCk7XHJcblxyXG5jb25zdCBkZWZNYWxlSGFzaCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0TW9kZWwgPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlIHwgVFNraW4gfCBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldE1vZGVsJylcclxuICAgICAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtb2RlbDogbnVtYmVyO1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIG1vZGVsID0gR2V0SGFzaEtleShkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbW9kZWwgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGEubW9kZWwgfHwgZGVmTWFsZUhhc2g7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vZGVsID09PSAwKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGF3YWl0IHJlcXVlc3RNb2RlbChtb2RlbCk7XHJcblxyXG4gICAgY29uc3QgaXNQbGF5ZXIgPSBJc1BlZEFQbGF5ZXIocGVkSGFuZGxlKTtcclxuICAgIGlmIChpc1BsYXllcikge1xyXG4gICAgICAgIFNldFBsYXllck1vZGVsKFBsYXllcklkKCksIG1vZGVsKTtcclxuICAgICAgICBwZWRIYW5kbGUgPSBQbGF5ZXJQZWRJZCgpO1xyXG4gICAgICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIFNldFBsYXllck1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIFNldE1vZGVsQXNOb0xvbmdlck5lZWRlZChtb2RlbCk7XHJcbiAgICBTZXRQZWREZWZhdWx0Q29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSk7XHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuIHBlZEhhbmRsZTtcclxuXHJcbiAgICBjb25zdCBpc0p1c3RNb2RlbCA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGF0YSA9PT0gJ251bWJlcic7XHJcbiAgICBjb25zdCBoYXNIZWFkQmxlbmQgPSAhaXNKdXN0TW9kZWwgJiYgZGF0YS5oZWFkQmxlbmQgJiYgT2JqZWN0LmtleXMoZGF0YS5oZWFkQmxlbmQpLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgaWYgKGhhc0hlYWRCbGVuZCkge1xyXG4gICAgICAgIHNldEhlYWRCbGVuZChwZWRIYW5kbGUsIChkYXRhIGFzIFRBcHBlYXJhbmNlIHwgVFNraW4pLmhlYWRCbGVuZCk7XHJcbiAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSkge1xyXG4gICAgICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCA0NSwgMjEsIDAsIDIwLCAxNSwgMCwgMC4zLCAwLjEsIDAsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlZEhhbmRsZTtcclxufTtcclxuZXhwb3J0cygnU2V0TW9kZWwnLCBzZXRNb2RlbCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RmFjZUZlYXR1cmUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRGYWNlRmVhdHVyZScpXHJcblxyXG4gICAgU2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlICsgMC4wKVxyXG59XHJcbmV4cG9ydHMoJ1NldEZhY2VGZWF0dXJlJywgc2V0RmFjZUZlYXR1cmUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZhY2VGZWF0dXJlcyhwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEhlYWRTdHJ1Y3R1cmUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RmFjZUZlYXR1cmVzJylcclxuICAgICAgICBcclxuXHJcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmVzJywgc2V0RmFjZUZlYXR1cmVzKTtcclxuXHJcbmNvbnN0IGlzUG9zaXRpdmUgPSAodmFsOiBudW1iZXIpID0+IHZhbCA+PSAwID8gdmFsIDogMFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEhlYWRCbGVuZChwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRIZWFkQmxlbmQnKVxyXG5cclxuICAgIHBlZEhhbmRsZSA9IHBlZEhhbmRsZSB8fCBwZWRcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBzaGFwZUZpcnN0ID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlRmlyc3QpXHJcbiAgICBjb25zdCBzaGFwZVNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZVNlY29uZClcclxuICAgIGNvbnN0IHNoYXBlVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVUaGlyZClcclxuICAgIGNvbnN0IHNraW5GaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5za2luRmlyc3QpXHJcbiAgICBjb25zdCBza2luU2Vjb25kID0gaXNQb3NpdGl2ZShkYXRhLnNraW5TZWNvbmQpXHJcbiAgICBjb25zdCBza2luVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpblRoaXJkKVxyXG4gICAgY29uc3Qgc2hhcGVNaXggPSBkYXRhLnNoYXBlTWl4ICsgMC4wXHJcbiAgICBjb25zdCBza2luTWl4ID0gZGF0YS5za2luTWl4ICsgMC4wXHJcbiAgICBjb25zdCB0aGlyZE1peCA9IGRhdGEudGhpcmRNaXggKyAwLjBcclxuICAgIGNvbnN0IGhhc1BhcmVudCA9IGRhdGEuaGFzUGFyZW50XHJcblxyXG4gICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIHNoYXBlRmlyc3QsIHNoYXBlU2Vjb25kLCBzaGFwZVRoaXJkLCBza2luRmlyc3QsIHNraW5TZWNvbmQsIHNraW5UaGlyZCwgc2hhcGVNaXgsIHNraW5NaXgsIHRoaXJkTWl4LCBoYXNQYXJlbnQpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZEJsZW5kJywgc2V0SGVhZEJsZW5kKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRIZWFkT3ZlcmxheScpXHJcblxyXG4gICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAxMykge1xyXG4gICAgICAgIFNldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSwgZGF0YS52YWx1ZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGEub3ZlcmxheVZhbHVlXHJcblxyXG4gICAgLyogSGFpciBjb2xvciBkb2VzIG5vdCBoYXZlIGFuIGluZGV4LCBvbmx5IGFuIElEIHNvIHdlJ2xsIGNoZWNrIGZvciB0aGF0ICovXHJcbiAgICBpZiAoZGF0YS5pZCA9PT0gJ2hhaXJDb2xvcicpIHtcclxuICAgICAgICBTZXRQZWRIYWlyVGludChwZWRIYW5kbGUsIGRhdGEuaGFpckNvbG9yLCBkYXRhLmhhaXJIaWdobGlnaHQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZEhlYWRPdmVybGF5KHBlZEhhbmRsZSwgaW5kZXgsIHZhbHVlLCBkYXRhLm92ZXJsYXlPcGFjaXR5ICsgMC4wKVxyXG4gICAgU2V0UGVkSGVhZE92ZXJsYXlDb2xvcihwZWRIYW5kbGUsIGluZGV4LCAxLCBkYXRhLmZpcnN0Q29sb3IsIGRhdGEuc2Vjb25kQ29sb3IpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZE92ZXJsYXknLCBzZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VG9nZ2xlcyhkYXRhKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcblxyXG4gICAgZm9yIChjb25zdCBbdG9nZ2xlSXRlbSwgdG9nZ2xlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoVE9HR0xFX0lOREVYRVMpKSB7XHJcbiAgICAgICAgY29uc3QgdG9nZ2xlVHlwZSA9IHRvZ2dsZURhdGEudHlwZVxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdG9nZ2xlRGF0YS5pbmRleFxyXG5cclxuICAgICAgICBpZiAodG9nZ2xlVHlwZSA9PT0gXCJkcmF3YWJsZVwiICYmIGRyYXdhYmxlc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudERyYXdhYmxlICE9PSBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRvZ2dsZVR5cGUgPT09IFwicHJvcFwiICYmIHByb3BzW3RvZ2dsZUl0ZW1dKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcCAhPT0gcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZFByb3BJbmRleChwZWQsIGluZGV4LCBwcm9wc1t0b2dnbGVJdGVtXS52YWx1ZSwgMCwgZmFsc2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZENsb3RoZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRDbG90aGVzKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZENsb3RoZXMnKVxyXG5cclxuICAgIGNvbnN0IGRyYXdhYmxlcyA9IGRhdGEuZHJhd2FibGVzXHJcbiAgICBjb25zdCBwcm9wcyA9IGRhdGEucHJvcHNcclxuICAgIGNvbnN0IGhlYWRPdmVybGF5ID0gZGF0YS5oZWFkT3ZlcmxheVxyXG4gICAgZm9yIChjb25zdCBpZCBpbiBkcmF3YWJsZXMpIHtcclxuICAgICAgICBjb25zdCBkcmF3YWJsZSA9IGRyYXdhYmxlc1tpZF1cclxuICAgICAgICBzZXREcmF3YWJsZShwZWRIYW5kbGUsIGRyYXdhYmxlKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gcHJvcHMpIHtcclxuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaWRdXHJcbiAgICAgICAgc2V0UHJvcChwZWRIYW5kbGUsIHByb3ApXHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBpZCBpbiBoZWFkT3ZlcmxheSkge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBoZWFkT3ZlcmxheVtpZF1cclxuICAgICAgICBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIG92ZXJsYXkpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldFBlZFNraW4gPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRTa2luKSA9PiB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZFNraW4nKVxyXG5cclxuICAgIGlmICghcGVkSGFuZGxlKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBwZWRIYW5kbGUgcHJvdmlkZWQgZm9yIHNldFBlZFNraW4nKVxyXG5cclxuICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgZGF0YSlcclxuXHJcbiAgICBjb25zdCBoZWFkU3RydWN0dXJlID0gZGF0YS5oZWFkU3RydWN0dXJlXHJcbiAgICBjb25zdCBoZWFkQmxlbmQgPSBkYXRhLmhlYWRCbGVuZFxyXG5cclxuICAgIGlmIChoZWFkQmxlbmQpIHNldEhlYWRCbGVuZChwZWRIYW5kbGUsIGhlYWRCbGVuZClcclxuICAgIFxyXG4gICAgaWYgKGhlYWRTdHJ1Y3R1cmUpIHNldEZhY2VGZWF0dXJlcyhwZWRIYW5kbGUsIGhlYWRTdHJ1Y3R1cmUpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07QUFDVixHQUZ5QjtBQWFsQixJQUFNLGVBQWUsd0JBQUMsUUFBZ0IsU0FBYztBQUN2RCxpQkFBZTtBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsRUFDSixDQUFDO0FBQ0wsR0FMNEI7QUFPckIsSUFBTSxRQUFRLHdCQUFDLE9BQWUsSUFBSSxRQUFRLFNBQU8sV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUF0RDtBQUVkLElBQU0sZUFBZSw4QkFBTyxVQUE0QztBQUMzRSxNQUFJLFlBQW9CLE9BQU8sVUFBVSxXQUFXLFFBQVEsV0FBVyxLQUFLO0FBRTVFLE1BQUksQ0FBQyxhQUFhLFNBQVMsS0FBSyxDQUFDLGlCQUFpQixTQUFTLEdBQUc7QUFPMUQsWUFBUSxLQUFLLG9DQUFvQyxLQUFLLEdBQUc7QUFDekQsV0FBTztBQUFBLEVBQ1g7QUFFQSxNQUFJLGVBQWUsU0FBUztBQUFHLFdBQU87QUFFdEMsZUFBYSxTQUFTO0FBRXRCLFFBQU0scUJBQXFCLDZCQUFxQjtBQUM1QyxXQUFPLElBQUksUUFBUSxhQUFXO0FBQzFCLFlBQU0sV0FBVyxZQUFZLE1BQU07QUFDL0IsWUFBSSxlQUFlLFNBQVMsR0FBRztBQUMzQix3QkFBYyxRQUFRO0FBQ3RCLGtCQUFRO0FBQUEsUUFDWjtBQUFBLE1BQ0osR0FBRyxHQUFHO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDTCxHQVQyQjtBQVczQixRQUFNLG1CQUFtQjtBQUV6QixTQUFPO0FBQ1gs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Z0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= diff --git a/dist/client/init.js.map b/dist/client/init.js.map index 1ef13ef..d0364af 100644 --- a/dist/client/init.js.map +++ b/dist/client/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], - "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) for (const feature in headStructure) {\r\n const value = headStructure[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], - "mappings": ";;;;AAAO,IAAI,MAAM;AAEV,IAAM,YAAY,wBAAC,cAAsB;AAC5C,QAAM;AACV,GAFyB;AAalB,IAAM,eAAe,wBAAC,QAAgB,SAAc;AACvD,iBAAe;AAAA,IACX;AAAA,IACA;AAAA,EACJ,CAAC;AACL,GAL4B;AAOrB,IAAM,QAAQ,wBAAC,OAAe,IAAI,QAAQ,SAAO,WAAW,KAAK,EAAE,CAAC,GAAtD;AAEd,IAAM,eAAe,8BAAO,UAA4C;AAC3E,MAAI,YAAoB,OAAO,UAAU,WAAW,QAAQ,WAAW,KAAK;AAE5E,MAAI,CAAC,aAAa,SAAS,KAAK,CAAC,iBAAiB,SAAS,GAAG;AAO1D,YAAQ,KAAK,oCAAoC,KAAK,GAAG;AACzD,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,SAAS;AAAG,WAAO;AAEtC,eAAa,SAAS;AAEtB,QAAM,qBAAqB,6BAAqB;AAC5C,WAAO,IAAI,QAAQ,aAAW;AAC1B,YAAM,WAAW,YAAY,MAAM;AAC/B,YAAI,eAAe,SAAS,GAAG;AAC3B,wBAAc,QAAQ;AACtB,kBAAQ;AAAA,QACZ;AAAA,MACJ,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL,GAT2B;AAW3B,QAAM,mBAAmB;AAEzB,SAAO;AACX,GAhC4B;AAsC5B,IAAM,eAAe,uBAAuB;AAC5C,IAAM,cAAsC,CAAC;AAC7C,IAAM,eAAyD,CAAC;AAEhE,SAAS,WAAW,WAAmBA,QAAsB;AACzD,MAAIA,UAASA,SAAQ,GAAG;AACpB,UAAM,cAAc,aAAa;AAEjC,SAAK,YAAY,SAAS,KAAK,KAAK;AAAa,aAAO;AAExD,gBAAY,SAAS,IAAI,cAAcA;AAAA,EAC3C;AAEA,SAAO;AACX;AAVS;AAYT,MAAM,UAAU,YAAY,IAAI,CAAC,QAAgB,SAAc;AAC3D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,WAAW,QAAQ,GAAG,IAAI;AACrC,CAAC;AAEM,SAAS,sBACZ,cAAsB,MACL;AACjB,MAAI,CAAC,WAAW,WAAW,CAAC,GAAG;AAC3B;AAAA,EACJ;AAEA,MAAI;AAEJ,KAAG;AACC,UAAM,GAAG,SAAS,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,MAAS,EAAE,CAAC;AAAA,EAClE,SAAS,aAAa,GAAG;AACzB,UAAQ,UAAU,SAAS,IAAI,cAAc,KAAK,GAAG,IAAI;AAEzD,SAAO,IAAI,QAAW,CAAC,YAAY;AAC/B,iBAAa,GAAG,IAAI;AAAA,EACxB,CAAC;AACL;AAjBgB;AAmBT,SAAS,iBAAiB,WAAW,IAAI;AAC5C,QAAM,UAAU,SAAS,IAAI,OAAO,UAAU,QAAQ,SAAS;AAC3D,QAAI;AACJ,QAAI;AACA,iBAAW,MAAM,GAAG,GAAG,IAAI;AAAA,IAC/B,SACO,GAAG;AACN,cAAQ,MAAM,mDAAmD,SAAS,EAAE;AAC5E,cAAQ,IAAI,KAAK,EAAE,KAAK,IAAI;AAAA,IAChC;AACA,YAAQ,UAAU,QAAQ,IAAI,KAAK,QAAQ;AAAA,EAC/C,CAAC;AACL;AAZgB;AAgBT,IAAM,gBAAgB,wBAAC,oBAA4B;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,UAAM,oBAAoB,6BAAM;AAC5B,UAAI,uBAAuB,eAAe,GAAG;AACzC,cAAM,aAAa,QAAQ,cAAc,OAAO,EAAE;AAClD,YAAI,oBAAoB,iBAAiB,cAAc,UAAU,UAAU,OAAO;AAClF,YAAI,CAAC,mBAAmB;AACpB,kBAAQ,MAAM,GAAG,UAAU,qEAAqE;AAChG,8BAAoB,iBAAiB,cAAc,gBAAgB;AAAA,QACvE;AACA,gBAAQ,iBAAiB;AAAA,MAC7B,OAAO;AACH,mBAAW,mBAAmB,GAAG;AAAA,MACrC;AAAA,IACJ,GAZ0B;AAa1B,sBAAkB;AAAA,EACtB,CAAC;AACL,GAjB6B;AA2BtB,IAAM,YAAY,QAAQ;AAE1B,IAAM,gBAAgB,6BAAM;AAC/B,SAAO,UAAU,KAAK,EAAE,cAAc;AAC1C,GAF6B;AAItB,IAAM,iBAAiB,6BAAM;AAChC,QAAM,KAAK,cAAc,EAAE;AAC3B,SAAO;AACX,GAH8B;AAKvB,IAAM,uBAAuB,6BAAM;AACtC,QAAM,SAAS,cAAc,EAAE;AAC/B,SAAO,WAAW,SAAS,qBAAqB;AACpD,GAHoC;AAK7B,SAAS,MAAM,IAA2B;AAC7C,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACzD;AAFgB;AAIT,SAAS,OAAO,KAAqB;AACxC,MAAI,CAAC,IAAI,SAAS,GAAG;AAAG,WAAO;AAC/B,SAAO,IAAI,QAAQ,MAAM,EAAE;AAC/B;AAHgB;AAKT,SAAS,aAAuD;AACnE,QAAM,MAAM,cAAc,EAAE;AAC5B,SAAO,MAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI;AAC1D;AAHgB;AAKT,SAAS,mBAAmBC,MAAa;AAC5C,QAAM,QAAQ,eAAeA,IAAG;AAChC,SAAO,UAAU,WAAW,kBAAkB,KAAK,UAAU,WAAW,kBAAkB;AAC9F;AAHgB;;;AC3KhB,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAE7B,IAAI,UAAmB;AACvB,IAAI,cAAsB;AAC1B,IAAI,MAAqB;AACzB,IAAI,SAAiB;AACrB,IAAI,SAAiB;AACrB,IAAI,eAA+B;AACnC,IAAI,SAAwB;AAC5B,IAAI,cAAuB;AAE3B,IAAI,cAAkC;AAEtC,IAAM,cAA4B;AAAA,EAC9B,OAAO;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,CAAC,OAAO,KAAK;AAAA,EAChB,OAAO,CAAC,OAAO,KAAK;AACxB;AAEA,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,YAAY,6BAAgB;AACjC,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,IAAI,IAAI,MAAM,IAAI;AAExB,SAAO,CAAC,GAAG,GAAG,CAAC;AAChB,GAVkB;AAYlB,IAAM,iBAAiB,wBAAC,QAAiB,WAA0B;AAClE,MAAI,CAAC,WAAW,CAAC,gBAAgB;AAAa;AAE9C,WAAS,UAAU;AACnB,WAAS,UAAU;AAEnB,YAAU;AACV,YAAU;AAEP,QAAM,gBAAgB,gBAAgB,WAAW,gBAAgB;AACjE,QAAM,WAAW,gBAAgB,KAAO;AAExC,QAAM,UAAU,gBAAgB;AAChC,QAAM,WAAW,UAAU,IAAM;AAEpC,WAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ;AAEtD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B;AAAA,IACC;AAAA,IACA,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,EAClB;AACA,kBAAgB,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AACpE,GA1BuB;AA4BvB,IAAM,aAAa,8BAAO,QAAiB,aAAsB;AAChE,QAAM,UAAkB,iBAAiB,GAAG,IAAI;AAChD,aAAW,YAAY;AAEvB,gBAAc;AACd,gBAAc;AACd,WAAS;AAET,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B,QAAM,SAAiB;AAAA,IACtB;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,iBAAe;AACf,gBAAc;AACd,WAAS;AACT,QAAM;AAEN,kBAAgB,QAAQ,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,yBAAuB,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAEhD,QAAM,MAAM,GAAG;AAEf,0BAAwB,QAAQ,IAAI;AACpC,gBAAc,QAAQ,GAAG;AACzB,eAAa,QAAQ,GAAG;AACxB,oBAAkB,QAAQ,GAAG;AAC7B,WAAS,MAAM;AAEf,aAAW,QAAQ,IAAI;AACxB,GAxCmB;AA0CnB,IAAM,WAAW,wBAAC,eAAuB;AACxC,MAAI,EAAE,aAAa,GAAG,KAAK,cAAc;AAAM;AAC/C,cAAY;AACZ,aAAW,UAAU,CAAC;AACvB,GAJiB;AAMV,IAAM,cAAc,6BAAM;AAChC,MAAI;AAAS;AACb,YAAU;AACV,gBAAc;AACd,QAAM,UAAU,2BAA2B,IAAI;AAC/C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,OAAO,GAAK,GAAK,CAAG;AACtE,cAAY,KAAK,GAAG,GAAG,CAAC;AACxB,mBAAiB,MAAM,MAAM,KAAM,MAAM,IAAI;AAE1C,YAAU,SAAS,WAAW;AAClC,GAV2B;AAYpB,IAAM,aAAa,6BAAY;AACrC,MAAI,CAAC;AAAS;AACd,YAAU;AAEV,mBAAiB,OAAO,MAAM,KAAK,MAAM,KAAK;AAC9C,aAAW,KAAK,IAAI;AACpB,QAAM;AACN,iBAAe;AAChB,GAR0B;AAU1B,IAAM,YAAY,wBAAC,MAA2B,WAAW,gBAAsB;AAE9E,QAAM,OAAsC,YAAY,IAAI;AAEzD,QAAM,cAAc,MAAM,QAAQ,IAAI;AAEtC,gBAAc;AAEd,MAAI,CAAC,eAAe,SAAS,GAAG;AAC5B,UAAM,CAACC,IAAGC,IAAGC,EAAC,IAAc,gBAAgB,KAAK,KAAK;AACtD;AAAA,MACI;AAAA,QACI,GAAGF;AAAA,QACH,GAAGC;AAAA,QACH,GAAGC,KAAI;AAAA,MACX;AAAA,MACA;AAAA,IACJ;AACA;AAAA,EACJ;AAGA,MAAI,WAAW;AAAsB,eAAW;AAEhD,MAAI,aAAa;AACb,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAE3E,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAG3E,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AAAA,EACxB,OAAO;AACH,QAAI,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,MAAM,GAAK,GAAK,CAAG;AAAA,EACvE;AAEH;AAAA,IACC;AAAA,MACC;AAAA,MACA;AAAA,MACA,GAAG,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACD;AAED,GA9CkB;AAgDlB,wDAAqC,CAAC,MAAM,OAAO;AAC/C,iBAAe,KAAK,GAAG,KAAK,CAAC;AAC7B,KAAG,CAAC;AACR,CAAC;AAID,8DAAwC,CAAC,MAAgB,OAAiB;AACzE,UAAQ,MAAM;AAAA,IACP,KAAK;AACD,gBAAU,SAAS,uBAAuB;AAC1C;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB,qBAAe;AACf;AAAA,EACX;AACA,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,CAAC,MAAM,OAAO;AAClD,MAAI,SAAS,QAAQ;AAEd,UAAM,UAAU,gBAAgB,UAAU,0BAA0B;AAE1E,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,UAAU,UAAU;AAAA,EAClD,WAAW,SAAS,MAAM;AACzB,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,MAAM,MAAM;AAAA,EAC1C;AAEA,gBAAc;AACd,iBAAe;AACf,KAAG,CAAC;AACL,CAAC;;;AC5OD,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACfA,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACrBA,IAAO,oBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACbA,IAAO,gBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACDO,SAAS,eAAe,QAAgB;AAC3C,QAAMC,UAAS,QAAQ;AACvB,QAAM,SAASA,QAAO,OAAO;AAE7B,SAAO,OAAO,UAAU,CAAC,UAAkB,WAAW,KAAK,MAAM,MAAM;AAC3E;AALgB;AAOT,SAAS,QAAQ,WAA8B;AAClD,SAAO;AAAA,IACH,OAAO,gBAAgB,SAAS;AAAA,IAChC,WAAW,yBAAyB,SAAS;AAAA,EACjD;AACJ;AALgB;AAMhB,QAAQ,WAAW,OAAO;AAEnB,SAAS,iBAAiB,WAAmB;AAEhD,QAAM,SAAS,IAAI,YAAY,EAAE;AACjC,SAAO,QAAQ,aAAa,sBAAsB,WAAW,IAAI,YAAY,MAAM,CAAC;AAEpF,QAAM,EAAE,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI,YAAY,MAAM;AAC1I,QAAM,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,IAAI,IAAI,aAAa,QAAQ,EAAE;AAW5E,SAAO;AAAA,IACH;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA;AAAA,IAEA,WAAW,QAAQ,SAAS;AAAA,EAChC;AACJ;AAjCgB;AAkChB,QAAQ,gBAAgB,gBAAgB;AAEjC,SAAS,eAAe,WAAmB;AAC9C,MAAI,SAA4B,CAAC;AACjC,MAAI,WAAyB,CAAC;AAE9B,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,WAAO,OAAO,IAAI,wBAAwB,CAAC;AAE3C,QAAI,YAAY,YAAY;AACxB,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,eAAe,SAAS;AAAA,MAC1C;AAAA,IACJ,OAAO;AACH,YAAM,CAAC,GAAG,cAAc,YAAY,YAAY,aAAa,cAAc,IAAI,sBAAsB,WAAW,CAAC;AACjH,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,iBAAiB,MAAM,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,CAAC,UAAU,MAAM;AAC5B;AA7BgB;AA8BhB,QAAQ,kBAAkB,cAAc;AAEjC,SAAS,iBAAiB,WAAmB;AAChD,QAAM,WAAW,eAAe,SAAS;AAEzC,MAAI,aAAa,WAAW,kBAAkB,KAAK,aAAa,WAAW,kBAAkB;AAAG;AAEhG,MAAI,aAAa,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,eAAW,OAAO,IAAI;AAAA,MAClB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,kBAAkB,WAAW,CAAC;AAAA,IACzC;AAAA,EACJ;AAEA,SAAO;AACX;AAhBgB;AAiBhB,QAAQ,oBAAoB,gBAAgB;AAErC,SAAS,aAAa,WAAmB;AAC5C,MAAI,YAAY,CAAC;AACjB,MAAI,iBAAiB,CAAC;AAEtB,WAAS,IAAI,GAAG,IAAI,kBAAe,QAAQ,KAAK;AAC5C,UAAM,OAAO,kBAAe,CAAC;AAC7B,UAAM,UAAU,wBAAwB,WAAW,CAAC;AAEpD,mBAAe,IAAI,IAAI;AAAA,MACnB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,iCAAiC,WAAW,CAAC;AAAA,MACpD,UAAU,gCAAgC,WAAW,GAAG,OAAO;AAAA,IACnE;AACA,cAAU,IAAI,IAAI;AAAA,MACd,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,wBAAwB,WAAW,CAAC;AAAA,MAC3C,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,WAAW,cAAc;AACrC;AAvBgB;AAwBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,SAAS,WAAmB;AACxC,MAAI,QAAQ,CAAC;AACb,MAAI,aAAa,CAAC;AAElB,WAAS,IAAI,GAAG,IAAI,cAAW,QAAQ,KAAK;AACxC,UAAM,OAAO,cAAW,CAAC;AACzB,UAAM,UAAU,gBAAgB,WAAW,CAAC;AAE5C,eAAW,IAAI,IAAI;AAAA,MACf,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,qCAAqC,WAAW,CAAC;AAAA,MACxD,UAAU,oCAAoC,WAAW,GAAG,OAAO;AAAA,IACvE;AAEA,UAAM,IAAI,IAAI;AAAA,MACV,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,gBAAgB,WAAW,CAAC;AAAA,MACnC,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,OAAO,UAAU;AAC7B;AAxBgB;AAyBhB,QAAQ,YAAY,QAAQ;AAG5B,eAAsB,cAAc,WAAyC;AACzE,QAAM,CAAC,UAAU,MAAM,IAAI,eAAe,SAAS;AACnD,QAAM,CAAC,WAAW,SAAS,IAAI,aAAa,SAAS;AACrD,QAAM,CAAC,OAAO,SAAS,IAAI,SAAS,SAAS;AAC7C,QAAM,QAAQ,eAAe,SAAS;AACtC,QAAM,UAAU,MAAM,WAAW;AAEjC,SAAO;AAAA,IACH,YAAY,eAAe,KAAK;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ,SAAS;AAAA,IAC5B,WAAW,iBAAiB,SAAS;AAAA,IACrC,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,eAAe,iBAAiB,SAAS;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AArBsB;AAsBtB,QAAQ,iBAAiB,aAAa;AACtC,iBAAiB,sCAAsC,MAAM;AACzD,YAAU,YAAY,CAAC;AACvB,SAAO,cAAc,GAAG;AAC5B,CAAC;AAEM,SAAS,cAAc,WAA6B;AACvD,QAAM,CAAC,SAAS,IAAI,aAAa,SAAS;AAC1C,QAAM,CAAC,KAAK,IAAI,SAAS,SAAS;AAClC,QAAM,CAAC,QAAQ,IAAI,eAAe,SAAS;AAE3C,SAAO;AAAA,IACH,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACJ;AACJ;AAVgB;AAWhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,WAAW,WAA0B;AACjD,SAAO;AAAA,IACH,WAAW,iBAAiB,SAAS;AAAA,IACrC,eAAe,iBAAiB,SAAS;AAAA,IACzC,WAAW,QAAQ,SAAS;AAAA,IAC5B,OAAO,eAAe,SAAS;AAAA,EACnC;AACJ;AAPgB;AAQhB,QAAQ,cAAc,UAAU;AAEzB,SAAS,gBAAgB;AAC5B,MAAI,cAAc,CAAC;AAEnB,QAAM,CAAC,aAAa,iBAAiB,IAAI,QAAQ,cAAc,QAAQ;AACvE,WAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AAC/C,UAAM,WAAW,kBAAkB,CAAC;AACpC,UAAM,OAAO,SAAS;AACtB,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,gBAAY,KAAK,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,IACX;AAEA,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,YAAM,UAAU,YAAY,CAAC;AAC7B,kBAAY,KAAK,EAAE,KAAK,KAAK;AAAA,QACzB,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,WAAW,eAAe,GAAG,MAAM,WAAW,kBAAkB;AAEtE,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,UAAM,UAAU,WAAW,GAAG;AAC9B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,aAAa,QAAQ,CAAC;AAC5B,UAAI,SAAS;AAEb,YAAM,cAAc,WAAW,YAAY;AAC3C,YAAM,iBAAiB,YAAY,SAAS,IAAI;AAChD,UAAI,kBAAkB,UAAU;AAC5B,iBAAS;AAAA,MACb,WAAW,CAAC,kBAAkB,CAAC,UAAU;AACrC,iBAAS;AAAA,MACb;AAEA,UAAI,OAAO;AACX,UAAI,OAAO;AAEX,UAAI,QAAQ;AACR,eAAO,WAAW,MAAM;AACxB,eAAO,+BAA+B,SAAS,IAAI;AAAA,MACvD;AAEA,UAAI,SAAS,MAAM,MAAM;AACrB,cAAM,cAAc,YAAY,IAAI,EAAE,KAAK,CAAC,EAAE;AAE9C,oBAAY,KAAK;AAAA,UACb,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAlEgB;AAoEhB,eAAsB,aAAiC;AACnD,SAAO,MAAM,sBAAsB,iCAAiC,KAAK,CAAC;AAC9E;AAFsB;AAGtB,QAAQ,cAAc,UAAU;AAGhC,iBAAiB,gDAAgD,CAAC,SAAoC;AAClG,MAAI,KAAK,SAAS;AAAS,YAAQ,kBAAkB,EAAE,oBAAoB,KAAK,IAAI;AACpF,MAAI,KAAK,SAAS;AAAY,YAAQ,qBAAqB,EAAE,oBAAoB,KAAK,IAAI;AAC9F,CAAC;;;ACpSD,IAAO,kBAAQ;AAAA,EACX,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,MAC1D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,UAAU;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AACJ;;;AC9CO,SAAS,YAAY,WAAmB,MAAc;AACzD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,kCAAkC;AAEjE,2BAAyB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC;AAC3E,SAAO,gCAAgC,WAAW,KAAK,OAAO,KAAK,KAAK;AAC5E;AALgB;AAMhB,QAAQ,eAAe,WAAW;AAE3B,SAAS,QAAQ,WAAmB,MAAc;AACrD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,8BAA8B;AAE7D,MAAI,KAAK,UAAU,IAAI;AACnB,iBAAa,WAAW,KAAK,KAAK;AAClC;AAAA,EACJ;AAEA,kBAAgB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK;AACtE,SAAO,oCAAoC,WAAW,KAAK,OAAO,KAAK,KAAK;AAChF;AAVgB;AAWhB,QAAQ,WAAW,OAAO;AAE1B,IAAM,cAAc,WAAW,kBAAkB;AAE1C,IAAM,WAAW,8BAAO,WAAmB,SAAiE;AAC/G,MAAI,QAAQ,QAAQ,SAAS,QAAW;AACpC,YAAQ,KAAK,+BAA+B;AAC5C,WAAO;AAAA,EACX;AAEA,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC1B,YAAQ,WAAW,IAAI;AAAA,EAC3B,WAAW,OAAO,SAAS,UAAU;AACjC,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ,KAAK,SAAS;AAAA,EAC1B;AAEA,MAAI,UAAU;AAAG,WAAO;AAExB,QAAM,aAAa,KAAK;AAExB,QAAM,WAAW,aAAa,SAAS;AACvC,MAAI,UAAU;AACV,mBAAe,SAAS,GAAG,KAAK;AAChC,gBAAY,YAAY;AACxB,cAAU,SAAS;AAAA,EACvB,OAAO;AACH,mBAAe,WAAW,KAAK;AAAA,EACnC;AAEA,2BAAyB,KAAK;AAC9B,kCAAgC,SAAS;AAEzC,MAAI,CAAC,mBAAmB,SAAS;AAAG,WAAO;AAE3C,QAAM,cAAc,OAAO,SAAS,YAAY,OAAO,SAAS;AAChE,QAAM,eAAe,CAAC,eAAe,KAAK,aAAa,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS;AAE5F,MAAI,cAAc;AACd,iBAAa,WAAY,KAA6B,SAAS;AAC/D,wBAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,EACzE,OAAO;AACH,QAAI,UAAU,WAAW,kBAAkB,GAAG;AAC1C,0BAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,IACzE,WAAW,UAAU,WAAW,kBAAkB,GAAG;AACjD,0BAAoB,WAAW,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK;AAAA,IAC3E;AAAA,EACJ;AAEA,SAAO;AACX,GAhDwB;AAiDxB,QAAQ,YAAY,QAAQ;AAErB,SAAS,eAAe,WAAmB,MAAc;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,oBAAkB,WAAW,KAAK,OAAO,KAAK,QAAQ,CAAG;AAC7D;AAJgB;AAKhB,QAAQ,kBAAkB,cAAc;AAExC,IAAM,aAAa,wBAAC,QAAgB,OAAO,IAAI,MAAM,GAAlC;AAEZ,SAAS,aAAa,WAAmB,MAAM;AAClD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,mCAAmC;AAElE,cAAY,aAAa;AAEzB,MAAI,CAAC,mBAAmB,SAAS;AAAG;AAEpC,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,cAAc,WAAW,KAAK,WAAW;AAC/C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,YAAY,KAAK;AAEvB,sBAAoB,WAAW,YAAY,aAAa,YAAY,WAAW,YAAY,WAAW,UAAU,SAAS,UAAU,SAAS;AAChJ;AAnBgB;AAoBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,eAAe,WAAmB,MAAM;AACpD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,QAAM,QAAQ,KAAK;AAEnB,MAAI,UAAU,IAAI;AACd,mBAAe,WAAW,KAAK,KAAK;AACpC;AAAA,EACJ;AAEA,QAAM,QAAQ,KAAK;AAGnB,MAAI,KAAK,OAAO,aAAa;AACzB,mBAAe,WAAW,KAAK,WAAW,KAAK,aAAa;AAC5D;AAAA,EACJ;AAEA,oBAAkB,WAAW,OAAO,OAAO,KAAK,iBAAiB,CAAG;AACpE,yBAAuB,WAAW,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW;AACjF;AApBgB;AAqBhB,QAAQ,kBAAkB,cAAc;AAGjC,SAAS,aAAa,MAAM;AAC/B,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AAEnB,aAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,eAAc,GAAG;AACnE,UAAM,aAAa,WAAW;AAC9B,UAAM,QAAQ,WAAW;AAEzB,QAAI,eAAe,cAAc,UAAU,UAAU,GAAG;AACpD,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAC1D,UAAI,oBAAoB,UAAU,UAAU,EAAE,OAAO;AACjD,iCAAyB,KAAK,OAAO,UAAU,UAAU,EAAE,OAAO,GAAG,CAAC;AAAA,MAC1E;AAAA,IACJ,WAAW,eAAe,UAAU,MAAM,UAAU,GAAG;AACnD,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAC9C,UAAI,gBAAgB,MAAM,UAAU,EAAE,OAAO;AACzC,wBAAgB,KAAK,OAAO,MAAM,UAAU,EAAE,OAAO,GAAG,KAAK;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,cAAc,WAAmB,MAAgB;AAC7D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,cAAc,KAAK;AACzB,aAAW,MAAM,WAAW;AACxB,UAAM,WAAW,UAAU,EAAE;AAC7B,gBAAY,WAAW,QAAQ;AAAA,EACnC;AAEA,aAAW,MAAM,OAAO;AACpB,UAAM,OAAO,MAAM,EAAE;AACrB,YAAQ,WAAW,IAAI;AAAA,EAC3B;AAEA,aAAW,MAAM,aAAa;AAC1B,UAAM,UAAU,YAAY,EAAE;AAC9B,mBAAe,WAAW,OAAO;AAAA,EACrC;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,IAAM,aAAa,8BAAO,WAAmB,SAAgB;AAChE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,iCAAiC;AAEhE,MAAI,CAAC;AAAW,WAAO,QAAQ,KAAK,sCAAsC;AAE1E,cAAY,MAAM,SAAS,WAAW,IAAI;AAE1C,QAAM,gBAAgB,KAAK;AAC3B,QAAM,YAAY,KAAK;AAEvB,MAAI;AAAW,iBAAa,WAAW,SAAS;AAEhD,MAAI;AAAe,eAAW,WAAW,eAAe;AACpD,YAAM,QAAQ,cAAc,OAAO;AACnC,qBAAe,WAAW,KAAK;AAAA,IACnC;AACJ,GAhB0B;AAiB1B,QAAQ,cAAc,UAAU;AAEzB,SAAS,cAAc,WAAmB,MAAiB;AAC9D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,gCAA8B,SAAS;AAEvC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,aAAa,KAAK,CAAC,EAAE;AAC3B,QAAI,YAAY;AACZ,YAAM,aAAa,WAAW,WAAW,GAAG;AAC5C,YAAM,SAAS,WAAW;AAC1B,iCAA2B,WAAW,YAAY,MAAM;AAAA,IAC5D;AAAA,EACJ;AACJ;AAbgB;AAchB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,iBAAiB,WAAmB,MAAkB;AAClE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,KAAK;AACvB,kBAAgB,WAAW,OAAO,SAAS;AAC/C;AANgB;AAOhB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,iBAAiB,WAAmB,MAAmB;AACzE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,MAAI,aAAa,SAAS,GAAG;AACzB,2BAAuB,IAAI;AAC3B;AAAA,EACJ;AACA,QAAM,WAAW,WAAW,IAAI;AAChC,gBAAc,WAAW,IAAI;AAC7B,mBAAiB,WAAW,KAAK,SAAS;AAC1C,gBAAc,WAAW,KAAK,OAAO;AACzC;AAXsB;AAYtB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,uBAAuB,MAAmB;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,6CAA6C;AAE5E,YAAU,YAAY,CAAC;AACvB,QAAM,WAAW,KAAK,IAAI;AAE1B,YAAU,YAAY,CAAC;AACvB,gBAAc,KAAK,IAAI;AACvB,mBAAiB,KAAK,KAAK,SAAS;AACpC,gBAAc,KAAK,KAAK,OAAO;AACnC;AAVsB;AAYtB,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,cAAc,UAAU;AAChC,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,oBAAoB,gBAAgB;;;ACxO5C,sDAAoC,OAAO,YAAyB,OAAiB;AACpF,QAAM,uBAAuB,UAAU;AACvC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,kDAAkC,OAAO,YAAyB,OAAiB;AAClF,eAAa,UAAU;AAEvB,QAAM,MAAM,GAAG;AAEf,QAAM,gBAAgB,MAAM,cAAc,GAAG;AAC7C,gBAAc,UAAU,WAAW,WAAW;AAC9C,wBAAsB,uCAAuC,eAAe,GAAG,aAAa;AAE5F,gBAAc,KAAK,cAAc,OAAO;AAExC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,0DAAsC,OAAO,OAAe,OAAiB;AAC5E,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG;AACnD,WAAO,GAAG,CAAC;AAAA,EACZ;AAGA,QAAM,SAAS,MAAM,SAAS,KAAK,IAAI;AAEpC,YAAU,MAAM;AAEnB,QAAM,aAAa,MAAM,cAAc,GAAG;AAE1C,aAAW,UAAU,CAAC;AAEtB,gBAAc,KAAK,CAAC,CAAC;AAErB,KAAG,UAAU;AACd,CAAC;AAED,wEAA6C,OAAO,GAAQ,OAAiB;AAC5E,QAAM,UAAU,cAAc;AAE9B,KAAG,OAAO;AACX,CAAC;AAED,0EAA8C,OAAO,MAAc,OAAiB;AACnF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,sEAA4C,OAAO,MAAc,OAAiB;AACjF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,MAAc,OAAiB;AAC/E,eAAa,KAAK,IAAI;AACtB,KAAG,CAAC;AACL,CAAC;AAED,8DAAwC,OAAO,MAAiB,OAAiB;AAChF,gBAAc,KAAK,IAAI;AACvB,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,OAAO,MAAc,OAAiB;AAC1E,MAAI,UAAU,QAAQ,KAAK,IAAI;AAC/B,KAAG,OAAO;AACX,CAAC;AAED,gEAAyC,OAAO,MAAc,OAAiB;AAC9E,MAAI,UAAU,YAAY,KAAK,IAAI;AACnC,KAAG,OAAO;AACX,CAAC;AAED;AAAA;AAAA,EAAwC,OAAO,MAAmB,OAAiB;AAClF,UAAM,OAAO,gBAAe,KAAK,IAAI;AACrC,QAAI,CAAC;AAAM,aAAO,GAAG,KAAK;AAE1B,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC;AAAS,aAAO,GAAG,KAAK;AAE7B,QAAI,SAAS,QAAQ;AACpB,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAE9C,UAAI,gBAAgB,IAAI;AACvB,gBAAQ,KAAK,OAAO;AACpB,WAAG,KAAK;AACR;AAAA,MACD,OAAO;AACN,qBAAa,KAAK,KAAK;AACvB,WAAG,IAAI;AACP;AAAA,MACD;AAAA,IACD,WAAW,SAAS,YAAY;AAC/B,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAE1D,UAAI,QAAQ,UAAU,KAAK,KAAK;AAC/B,WAAG,KAAK;AACR;AAAA,MACD;AAEA,UAAI,QAAQ,UAAU,iBAAiB;AACtC,iCAAyB,KAAK,OAAO,KAAK,KAAK,GAAG,CAAC;AACnD,YAAI,MAAM;AACT,mBAAQ,IAAE,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC7C,kBAAM,WAAW,KAAK,UAAU,CAAC;AACjC,qCAAyB,KAAK,SAAS,WAAW,SAAS,SAAS,SAAS,SAAS,CAAC;AAAA,UACxF;AAAA,QACD;AACA,WAAG,IAAI;AACP;AAAA,MACD,OAAO;AACN,oBAAY,KAAK,OAAO;AACxB,iBAAQ,IAAE,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,sBAAY,KAAK,SAAS,CAAC,CAAC;AAAA,QAC7B;AACA,WAAG,KAAK;AACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA;AAEA,8DAAwC,OAAO,MAAW,OAAiB;AAC1E,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,EAAC,GAAE,GAAG,OAAiB;AACvE,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,EAAE;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,MAAW,OAAiB;AAC5E,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,IAAI;AACpF,KAAG,MAAM;AACV,CAAC;AAED,4DAAuC,OAAO,QAAqB,OAAiB;AACnF,gBAAc,KAAK,MAAM;AACzB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,EAAE,IAAI,WAAW,GAAG,OAAiB;AACrF,QAAM,eAAe,eAAe;AACpC,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,cAAc,IAAI,UAAU;AAC5G,KAAG,MAAM;AACV,CAAC;AAED,gEAAyC,OAAO,EAAE,GAAG,GAAG,OAAiB;AACxE,QAAM,SAAS,MAAM,sBAAsB,oCAAoC,EAAE;AACjF,KAAG,MAAM;AACV,CAAC;AAED,8DAAwC,OAAO,MAA4C,OAAiB;AAC3G,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,MAAM,qCAAqC,CAAC,WAAwB;AACnE,gBAAc,KAAK,MAAM;AAC1B,CAAC;;;ACrLD,IAAM,SAAS,QAAQ;AACvB,IAAI,SAAS;AACb,IAAI,OAAO;AAEX,IAAI,iBAAiB;AACrB,IAAI,UAAU;AAEd,eAAsB,SAAS,MAAiD,WAAoB,OAAO;AACvG,MAAI,SAAS,QAAQ,MAAM;AACvB;AAAA,EACJ;AAEA,MAAI,YAAY,YAAY;AAC5B,QAAM,cAAc,OAAO,MAAM;AAEjC,QAAM,WAAW,OAAO,SAAS;AAEjC,QAAM,OAAO,WAAW,OAAO,KAAK;AAEpC,QAAM,OAAO,YAAY,IAAI;AAC7B,MAAI,CAAC;AAAM;AAEX,YAAU,SAAS;AAEnB,QAAM,eAAe,eAAe;AACpC,QAAM,OAAO,KAAK;AAClB,MAAI,YAAY,WAAW,QAAQ,KAAK;AAExC,WAAS,aAAa,SAAS;AAE/B,MAAI,UAAU,CAAC;AAEf,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AAAc,cAAU,MAAM,sBAAgC,mCAAmC,YAAY;AAEjH,MAAI,SAAS,CAAC;AAEd,QAAM,iBAAiB,KAAK,SAAS,UAAU;AAC/C,MAAI,gBAAgB;AAChB,aAAS,OAAO,OAAO;AAAA,EAC3B;AAEA,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AACJ,MAAI,cAAc;AACd,cAAU,cAAc;AAAA,EAC5B;AAEA,QAAM,YAAY,aAAa,IAAI;AAEnC,MAAI,UAAU;AACV,UAAM,QAAQ,WAAW,qBAAqB,CAAC;AAC/C,gBAAY,MAAM,SAAS,WAAW,KAAK;AAC3C,YAAQ,uCAAuC;AAC/C,cAAU,IAAI,QAAQ,aAAW;AAC7B,uBAAiB;AAAA,IACrB,CAAC;AAED,cAAU,SAAS;AAAA,EACvB;AAEA,QAAM,aAAa,MAAM,cAAc,SAAS;AAEhD,cAAY;AAEZ,6CAAwB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,QAAQ,MAAM,cAAc,QAAQ;AAAA,EACxC,CAAC;AAED,cAAY,MAAM,IAAI;AACtB,mDAA2B,IAAI;AAE/B,SAAO;AAEP,UAAQ,cAAc,QAAQ,IAAI;AAElC,MAAI,SAAS;AACT,UAAM;AACN,YAAQ,yCAAyC;AAAA,EACrD;AAEA,YAAU;AACV,mBAAiB;AACjB,SAAO;AACX;AArFsB;AAsFtB,QAAQ,YAAY,QAAQ;AAE5B,gBAAgB,cAAc,OAAO,GAAG,SAAmB;AACvD,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACP,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,OAAO;AACH,UAAM,OAAO,KAAK,YAAY;AAC9B,aAAS,IAAI;AAAA,EACjB;AACJ,GAAG,IAAI;AAGP,SAAS,aAAa,MAAgC;AAClD,QAAM,EAAC,YAAY,KAAI,IAAI,OAAO,UAAU;AAE5C,MAAI,OAAO,SAAS;AAAU,WAAO;AAErC,MAAI,CAAC;AAAY,WAAO;AAExB,MAAI,YAAY,EAAC,GAAG,KAAI;AAExB,QAAM,aAAa,cAAc;AAGjC,aAAW,QAAQ,YAAY;AAC3B,UAAM,SAAS,WAAW,IAAI;AAC9B,eAAW,SAAS,QAAQ;AAExB,UAAI,OAAgB;AAEpB,UAAI,QAAQ,UAAU,KAAK,MAAM;AAC7B,eAAO,KAAK,KAAK,SAAS,WAAW,IAAI,IAAI;AAAA,MACjD;AAEA,UAAI,QAAQ,WAAW,KAAK,OAAO;AAC/B,eAAO,KAAK,MAAM,SAAS,WAAW,KAAK,IAAI;AAAA,MACnD;AAEA,UAAI,CAAC,MAAM;AACP,cAAM,iBAAiB,OAAO,KAAK;AACnC,oBAAY,OAAO,OAAO,CAAC,GAAG,WAAW,gBAAgB;AAAA,UACvD,WAAW,OAAO,OAAO,CAAC,GAAG,UAAU,WAAW,eAAe,SAAS;AAAA,QAC5E,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAGX;AAtCS;AAwCF,SAAS,YAAY;AACxB,eAAa,KAAK,MAAM;AAExB,aAAW;AACX,cAAY,OAAO,KAAK;AACxB,mDAA2B,KAAK;AAGhC,UAAQ,cAAc,QAAQ,KAAK;AAEnC,MAAI,gBAAgB;AAChB,mBAAe;AAAA,EACnB;AACA,SAAO;AACX;AAdgB;;;ACtJT,SAAS,WAAW;AACvB,QAAM,yCAAyC,OAAO,YAAyBC,SAAgB;AAC3F,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,0CAA0C,MAAM;AAClD,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,QAAM,qCAAqC,MAAM;AAC7C,aAAS,EAAE,MAAM,WAAW,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EACtD,CAAC;AACL;AAZgB;;;ACAT,SAAS,YAAY;AACxB,MAAI,aAAa;AAEjB,KAAG,4BAA4B,MAAM;AACjC,iBAAa;AAAA,EACjB,CAAC;AAED,KAAG,6BAA6B,MAAM;AAClC,QAAG;AACC,cAAQ,cAAc,gBAAgB;AAAA,EAC9C,CAAC;AAED,QAAM,yBAAyB,OAAO,YAAyBC,SAAgB;AAC3E,QAAI,CAAC,WAAW;AAAO,iBAAW,QAAQ,WAAW,kBAAkB;AACvE,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,uBAAuB,OAAO,OAAY;AAC5C,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,OAAG,UAAU;AAAA,EACjB,CAAC;AAED,QAAM,wBAAwB,OAAO,YAAyB,OAAY;AACtE,UAAM,uBAAuB,UAAU;AACvC,QAAI;AAAI,SAAG;AAAA,EACf,CAAC;AAED,QAAM,6BAA6B,OAAO,aAAkB;AACxD,YAAQ,cAAc,gBAAgB,QAAQ;AAAA,EAClD,CAAC;AACL;AA/BgB;;;ACChB,SAAS,cAAc,MAAc,IAAS;AAC1C,KAAG,sCAAsC,MAAM,CAAC,UAAe;AAC3D,UAAM,EAAE;AAAA,EACZ,CAAC;AACL;AAJS;AAMF,SAAS,iBAAiB;AAC7B,gBAAc,4BAA4B,MAAM;AAC5C,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,gBAAc,eAAe,CAACC,SAAgB;AAC1C,WAAO,eAAeA,IAAG;AAAA,EAC7B,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,UAAM,YAAiB,aAAaA,IAAG,EAAE,CAAC;AAC1C,QAAI,cAAc,CAAC;AACnB,eAAW,MAAM,WAAW;AACxB,YAAM,WAAW,UAAU,EAAE;AAC7B,kBAAY,KAAK;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,UAAU,SAAS;AAAA,QACnB,SAAS,SAAS;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,eAAe,CAACA,SAAgB;AAC1C,UAAM,QAAc,SAASA,IAAG,EAAE,CAAC;AACnC,QAAI,WAAW,CAAC;AAChB,eAAW,MAAM,OAAO;AACpB,YAAM,OAAO,MAAM,EAAE;AACrB,eAAS,KAAK;AAAA,QACV,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAClB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,mBAAmB,CAACA,SAAgB;AAC9C,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,cAAc,CAACA,SAAgB;AAEzC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,WAAO,cAAcA,IAAG;AAAA,EAC5B,CAAC;AAED,gBAAc,kBAAkB,CAAC,UAAkB;AAC/C,cAAU,YAAY,CAAC;AACvB,aAAS,KAAK,KAAK;AAAA,EACvB,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,UAAe;AAE1D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,MAAM;AACtC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,MAAa,YAAiB;AAE/D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,cAAc,OAAOA,MAAa,MAAW,WAAgB;AAEvE,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,kBAAkB,MAAM;AAClC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,aAAkB;AAC7D,UAAM,cAAc;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,IACtB;AACA,gBAAYA,MAAK,WAAW;AAAA,EAChC,CAAC;AAED,gBAAc,oBAAoB,CAACA,MAAa,eAAoB;AAChE,eAAW,aAAa,YAAY;AAChC,YAAM,cAAc;AAAA,QAChB,OAAO,UAAU;AAAA,QACjB,OAAO,UAAU;AAAA,QACjB,SAAS,UAAU;AAAA,MACvB;AACA,kBAAYA,MAAK,WAAW;AAAA,IAChC;AAAA,EACJ,CAAC;AAED,gBAAc,cAAc,CAACA,MAAa,SAAc;AACpD,UAAM,UAAU;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAClB;AACA,YAAQA,MAAK,OAAO;AAAA,EACxB,CAAC;AAED,gBAAc,eAAe,CAACA,MAAa,UAAe;AACtD,eAAW,QAAQ,OAAO;AACtB,YAAM,UAAU;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,MAClB;AACA,cAAQA,MAAK,OAAO;AAAA,IACxB;AAAA,EACJ,CAAC;AAMD,gBAAc,oBAAoB,CAACA,MAAa,eAA4B;AACxE,qBAAiBA,MAAK,UAAU;AAAA,EACpC,CAAC;AAED,gBAAc,iBAAiB,CAACA,MAAa,YAAuB;AAChE,kBAAcA,MAAK,OAAO;AAAA,EAC9B,CAAC;AACL;AA1IgB;;;ACJhB,QAAQ,0BAA0B,OAAO,eAAqC;AAC1E,MAAI;AAEJ,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AAC/C,UAAM,cAAsB,cAAc,MAAM,eAAe;AAC/D,yBAAqB,MAAM,sBAAmC,sCAAsC,WAAW;AAAA,EACnH,WAAW,OAAO,eAAe;AAAU,yBAAqB;AAEhE,MAAI,CAAC,oBAAoB;AACrB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AAEA,QAAM,uBAAuB,kBAAkB;AACnD,CAAC;AAED,QAAQ,0BAA0B,OAAO,gBAAwB;AAC7D,gBAAc,eAAe,MAAM,eAAe;AAClD,SAAO,MAAM,sBAAmC,sCAAsC,WAAW;AACrG,CAAC;AAED,QAAQ,mBAAmB,OAAO,OAAkB;AAEhD,QAAM,SAAS,EAAE,MAAM,cAAc,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI;AACjE,MAAI;AAAI,OAAG;AACf,CAAC;AAED,GAAG,gCAAgC,CAAC,SAA0B;AAC1D,WAAS,IAAI;AACjB,CAAC;AAED,MAAM,iCAAiC,YAAY;AAC/C,SAAO,CAAC,UAAU,KAAK,EAAE,aAAa,GAAG;AACrC,UAAM,MAAM,GAAG;AAAA,EACnB;AACA,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAC3C,CAAC;AAED,MAAM,mBAAmB,OAAO,aAAqB;AACjD,MAAI,aAAa,uBAAuB,KAAK,UAAU,KAAK,EAAE,aAAa,GAAG;AAC1E,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,QAAI,CAAC;AAAY;AACjB,UAAM,uBAAuB,UAAU;AAAA,EAC3C;AACJ,CAAC;AAED,IAAM,gBAAgB,UAAU,aAAa,MAAM;AACnD,IAAM,OAAO,OAAO,UAAU,gBAAgB,IAAI,CAAC;AAEnD,IAAI,QAAQ,QAAQ,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AAC/E,WAAS;AACb,WAAW,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AACtE,YAAU;AACd;AAEA,eAAe;AAEf,gBAAgB,cAAc,YAAY;AACtC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,YAAY,mBAAmB,GAAG;AACxC,QAAM,QAAQ,aAAa,GAAG;AAE9B,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAEvC,kBAAgB,KAAK,SAAS;AAC9B,QAAM,GAAI;AACV,kBAAgB,KAAK,MAAM;AAC3B,eAAa,KAAK,KAAK;AAC3B,GAAG,KAAK;", + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nexport function setFaceFeatures(pedHandle: number, data: THeadStructure) {\r\n if (!data) return console.warn('No data provided for setFaceFeatures')\r\n \r\n\r\n for (const feature in data) {\r\n const value = data[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetFaceFeatures', setFaceFeatures);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) setFaceFeatures(pedHandle, headStructure)\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "mappings": "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", "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] } diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index 75b13fa..32d6e68 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -1,4 +1,4 @@ -import { TAppearance, THairColor, TClothes, TSkin, TValue } from "@typings/appearance"; +import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from "@typings/appearance"; import TOGGLE_INDEXES from "@data/toggles" import { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils'; import { TTattoo } from "@typings/tattoos"; @@ -84,6 +84,17 @@ export function setFaceFeature(pedHandle: number, data: TValue) { } exports('SetFaceFeature', setFaceFeature); +export function setFaceFeatures(pedHandle: number, data: THeadStructure) { + if (!data) return console.warn('No data provided for setFaceFeatures') + + + for (const feature in data) { + const value = data[feature] + setFaceFeature(pedHandle, value) + } +} +exports('SetFaceFeatures', setFaceFeatures); + const isPositive = (val: number) => val >= 0 ? val : 0 export function setHeadBlend(pedHandle: number, data) { @@ -190,10 +201,7 @@ export const setPedSkin = async (pedHandle: number, data: TSkin) => { if (headBlend) setHeadBlend(pedHandle, headBlend) - if (headStructure) for (const feature in headStructure) { - const value = headStructure[feature] - setFaceFeature(pedHandle, value) - } + if (headStructure) setFaceFeatures(pedHandle, headStructure) } exports('SetPedSkin', setPedSkin); From 30cc74cf5de89e09738de877dac23e806e1656ac Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 16:08:12 +1000 Subject: [PATCH 28/30] fix(tattoo); only fetch player tattoos if player is the desired pedhandle --- dist/client/init.js | 4 ++-- dist/client/init.js.map | 4 ++-- src/client/appearance/getters.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 90c85b7..1839236 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -522,7 +522,7 @@ async function getAppearance(pedHandle) { const [drawables, drawTotal] = getDrawables(pedHandle); const [props, propTotal] = getProps(pedHandle); const model = GetEntityModel(pedHandle); - const tattoos = await getTattoos(); + const tattoos = pedHandle == PlayerPedId() ? await getTattoos() : []; return { modelIndex: findModelIndex(model), model, @@ -1413,4 +1413,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBhd2FpdCBnZXRUYXR0b29zKClcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBoZWFkT3ZlcmxheVRvdGFsOiB0b3RhbHMgYXMgVEhlYWRPdmVybGF5VG90YWwsXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgICAgICBkcmF3VG90YWw6IGRyYXdUb3RhbCxcclxuICAgICAgICBwcm9wVG90YWw6IHByb3BUb3RhbCxcclxuICAgICAgICB0YXR0b29zOiB0YXR0b29zXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldEFwcGVhcmFuY2VcIiwgZ2V0QXBwZWFyYW5jZSlcclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsICgpID0+IHtcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKVxyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyKTogVENsb3RoZXMge1xyXG4gICAgY29uc3QgW2RyYXdhYmxlc10gPSBnZXREcmF3YWJsZXMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW3Byb3BzXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtoZWFkRGF0YV0gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGRyYXdhYmxlczogZHJhd2FibGVzLFxyXG4gICAgICAgIHByb3BzOiBwcm9wcyxcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQ2xvdGhlc1wiLCBnZXRQZWRDbG90aGVzKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZFNraW4ocGVkSGFuZGxlOiBudW1iZXIpOiBUU2tpbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBoYWlyQ29sb3I6IGdldEhhaXIocGVkSGFuZGxlKSxcclxuICAgICAgICBtb2RlbDogR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRTa2luXCIsIGdldFBlZFNraW4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGF0dG9vRGF0YSgpIHtcclxuICAgIGxldCB0YXR0b29ab25lcyA9IFtdXHJcblxyXG4gICAgY29uc3QgW1RBVFRPT19MSVNULCBUQVRUT09fQ0FURUdPUklFU10gPSBleHBvcnRzLmJsX2FwcGVhcmFuY2UudGF0dG9vcygpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRBVFRPT19DQVRFR09SSUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSBUQVRUT09fQ0FURUdPUklFU1tpXVxyXG4gICAgICAgIGNvbnN0IHpvbmUgPSBjYXRlZ29yeS56b25lXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBjYXRlZ29yeS5sYWJlbFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2F0ZWdvcnkuaW5kZXhcclxuICAgICAgICB0YXR0b29ab25lc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgICAgem9uZUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgZGxjczogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZGxjRGF0YSA9IFRBVFRPT19MSVNUW2pdXHJcbiAgICAgICAgICAgIHRhdHRvb1pvbmVzW2luZGV4XS5kbGNzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRsY0RhdGEuZGxjLFxyXG4gICAgICAgICAgICAgICAgZGxjSW5kZXg6IGosXHJcbiAgICAgICAgICAgICAgICB0YXR0b29zOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0ZlbWFsZSA9IEdldEVudGl0eU1vZGVsKHBlZCkgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fTElTVC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBUQVRUT09fTElTVFtpXVxyXG4gICAgICAgIGNvbnN0IHsgZGxjLCB0YXR0b29zIH0gPSBkYXRhXHJcbiAgICAgICAgY29uc3QgZGxjSGFzaCA9IEdldEhhc2hLZXkoZGxjKVxyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGF0dG9vcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXR0b29EYXRhID0gdGF0dG9vc1tqXVxyXG4gICAgICAgICAgICBsZXQgdGF0dG9vID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG93ZXJUYXR0b28gPSB0YXR0b29EYXRhLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgY29uc3QgaXNGZW1hbGVUYXR0b28gPSBsb3dlclRhdHRvby5pbmNsdWRlcyhcIl9mXCIpXHJcbiAgICAgICAgICAgIGlmIChpc0ZlbWFsZVRhdHRvbyAmJiBpc0ZlbWFsZSkge1xyXG4gICAgICAgICAgICAgICAgdGF0dG9vID0gdGF0dG9vRGF0YVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0ZlbWFsZVRhdHRvbyAmJiAhaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBudWxsXHJcbiAgICAgICAgICAgIGxldCB6b25lID0gLTFcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXR0b28pIHtcclxuICAgICAgICAgICAgICAgIGhhc2ggPSBHZXRIYXNoS2V5KHRhdHRvbylcclxuICAgICAgICAgICAgICAgIHpvbmUgPSBHZXRQZWREZWNvcmF0aW9uWm9uZUZyb21IYXNoZXMoZGxjSGFzaCwgaGFzaClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHpvbmUgIT09IC0xICYmIGhhc2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVUYXR0b29zID0gdGF0dG9vWm9uZXNbem9uZV0uZGxjc1tpXS50YXR0b29zXHJcblxyXG4gICAgICAgICAgICAgICAgem9uZVRhdHRvb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhdHRvbyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGxjOiBkbGMsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXR0b29ab25lc1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcygpOiBQcm9taXNlPFRUYXR0b29bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycpIHx8IFtdXHJcbn1cclxuZXhwb3J0cygnR2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG4vL21pZ3JhdGlvblxyXG5cclxub25TZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCAoZGF0YToge3R5cGU6IHN0cmluZywgZGF0YTogYW55fSkgPT4ge1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2ZpdmVtJykgZXhwb3J0c1snZml2ZW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2lsbGVuaXVtJykgZXhwb3J0c1snaWxsZW5pdW0tYXBwZWFyYW5jZSddLnNldFBsYXllckFwcGVhcmFuY2UoZGF0YS5kYXRhKVxyXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgaGF0czoge1xyXG4gICAgICAgIHR5cGU6IFwicHJvcFwiLFxyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgfSxcclxuICAgIGdsYXNzZXM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgIH0sXHJcbiAgICBtYXNrczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMSxcclxuICAgICAgICBvZmY6IDAsXHJcbiAgICB9LFxyXG4gICAgc2hpcnRzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA4LFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogOCwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnc2hpcnRzJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgamFja2V0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogMTEsXHJcbiAgICAgICAgb2ZmOiAxNSxcclxuICAgICAgICBob29rOiB7XHJcbiAgICAgICAgICAgIGRyYXdhYmxlczogW1xyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDMsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3RvcnNvcycgfSxcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAxMSwgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAnamFja2V0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHZlc3Q6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDksXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIGxlZ3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDQsXHJcbiAgICAgICAgb2ZmOiAxOCxcclxuICAgIH0sXHJcbiAgICBzaG9lczoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogNixcclxuICAgICAgICBvZmY6IDM0LFxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckNvbG9yLCBUQ2xvdGhlcywgVFNraW4sIFRWYWx1ZSwgVEhlYWRTdHJ1Y3R1cmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5pbXBvcnQgVE9HR0xFX0lOREVYRVMgZnJvbSBcIkBkYXRhL3RvZ2dsZXNcIlxyXG5pbXBvcnQgeyByZXF1ZXN0TW9kZWwsIHBlZCwgdXBkYXRlUGVkLCBpc1BlZEZyZWVtb2RlTW9kZWx9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldERyYXdhYmxlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RHJhd2FibGUnKVxyXG5cclxuICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUsIGRhdGEudGV4dHVyZSwgMClcclxuICAgIHJldHVybiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXREcmF3YWJsZScsIHNldERyYXdhYmxlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQcm9wKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UHJvcCcpXHJcblxyXG4gICAgaWYgKGRhdGEudmFsdWUgPT09IC0xKSB7XHJcbiAgICAgICAgQ2xlYXJQZWRQcm9wKHBlZEhhbmRsZSwgZGF0YS5pbmRleClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRQcm9wSW5kZXgocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIGZhbHNlKVxyXG4gICAgcmV0dXJuIEdldE51bWJlck9mUGVkUHJvcFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSlcclxufVxyXG5leHBvcnRzKCdTZXRQcm9wJywgc2V0UHJvcCk7XHJcblxyXG5jb25zdCBkZWZNYWxlSGFzaCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0TW9kZWwgPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlIHwgVFNraW4gfCBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldE1vZGVsJylcclxuICAgICAgICByZXR1cm4gcGVkSGFuZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtb2RlbDogbnVtYmVyO1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIG1vZGVsID0gR2V0SGFzaEtleShkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbW9kZWwgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBtb2RlbCA9IGRhdGEubW9kZWwgfHwgZGVmTWFsZUhhc2g7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vZGVsID09PSAwKSByZXR1cm4gcGVkSGFuZGxlO1xyXG5cclxuICAgIGF3YWl0IHJlcXVlc3RNb2RlbChtb2RlbCk7XHJcblxyXG4gICAgY29uc3QgaXNQbGF5ZXIgPSBJc1BlZEFQbGF5ZXIocGVkSGFuZGxlKTtcclxuICAgIGlmIChpc1BsYXllcikge1xyXG4gICAgICAgIFNldFBsYXllck1vZGVsKFBsYXllcklkKCksIG1vZGVsKTtcclxuICAgICAgICBwZWRIYW5kbGUgPSBQbGF5ZXJQZWRJZCgpO1xyXG4gICAgICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIFNldFBsYXllck1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIFNldE1vZGVsQXNOb0xvbmdlck5lZWRlZChtb2RlbCk7XHJcbiAgICBTZXRQZWREZWZhdWx0Q29tcG9uZW50VmFyaWF0aW9uKHBlZEhhbmRsZSk7XHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuIHBlZEhhbmRsZTtcclxuXHJcbiAgICBjb25zdCBpc0p1c3RNb2RlbCA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGF0YSA9PT0gJ251bWJlcic7XHJcbiAgICBjb25zdCBoYXNIZWFkQmxlbmQgPSAhaXNKdXN0TW9kZWwgJiYgZGF0YS5oZWFkQmxlbmQgJiYgT2JqZWN0LmtleXMoZGF0YS5oZWFkQmxlbmQpLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgaWYgKGhhc0hlYWRCbGVuZCkge1xyXG4gICAgICAgIHNldEhlYWRCbGVuZChwZWRIYW5kbGUsIChkYXRhIGFzIFRBcHBlYXJhbmNlIHwgVFNraW4pLmhlYWRCbGVuZCk7XHJcbiAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSkge1xyXG4gICAgICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgMCwgMCwgMCwgMCwgMCwgMCwgMC4wLCAwLjAsIDAuMCwgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IEdldEhhc2hLZXkoXCJtcF9mX2ZyZWVtb2RlXzAxXCIpKSB7XHJcbiAgICAgICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCA0NSwgMjEsIDAsIDIwLCAxNSwgMCwgMC4zLCAwLjEsIDAsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlZEhhbmRsZTtcclxufTtcclxuZXhwb3J0cygnU2V0TW9kZWwnLCBzZXRNb2RlbCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RmFjZUZlYXR1cmUocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRWYWx1ZSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRGYWNlRmVhdHVyZScpXHJcblxyXG4gICAgU2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlICsgMC4wKVxyXG59XHJcbmV4cG9ydHMoJ1NldEZhY2VGZWF0dXJlJywgc2V0RmFjZUZlYXR1cmUpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZhY2VGZWF0dXJlcyhwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEhlYWRTdHJ1Y3R1cmUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RmFjZUZlYXR1cmVzJylcclxuICAgICAgICBcclxuXHJcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtmZWF0dXJlXVxyXG4gICAgICAgIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgdmFsdWUpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0RmFjZUZlYXR1cmVzJywgc2V0RmFjZUZlYXR1cmVzKTtcclxuXHJcbmNvbnN0IGlzUG9zaXRpdmUgPSAodmFsOiBudW1iZXIpID0+IHZhbCA+PSAwID8gdmFsIDogMFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEhlYWRCbGVuZChwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRIZWFkQmxlbmQnKVxyXG5cclxuICAgIHBlZEhhbmRsZSA9IHBlZEhhbmRsZSB8fCBwZWRcclxuXHJcbiAgICBpZiAoIWlzUGVkRnJlZW1vZGVNb2RlbChwZWRIYW5kbGUpKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBzaGFwZUZpcnN0ID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlRmlyc3QpXHJcbiAgICBjb25zdCBzaGFwZVNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZVNlY29uZClcclxuICAgIGNvbnN0IHNoYXBlVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVUaGlyZClcclxuICAgIGNvbnN0IHNraW5GaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5za2luRmlyc3QpXHJcbiAgICBjb25zdCBza2luU2Vjb25kID0gaXNQb3NpdGl2ZShkYXRhLnNraW5TZWNvbmQpXHJcbiAgICBjb25zdCBza2luVGhpcmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpblRoaXJkKVxyXG4gICAgY29uc3Qgc2hhcGVNaXggPSBkYXRhLnNoYXBlTWl4ICsgMC4wXHJcbiAgICBjb25zdCBza2luTWl4ID0gZGF0YS5za2luTWl4ICsgMC4wXHJcbiAgICBjb25zdCB0aGlyZE1peCA9IGRhdGEudGhpcmRNaXggKyAwLjBcclxuICAgIGNvbnN0IGhhc1BhcmVudCA9IGRhdGEuaGFzUGFyZW50XHJcblxyXG4gICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIHNoYXBlRmlyc3QsIHNoYXBlU2Vjb25kLCBzaGFwZVRoaXJkLCBza2luRmlyc3QsIHNraW5TZWNvbmQsIHNraW5UaGlyZCwgc2hhcGVNaXgsIHNraW5NaXgsIHRoaXJkTWl4LCBoYXNQYXJlbnQpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZEJsZW5kJywgc2V0SGVhZEJsZW5kKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGU6IG51bWJlciwgZGF0YSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRIZWFkT3ZlcmxheScpXHJcblxyXG4gICAgY29uc3QgaW5kZXggPSBkYXRhLmluZGV4XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAxMykge1xyXG4gICAgICAgIFNldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSwgZGF0YS52YWx1ZSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGEub3ZlcmxheVZhbHVlXHJcblxyXG4gICAgLyogSGFpciBjb2xvciBkb2VzIG5vdCBoYXZlIGFuIGluZGV4LCBvbmx5IGFuIElEIHNvIHdlJ2xsIGNoZWNrIGZvciB0aGF0ICovXHJcbiAgICBpZiAoZGF0YS5pZCA9PT0gJ2hhaXJDb2xvcicpIHtcclxuICAgICAgICBTZXRQZWRIYWlyVGludChwZWRIYW5kbGUsIGRhdGEuaGFpckNvbG9yLCBkYXRhLmhhaXJIaWdobGlnaHQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFNldFBlZEhlYWRPdmVybGF5KHBlZEhhbmRsZSwgaW5kZXgsIHZhbHVlLCBkYXRhLm92ZXJsYXlPcGFjaXR5ICsgMC4wKVxyXG4gICAgU2V0UGVkSGVhZE92ZXJsYXlDb2xvcihwZWRIYW5kbGUsIGluZGV4LCAxLCBkYXRhLmZpcnN0Q29sb3IsIGRhdGEuc2Vjb25kQ29sb3IpXHJcbn1cclxuZXhwb3J0cygnU2V0SGVhZE92ZXJsYXknLCBzZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VG9nZ2xlcyhkYXRhKSB7XHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcblxyXG4gICAgZm9yIChjb25zdCBbdG9nZ2xlSXRlbSwgdG9nZ2xlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoVE9HR0xFX0lOREVYRVMpKSB7XHJcbiAgICAgICAgY29uc3QgdG9nZ2xlVHlwZSA9IHRvZ2dsZURhdGEudHlwZVxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdG9nZ2xlRGF0YS5pbmRleFxyXG5cclxuICAgICAgICBpZiAodG9nZ2xlVHlwZSA9PT0gXCJkcmF3YWJsZVwiICYmIGRyYXdhYmxlc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RHJhd2FibGUgPSBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudERyYXdhYmxlICE9PSBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRvZ2dsZVR5cGUgPT09IFwicHJvcFwiICYmIHByb3BzW3RvZ2dsZUl0ZW1dKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcCAhPT0gcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIFNldFBlZFByb3BJbmRleChwZWQsIGluZGV4LCBwcm9wc1t0b2dnbGVJdGVtXS52YWx1ZSwgMCwgZmFsc2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZENsb3RoZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRDbG90aGVzKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZENsb3RoZXMnKVxyXG5cclxuICAgIGNvbnN0IGRyYXdhYmxlcyA9IGRhdGEuZHJhd2FibGVzXHJcbiAgICBjb25zdCBwcm9wcyA9IGRhdGEucHJvcHNcclxuICAgIGNvbnN0IGhlYWRPdmVybGF5ID0gZGF0YS5oZWFkT3ZlcmxheVxyXG4gICAgZm9yIChjb25zdCBpZCBpbiBkcmF3YWJsZXMpIHtcclxuICAgICAgICBjb25zdCBkcmF3YWJsZSA9IGRyYXdhYmxlc1tpZF1cclxuICAgICAgICBzZXREcmF3YWJsZShwZWRIYW5kbGUsIGRyYXdhYmxlKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gcHJvcHMpIHtcclxuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaWRdXHJcbiAgICAgICAgc2V0UHJvcChwZWRIYW5kbGUsIHByb3ApXHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBpZCBpbiBoZWFkT3ZlcmxheSkge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBoZWFkT3ZlcmxheVtpZF1cclxuICAgICAgICBzZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIG92ZXJsYXkpXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldFBlZFNraW4gPSBhc3luYyAocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRTa2luKSA9PiB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZFNraW4nKVxyXG5cclxuICAgIGlmICghcGVkSGFuZGxlKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBwZWRIYW5kbGUgcHJvdmlkZWQgZm9yIHNldFBlZFNraW4nKVxyXG5cclxuICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgZGF0YSlcclxuXHJcbiAgICBjb25zdCBoZWFkU3RydWN0dXJlID0gZGF0YS5oZWFkU3RydWN0dXJlXHJcbiAgICBjb25zdCBoZWFkQmxlbmQgPSBkYXRhLmhlYWRCbGVuZFxyXG5cclxuICAgIGlmIChoZWFkQmxlbmQpIHNldEhlYWRCbGVuZChwZWRIYW5kbGUsIGhlYWRCbGVuZClcclxuICAgIFxyXG4gICAgaWYgKGhlYWRTdHJ1Y3R1cmUpIHNldEZhY2VGZWF0dXJlcyhwZWRIYW5kbGUsIGhlYWRTdHJ1Y3R1cmUpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRUYXR0b29bXSkge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRUYXR0b29zJylcclxuXHJcbiAgICBDbGVhclBlZERlY29yYXRpb25zTGVhdmVTY2FycyhwZWRIYW5kbGUpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IGRhdGFbaV0udGF0dG9vXHJcbiAgICAgICAgaWYgKHRhdHRvb0RhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IEdldEhhc2hLZXkodGF0dG9vRGF0YS5kbGMpXHJcbiAgICAgICAgICAgIGNvbnN0IHRhdHRvbyA9IHRhdHRvb0RhdGEuaGFzaFxyXG4gICAgICAgICAgICBBZGRQZWREZWNvcmF0aW9uRnJvbUhhc2hlcyhwZWRIYW5kbGUsIGNvbGxlY3Rpb24sIHRhdHRvbylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cygnU2V0UGVkVGF0dG9vcycsIHNldFBlZFRhdHRvb3MpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIYWlyQ29sb3IpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkSGFpckNvbG9ycycpXHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkYXRhLmNvbG9yXHJcbiAgICBjb25zdCBoaWdobGlnaHQgPSBkYXRhLmhpZ2hsaWdodFxyXG4gICAgU2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSwgY29sb3IsIGhpZ2hsaWdodClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVkQXBwZWFyYW5jZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkQXBwZWFyYW5jZScpXHJcblxyXG4gICAgaWYgKElzUGVkQVBsYXllcihwZWRIYW5kbGUpKSB7XHJcbiAgICAgICAgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShkYXRhKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgYXdhaXQgc2V0UGVkU2tpbihwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZSwgZGF0YSlcclxuICAgIHNldFBlZEhhaXJDb2xvcnMocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvcilcclxuICAgIHNldFBlZFRhdHRvb3MocGVkSGFuZGxlLCBkYXRhLnRhdHRvb3MpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkQXBwZWFyYW5jZScsIHNldFBlZEFwcGVhcmFuY2UpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGxheWVyUGVkQXBwZWFyYW5jZScpXHJcbiAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGFmdGVyIHNjcmlwdHMgc2V0IHRoZWlyIG93biBtb2RlbCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBiZWZvcmUgd2Ugc2V0IHRoZSBhcHBlYXJhbmNlXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkLCBkYXRhKVxyXG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBlZCBhZ2FpbiBhZnRlciBzZXR0aW5nIHRoZSBza2luIGJlY2F1c2UgU2V0UGxheWVyTW9kZWwgd2lsbCBzZXQgYSBuZXcgUGxheWVyUGVkSWRcclxuICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWQsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZCwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZCwgZGF0YS50YXR0b29zKVxyXG59XHJcblxyXG5leHBvcnRzKCdTZXRQZWRDbG90aGVzJywgc2V0UGVkQ2xvdGhlcylcclxuZXhwb3J0cygnU2V0UGVkU2tpbicsIHNldFBlZFNraW4pXHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKVxyXG5leHBvcnRzKCdTZXRQZWRIYWlyQ29sb3JzJywgc2V0UGVkSGFpckNvbG9ycykiLCAiaW1wb3J0IHsgUmVjZWl2ZSB9IGZyb20gJ0BldmVudHMnO1xyXG5pbXBvcnQge1xyXG5cdHJlc2V0VG9nZ2xlcyxcclxuXHRzZXREcmF3YWJsZSxcclxuXHRzZXRGYWNlRmVhdHVyZSxcclxuXHRzZXRIZWFkQmxlbmQsXHJcblx0c2V0SGVhZE92ZXJsYXksXHJcblx0c2V0TW9kZWwsXHJcblx0c2V0UGVkQ2xvdGhlcyxcclxuXHRzZXRQZWRUYXR0b29zLFxyXG5cdHNldFBsYXllclBlZEFwcGVhcmFuY2UsXHJcblx0c2V0UHJvcCxcclxufSBmcm9tICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCB7IGNsb3NlTWVudSB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IFRBcHBlYXJhbmNlLCBUVG9nZ2xlRGF0YSwgVFZhbHVlIH0gZnJvbSAnQHR5cGluZ3MvYXBwZWFyYW5jZSc7XHJcbmltcG9ydCB7IGRlbGF5LCBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IGdldEFwcGVhcmFuY2UsIGdldFRhdHRvb0RhdGEgfSBmcm9tICcuL2FwcGVhcmFuY2UvZ2V0dGVycyc7XHJcbmltcG9ydCBUT0dHTEVfSU5ERVhFUyBmcm9tICdAZGF0YS90b2dnbGVzJztcclxuaW1wb3J0IHsgVE91dGZpdERhdGEgfSBmcm9tICdAdHlwaW5ncy9vdXRmaXRzJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbmNlbCwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpO1xyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHJlc2V0VG9nZ2xlcyhhcHBlYXJhbmNlKTtcclxuXHJcblx0YXdhaXQgZGVsYXkoMTAwKTtcclxuXHJcblx0Y29uc3QgbmV3QXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHRuZXdBcHBlYXJhbmNlLnRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgbnVsbFxyXG5cdHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBnZXRGcmFtZXdvcmtJRCgpLCBuZXdBcHBlYXJhbmNlKTtcclxuXHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIG5ld0FwcGVhcmFuY2UudGF0dG9vcyk7XHJcblxyXG5cdGNsb3NlTWVudSgpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRNb2RlbCwgYXN5bmMgKG1vZGVsOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IGhhc2ggPSBHZXRIYXNoS2V5KG1vZGVsKTtcclxuXHRpZiAoIUlzTW9kZWxJbkNkaW1hZ2UoaGFzaCkgfHwgIUlzTW9kZWxWYWxpZChoYXNoKSkge1xyXG5cdFx0cmV0dXJuIGNiKDApO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0IG5ld1BlZCA9IGF3YWl0IHNldE1vZGVsKHBlZCwgaGFzaCk7XHJcblxyXG4gICAgdXBkYXRlUGVkKG5ld1BlZClcclxuXHJcblx0Y29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IGdldEFwcGVhcmFuY2UocGVkKTtcclxuXHJcblx0YXBwZWFyYW5jZS50YXR0b29zID0gW107XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBbXSk7XHJcblxyXG5cdGNiKGFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5nZXRNb2RlbFRhdHRvb3MsIGFzeW5jIChfOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHRhdHRvb3MgPSBnZXRUYXR0b29EYXRhKCk7XHJcblxyXG5cdGNiKHRhdHRvb3MpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkU3RydWN0dXJlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRGYWNlRmVhdHVyZShwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRIZWFkT3ZlcmxheSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZE92ZXJsYXkocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZEJsZW5kLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRIZWFkQmxlbmQocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0VGF0dG9vcywgYXN5bmMgKGRhdGE6IFRUYXR0b29bXSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEpO1xyXG5cdGNiKDEpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zZXRQcm9wLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldFByb3AocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0RHJhd2FibGUsIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGxldCB0ZXh0dXJlID0gc2V0RHJhd2FibGUocGVkLCBkYXRhKTtcclxuXHRjYih0ZXh0dXJlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudG9nZ2xlSXRlbSwgYXN5bmMgKGRhdGE6IFRUb2dnbGVEYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBpdGVtID0gVE9HR0xFX0lOREVYRVNbZGF0YS5pdGVtXTtcclxuXHRpZiAoIWl0ZW0pIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnQgPSBkYXRhLmRhdGE7XHJcblx0Y29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcclxuXHRjb25zdCBpbmRleCA9IGl0ZW0uaW5kZXg7XHJcblx0Y29uc3QgaG9vayA9IGl0ZW0uaG9vaztcclxuXHRjb25zdCBob29rRGF0YSA9IGRhdGEuaG9va0RhdGE7XHJcblxyXG5cdGlmICghY3VycmVudCkgcmV0dXJuIGNiKGZhbHNlKTtcclxuXHJcblx0aWYgKHR5cGUgPT09ICdwcm9wJykge1xyXG5cdFx0Y29uc3QgY3VycmVudFByb3AgPSBHZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnRQcm9wID09PSAtMSkge1xyXG5cdFx0XHRzZXRQcm9wKHBlZCwgY3VycmVudCk7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Q2xlYXJQZWRQcm9wKHBlZCwgaW5kZXgpO1xyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RyYXdhYmxlJykge1xyXG5cdFx0Y29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleCk7XHJcblxyXG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPT09IGl0ZW0ub2ZmKSB7XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBjdXJyZW50RHJhd2FibGUpIHtcclxuXHRcdFx0U2V0UGVkQ29tcG9uZW50VmFyaWF0aW9uKHBlZCwgaW5kZXgsIGl0ZW0ub2ZmLCAwLCAwKTtcclxuXHRcdFx0aWYgKGhvb2spIHtcclxuXHRcdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2suZHJhd2FibGVzPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9va0l0ZW0gPSBob29rLmRyYXdhYmxlc1tpXTtcclxuXHRcdFx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGhvb2tJdGVtLmNvbXBvbmVudCwgaG9va0l0ZW0udmFyaWFudCwgaG9va0l0ZW0udGV4dHVyZSwgMCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGNiKHRydWUpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzZXREcmF3YWJsZShwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRmb3IobGV0IGk9MDsgaSA8IGhvb2tEYXRhPy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHNldERyYXdhYmxlKHBlZCwgaG9va0RhdGFbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNiKGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNhdmVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmRlbGV0ZU91dGZpdCwgYXN5bmMgKHtpZH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnJlbmFtZU91dGZpdCwgYXN5bmMgKGRhdGE6IGFueSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS51c2VPdXRmaXQsIGFzeW5jIChvdXRmaXQ6IFRPdXRmaXREYXRhLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaW1wb3J0T3V0Zml0LCBhc3luYyAoeyBpZCwgb3V0Zml0TmFtZSB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aW1wb3J0T3V0Zml0JywgZnJhbWV3b3JrZElkLCBpZCwgb3V0Zml0TmFtZSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZmV0Y2hPdXRmaXQsIGFzeW5jICh7IGlkIH0sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBpZCk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuaXRlbU91dGZpdCwgYXN5bmMgKGRhdGE6IHtvdXRmaXQ6IFRPdXRmaXREYXRhLCBsYWJlbDogc3RyaW5nfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0ZmlJdGVtJywgKG91dGZpdDogVE91dGZpdERhdGEpID0+IHtcclxuXHRzZXRQZWRDbG90aGVzKHBlZCwgb3V0Zml0KTtcclxufSkiLCAiaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHJlcXVlc3RMb2NhbGUsIHNlbmROVUlFdmVudCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHBlZCwgZ2V0UGxheWVyRGF0YSwgZ2V0Sm9iSW5mbywgZ2V0UGxheWVyR2VuZGVyTW9kZWwgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgc3RhcnRDYW1lcmEsIHN0b3BDYW1lcmEgfSBmcm9tIFwiLi9jYW1lcmFcIlxyXG5pbXBvcnQgdHlwZSB7IFRBcHBlYXJhbmNlWm9uZSwgVE1lbnVUeXBlcyB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIlxyXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSBcIkBldmVudHNcIlxyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9nZXR0ZXJzXCJcclxuaW1wb3J0IFwiLi9oYW5kbGVyc1wiXHJcbmltcG9ydCB7IHNldE1vZGVsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuXHJcbmNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG5sZXQgYXJtb3VyID0gMFxyXG5sZXQgb3BlbiA9IGZhbHNlXHJcblxyXG5sZXQgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG5sZXQgcHJvbWlzZSA9IG51bGw7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbk1lbnUoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgVEFwcGVhcmFuY2Vab25lWyd0eXBlJ10sIGNyZWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh6b25lID09PSBudWxsIHx8IG9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBlZEhhbmRsZSA9IFBsYXllclBlZElkKClcclxuICAgIGNvbnN0IGNvbmZpZ01lbnVzID0gY29uZmlnLm1lbnVzKClcclxuXHJcbiAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiB6b25lID09PSAnc3RyaW5nJ1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBpc1N0cmluZyA/IHpvbmUgOiB6b25lLnR5cGVcclxuXHJcbiAgICBjb25zdCBtZW51ID0gY29uZmlnTWVudXNbdHlwZV1cclxuICAgIGlmICghbWVudSkgcmV0dXJuXHJcblxyXG4gICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuXHJcbiAgICBjb25zdCBmcmFtZXdvcmtkSWQgPSBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICBjb25zdCB0YWJzID0gbWVudS50YWJzXHJcbiAgICBsZXQgYWxsb3dFeGl0ID0gY3JlYXRpb24gPyBmYWxzZSA6IG1lbnUuYWxsb3dFeGl0XHJcblxyXG4gICAgYXJtb3VyID0gR2V0UGVkQXJtb3VyKHBlZEhhbmRsZSlcclxuXHJcbiAgICBsZXQgb3V0Zml0cyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzT3V0Zml0VGFiID0gdGFicy5pbmNsdWRlcygnb3V0Zml0cycpXHJcbiAgICBpZiAoaGFzT3V0Zml0VGFiKSBvdXRmaXRzID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPE91dGZpdFtdPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGZyYW1ld29ya2RJZCkgYXMgT3V0Zml0W11cclxuXHJcbiAgICBsZXQgbW9kZWxzID0gW11cclxuXHJcbiAgICBjb25zdCBoYXNIZXJpdGFnZVRhYiA9IHRhYnMuaW5jbHVkZXMoJ2hlcml0YWdlJylcclxuICAgIGlmIChoYXNIZXJpdGFnZVRhYikge1xyXG4gICAgICAgIG1vZGVscyA9IGNvbmZpZy5tb2RlbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1RhdHRvb1RhYiA9IHRhYnMuaW5jbHVkZXMoJ3RhdHRvb3MnKVxyXG4gICAgbGV0IHRhdHRvb3NcclxuICAgIGlmIChoYXNUYXR0b29UYWIpIHtcclxuICAgICAgICB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmxhY2tsaXN0ID0gZ2V0QmxhY2tsaXN0KHpvbmUpXHJcblxyXG4gICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSBHZXRIYXNoS2V5KGdldFBsYXllckdlbmRlck1vZGVsKCkpO1xyXG4gICAgICAgIHBlZEhhbmRsZSA9IGF3YWl0IHNldE1vZGVsKHBlZEhhbmRsZSwgbW9kZWwpO1xyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNldHJvdXRpbmdidWNrZXQnKVxyXG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZSlcclxuXHJcbiAgICBzdGFydENhbWVyYSgpXHJcblxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQuZGF0YSwge1xyXG4gICAgICAgIHRhYnMsXHJcbiAgICAgICAgYXBwZWFyYW5jZSxcclxuICAgICAgICBibGFja2xpc3QsXHJcbiAgICAgICAgdGF0dG9vcyxcclxuICAgICAgICBvdXRmaXRzLFxyXG4gICAgICAgIG1vZGVscyxcclxuICAgICAgICBhbGxvd0V4aXQsXHJcbiAgICAgICAgam9iOiBnZXRKb2JJbmZvKCksXHJcbiAgICAgICAgbG9jYWxlOiBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKVxyXG4gICAgfSlcclxuXHJcbiAgICBTZXROdWlGb2N1cyh0cnVlLCB0cnVlKVxyXG4gICAgc2VuZE5VSUV2ZW50KFNlbmQudmlzaWJsZSwgdHJ1ZSlcclxuXHJcbiAgICBvcGVuID0gdHJ1ZVxyXG5cclxuICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5oaWRlSHVkKHRydWUpXHJcblxyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgICBhd2FpdCBwcm9taXNlXHJcbiAgICAgICAgZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG59XHJcbmV4cG9ydHMoJ09wZW5NZW51Jywgb3Blbk1lbnUpXHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ2FwcGVhcmFuY2UnLCBhc3luYyAoXywgYXJnczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IHR5cGUgPSBhcmdzWzBdXHJcbiAgICBpZiAoIXR5cGUpIHtcclxuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHR5cGUudG9Mb3dlckNhc2UoKSBhcyBUTWVudVR5cGVzXHJcbiAgICAgICAgb3Blbk1lbnUoem9uZSlcclxuICAgIH1cclxufSwgdHJ1ZSlcclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCbGFja2xpc3Qoem9uZTogVEFwcGVhcmFuY2Vab25lIHwgc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7Z3JvdXBUeXBlcywgYmFzZX0gPSBjb25maWcuYmxhY2tsaXN0KClcclxuXHJcbiAgICBpZiAodHlwZW9mIHpvbmUgPT09ICdzdHJpbmcnKSByZXR1cm4gYmFzZVxyXG5cclxuICAgIGlmICghZ3JvdXBUeXBlcykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBsZXQgYmxhY2tsaXN0ID0gey4uLmJhc2V9XHJcblxyXG4gICAgY29uc3QgcGxheWVyRGF0YSA9IGdldFBsYXllckRhdGEoKVxyXG5cclxuXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZ3JvdXBUeXBlcykge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwVHlwZXNbdHlwZV1cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIGluIGdyb3Vwcykge1xyXG5cclxuICAgICAgICAgICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2pvYnMnICYmIHpvbmUuam9icykge1xyXG4gICAgICAgICAgICAgICAgc2tpcCA9IHpvbmUuam9icy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmpvYi5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnZ2FuZ3MnICYmIHpvbmUuZ2FuZ3MpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmdhbmdzLmluY2x1ZGVzKHBsYXllckRhdGEuZ2FuZy5uYW1lKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNraXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQmxhY2tsaXN0ID0gZ3JvdXBzW2dyb3VwXVxyXG4gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgYmxhY2tsaXN0LCBncm91cEJsYWNrbGlzdCwge1xyXG4gICAgICAgICAgICAgICAgICBkcmF3YWJsZXM6IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdC5kcmF3YWJsZXMsIGdyb3VwQmxhY2tsaXN0LmRyYXdhYmxlcylcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJsYWNrbGlzdFxyXG5cclxuICAgIC8vIHJldHVybiBibGFja2xpc3RcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTWVudSgpIHtcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW91cilcclxuXHJcbiAgICBzdG9wQ2FtZXJhKClcclxuICAgIFNldE51aUZvY3VzKGZhbHNlLCBmYWxzZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIGZhbHNlKVxyXG5cclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZChmYWxzZSlcclxuXHJcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcclxuICAgICAgICByZXNvbHZlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgb3BlbiA9IGZhbHNlXHJcbn1cclxuIiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuLi9tZW51XCJcblxuZXhwb3J0IGZ1bmN0aW9uIFFCQnJpZGdlKCkge1xuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6bG9hZFBsYXllckNsb3RoaW5nJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoZXM6Y2xpZW50OkNyZWF0ZUZpcnN0Q2hhcmFjdGVyJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KVxuXG4gICAgb25OZXQoJ3FiLWNsb3RoaW5nOmNsaWVudDpvcGVuT3V0Zml0TWVudScsICgpID0+IHtcbiAgICAgICAgb3Blbk1lbnUoeyB0eXBlOiBcIm91dGZpdHNcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSkgIFxuICAgIH0pXG59IiwgIlxuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXG5pbXBvcnQgeyBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgdHJpZ2dlclNlcnZlckNhbGxiYWNrIH0gZnJvbSBcIkB1dGlsc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBFU1hCcmlkZ2UoKSB7XG4gICAgbGV0IGZpcnN0U3Bhd24gPSBmYWxzZVxuXG4gICAgb24oXCJlc3hfc2tpbjpyZXNldEZpcnN0U3Bhd25cIiwgKCkgPT4ge1xuICAgICAgICBmaXJzdFNwYXduID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgb24oXCJlc3hfc2tpbjpwbGF5ZXJSZWdpc3RlcmVkXCIsICgpID0+IHtcbiAgICAgICAgaWYoZmlyc3RTcGF3bilcbiAgICAgICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24oKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luMicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlLm1vZGVsKSBhcHBlYXJhbmNlLm1vZGVsID0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIik7XG4gICAgICAgIGF3YWl0IHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmdldFNraW4nLCBhc3luYyAoY2I6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcbiAgICAgICAgY2IoYXBwZWFyYW5jZSlcbiAgICB9KVxuXG4gICAgb25OZXQoJ3NraW5jaGFuZ2VyOmxvYWRTa2luJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogYW55KSA9PiB7XG4gICAgICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcbiAgICAgICAgaWYgKGNiKSBjYigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdlc3hfc2tpbjpvcGVuU2F2ZWFibGVNZW51JywgYXN5bmMgKG9uU3VibWl0OiBhbnkpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbihvblN1Ym1pdClcbiAgICB9KVxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCI7XG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXREcmF3YWJsZXMsIGdldFByb3BzIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2UvZ2V0dGVyc1wiO1xuaW1wb3J0IHsgc2V0RHJhd2FibGUsIHNldE1vZGVsLCBzZXRQZWRBcHBlYXJhbmNlLCBzZXRQZWRUYXR0b29zLCBzZXRQcm9wIH0gZnJvbSBcIi4uL2FwcGVhcmFuY2Uvc2V0dGVyc1wiO1xuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gXCJAdHlwaW5ncy90YXR0b29zXCI7XG5pbXBvcnQgeyBwZWQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIjtcblxuZnVuY3Rpb24gZXhwb3J0SGFuZGxlcihuYW1lOiBzdHJpbmcsIGNiOiBhbnkpIHtcbiAgICBvbignX19jZnhfZXhwb3J0X2lsbGVuaXVtLWFwcGVhcmFuY2VfJyArIG5hbWUsIChzZXRDQjogYW55KSA9PiB7XG4gICAgICAgIHNldENCKGNiKTtcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWxsZW5pdW1Db21wYXQoKSB7XG4gICAgZXhwb3J0SGFuZGxlcignc3RhcnRQbGF5ZXJDdXN0b21pemF0aW9uJywgKCkgPT4ge1xuICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZE1vZGVsJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBHZXRFbnRpdHlNb2RlbChwZWQpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlczogYW55ID0gZ2V0RHJhd2FibGVzKHBlZClbMF07XG4gICAgICAgIGxldCBuZXdkcmF3YWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGRyYXdhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdO1xuICAgICAgICAgICAgbmV3ZHJhd2FibGUucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50X2lkOiBkcmF3YWJsZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkcmF3YWJsZTogZHJhd2FibGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IGFueSA9ICBnZXRQcm9wcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3UHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXTtcbiAgICAgICAgICAgIG5ld1Byb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIHByb3BfaWQ6IHByb3AuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IHByb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkQmxlbmQnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkQmxlbmREYXRhKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRGYWNlRmVhdHVyZXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkU3RydWN0dXJlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgICAgICAvL3JldHVybiBnZXRIZWFkT3ZlcmxheShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGFpcicsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAvL3JldHVybiBnZXRIYWlyKHBlZCk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFwcGVhcmFuY2UocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllck1vZGVsJywgKG1vZGVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXG4gICAgICAgIHNldE1vZGVsKHBlZCwgbW9kZWwpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyLCBibGVuZDogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZEJsZW5kKHBlZCwgYmxlbmQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRGYWNlRmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRPdmVybGF5cycsIChwZWQ6IG51bWJlciwgb3ZlcmxheTogYW55KSA9PiB7XG4gICAgICAgIC8vc2V0SGVhZE92ZXJsYXkocGVkLCBvdmVybGF5KTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkSGFpcicsIGFzeW5jIChwZWQ6IG51bWJlciwgaGFpcjogYW55LCB0YXR0b286IGFueSkgPT4ge1xuICAgICAgICAvL3NldFBlZEhhaXJDb2xvcnMocGVkLCBoYWlyKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRXllQ29sb3InLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZENvbXBvbmVudCcsIChwZWQ6IG51bWJlciwgZHJhd2FibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEcmF3YWJsZSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkcmF3YWJsZS5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd2FibGUuZHJhd2FibGUsXG4gICAgICAgICAgICB0ZXh0dXJlOiBkcmF3YWJsZS50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnRzJywgKHBlZDogbnVtYmVyLCBjb21wb25lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGNvbXBvbmVudC5jb21wb25lbnRfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBvbmVudC5kcmF3YWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb21wb25lbnQudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0RHJhd2FibGUocGVkLCBuZXdEcmF3YWJsZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3AnLCAocGVkOiBudW1iZXIsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgaW5kZXg6IHByb3AucHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkUHJvcHMnLCAocGVkOiBudW1iZXIsIHByb3BzOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3AuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogcHJvcC50ZXh0dXJlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRQcm9wKHBlZCwgbmV3UHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGV4cG9ydEhhbmRsZXIoJ3NldFBsYXllckFwcGVhcmFuY2UnLCAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIGNvbnNvbGUud2FybignTmVlZCB0byBiZSBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQXBwZWFyYW5jZScsIChwZWQ6IG51bWJlciwgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpID0+IHtcbiAgICAgICAgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRUYXR0b29zJywgKHBlZDogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pID0+IHtcbiAgICAgICAgc2V0UGVkVGF0dG9vcyhwZWQsIHRhdHRvb3MpXG4gICAgfSk7XG59IiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQXBwZWFyYW5jZVpvbmUgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IG9wZW5NZW51IH0gZnJvbSBcIi4vbWVudVwiXHJcbmltcG9ydCB7IHNldFBsYXllclBlZEFwcGVhcmFuY2UgfSBmcm9tIFwiLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxyXG5pbXBvcnQgeyB0cmlnZ2VyU2VydmVyQ2FsbGJhY2ssIGdldEZyYW1ld29ya0lELCBEZWxheSwgYmxfYnJpZGdlLCBwZWQsIGRlbGF5LCBmb3JtYXQsIHVwZGF0ZVBlZCB9IGZyb20gXCJAdXRpbHNcIlxyXG5pbXBvcnQgeyBRQkJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9xYlwiXHJcbmltcG9ydCB7IEVTWEJyaWRnZSB9IGZyb20gXCIuL2JyaWRnZS9lc3hcIlxyXG5pbXBvcnQgeyBpbGxlbml1bUNvbXBhdCB9IGZyb20gXCIuL2NvbXBhdC9pbGxlbml1bVwiXHJcblxyXG5leHBvcnRzKCdTZXRQbGF5ZXJQZWRBcHBlYXJhbmNlJywgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlIHwgc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVzb2x2ZWRBcHBlYXJhbmNlOiBUQXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFhcHBlYXJhbmNlIHx8IHR5cGVvZiBhcHBlYXJhbmNlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEOiBzdHJpbmcgPSBhcHBlYXJhbmNlIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKCk7XHJcbiAgICAgICAgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKSBhcyBUQXBwZWFyYW5jZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVhcmFuY2UgPT09ICdvYmplY3QnKSByZXNvbHZlZEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlO1xyXG4gICAgXHJcbiAgICBpZiAoIXJlc29sdmVkQXBwZWFyYW5jZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgYXBwZWFyYW5jZSBmb3VuZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKHJlc29sdmVkQXBwZWFyYW5jZSk7XHJcbn0pO1xyXG5cclxuZXhwb3J0cygnR2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChmcmFtZXdvcmtJRDogc3RyaW5nKSA9PiB7XHJcbiAgICBmcmFtZXdvcmtJRCA9IGZyYW1ld29ya0lEIHx8IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbn0pXHJcblxyXG5leHBvcnRzKCdJbml0aWFsQ3JlYXRpb24nLCBhc3luYyAoY2I/OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG5lZWRzIHRvIGJlIHR5cGUgb2YgVEFwcGVhcmFuY2Vab25lIG1lYW5pbmcgaXQgbmVlZHMgYSBjb29yZHMgcHJvcGVydHksIGJ1dCBpbiB0aGlzIGNhc2UgaXQncyBub3QgdXNlZFxyXG4gICAgYXdhaXQgb3Blbk1lbnUoeyB0eXBlOiBcImFwcGVhcmFuY2VcIiwgY29vcmRzOiBbMCwgMCwgMCwgMF0gfSwgdHJ1ZSlcclxuICAgIGlmIChjYikgY2IoKVxyXG59KVxyXG5cclxub24oJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OnVzZVpvbmUnLCAoem9uZTogVEFwcGVhcmFuY2Vab25lKSA9PiB7XHJcbiAgICBvcGVuTWVudSh6b25lKVxyXG59KVxyXG5cclxub25OZXQoJ2JsX2JyaWRnZTpjbGllbnQ6cGxheWVyTG9hZGVkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgd2hpbGUgKCFibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgYXdhaXQgRGVsYXkoMTAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG59KVxyXG5cclxub25OZXQoJ29uUmVzb3VyY2VTdGFydCcsIGFzeW5jIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVzb3VyY2UgPT09IEdldEN1cnJlbnRSZXNvdXJjZU5hbWUoKSAmJiBibF9icmlkZ2UuY29yZSgpLnBsYXllckxvYWRlZCgpKSB7XHJcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICAgICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgICAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmcmFtZXdvcmtOYW1lID0gYmxfYnJpZGdlLmdldEZyYW1ld29yaygnY29yZScpXHJcbmNvbnN0IGNvcmUgPSBmb3JtYXQoR2V0Q29udmFyKCdibDpmcmFtZXdvcmsnLCAncWInKSlcclxuXHJcbmlmIChjb3JlID09ICdxYicgfHwgY29yZSA9PSAncWJ4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgUUJCcmlkZ2UoKTtcclxufSBlbHNlIGlmIChjb3JlID09ICdlc3gnICYmIEdldFJlc291cmNlU3RhdGUoZnJhbWV3b3JrTmFtZSkgPT0gJ3N0YXJ0ZWQnKSB7XHJcbiAgICBFU1hCcmlkZ2UoKTtcclxufVxyXG5cclxuaWxsZW5pdW1Db21wYXQoKTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgncmVsb2Fkc2tpbicsIGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgaGVhbHRoID0gR2V0RW50aXR5SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBtYXhoZWFsdGggPSBHZXRFbnRpdHlNYXhIZWFsdGgocGVkKTtcclxuICAgIGNvbnN0IGFybW9yID0gR2V0UGVkQXJtb3VyKHBlZCk7XHJcblxyXG4gICAgY29uc3QgYXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRClcclxuICAgIGlmICghYXBwZWFyYW5jZSkgcmV0dXJuO1xyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG5cclxuICAgIFNldFBlZE1heEhlYWx0aChwZWQsIG1heGhlYWx0aClcclxuICAgIGRlbGF5KDEwMDApIFxyXG4gICAgU2V0RW50aXR5SGVhbHRoKHBlZCwgaGVhbHRoKVxyXG4gICAgU2V0UGVkQXJtb3VyKHBlZCwgYXJtb3IpXHJcbn0sIGZhbHNlKVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQU8sSUFBSSxNQUFNO0FBRVYsSUFBTSxZQUFZLHdCQUFDLGNBQXNCO0FBQzVDLFFBQU07QUFDVixHQUZ5QjtBQWFsQixJQUFNLGVBQWUsd0JBQUMsUUFBZ0IsU0FBYztBQUN2RCxpQkFBZTtBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsRUFDSixDQUFDO0FBQ0wsR0FMNEI7QUFPckIsSUFBTSxRQUFRLHdCQUFDLE9BQWUsSUFBSSxRQUFRLFNBQU8sV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUF0RDtBQUVkLElBQU0sZUFBZSw4QkFBTyxVQUE0QztBQUMzRSxNQUFJLFlBQW9CLE9BQU8sVUFBVSxXQUFXLFFBQVEsV0FBVyxLQUFLO0FBRTVFLE1BQUksQ0FBQyxhQUFhLFNBQVMsS0FBSyxDQUFDLGlCQUFpQixTQUFTLEdBQUc7QUFPMUQsWUFBUSxLQUFLLG9DQUFvQyxLQUFLLEdBQUc7QUFDekQsV0FBTztBQUFBLEVBQ1g7QUFFQSxNQUFJLGVBQWUsU0FBUztBQUFHLFdBQU87QUFFdEMsZUFBYSxTQUFTO0FBRXRCLFFBQU0scUJBQXFCLDZCQUFxQjtBQUM1QyxXQUFPLElBQUksUUFBUSxhQUFXO0FBQzFCLFlBQU0sV0FBVyxZQUFZLE1BQU07QUFDL0IsWUFBSSxlQUFlLFNBQVMsR0FBRztBQUMzQix3QkFBYyxRQUFRO0FBQ3RCLGtCQUFRO0FBQUEsUUFDWjtBQUFBLE1BQ0osR0FBRyxHQUFHO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDTCxHQVQyQjtBQVczQixRQUFNLG1CQUFtQjtBQUV6QixTQUFPO0FBQ1gs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Z0IsVUFBVSxhQUFhLE1BQU07QUFDbkQsSUFBTSxPQUFPLE9BQU8sVUFBVSxnQkFBZ0IsSUFBSSxDQUFDO0FBRW5ELElBQUksUUFBUSxRQUFRLFFBQVEsU0FBUyxpQkFBaUIsYUFBYSxLQUFLLFdBQVc7QUFDL0UsV0FBUztBQUNiLFdBQVcsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUN0RSxZQUFVO0FBQ2Q7QUFFQSxlQUFlO0FBRWYsZ0JBQWdCLGNBQWMsWUFBWTtBQUN0QyxRQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFFBQU0sU0FBUyxnQkFBZ0IsR0FBRztBQUNsQyxRQUFNLFlBQVksbUJBQW1CLEdBQUc7QUFDeEMsUUFBTSxRQUFRLGFBQWEsR0FBRztBQUU5QixRQUFNLGFBQWEsTUFBTSxzQkFBbUMsc0NBQXNDLFdBQVc7QUFDN0csTUFBSSxDQUFDO0FBQVk7QUFDakIsUUFBTSx1QkFBdUIsVUFBVTtBQUV2QyxrQkFBZ0IsS0FBSyxTQUFTO0FBQzlCLFFBQU0sR0FBSTtBQUNWLGtCQUFnQixLQUFLLE1BQU07QUFDM0IsZUFBYSxLQUFLLEtBQUs7QUFDM0IsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJkZWxheSIsICJwZWQiLCAieCIsICJ5IiwgInoiLCAiY29uZmlnIiwgInBlZCIsICJwZWQiLCAicGVkIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBwZWRIYW5kbGUgPT0gUGxheWVyUGVkSWQoKSA/IGF3YWl0IGdldFRhdHRvb3MoKSA6IFtdXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RlbEluZGV4OiBmaW5kTW9kZWxJbmRleChtb2RlbCksXHJcbiAgICAgICAgbW9kZWw6IG1vZGVsLFxyXG4gICAgICAgIGhhaXJDb2xvcjogZ2V0SGFpcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRPdmVybGF5OiBoZWFkRGF0YSBhcyBUSGVhZE92ZXJsYXksXHJcbiAgICAgICAgaGVhZE92ZXJsYXlUb3RhbDogdG90YWxzIGFzIFRIZWFkT3ZlcmxheVRvdGFsLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBkcmF3YWJsZXM6IGRyYXdhYmxlcyxcclxuICAgICAgICBwcm9wczogcHJvcHMsXHJcbiAgICAgICAgZHJhd1RvdGFsOiBkcmF3VG90YWwsXHJcbiAgICAgICAgcHJvcFRvdGFsOiBwcm9wVG90YWwsXHJcbiAgICAgICAgdGF0dG9vczogdGF0dG9vc1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRBcHBlYXJhbmNlXCIsIGdldEFwcGVhcmFuY2UpXHJcbm9uU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCAoKSA9PiB7XHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKHBlZClcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGVkQ2xvdGhlcyhwZWRIYW5kbGU6IG51bWJlcik6IFRDbG90aGVzIHtcclxuICAgIGNvbnN0IFtkcmF3YWJsZXNdID0gZ2V0RHJhd2FibGVzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtwcm9wc10gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbaGVhZERhdGFdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBkcmF3YWJsZXM6IGRyYXdhYmxlcyxcclxuICAgICAgICBwcm9wczogcHJvcHMsXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldFBlZENsb3RoZXNcIiwgZ2V0UGVkQ2xvdGhlcylcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRTa2luKHBlZEhhbmRsZTogbnVtYmVyKTogVFNraW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkQmxlbmQ6IGdldEhlYWRCbGVuZERhdGEocGVkSGFuZGxlKSxcclxuICAgICAgICBoZWFkU3RydWN0dXJlOiBnZXRIZWFkU3RydWN0dXJlKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgbW9kZWw6IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkU2tpblwiLCBnZXRQZWRTa2luKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhdHRvb0RhdGEoKSB7XHJcbiAgICBsZXQgdGF0dG9vWm9uZXMgPSBbXVxyXG5cclxuICAgIGNvbnN0IFtUQVRUT09fTElTVCwgVEFUVE9PX0NBVEVHT1JJRVNdID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLnRhdHRvb3MoKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fQ0FURUdPUklFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gVEFUVE9PX0NBVEVHT1JJRVNbaV1cclxuICAgICAgICBjb25zdCB6b25lID0gY2F0ZWdvcnkuem9uZVxyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gY2F0ZWdvcnkubGFiZWxcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNhdGVnb3J5LmluZGV4XHJcbiAgICAgICAgdGF0dG9vWm9uZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgICAgICAgIHpvbmVJbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgIGRsY3M6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFRBVFRPT19MSVNULmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRsY0RhdGEgPSBUQVRUT09fTElTVFtqXVxyXG4gICAgICAgICAgICB0YXR0b29ab25lc1tpbmRleF0uZGxjcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBkbGNEYXRhLmRsYyxcclxuICAgICAgICAgICAgICAgIGRsY0luZGV4OiBqLFxyXG4gICAgICAgICAgICAgICAgdGF0dG9vczogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNGZW1hbGUgPSBHZXRFbnRpdHlNb2RlbChwZWQpID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gVEFUVE9PX0xJU1RbaV1cclxuICAgICAgICBjb25zdCB7IGRsYywgdGF0dG9vcyB9ID0gZGF0YVxyXG4gICAgICAgIGNvbnN0IGRsY0hhc2ggPSBHZXRIYXNoS2V5KGRsYylcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhdHRvb3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IHRhdHRvb3Nbal1cclxuICAgICAgICAgICAgbGV0IHRhdHRvbyA9IG51bGxcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyVGF0dG9vID0gdGF0dG9vRGF0YS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRmVtYWxlVGF0dG9vID0gbG93ZXJUYXR0b28uaW5jbHVkZXMoXCJfZlwiKVxyXG4gICAgICAgICAgICBpZiAoaXNGZW1hbGVUYXR0b28gJiYgaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGZW1hbGVUYXR0b28gJiYgIWlzRmVtYWxlKSB7XHJcbiAgICAgICAgICAgICAgICB0YXR0b28gPSB0YXR0b29EYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gbnVsbFxyXG4gICAgICAgICAgICBsZXQgem9uZSA9IC0xXHJcblxyXG4gICAgICAgICAgICBpZiAodGF0dG9vKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNoID0gR2V0SGFzaEtleSh0YXR0b28pXHJcbiAgICAgICAgICAgICAgICB6b25lID0gR2V0UGVkRGVjb3JhdGlvblpvbmVGcm9tSGFzaGVzKGRsY0hhc2gsIGhhc2gpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh6b25lICE9PSAtMSAmJiBoYXNoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lVGF0dG9vcyA9IHRhdHRvb1pvbmVzW3pvbmVdLmRsY3NbaV0udGF0dG9vc1xyXG5cclxuICAgICAgICAgICAgICAgIHpvbmVUYXR0b29zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YXR0b28sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRsYzogZGxjLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGF0dG9vWm9uZXNcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRhdHRvb3MoKTogUHJvbWlzZTxUVGF0dG9vW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldFRhdHRvb3MnKSB8fCBbXVxyXG59XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBnZXRUYXR0b29zKTtcclxuLy9taWdyYXRpb25cclxuXHJcbm9uU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50Om1pZ3JhdGlvbjpzZXRBcHBlYXJhbmNlJywgKGRhdGE6IHt0eXBlOiBzdHJpbmcsIGRhdGE6IGFueX0pID0+IHtcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdmaXZlbScpIGV4cG9ydHNbJ2ZpdmVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdpbGxlbml1bScpIGV4cG9ydHNbJ2lsbGVuaXVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxufSk7IiwgImV4cG9ydCBkZWZhdWx0IHtcclxuICAgIGhhdHM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMCxcclxuICAgIH0sXHJcbiAgICBnbGFzc2VzOiB7XHJcbiAgICAgICAgdHlwZTogXCJwcm9wXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICB9LFxyXG4gICAgbWFza3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIHNoaXJ0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogOCxcclxuICAgICAgICBvZmY6IDE1LFxyXG4gICAgICAgIGhvb2s6IHtcclxuICAgICAgICAgICAgZHJhd2FibGVzOiBbXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMywgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAndG9yc29zJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDgsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3NoaXJ0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGphY2tldHM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDExLFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMTEsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ2phY2tldHMnIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB2ZXN0OiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA5LFxyXG4gICAgICAgIG9mZjogMCxcclxuICAgIH0sXHJcbiAgICBsZWdzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA0LFxyXG4gICAgICAgIG9mZjogMTgsXHJcbiAgICB9LFxyXG4gICAgc2hvZXM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDYsXHJcbiAgICAgICAgb2ZmOiAzNCxcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEhhaXJDb2xvciwgVENsb3RoZXMsIFRTa2luLCBUVmFsdWUsIFRIZWFkU3RydWN0dXJlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcclxuaW1wb3J0IFRPR0dMRV9JTkRFWEVTIGZyb20gXCJAZGF0YS90b2dnbGVzXCJcclxuaW1wb3J0IHsgcmVxdWVzdE1vZGVsLCBwZWQsIHVwZGF0ZVBlZCwgaXNQZWRGcmVlbW9kZU1vZGVsfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSBcIkB0eXBpbmdzL3RhdHRvb3NcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREcmF3YWJsZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldERyYXdhYmxlJylcclxuXHJcbiAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIDApXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0RHJhd2FibGUnLCBzZXREcmF3YWJsZSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFByb3AnKVxyXG5cclxuICAgIGlmIChkYXRhLnZhbHVlID09PSAtMSkge1xyXG4gICAgICAgIENsZWFyUGVkUHJvcChwZWRIYW5kbGUsIGRhdGEuaW5kZXgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgU2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCBmYWxzZSlcclxuICAgIHJldHVybiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0UHJvcCcsIHNldFByb3ApO1xyXG5cclxuY29uc3QgZGVmTWFsZUhhc2ggPSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldE1vZGVsID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQXBwZWFyYW5jZSB8IFRTa2luIHwgbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRNb2RlbCcpXHJcbiAgICAgICAgcmV0dXJuIHBlZEhhbmRsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbW9kZWw6IG51bWJlcjtcclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBtb2RlbCA9IEdldEhhc2hLZXkoZGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9kZWwgPSBkYXRhLm1vZGVsIHx8IGRlZk1hbGVIYXNoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtb2RlbCA9PT0gMCkgcmV0dXJuIHBlZEhhbmRsZTtcclxuXHJcbiAgICBhd2FpdCByZXF1ZXN0TW9kZWwobW9kZWwpO1xyXG5cclxuICAgIGNvbnN0IGlzUGxheWVyID0gSXNQZWRBUGxheWVyKHBlZEhhbmRsZSk7XHJcbiAgICBpZiAoaXNQbGF5ZXIpIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChQbGF5ZXJJZCgpLCBtb2RlbCk7XHJcbiAgICAgICAgcGVkSGFuZGxlID0gUGxheWVyUGVkSWQoKTtcclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICBTZXRNb2RlbEFzTm9Mb25nZXJOZWVkZWQobW9kZWwpO1xyXG4gICAgU2V0UGVkRGVmYXVsdENvbXBvbmVudFZhcmlhdGlvbihwZWRIYW5kbGUpO1xyXG5cclxuICAgIGlmICghaXNQZWRGcmVlbW9kZU1vZGVsKHBlZEhhbmRsZSkpIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgY29uc3QgaXNKdXN0TW9kZWwgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGRhdGEgPT09ICdudW1iZXInO1xyXG4gICAgY29uc3QgaGFzSGVhZEJsZW5kID0gIWlzSnVzdE1vZGVsICYmIGRhdGEuaGVhZEJsZW5kICYmIE9iamVjdC5rZXlzKGRhdGEuaGVhZEJsZW5kKS5sZW5ndGggPiAwO1xyXG5cclxuICAgIGlmIChoYXNIZWFkQmxlbmQpIHtcclxuICAgICAgICBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCAoZGF0YSBhcyBUQXBwZWFyYW5jZSB8IFRTa2luKS5oZWFkQmxlbmQpO1xyXG4gICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIGZhbHNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKSkge1xyXG4gICAgICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgNDUsIDIxLCAwLCAyMCwgMTUsIDAsIDAuMywgMC4xLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbn07XHJcbmV4cG9ydHMoJ1NldE1vZGVsJywgc2V0TW9kZWwpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RmFjZUZlYXR1cmUnKVxyXG5cclxuICAgIFNldFBlZEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSArIDAuMClcclxufVxyXG5leHBvcnRzKCdTZXRGYWNlRmVhdHVyZScsIHNldEZhY2VGZWF0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIZWFkU3RydWN0dXJlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlcycpXHJcbiAgICAgICAgXHJcblxyXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIGluIGRhdGEpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbZmVhdHVyZV1cclxuICAgICAgICBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIHZhbHVlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldEZhY2VGZWF0dXJlcycsIHNldEZhY2VGZWF0dXJlcyk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlLCBoZWFkU3RydWN0dXJlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVGF0dG9vW10pIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkVGF0dG9vcycpXHJcblxyXG4gICAgQ2xlYXJQZWREZWNvcmF0aW9uc0xlYXZlU2NhcnMocGVkSGFuZGxlKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRhdHRvb0RhdGEgPSBkYXRhW2ldLnRhdHRvb1xyXG4gICAgICAgIGlmICh0YXR0b29EYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBHZXRIYXNoS2V5KHRhdHRvb0RhdGEuZGxjKVxyXG4gICAgICAgICAgICBjb25zdCB0YXR0b28gPSB0YXR0b29EYXRhLmhhc2hcclxuICAgICAgICAgICAgQWRkUGVkRGVjb3JhdGlvbkZyb21IYXNoZXMocGVkSGFuZGxlLCBjb2xsZWN0aW9uLCB0YXR0b28pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUSGFpckNvbG9yKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEhhaXJDb2xvcnMnKVxyXG5cclxuICAgIGNvbnN0IGNvbG9yID0gZGF0YS5jb2xvclxyXG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gZGF0YS5oaWdobGlnaHRcclxuICAgIFNldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUsIGNvbG9yLCBoaWdobGlnaHQpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBlZEFwcGVhcmFuY2UocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEFwcGVhcmFuY2UnKVxyXG5cclxuICAgIGlmIChJc1BlZEFQbGF5ZXIocGVkSGFuZGxlKSkge1xyXG4gICAgICAgIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkSGFuZGxlLCBkYXRhKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZSwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZSwgZGF0YS50YXR0b29zKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEFwcGVhcmFuY2UnLCBzZXRQZWRBcHBlYXJhbmNlKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBsYXllclBlZEFwcGVhcmFuY2UnKVxyXG4gICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBhZnRlciBzY3JpcHRzIHNldCB0aGVpciBvd24gbW9kZWwsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYmVmb3JlIHdlIHNldCB0aGUgYXBwZWFyYW5jZVxyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICBhd2FpdCBzZXRQZWRTa2luKHBlZCwgZGF0YSlcclxuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYWdhaW4gYWZ0ZXIgc2V0dGluZyB0aGUgc2tpbiBiZWNhdXNlIFNldFBsYXllck1vZGVsIHdpbGwgc2V0IGEgbmV3IFBsYXllclBlZElkXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIHNldFBlZENsb3RoZXMocGVkLCBkYXRhKVxyXG4gICAgc2V0UGVkSGFpckNvbG9ycyhwZWQsIGRhdGEuaGFpckNvbG9yKVxyXG4gICAgc2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEudGF0dG9vcylcclxufVxyXG5cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpXHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKVxyXG5leHBvcnRzKCdTZXRQZWRUYXR0b29zJywgc2V0UGVkVGF0dG9vcylcclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpIiwgImltcG9ydCB7IFJlY2VpdmUgfSBmcm9tICdAZXZlbnRzJztcclxuaW1wb3J0IHtcclxuXHRyZXNldFRvZ2dsZXMsXHJcblx0c2V0RHJhd2FibGUsXHJcblx0c2V0RmFjZUZlYXR1cmUsXHJcblx0c2V0SGVhZEJsZW5kLFxyXG5cdHNldEhlYWRPdmVybGF5LFxyXG5cdHNldE1vZGVsLFxyXG5cdHNldFBlZENsb3RoZXMsXHJcblx0c2V0UGVkVGF0dG9vcyxcclxuXHRzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlLFxyXG5cdHNldFByb3AsXHJcbn0gZnJvbSAnLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xyXG5pbXBvcnQgeyBjbG9zZU1lbnUgfSBmcm9tICcuL21lbnUnO1xyXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSwgVFRvZ2dsZURhdGEsIFRWYWx1ZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xyXG5pbXBvcnQgeyBkZWxheSwgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgcGVkLCB1cGRhdGVQZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgVE9HR0xFX0lOREVYRVMgZnJvbSAnQGRhdGEvdG9nZ2xlcyc7XHJcbmltcG9ydCB7IFRPdXRmaXREYXRhIH0gZnJvbSAnQHR5cGluZ3Mvb3V0Zml0cyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tICdAdHlwaW5ncy90YXR0b29zJztcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5jYW5jZWwsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0YXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKTtcclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2F2ZSwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRyZXNldFRvZ2dsZXMoYXBwZWFyYW5jZSk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDEwMCk7XHJcblxyXG5cdGNvbnN0IG5ld0FwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblx0bmV3QXBwZWFyYW5jZS50YXR0b29zID0gYXBwZWFyYW5jZS50YXR0b29zIHx8IG51bGxcclxuXHR0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVBcHBlYXJhbmNlJywgZ2V0RnJhbWV3b3JrSUQoKSwgbmV3QXBwZWFyYW5jZSk7XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBuZXdBcHBlYXJhbmNlLnRhdHRvb3MpO1xyXG5cclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0TW9kZWwsIGFzeW5jIChtb2RlbDogc3RyaW5nLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBoYXNoID0gR2V0SGFzaEtleShtb2RlbCk7XHJcblx0aWYgKCFJc01vZGVsSW5DZGltYWdlKGhhc2gpIHx8ICFJc01vZGVsVmFsaWQoaGFzaCkpIHtcclxuXHRcdHJldHVybiBjYigwKTtcclxuXHR9XHJcblxyXG5cclxuXHRjb25zdCBuZXdQZWQgPSBhd2FpdCBzZXRNb2RlbChwZWQsIGhhc2gpO1xyXG5cclxuICAgIHVwZGF0ZVBlZChuZXdQZWQpXHJcblxyXG5cdGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblxyXG5cdGFwcGVhcmFuY2UudGF0dG9vcyA9IFtdO1xyXG5cclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgW10pO1xyXG5cclxuXHRjYihhcHBlYXJhbmNlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZ2V0TW9kZWxUYXR0b29zLCBhc3luYyAoXzogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpO1xyXG5cclxuXHRjYih0YXR0b29zKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZFN0cnVjdHVyZSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0RmFjZUZlYXR1cmUocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZE92ZXJsYXksIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldEhlYWRPdmVybGF5KHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRCbGVuZCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZEJsZW5kKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldFRhdHRvb3MsIGFzeW5jIChkYXRhOiBUVGF0dG9vW10sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0UHJvcCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0bGV0IHRleHR1cmUgPSBzZXRQcm9wKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldERyYXdhYmxlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldERyYXdhYmxlKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnRvZ2dsZUl0ZW0sIGFzeW5jIChkYXRhOiBUVG9nZ2xlRGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgaXRlbSA9IFRPR0dMRV9JTkRFWEVTW2RhdGEuaXRlbV07XHJcblx0aWYgKCFpdGVtKSByZXR1cm4gY2IoZmFsc2UpO1xyXG5cclxuXHRjb25zdCBjdXJyZW50ID0gZGF0YS5kYXRhO1xyXG5cdGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XHJcblx0Y29uc3QgaW5kZXggPSBpdGVtLmluZGV4O1xyXG5cdGNvbnN0IGhvb2sgPSBpdGVtLmhvb2s7XHJcblx0Y29uc3QgaG9va0RhdGEgPSBkYXRhLmhvb2tEYXRhO1xyXG5cclxuXHRpZiAoIWN1cnJlbnQpIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGlmICh0eXBlID09PSAncHJvcCcpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50UHJvcCA9PT0gLTEpIHtcclxuXHRcdFx0c2V0UHJvcChwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdENsZWFyUGVkUHJvcChwZWQsIGluZGV4KTtcclxuXHRcdFx0Y2IodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9IGVsc2UgaWYgKHR5cGUgPT09ICdkcmF3YWJsZScpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnREcmF3YWJsZSA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBpdGVtLm9mZikge1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY3VycmVudC52YWx1ZSA9PT0gY3VycmVudERyYXdhYmxlKSB7XHJcblx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBpdGVtLm9mZiwgMCwgMCk7XHJcblx0XHRcdGlmIChob29rKSB7XHJcblx0XHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rLmRyYXdhYmxlcz8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGNvbnN0IGhvb2tJdGVtID0gaG9vay5kcmF3YWJsZXNbaV07XHJcblx0XHRcdFx0XHRTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBob29rSXRlbS5jb21wb25lbnQsIGhvb2tJdGVtLnZhcmlhbnQsIGhvb2tJdGVtLnRleHR1cmUsIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c2V0RHJhd2FibGUocGVkLCBjdXJyZW50KTtcclxuXHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rRGF0YT8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRzZXREcmF3YWJsZShwZWQsIGhvb2tEYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuKTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlT3V0Zml0LCBhc3luYyAoZGF0YTogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5kZWxldGVPdXRmaXQsIGFzeW5jICh7aWR9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmRlbGV0ZU91dGZpdCcsIGlkKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5yZW5hbWVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVuYW1lT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudXNlT3V0Zml0LCBhc3luYyAob3V0Zml0OiBUT3V0Zml0RGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmltcG9ydE91dGZpdCwgYXN5bmMgKHsgaWQsIG91dGZpdE5hbWUgfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKTtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGZyYW1ld29ya2RJZCwgaWQsIG91dGZpdE5hbWUpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmZldGNoT3V0Zml0LCBhc3luYyAoeyBpZCB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmZldGNoT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLml0ZW1PdXRmaXQsIGFzeW5jIChkYXRhOiB7b3V0Zml0OiBUT3V0Zml0RGF0YSwgbGFiZWw6IHN0cmluZ30sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aXRlbU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxub25OZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnVzZU91dGZpSXRlbScsIChvdXRmaXQ6IFRPdXRmaXREYXRhKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcbn0pIiwgImltcG9ydCB7IGdldEZyYW1ld29ya0lELCByZXF1ZXN0TG9jYWxlLCBzZW5kTlVJRXZlbnQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgdXBkYXRlUGVkLCBwZWQsIGdldFBsYXllckRhdGEsIGdldEpvYkluZm8sIGdldFBsYXllckdlbmRlck1vZGVsIH0gZnJvbSBcIkB1dGlsc1wiXHJcbmltcG9ydCB7IHN0YXJ0Q2FtZXJhLCBzdG9wQ2FtZXJhIH0gZnJvbSBcIi4vY2FtZXJhXCJcclxuaW1wb3J0IHR5cGUgeyBUQXBwZWFyYW5jZVpvbmUsIFRNZW51VHlwZXMgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IE91dGZpdCB9IGZyb20gXCJAdHlwaW5ncy9vdXRmaXRzXCJcclxuaW1wb3J0IHsgU2VuZCB9IGZyb20gXCJAZXZlbnRzXCJcclxuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0VGF0dG9vRGF0YSB9IGZyb20gXCIuL2FwcGVhcmFuY2UvZ2V0dGVyc1wiXHJcbmltcG9ydCBcIi4vaGFuZGxlcnNcIlxyXG5pbXBvcnQgeyBzZXRNb2RlbCB9IGZyb20gXCIuL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXHJcblxyXG5jb25zdCBjb25maWcgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2VcclxubGV0IGFybW91ciA9IDBcclxubGV0IG9wZW4gPSBmYWxzZVxyXG5cclxubGV0IHJlc29sdmVQcm9taXNlID0gbnVsbDtcclxubGV0IHByb21pc2UgPSBudWxsO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5NZW51KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IFRBcHBlYXJhbmNlWm9uZVsndHlwZSddLCBjcmVhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAoem9uZSA9PT0gbnVsbCB8fCBvcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwZWRIYW5kbGUgPSBQbGF5ZXJQZWRJZCgpXHJcbiAgICBjb25zdCBjb25maWdNZW51cyA9IGNvbmZpZy5tZW51cygpXHJcblxyXG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZydcclxuXHJcbiAgICBjb25zdCB0eXBlID0gaXNTdHJpbmcgPyB6b25lIDogem9uZS50eXBlXHJcblxyXG4gICAgY29uc3QgbWVudSA9IGNvbmZpZ01lbnVzW3R5cGVdXHJcbiAgICBpZiAoIW1lbnUpIHJldHVyblxyXG5cclxuICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcblxyXG4gICAgY29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgdGFicyA9IG1lbnUudGFic1xyXG4gICAgbGV0IGFsbG93RXhpdCA9IGNyZWF0aW9uID8gZmFsc2UgOiBtZW51LmFsbG93RXhpdFxyXG5cclxuICAgIGFybW91ciA9IEdldFBlZEFybW91cihwZWRIYW5kbGUpXHJcblxyXG4gICAgbGV0IG91dGZpdHMgPSBbXVxyXG5cclxuICAgIGNvbnN0IGhhc091dGZpdFRhYiA9IHRhYnMuaW5jbHVkZXMoJ291dGZpdHMnKVxyXG4gICAgaWYgKGhhc091dGZpdFRhYikgb3V0Zml0cyA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxPdXRmaXRbXT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldE91dGZpdHMnLCBmcmFtZXdvcmtkSWQpIGFzIE91dGZpdFtdXHJcblxyXG4gICAgbGV0IG1vZGVscyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzSGVyaXRhZ2VUYWIgPSB0YWJzLmluY2x1ZGVzKCdoZXJpdGFnZScpXHJcbiAgICBpZiAoaGFzSGVyaXRhZ2VUYWIpIHtcclxuICAgICAgICBtb2RlbHMgPSBjb25maWcubW9kZWxzKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNUYXR0b29UYWIgPSB0YWJzLmluY2x1ZGVzKCd0YXR0b29zJylcclxuICAgIGxldCB0YXR0b29zXHJcbiAgICBpZiAoaGFzVGF0dG9vVGFiKSB7XHJcbiAgICAgICAgdGF0dG9vcyA9IGdldFRhdHRvb0RhdGEoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJsYWNrbGlzdCA9IGdldEJsYWNrbGlzdCh6b25lKVxyXG5cclxuICAgIGlmIChjcmVhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gR2V0SGFzaEtleShnZXRQbGF5ZXJHZW5kZXJNb2RlbCgpKTtcclxuICAgICAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgICAgICBlbWl0TmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JylcclxuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWRIYW5kbGUpXHJcblxyXG4gICAgc3RhcnRDYW1lcmEoKVxyXG5cclxuICAgIHNlbmROVUlFdmVudChTZW5kLmRhdGEsIHtcclxuICAgICAgICB0YWJzLFxyXG4gICAgICAgIGFwcGVhcmFuY2UsXHJcbiAgICAgICAgYmxhY2tsaXN0LFxyXG4gICAgICAgIHRhdHRvb3MsXHJcbiAgICAgICAgb3V0Zml0cyxcclxuICAgICAgICBtb2RlbHMsXHJcbiAgICAgICAgYWxsb3dFeGl0LFxyXG4gICAgICAgIGpvYjogZ2V0Sm9iSW5mbygpLFxyXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVxdWVzdExvY2FsZSgnbG9jYWxlJylcclxuICAgIH0pXHJcblxyXG4gICAgU2V0TnVpRm9jdXModHJ1ZSwgdHJ1ZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIHRydWUpXHJcblxyXG4gICAgb3BlbiA9IHRydWVcclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZCh0cnVlKVxyXG5cclxuICAgIGlmIChwcm9taXNlKSB7XHJcbiAgICAgICAgYXdhaXQgcHJvbWlzZVxyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlc2V0cm91dGluZ2J1Y2tldCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb21pc2UgPSBudWxsO1xyXG4gICAgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5leHBvcnRzKCdPcGVuTWVudScsIG9wZW5NZW51KVxyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdhcHBlYXJhbmNlJywgYXN5bmMgKF8sIGFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCB0eXBlID0gYXJnc1swXVxyXG4gICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHpvbmUgPSB0eXBlLnRvTG93ZXJDYXNlKCkgYXMgVE1lbnVUeXBlc1xyXG4gICAgICAgIG9wZW5NZW51KHpvbmUpXHJcbiAgICB9XHJcbn0sIHRydWUpXHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0QmxhY2tsaXN0KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IHN0cmluZykge1xyXG4gICAgY29uc3Qge2dyb3VwVHlwZXMsIGJhc2V9ID0gY29uZmlnLmJsYWNrbGlzdCgpXHJcblxyXG4gICAgaWYgKHR5cGVvZiB6b25lID09PSAnc3RyaW5nJykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBpZiAoIWdyb3VwVHlwZXMpIHJldHVybiBiYXNlXHJcblxyXG4gICAgbGV0IGJsYWNrbGlzdCA9IHsuLi5iYXNlfVxyXG5cclxuICAgIGNvbnN0IHBsYXllckRhdGEgPSBnZXRQbGF5ZXJEYXRhKClcclxuXHJcblxyXG4gICAgZm9yIChjb25zdCB0eXBlIGluIGdyb3VwVHlwZXMpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cFR5cGVzW3R5cGVdXHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiBncm91cHMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2VcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09ICdqb2JzJyAmJiB6b25lLmpvYnMpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmpvYnMuaW5jbHVkZXMocGxheWVyRGF0YS5qb2IubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2dhbmdzJyAmJiB6b25lLmdhbmdzKSB7XHJcbiAgICAgICAgICAgICAgICBza2lwID0gem9uZS5nYW5ncy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmdhbmcubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFza2lwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEJsYWNrbGlzdCA9IGdyb3Vwc1tncm91cF1cclxuICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdCwgZ3JvdXBCbGFja2xpc3QsIHtcclxuICAgICAgICAgICAgICAgICAgZHJhd2FibGVzOiBPYmplY3QuYXNzaWduKHt9LCBibGFja2xpc3QuZHJhd2FibGVzLCBncm91cEJsYWNrbGlzdC5kcmF3YWJsZXMpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBibGFja2xpc3RcclxuXHJcbiAgICAvLyByZXR1cm4gYmxhY2tsaXN0XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7XHJcbiAgICBTZXRQZWRBcm1vdXIocGVkLCBhcm1vdXIpXHJcblxyXG4gICAgc3RvcENhbWVyYSgpXHJcbiAgICBTZXROdWlGb2N1cyhmYWxzZSwgZmFsc2UpXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC52aXNpYmxlLCBmYWxzZSlcclxuXHJcblxyXG4gICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmhpZGVIdWQoZmFsc2UpXHJcblxyXG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XHJcbiAgICAgICAgcmVzb2x2ZVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIG9wZW4gPSBmYWxzZVxyXG59XHJcbiIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgb3Blbk1lbnUgfSBmcm9tIFwiLi4vbWVudVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBRQkJyaWRnZSgpIHtcbiAgICBvbk5ldCgncWItY2xvdGhpbmc6Y2xpZW50OmxvYWRQbGF5ZXJDbG90aGluZycsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGVzOmNsaWVudDpDcmVhdGVGaXJzdENoYXJhY3RlcicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6b3Blbk91dGZpdE1lbnUnLCAoKSA9PiB7XG4gICAgICAgIG9wZW5NZW51KHsgdHlwZTogXCJvdXRmaXRzXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0pICBcbiAgICB9KVxufSIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGxheWVyUGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gXCJAdXRpbHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gRVNYQnJpZGdlKCkge1xuICAgIGxldCBmaXJzdFNwYXduID0gZmFsc2VcblxuICAgIG9uKFwiZXN4X3NraW46cmVzZXRGaXJzdFNwYXduXCIsICgpID0+IHtcbiAgICAgICAgZmlyc3RTcGF3biA9IHRydWVcbiAgICB9KTtcblxuICAgIG9uKFwiZXN4X3NraW46cGxheWVyUmVnaXN0ZXJlZFwiLCAoKSA9PiB7XG4gICAgICAgIGlmKGZpcnN0U3Bhd24pXG4gICAgICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbjInLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghYXBwZWFyYW5jZS5tb2RlbCkgYXBwZWFyYW5jZS5tb2RlbCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpO1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpnZXRTa2luJywgYXN5bmMgKGNiOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXG4gICAgICAgIGNiKGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IGFueSkgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXG4gICAgICAgIGlmIChjYikgY2IoKVxuICAgIH0pXG5cbiAgICBvbk5ldCgnZXN4X3NraW46b3BlblNhdmVhYmxlTWVudScsIGFzeW5jIChvblN1Ym1pdDogYW55KSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24ob25TdWJtaXQpXG4gICAgfSlcbn0iLCAiaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0RHJhd2FibGVzLCBnZXRQcm9wcyB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2dldHRlcnNcIjtcbmltcG9ydCB7IHNldERyYXdhYmxlLCBzZXRNb2RlbCwgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGVkVGF0dG9vcywgc2V0UHJvcCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIjtcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiO1xuaW1wb3J0IHsgcGVkLCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCI7XG5cbmZ1bmN0aW9uIGV4cG9ydEhhbmRsZXIobmFtZTogc3RyaW5nLCBjYjogYW55KSB7XG4gICAgb24oJ19fY2Z4X2V4cG9ydF9pbGxlbml1bS1hcHBlYXJhbmNlXycgKyBuYW1lLCAoc2V0Q0I6IGFueSkgPT4ge1xuICAgICAgICBzZXRDQihjYik7XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlsbGVuaXVtQ29tcGF0KCkge1xuICAgIGV4cG9ydEhhbmRsZXIoJ3N0YXJ0UGxheWVyQ3VzdG9taXphdGlvbicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRNb2RlbCcsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gR2V0RW50aXR5TW9kZWwocGVkKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBkcmF3YWJsZXM6IGFueSA9IGdldERyYXdhYmxlcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3ZHJhd2FibGUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBkcmF3YWJsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyYXdhYmxlID0gZHJhd2FibGVzW2lkXTtcbiAgICAgICAgICAgIG5ld2RyYXdhYmxlLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZDogZHJhd2FibGUuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IGRyYXdhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IGRyYXdhYmxlLnRleHR1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZFByb3BzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSAgZ2V0UHJvcHMocGVkKVswXTtcbiAgICAgICAgbGV0IG5ld1Byb3BzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpZF07XG4gICAgICAgICAgICBuZXdQcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9wX2lkOiBwcm9wLmluZGV4LFxuICAgICAgICAgICAgICAgIGRyYXdhYmxlOiBwcm9wLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZEJsZW5kRGF0YShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkRmFjZUZlYXR1cmVzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZFN0cnVjdHVyZShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZE92ZXJsYXlzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZE92ZXJsYXkocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhhaXInLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGFpcihwZWQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRBcHBlYXJhbmNlJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJNb2RlbCcsIChtb2RlbDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxuICAgICAgICBzZXRNb2RlbChwZWQsIG1vZGVsKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRCbGVuZCcsIChwZWQ6IG51bWJlciwgYmxlbmQ6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRCbGVuZChwZWQsIGJsZW5kKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRmFjZUZlYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIsIG92ZXJsYXk6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRPdmVybGF5KHBlZCwgb3ZlcmxheSk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhhaXInLCBhc3luYyAocGVkOiBudW1iZXIsIGhhaXI6IGFueSwgdGF0dG9vOiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRQZWRIYWlyQ29sb3JzKHBlZCwgaGFpcik7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEV5ZUNvbG9yJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnQnLCAocGVkOiBudW1iZXIsIGRyYXdhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICBpbmRleDogZHJhd2FibGUuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgdmFsdWU6IGRyYXdhYmxlLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlciwgY29tcG9uZW50czogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RyYXdhYmxlID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnQuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29tcG9uZW50LnRleHR1cmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRQcm9wJywgKHBlZDogbnVtYmVyLCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICB2YWx1ZTogcHJvcC5kcmF3YWJsZSxcbiAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldFByb3AocGVkLCBuZXdQcm9wKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3BzJywgKHBlZDogbnVtYmVyLCBwcm9wczogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogcHJvcC5wcm9wX2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJBcHBlYXJhbmNlJywgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgLy8gICAgIHJldHVybiBjb25zb2xlLndhcm4oJ05lZWQgdG8gYmUgaW1wbGVtZW50ZWQnKTtcbiAgICAvLyB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIsIGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgICAgIHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkVGF0dG9vcycsIChwZWQ6IG51bWJlciwgdGF0dG9vczogVFRhdHRvb1tdKSA9PiB7XG4gICAgICAgIHNldFBlZFRhdHRvb3MocGVkLCB0YXR0b29zKVxuICAgIH0pO1xufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEFwcGVhcmFuY2Vab25lIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxyXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuL21lbnVcIlxyXG5pbXBvcnQgeyBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuaW1wb3J0IHsgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBnZXRGcmFtZXdvcmtJRCwgRGVsYXksIGJsX2JyaWRnZSwgcGVkLCBkZWxheSwgZm9ybWF0LCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgUUJCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvcWJcIlxyXG5pbXBvcnQgeyBFU1hCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvZXN4XCJcclxuaW1wb3J0IHsgaWxsZW5pdW1Db21wYXQgfSBmcm9tIFwiLi9jb21wYXQvaWxsZW5pdW1cIlxyXG5cclxuZXhwb3J0cygnU2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSB8IHN0cmluZykgPT4ge1xyXG4gICAgbGV0IHJlc29sdmVkQXBwZWFyYW5jZTogVEFwcGVhcmFuY2U7XHJcbiAgICBcclxuICAgIGlmICghYXBwZWFyYW5jZSB8fCB0eXBlb2YgYXBwZWFyYW5jZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRDogc3RyaW5nID0gYXBwZWFyYW5jZSB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpO1xyXG4gICAgICAgIHJlc29sdmVkQXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRCkgYXMgVEFwcGVhcmFuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcHBlYXJhbmNlID09PSAnb2JqZWN0JykgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFyZXNvbHZlZEFwcGVhcmFuY2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZhbGlkIGFwcGVhcmFuY2UgZm91bmQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShyZXNvbHZlZEFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcbmV4cG9ydHMoJ0dldFBsYXllclBlZEFwcGVhcmFuY2UnLCBhc3luYyAoZnJhbWV3b3JrSUQ6IHN0cmluZykgPT4ge1xyXG4gICAgZnJhbWV3b3JrSUQgPSBmcmFtZXdvcmtJRCB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICByZXR1cm4gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG59KVxyXG5cclxuZXhwb3J0cygnSW5pdGlhbENyZWF0aW9uJywgYXN5bmMgKGNiPzogRnVuY3Rpb24pID0+IHtcclxuICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBuZWVkcyB0byBiZSB0eXBlIG9mIFRBcHBlYXJhbmNlWm9uZSBtZWFuaW5nIGl0IG5lZWRzIGEgY29vcmRzIHByb3BlcnR5LCBidXQgaW4gdGhpcyBjYXNlIGl0J3Mgbm90IHVzZWRcclxuICAgIGF3YWl0IG9wZW5NZW51KHsgdHlwZTogXCJhcHBlYXJhbmNlXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0sIHRydWUpXHJcbiAgICBpZiAoY2IpIGNiKClcclxufSlcclxuXHJcbm9uKCdibF9hcHBlYXJhbmNlOmNsaWVudDp1c2Vab25lJywgKHpvbmU6IFRBcHBlYXJhbmNlWm9uZSkgPT4ge1xyXG4gICAgb3Blbk1lbnUoem9uZSlcclxufSlcclxuXHJcbm9uTmV0KCdibF9icmlkZ2U6Y2xpZW50OnBsYXllckxvYWRlZCcsIGFzeW5jICgpID0+IHtcclxuICAgIHdoaWxlICghYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGF3YWl0IERlbGF5KDEwMCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxufSlcclxuXHJcbm9uTmV0KCdvblJlc291cmNlU3RhcnQnLCBhc3luYyAocmVzb3VyY2U6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHJlc291cmNlID09PSBHZXRDdXJyZW50UmVzb3VyY2VOYW1lKCkgJiYgYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICAgICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3QgZnJhbWV3b3JrTmFtZSA9IGJsX2JyaWRnZS5nZXRGcmFtZXdvcmsoJ2NvcmUnKVxyXG5jb25zdCBjb3JlID0gZm9ybWF0KEdldENvbnZhcignYmw6ZnJhbWV3b3JrJywgJ3FiJykpXHJcblxyXG5pZiAoY29yZSA9PSAncWInIHx8IGNvcmUgPT0gJ3FieCcgJiYgR2V0UmVzb3VyY2VTdGF0ZShmcmFtZXdvcmtOYW1lKSA9PSAnc3RhcnRlZCcpIHtcclxuICAgIFFCQnJpZGdlKCk7XHJcbn0gZWxzZSBpZiAoY29yZSA9PSAnZXN4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgRVNYQnJpZGdlKCk7XHJcbn1cclxuXHJcbmlsbGVuaXVtQ29tcGF0KCk7XHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ3JlbG9hZHNraW4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGhlYWx0aCA9IEdldEVudGl0eUhlYWx0aChwZWQpO1xyXG4gICAgY29uc3QgbWF4aGVhbHRoID0gR2V0RW50aXR5TWF4SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBhcm1vciA9IEdldFBlZEFybW91cihwZWQpO1xyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxuXHJcbiAgICBTZXRQZWRNYXhIZWFsdGgocGVkLCBtYXhoZWFsdGgpXHJcbiAgICBkZWxheSgxMDAwKSBcclxuICAgIFNldEVudGl0eUhlYWx0aChwZWQsIGhlYWx0aClcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW9yKVxyXG59LCBmYWxzZSlcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQUFPLElBQUksTUFBTTtBQUVWLElBQU0sWUFBWSx3QkFBQyxjQUFzQjtBQUM1QyxRQUFNO0FBQ1YsR0FGeUI7QUFhbEIsSUFBTSxlQUFlLHdCQUFDLFFBQWdCLFNBQWM7QUFDdkQsaUJBQWU7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBLEVBQ0osQ0FBQztBQUNMLEdBTDRCO0FBT3JCLElBQU0sUUFBUSx3QkFBQyxPQUFlLElBQUksUUFBUSxTQUFPLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBdEQ7QUFFZCxJQUFNLGVBQWUsOEJBQU8sVUFBNEM7QUFDM0UsTUFBSSxZQUFvQixPQUFPLFVBQVUsV0FBVyxRQUFRLFdBQVcsS0FBSztBQUU1RSxNQUFJLENBQUMsYUFBYSxTQUFTLEtBQUssQ0FBQyxpQkFBaUIsU0FBUyxHQUFHO0FBTzFELFlBQVEsS0FBSyxvQ0FBb0MsS0FBSyxHQUFHO0FBQ3pELFdBQU87QUFBQSxFQUNYO0FBRUEsTUFBSSxlQUFlLFNBQVM7QUFBRyxXQUFPO0FBRXRDLGVBQWEsU0FBUztBQUV0QixRQUFNLHFCQUFxQiw2QkFBcUI7QUFDNUMsV0FBTyxJQUFJLFFBQVEsYUFBVztBQUMxQixZQUFNLFdBQVcsWUFBWSxNQUFNO0FBQy9CLFlBQUksZUFBZSxTQUFTLEdBQUc7QUFDM0Isd0JBQWMsUUFBUTtBQUN0QixrQkFBUTtBQUFBLFFBQ1o7QUFBQSxNQUNKLEdBQUcsR0FBRztBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0wsR0FUMkI7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O0FBQ2pCLFVBQU0sdUJBQXVCLFVBQVU7QUFBQSxFQUMzQztBQUNKLENBQUM7QUFFRCxJQUFNLGdCQUFnQixVQUFVLGFBQWEsTUFBTTtBQUNuRCxJQUFNLE9BQU8sT0FBTyxVQUFVLGdCQUFnQixJQUFJLENBQUM7QUFFbkQsSUFBSSxRQUFRLFFBQVEsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUMvRSxXQUFTO0FBQ2IsV0FBVyxRQUFRLFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxXQUFXO0FBQ3RFLFlBQVU7QUFDZDtBQUVBLGVBQWU7QUFFZixnQkFBZ0IsY0FBYyxZQUFZO0FBQ3RDLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxTQUFTLGdCQUFnQixHQUFHO0FBQ2xDLFFBQU0sWUFBWSxtQkFBbUIsR0FBRztBQUN4QyxRQUFNLFFBQVEsYUFBYSxHQUFHO0FBRTlCLFFBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxNQUFJLENBQUM7QUFBWTtBQUNqQixRQUFNLHVCQUF1QixVQUFVO0FBRXZDLGtCQUFnQixLQUFLLFNBQVM7QUFDOUIsUUFBTSxHQUFJO0FBQ1Ysa0JBQWdCLEtBQUssTUFBTTtBQUMzQixlQUFhLEtBQUssS0FBSztBQUMzQixHQUFHLEtBQUs7IiwKICAibmFtZXMiOiBbImRlbGF5IiwgInBlZCIsICJ4IiwgInkiLCAieiIsICJjb25maWciLCAicGVkIiwgInBlZCIsICJwZWQiXQp9Cg== diff --git a/dist/client/init.js.map b/dist/client/init.js.map index d0364af..bf55095 100644 --- a/dist/client/init.js.map +++ b/dist/client/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], - "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = await getTattoos()\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nexport function setFaceFeatures(pedHandle: number, data: THeadStructure) {\r\n if (!data) return console.warn('No data provided for setFaceFeatures')\r\n \r\n\r\n for (const feature in data) {\r\n const value = data[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetFaceFeatures', setFaceFeatures);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) setFaceFeatures(pedHandle, headStructure)\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], - "mappings": ";;;;AAAO,IAAI,MAAM;AAEV,IAAM,YAAY,wBAAC,cAAsB;AAC5C,QAAM;AACV,GAFyB;AAalB,IAAM,eAAe,wBAAC,QAAgB,SAAc;AACvD,iBAAe;AAAA,IACX;AAAA,IACA;AAAA,EACJ,CAAC;AACL,GAL4B;AAOrB,IAAM,QAAQ,wBAAC,OAAe,IAAI,QAAQ,SAAO,WAAW,KAAK,EAAE,CAAC,GAAtD;AAEd,IAAM,eAAe,8BAAO,UAA4C;AAC3E,MAAI,YAAoB,OAAO,UAAU,WAAW,QAAQ,WAAW,KAAK;AAE5E,MAAI,CAAC,aAAa,SAAS,KAAK,CAAC,iBAAiB,SAAS,GAAG;AAO1D,YAAQ,KAAK,oCAAoC,KAAK,GAAG;AACzD,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,SAAS;AAAG,WAAO;AAEtC,eAAa,SAAS;AAEtB,QAAM,qBAAqB,6BAAqB;AAC5C,WAAO,IAAI,QAAQ,aAAW;AAC1B,YAAM,WAAW,YAAY,MAAM;AAC/B,YAAI,eAAe,SAAS,GAAG;AAC3B,wBAAc,QAAQ;AACtB,kBAAQ;AAAA,QACZ;AAAA,MACJ,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL,GAT2B;AAW3B,QAAM,mBAAmB;AAEzB,SAAO;AACX,GAhC4B;AAsC5B,IAAM,eAAe,uBAAuB;AAC5C,IAAM,cAAsC,CAAC;AAC7C,IAAM,eAAyD,CAAC;AAEhE,SAAS,WAAW,WAAmBA,QAAsB;AACzD,MAAIA,UAASA,SAAQ,GAAG;AACpB,UAAM,cAAc,aAAa;AAEjC,SAAK,YAAY,SAAS,KAAK,KAAK;AAAa,aAAO;AAExD,gBAAY,SAAS,IAAI,cAAcA;AAAA,EAC3C;AAEA,SAAO;AACX;AAVS;AAYT,MAAM,UAAU,YAAY,IAAI,CAAC,QAAgB,SAAc;AAC3D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,WAAW,QAAQ,GAAG,IAAI;AACrC,CAAC;AAEM,SAAS,sBACZ,cAAsB,MACL;AACjB,MAAI,CAAC,WAAW,WAAW,CAAC,GAAG;AAC3B;AAAA,EACJ;AAEA,MAAI;AAEJ,KAAG;AACC,UAAM,GAAG,SAAS,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,MAAS,EAAE,CAAC;AAAA,EAClE,SAAS,aAAa,GAAG;AACzB,UAAQ,UAAU,SAAS,IAAI,cAAc,KAAK,GAAG,IAAI;AAEzD,SAAO,IAAI,QAAW,CAAC,YAAY;AAC/B,iBAAa,GAAG,IAAI;AAAA,EACxB,CAAC;AACL;AAjBgB;AAmBT,SAAS,iBAAiB,WAAW,IAAI;AAC5C,QAAM,UAAU,SAAS,IAAI,OAAO,UAAU,QAAQ,SAAS;AAC3D,QAAI;AACJ,QAAI;AACA,iBAAW,MAAM,GAAG,GAAG,IAAI;AAAA,IAC/B,SACO,GAAG;AACN,cAAQ,MAAM,mDAAmD,SAAS,EAAE;AAC5E,cAAQ,IAAI,KAAK,EAAE,KAAK,IAAI;AAAA,IAChC;AACA,YAAQ,UAAU,QAAQ,IAAI,KAAK,QAAQ;AAAA,EAC/C,CAAC;AACL;AAZgB;AAgBT,IAAM,gBAAgB,wBAAC,oBAA4B;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,UAAM,oBAAoB,6BAAM;AAC5B,UAAI,uBAAuB,eAAe,GAAG;AACzC,cAAM,aAAa,QAAQ,cAAc,OAAO,EAAE;AAClD,YAAI,oBAAoB,iBAAiB,cAAc,UAAU,UAAU,OAAO;AAClF,YAAI,CAAC,mBAAmB;AACpB,kBAAQ,MAAM,GAAG,UAAU,qEAAqE;AAChG,8BAAoB,iBAAiB,cAAc,gBAAgB;AAAA,QACvE;AACA,gBAAQ,iBAAiB;AAAA,MAC7B,OAAO;AACH,mBAAW,mBAAmB,GAAG;AAAA,MACrC;AAAA,IACJ,GAZ0B;AAa1B,sBAAkB;AAAA,EACtB,CAAC;AACL,GAjB6B;AA2BtB,IAAM,YAAY,QAAQ;AAE1B,IAAM,gBAAgB,6BAAM;AAC/B,SAAO,UAAU,KAAK,EAAE,cAAc;AAC1C,GAF6B;AAItB,IAAM,iBAAiB,6BAAM;AAChC,QAAM,KAAK,cAAc,EAAE;AAC3B,SAAO;AACX,GAH8B;AAKvB,IAAM,uBAAuB,6BAAM;AACtC,QAAM,SAAS,cAAc,EAAE;AAC/B,SAAO,WAAW,SAAS,qBAAqB;AACpD,GAHoC;AAK7B,SAAS,MAAM,IAA2B;AAC7C,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACzD;AAFgB;AAIT,SAAS,OAAO,KAAqB;AACxC,MAAI,CAAC,IAAI,SAAS,GAAG;AAAG,WAAO;AAC/B,SAAO,IAAI,QAAQ,MAAM,EAAE;AAC/B;AAHgB;AAKT,SAAS,aAAuD;AACnE,QAAM,MAAM,cAAc,EAAE;AAC5B,SAAO,MAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI;AAC1D;AAHgB;AAKT,SAAS,mBAAmBC,MAAa;AAC5C,QAAM,QAAQ,eAAeA,IAAG;AAChC,SAAO,UAAU,WAAW,kBAAkB,KAAK,UAAU,WAAW,kBAAkB;AAC9F;AAHgB;;;AC3KhB,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAE7B,IAAI,UAAmB;AACvB,IAAI,cAAsB;AAC1B,IAAI,MAAqB;AACzB,IAAI,SAAiB;AACrB,IAAI,SAAiB;AACrB,IAAI,eAA+B;AACnC,IAAI,SAAwB;AAC5B,IAAI,cAAuB;AAE3B,IAAI,cAAkC;AAEtC,IAAM,cAA4B;AAAA,EAC9B,OAAO;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,CAAC,OAAO,KAAK;AAAA,EAChB,OAAO,CAAC,OAAO,KAAK;AACxB;AAEA,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,YAAY,6BAAgB;AACjC,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,IAAI,IAAI,MAAM,IAAI;AAExB,SAAO,CAAC,GAAG,GAAG,CAAC;AAChB,GAVkB;AAYlB,IAAM,iBAAiB,wBAAC,QAAiB,WAA0B;AAClE,MAAI,CAAC,WAAW,CAAC,gBAAgB;AAAa;AAE9C,WAAS,UAAU;AACnB,WAAS,UAAU;AAEnB,YAAU;AACV,YAAU;AAEP,QAAM,gBAAgB,gBAAgB,WAAW,gBAAgB;AACjE,QAAM,WAAW,gBAAgB,KAAO;AAExC,QAAM,UAAU,gBAAgB;AAChC,QAAM,WAAW,UAAU,IAAM;AAEpC,WAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ;AAEtD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B;AAAA,IACC;AAAA,IACA,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,EAClB;AACA,kBAAgB,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AACpE,GA1BuB;AA4BvB,IAAM,aAAa,8BAAO,QAAiB,aAAsB;AAChE,QAAM,UAAkB,iBAAiB,GAAG,IAAI;AAChD,aAAW,YAAY;AAEvB,gBAAc;AACd,gBAAc;AACd,WAAS;AAET,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B,QAAM,SAAiB;AAAA,IACtB;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,iBAAe;AACf,gBAAc;AACd,WAAS;AACT,QAAM;AAEN,kBAAgB,QAAQ,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,yBAAuB,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAEhD,QAAM,MAAM,GAAG;AAEf,0BAAwB,QAAQ,IAAI;AACpC,gBAAc,QAAQ,GAAG;AACzB,eAAa,QAAQ,GAAG;AACxB,oBAAkB,QAAQ,GAAG;AAC7B,WAAS,MAAM;AAEf,aAAW,QAAQ,IAAI;AACxB,GAxCmB;AA0CnB,IAAM,WAAW,wBAAC,eAAuB;AACxC,MAAI,EAAE,aAAa,GAAG,KAAK,cAAc;AAAM;AAC/C,cAAY;AACZ,aAAW,UAAU,CAAC;AACvB,GAJiB;AAMV,IAAM,cAAc,6BAAM;AAChC,MAAI;AAAS;AACb,YAAU;AACV,gBAAc;AACd,QAAM,UAAU,2BAA2B,IAAI;AAC/C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,OAAO,GAAK,GAAK,CAAG;AACtE,cAAY,KAAK,GAAG,GAAG,CAAC;AACxB,mBAAiB,MAAM,MAAM,KAAM,MAAM,IAAI;AAE1C,YAAU,SAAS,WAAW;AAClC,GAV2B;AAYpB,IAAM,aAAa,6BAAY;AACrC,MAAI,CAAC;AAAS;AACd,YAAU;AAEV,mBAAiB,OAAO,MAAM,KAAK,MAAM,KAAK;AAC9C,aAAW,KAAK,IAAI;AACpB,QAAM;AACN,iBAAe;AAChB,GAR0B;AAU1B,IAAM,YAAY,wBAAC,MAA2B,WAAW,gBAAsB;AAE9E,QAAM,OAAsC,YAAY,IAAI;AAEzD,QAAM,cAAc,MAAM,QAAQ,IAAI;AAEtC,gBAAc;AAEd,MAAI,CAAC,eAAe,SAAS,GAAG;AAC5B,UAAM,CAACC,IAAGC,IAAGC,EAAC,IAAc,gBAAgB,KAAK,KAAK;AACtD;AAAA,MACI;AAAA,QACI,GAAGF;AAAA,QACH,GAAGC;AAAA,QACH,GAAGC,KAAI;AAAA,MACX;AAAA,MACA;AAAA,IACJ;AACA;AAAA,EACJ;AAGA,MAAI,WAAW;AAAsB,eAAW;AAEhD,MAAI,aAAa;AACb,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAE3E,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAG3E,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AAAA,EACxB,OAAO;AACH,QAAI,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,MAAM,GAAK,GAAK,CAAG;AAAA,EACvE;AAEH;AAAA,IACC;AAAA,MACC;AAAA,MACA;AAAA,MACA,GAAG,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACD;AAED,GA9CkB;AAgDlB,wDAAqC,CAAC,MAAM,OAAO;AAC/C,iBAAe,KAAK,GAAG,KAAK,CAAC;AAC7B,KAAG,CAAC;AACR,CAAC;AAID,8DAAwC,CAAC,MAAgB,OAAiB;AACzE,UAAQ,MAAM;AAAA,IACP,KAAK;AACD,gBAAU,SAAS,uBAAuB;AAC1C;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB,qBAAe;AACf;AAAA,EACX;AACA,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,CAAC,MAAM,OAAO;AAClD,MAAI,SAAS,QAAQ;AAEd,UAAM,UAAU,gBAAgB,UAAU,0BAA0B;AAE1E,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,UAAU,UAAU;AAAA,EAClD,WAAW,SAAS,MAAM;AACzB,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,MAAM,MAAM;AAAA,EAC1C;AAEA,gBAAc;AACd,iBAAe;AACf,KAAG,CAAC;AACL,CAAC;;;AC5OD,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACfA,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACrBA,IAAO,oBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACbA,IAAO,gBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACDO,SAAS,eAAe,QAAgB;AAC3C,QAAMC,UAAS,QAAQ;AACvB,QAAM,SAASA,QAAO,OAAO;AAE7B,SAAO,OAAO,UAAU,CAAC,UAAkB,WAAW,KAAK,MAAM,MAAM;AAC3E;AALgB;AAOT,SAAS,QAAQ,WAA8B;AAClD,SAAO;AAAA,IACH,OAAO,gBAAgB,SAAS;AAAA,IAChC,WAAW,yBAAyB,SAAS;AAAA,EACjD;AACJ;AALgB;AAMhB,QAAQ,WAAW,OAAO;AAEnB,SAAS,iBAAiB,WAAmB;AAEhD,QAAM,SAAS,IAAI,YAAY,EAAE;AACjC,SAAO,QAAQ,aAAa,sBAAsB,WAAW,IAAI,YAAY,MAAM,CAAC;AAEpF,QAAM,EAAE,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI,YAAY,MAAM;AAC1I,QAAM,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,IAAI,IAAI,aAAa,QAAQ,EAAE;AAW5E,SAAO;AAAA,IACH;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA;AAAA,IAEA,WAAW,QAAQ,SAAS;AAAA,EAChC;AACJ;AAjCgB;AAkChB,QAAQ,gBAAgB,gBAAgB;AAEjC,SAAS,eAAe,WAAmB;AAC9C,MAAI,SAA4B,CAAC;AACjC,MAAI,WAAyB,CAAC;AAE9B,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,WAAO,OAAO,IAAI,wBAAwB,CAAC;AAE3C,QAAI,YAAY,YAAY;AACxB,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,eAAe,SAAS;AAAA,MAC1C;AAAA,IACJ,OAAO;AACH,YAAM,CAAC,GAAG,cAAc,YAAY,YAAY,aAAa,cAAc,IAAI,sBAAsB,WAAW,CAAC;AACjH,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,iBAAiB,MAAM,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,CAAC,UAAU,MAAM;AAC5B;AA7BgB;AA8BhB,QAAQ,kBAAkB,cAAc;AAEjC,SAAS,iBAAiB,WAAmB;AAChD,QAAM,WAAW,eAAe,SAAS;AAEzC,MAAI,aAAa,WAAW,kBAAkB,KAAK,aAAa,WAAW,kBAAkB;AAAG;AAEhG,MAAI,aAAa,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,eAAW,OAAO,IAAI;AAAA,MAClB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,kBAAkB,WAAW,CAAC;AAAA,IACzC;AAAA,EACJ;AAEA,SAAO;AACX;AAhBgB;AAiBhB,QAAQ,oBAAoB,gBAAgB;AAErC,SAAS,aAAa,WAAmB;AAC5C,MAAI,YAAY,CAAC;AACjB,MAAI,iBAAiB,CAAC;AAEtB,WAAS,IAAI,GAAG,IAAI,kBAAe,QAAQ,KAAK;AAC5C,UAAM,OAAO,kBAAe,CAAC;AAC7B,UAAM,UAAU,wBAAwB,WAAW,CAAC;AAEpD,mBAAe,IAAI,IAAI;AAAA,MACnB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,iCAAiC,WAAW,CAAC;AAAA,MACpD,UAAU,gCAAgC,WAAW,GAAG,OAAO;AAAA,IACnE;AACA,cAAU,IAAI,IAAI;AAAA,MACd,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,wBAAwB,WAAW,CAAC;AAAA,MAC3C,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,WAAW,cAAc;AACrC;AAvBgB;AAwBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,SAAS,WAAmB;AACxC,MAAI,QAAQ,CAAC;AACb,MAAI,aAAa,CAAC;AAElB,WAAS,IAAI,GAAG,IAAI,cAAW,QAAQ,KAAK;AACxC,UAAM,OAAO,cAAW,CAAC;AACzB,UAAM,UAAU,gBAAgB,WAAW,CAAC;AAE5C,eAAW,IAAI,IAAI;AAAA,MACf,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,qCAAqC,WAAW,CAAC;AAAA,MACxD,UAAU,oCAAoC,WAAW,GAAG,OAAO;AAAA,IACvE;AAEA,UAAM,IAAI,IAAI;AAAA,MACV,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,gBAAgB,WAAW,CAAC;AAAA,MACnC,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,OAAO,UAAU;AAC7B;AAxBgB;AAyBhB,QAAQ,YAAY,QAAQ;AAG5B,eAAsB,cAAc,WAAyC;AACzE,QAAM,CAAC,UAAU,MAAM,IAAI,eAAe,SAAS;AACnD,QAAM,CAAC,WAAW,SAAS,IAAI,aAAa,SAAS;AACrD,QAAM,CAAC,OAAO,SAAS,IAAI,SAAS,SAAS;AAC7C,QAAM,QAAQ,eAAe,SAAS;AACtC,QAAM,UAAU,MAAM,WAAW;AAEjC,SAAO;AAAA,IACH,YAAY,eAAe,KAAK;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ,SAAS;AAAA,IAC5B,WAAW,iBAAiB,SAAS;AAAA,IACrC,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,eAAe,iBAAiB,SAAS;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AArBsB;AAsBtB,QAAQ,iBAAiB,aAAa;AACtC,iBAAiB,sCAAsC,MAAM;AACzD,YAAU,YAAY,CAAC;AACvB,SAAO,cAAc,GAAG;AAC5B,CAAC;AAEM,SAAS,cAAc,WAA6B;AACvD,QAAM,CAAC,SAAS,IAAI,aAAa,SAAS;AAC1C,QAAM,CAAC,KAAK,IAAI,SAAS,SAAS;AAClC,QAAM,CAAC,QAAQ,IAAI,eAAe,SAAS;AAE3C,SAAO;AAAA,IACH,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACJ;AACJ;AAVgB;AAWhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,WAAW,WAA0B;AACjD,SAAO;AAAA,IACH,WAAW,iBAAiB,SAAS;AAAA,IACrC,eAAe,iBAAiB,SAAS;AAAA,IACzC,WAAW,QAAQ,SAAS;AAAA,IAC5B,OAAO,eAAe,SAAS;AAAA,EACnC;AACJ;AAPgB;AAQhB,QAAQ,cAAc,UAAU;AAEzB,SAAS,gBAAgB;AAC5B,MAAI,cAAc,CAAC;AAEnB,QAAM,CAAC,aAAa,iBAAiB,IAAI,QAAQ,cAAc,QAAQ;AACvE,WAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AAC/C,UAAM,WAAW,kBAAkB,CAAC;AACpC,UAAM,OAAO,SAAS;AACtB,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,gBAAY,KAAK,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,IACX;AAEA,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,YAAM,UAAU,YAAY,CAAC;AAC7B,kBAAY,KAAK,EAAE,KAAK,KAAK;AAAA,QACzB,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,WAAW,eAAe,GAAG,MAAM,WAAW,kBAAkB;AAEtE,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,UAAM,UAAU,WAAW,GAAG;AAC9B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,aAAa,QAAQ,CAAC;AAC5B,UAAI,SAAS;AAEb,YAAM,cAAc,WAAW,YAAY;AAC3C,YAAM,iBAAiB,YAAY,SAAS,IAAI;AAChD,UAAI,kBAAkB,UAAU;AAC5B,iBAAS;AAAA,MACb,WAAW,CAAC,kBAAkB,CAAC,UAAU;AACrC,iBAAS;AAAA,MACb;AAEA,UAAI,OAAO;AACX,UAAI,OAAO;AAEX,UAAI,QAAQ;AACR,eAAO,WAAW,MAAM;AACxB,eAAO,+BAA+B,SAAS,IAAI;AAAA,MACvD;AAEA,UAAI,SAAS,MAAM,MAAM;AACrB,cAAM,cAAc,YAAY,IAAI,EAAE,KAAK,CAAC,EAAE;AAE9C,oBAAY,KAAK;AAAA,UACb,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAlEgB;AAoEhB,eAAsB,aAAiC;AACnD,SAAO,MAAM,sBAAsB,iCAAiC,KAAK,CAAC;AAC9E;AAFsB;AAGtB,QAAQ,cAAc,UAAU;AAGhC,iBAAiB,gDAAgD,CAAC,SAAoC;AAClG,MAAI,KAAK,SAAS;AAAS,YAAQ,kBAAkB,EAAE,oBAAoB,KAAK,IAAI;AACpF,MAAI,KAAK,SAAS;AAAY,YAAQ,qBAAqB,EAAE,oBAAoB,KAAK,IAAI;AAC9F,CAAC;;;ACpSD,IAAO,kBAAQ;AAAA,EACX,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,MAC1D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,UAAU;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AACJ;;;AC9CO,SAAS,YAAY,WAAmB,MAAc;AACzD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,kCAAkC;AAEjE,2BAAyB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC;AAC3E,SAAO,gCAAgC,WAAW,KAAK,OAAO,KAAK,KAAK;AAC5E;AALgB;AAMhB,QAAQ,eAAe,WAAW;AAE3B,SAAS,QAAQ,WAAmB,MAAc;AACrD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,8BAA8B;AAE7D,MAAI,KAAK,UAAU,IAAI;AACnB,iBAAa,WAAW,KAAK,KAAK;AAClC;AAAA,EACJ;AAEA,kBAAgB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK;AACtE,SAAO,oCAAoC,WAAW,KAAK,OAAO,KAAK,KAAK;AAChF;AAVgB;AAWhB,QAAQ,WAAW,OAAO;AAE1B,IAAM,cAAc,WAAW,kBAAkB;AAE1C,IAAM,WAAW,8BAAO,WAAmB,SAAiE;AAC/G,MAAI,QAAQ,QAAQ,SAAS,QAAW;AACpC,YAAQ,KAAK,+BAA+B;AAC5C,WAAO;AAAA,EACX;AAEA,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC1B,YAAQ,WAAW,IAAI;AAAA,EAC3B,WAAW,OAAO,SAAS,UAAU;AACjC,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ,KAAK,SAAS;AAAA,EAC1B;AAEA,MAAI,UAAU;AAAG,WAAO;AAExB,QAAM,aAAa,KAAK;AAExB,QAAM,WAAW,aAAa,SAAS;AACvC,MAAI,UAAU;AACV,mBAAe,SAAS,GAAG,KAAK;AAChC,gBAAY,YAAY;AACxB,cAAU,SAAS;AAAA,EACvB,OAAO;AACH,mBAAe,WAAW,KAAK;AAAA,EACnC;AAEA,2BAAyB,KAAK;AAC9B,kCAAgC,SAAS;AAEzC,MAAI,CAAC,mBAAmB,SAAS;AAAG,WAAO;AAE3C,QAAM,cAAc,OAAO,SAAS,YAAY,OAAO,SAAS;AAChE,QAAM,eAAe,CAAC,eAAe,KAAK,aAAa,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS;AAE5F,MAAI,cAAc;AACd,iBAAa,WAAY,KAA6B,SAAS;AAC/D,wBAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,EACzE,OAAO;AACH,QAAI,UAAU,WAAW,kBAAkB,GAAG;AAC1C,0BAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,IACzE,WAAW,UAAU,WAAW,kBAAkB,GAAG;AACjD,0BAAoB,WAAW,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK;AAAA,IAC3E;AAAA,EACJ;AAEA,SAAO;AACX,GAhDwB;AAiDxB,QAAQ,YAAY,QAAQ;AAErB,SAAS,eAAe,WAAmB,MAAc;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,oBAAkB,WAAW,KAAK,OAAO,KAAK,QAAQ,CAAG;AAC7D;AAJgB;AAKhB,QAAQ,kBAAkB,cAAc;AAEjC,SAAS,gBAAgB,WAAmB,MAAsB;AACrE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,sCAAsC;AAGrE,aAAW,WAAW,MAAM;AACxB,UAAM,QAAQ,KAAK,OAAO;AAC1B,mBAAe,WAAW,KAAK;AAAA,EACnC;AACJ;AARgB;AAShB,QAAQ,mBAAmB,eAAe;AAE1C,IAAM,aAAa,wBAAC,QAAgB,OAAO,IAAI,MAAM,GAAlC;AAEZ,SAAS,aAAa,WAAmB,MAAM;AAClD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,mCAAmC;AAElE,cAAY,aAAa;AAEzB,MAAI,CAAC,mBAAmB,SAAS;AAAG;AAEpC,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,cAAc,WAAW,KAAK,WAAW;AAC/C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,YAAY,KAAK;AAEvB,sBAAoB,WAAW,YAAY,aAAa,YAAY,WAAW,YAAY,WAAW,UAAU,SAAS,UAAU,SAAS;AAChJ;AAnBgB;AAoBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,eAAe,WAAmB,MAAM;AACpD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,QAAM,QAAQ,KAAK;AAEnB,MAAI,UAAU,IAAI;AACd,mBAAe,WAAW,KAAK,KAAK;AACpC;AAAA,EACJ;AAEA,QAAM,QAAQ,KAAK;AAGnB,MAAI,KAAK,OAAO,aAAa;AACzB,mBAAe,WAAW,KAAK,WAAW,KAAK,aAAa;AAC5D;AAAA,EACJ;AAEA,oBAAkB,WAAW,OAAO,OAAO,KAAK,iBAAiB,CAAG;AACpE,yBAAuB,WAAW,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW;AACjF;AApBgB;AAqBhB,QAAQ,kBAAkB,cAAc;AAGjC,SAAS,aAAa,MAAM;AAC/B,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AAEnB,aAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,eAAc,GAAG;AACnE,UAAM,aAAa,WAAW;AAC9B,UAAM,QAAQ,WAAW;AAEzB,QAAI,eAAe,cAAc,UAAU,UAAU,GAAG;AACpD,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAC1D,UAAI,oBAAoB,UAAU,UAAU,EAAE,OAAO;AACjD,iCAAyB,KAAK,OAAO,UAAU,UAAU,EAAE,OAAO,GAAG,CAAC;AAAA,MAC1E;AAAA,IACJ,WAAW,eAAe,UAAU,MAAM,UAAU,GAAG;AACnD,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAC9C,UAAI,gBAAgB,MAAM,UAAU,EAAE,OAAO;AACzC,wBAAgB,KAAK,OAAO,MAAM,UAAU,EAAE,OAAO,GAAG,KAAK;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,cAAc,WAAmB,MAAgB;AAC7D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,cAAc,KAAK;AACzB,aAAW,MAAM,WAAW;AACxB,UAAM,WAAW,UAAU,EAAE;AAC7B,gBAAY,WAAW,QAAQ;AAAA,EACnC;AAEA,aAAW,MAAM,OAAO;AACpB,UAAM,OAAO,MAAM,EAAE;AACrB,YAAQ,WAAW,IAAI;AAAA,EAC3B;AAEA,aAAW,MAAM,aAAa;AAC1B,UAAM,UAAU,YAAY,EAAE;AAC9B,mBAAe,WAAW,OAAO;AAAA,EACrC;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,IAAM,aAAa,8BAAO,WAAmB,SAAgB;AAChE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,iCAAiC;AAEhE,MAAI,CAAC;AAAW,WAAO,QAAQ,KAAK,sCAAsC;AAE1E,cAAY,MAAM,SAAS,WAAW,IAAI;AAE1C,QAAM,gBAAgB,KAAK;AAC3B,QAAM,YAAY,KAAK;AAEvB,MAAI;AAAW,iBAAa,WAAW,SAAS;AAEhD,MAAI;AAAe,oBAAgB,WAAW,aAAa;AAC/D,GAb0B;AAc1B,QAAQ,cAAc,UAAU;AAEzB,SAAS,cAAc,WAAmB,MAAiB;AAC9D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,gCAA8B,SAAS;AAEvC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,aAAa,KAAK,CAAC,EAAE;AAC3B,QAAI,YAAY;AACZ,YAAM,aAAa,WAAW,WAAW,GAAG;AAC5C,YAAM,SAAS,WAAW;AAC1B,iCAA2B,WAAW,YAAY,MAAM;AAAA,IAC5D;AAAA,EACJ;AACJ;AAbgB;AAchB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,iBAAiB,WAAmB,MAAkB;AAClE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,KAAK;AACvB,kBAAgB,WAAW,OAAO,SAAS;AAC/C;AANgB;AAOhB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,iBAAiB,WAAmB,MAAmB;AACzE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,MAAI,aAAa,SAAS,GAAG;AACzB,2BAAuB,IAAI;AAC3B;AAAA,EACJ;AACA,QAAM,WAAW,WAAW,IAAI;AAChC,gBAAc,WAAW,IAAI;AAC7B,mBAAiB,WAAW,KAAK,SAAS;AAC1C,gBAAc,WAAW,KAAK,OAAO;AACzC;AAXsB;AAYtB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,uBAAuB,MAAmB;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,6CAA6C;AAE5E,YAAU,YAAY,CAAC;AACvB,QAAM,WAAW,KAAK,IAAI;AAE1B,YAAU,YAAY,CAAC;AACvB,gBAAc,KAAK,IAAI;AACvB,mBAAiB,KAAK,KAAK,SAAS;AACpC,gBAAc,KAAK,KAAK,OAAO;AACnC;AAVsB;AAYtB,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,cAAc,UAAU;AAChC,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,oBAAoB,gBAAgB;;;AChP5C,sDAAoC,OAAO,YAAyB,OAAiB;AACpF,QAAM,uBAAuB,UAAU;AACvC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,kDAAkC,OAAO,YAAyB,OAAiB;AAClF,eAAa,UAAU;AAEvB,QAAM,MAAM,GAAG;AAEf,QAAM,gBAAgB,MAAM,cAAc,GAAG;AAC7C,gBAAc,UAAU,WAAW,WAAW;AAC9C,wBAAsB,uCAAuC,eAAe,GAAG,aAAa;AAE5F,gBAAc,KAAK,cAAc,OAAO;AAExC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,0DAAsC,OAAO,OAAe,OAAiB;AAC5E,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG;AACnD,WAAO,GAAG,CAAC;AAAA,EACZ;AAGA,QAAM,SAAS,MAAM,SAAS,KAAK,IAAI;AAEpC,YAAU,MAAM;AAEnB,QAAM,aAAa,MAAM,cAAc,GAAG;AAE1C,aAAW,UAAU,CAAC;AAEtB,gBAAc,KAAK,CAAC,CAAC;AAErB,KAAG,UAAU;AACd,CAAC;AAED,wEAA6C,OAAO,GAAQ,OAAiB;AAC5E,QAAM,UAAU,cAAc;AAE9B,KAAG,OAAO;AACX,CAAC;AAED,0EAA8C,OAAO,MAAc,OAAiB;AACnF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,sEAA4C,OAAO,MAAc,OAAiB;AACjF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,MAAc,OAAiB;AAC/E,eAAa,KAAK,IAAI;AACtB,KAAG,CAAC;AACL,CAAC;AAED,8DAAwC,OAAO,MAAiB,OAAiB;AAChF,gBAAc,KAAK,IAAI;AACvB,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,OAAO,MAAc,OAAiB;AAC1E,MAAI,UAAU,QAAQ,KAAK,IAAI;AAC/B,KAAG,OAAO;AACX,CAAC;AAED,gEAAyC,OAAO,MAAc,OAAiB;AAC9E,MAAI,UAAU,YAAY,KAAK,IAAI;AACnC,KAAG,OAAO;AACX,CAAC;AAED;AAAA;AAAA,EAAwC,OAAO,MAAmB,OAAiB;AAClF,UAAM,OAAO,gBAAe,KAAK,IAAI;AACrC,QAAI,CAAC;AAAM,aAAO,GAAG,KAAK;AAE1B,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC;AAAS,aAAO,GAAG,KAAK;AAE7B,QAAI,SAAS,QAAQ;AACpB,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAE9C,UAAI,gBAAgB,IAAI;AACvB,gBAAQ,KAAK,OAAO;AACpB,WAAG,KAAK;AACR;AAAA,MACD,OAAO;AACN,qBAAa,KAAK,KAAK;AACvB,WAAG,IAAI;AACP;AAAA,MACD;AAAA,IACD,WAAW,SAAS,YAAY;AAC/B,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAE1D,UAAI,QAAQ,UAAU,KAAK,KAAK;AAC/B,WAAG,KAAK;AACR;AAAA,MACD;AAEA,UAAI,QAAQ,UAAU,iBAAiB;AACtC,iCAAyB,KAAK,OAAO,KAAK,KAAK,GAAG,CAAC;AACnD,YAAI,MAAM;AACT,mBAAQ,IAAE,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC7C,kBAAM,WAAW,KAAK,UAAU,CAAC;AACjC,qCAAyB,KAAK,SAAS,WAAW,SAAS,SAAS,SAAS,SAAS,CAAC;AAAA,UACxF;AAAA,QACD;AACA,WAAG,IAAI;AACP;AAAA,MACD,OAAO;AACN,oBAAY,KAAK,OAAO;AACxB,iBAAQ,IAAE,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,sBAAY,KAAK,SAAS,CAAC,CAAC;AAAA,QAC7B;AACA,WAAG,KAAK;AACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA;AAEA,8DAAwC,OAAO,MAAW,OAAiB;AAC1E,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,EAAC,GAAE,GAAG,OAAiB;AACvE,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,EAAE;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,MAAW,OAAiB;AAC5E,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,IAAI;AACpF,KAAG,MAAM;AACV,CAAC;AAED,4DAAuC,OAAO,QAAqB,OAAiB;AACnF,gBAAc,KAAK,MAAM;AACzB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,EAAE,IAAI,WAAW,GAAG,OAAiB;AACrF,QAAM,eAAe,eAAe;AACpC,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,cAAc,IAAI,UAAU;AAC5G,KAAG,MAAM;AACV,CAAC;AAED,gEAAyC,OAAO,EAAE,GAAG,GAAG,OAAiB;AACxE,QAAM,SAAS,MAAM,sBAAsB,oCAAoC,EAAE;AACjF,KAAG,MAAM;AACV,CAAC;AAED,8DAAwC,OAAO,MAA4C,OAAiB;AAC3G,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,MAAM,qCAAqC,CAAC,WAAwB;AACnE,gBAAc,KAAK,MAAM;AAC1B,CAAC;;;ACrLD,IAAM,SAAS,QAAQ;AACvB,IAAI,SAAS;AACb,IAAI,OAAO;AAEX,IAAI,iBAAiB;AACrB,IAAI,UAAU;AAEd,eAAsB,SAAS,MAAiD,WAAoB,OAAO;AACvG,MAAI,SAAS,QAAQ,MAAM;AACvB;AAAA,EACJ;AAEA,MAAI,YAAY,YAAY;AAC5B,QAAM,cAAc,OAAO,MAAM;AAEjC,QAAM,WAAW,OAAO,SAAS;AAEjC,QAAM,OAAO,WAAW,OAAO,KAAK;AAEpC,QAAM,OAAO,YAAY,IAAI;AAC7B,MAAI,CAAC;AAAM;AAEX,YAAU,SAAS;AAEnB,QAAM,eAAe,eAAe;AACpC,QAAM,OAAO,KAAK;AAClB,MAAI,YAAY,WAAW,QAAQ,KAAK;AAExC,WAAS,aAAa,SAAS;AAE/B,MAAI,UAAU,CAAC;AAEf,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AAAc,cAAU,MAAM,sBAAgC,mCAAmC,YAAY;AAEjH,MAAI,SAAS,CAAC;AAEd,QAAM,iBAAiB,KAAK,SAAS,UAAU;AAC/C,MAAI,gBAAgB;AAChB,aAAS,OAAO,OAAO;AAAA,EAC3B;AAEA,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AACJ,MAAI,cAAc;AACd,cAAU,cAAc;AAAA,EAC5B;AAEA,QAAM,YAAY,aAAa,IAAI;AAEnC,MAAI,UAAU;AACV,UAAM,QAAQ,WAAW,qBAAqB,CAAC;AAC/C,gBAAY,MAAM,SAAS,WAAW,KAAK;AAC3C,YAAQ,uCAAuC;AAC/C,cAAU,IAAI,QAAQ,aAAW;AAC7B,uBAAiB;AAAA,IACrB,CAAC;AAED,cAAU,SAAS;AAAA,EACvB;AAEA,QAAM,aAAa,MAAM,cAAc,SAAS;AAEhD,cAAY;AAEZ,6CAAwB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,QAAQ,MAAM,cAAc,QAAQ;AAAA,EACxC,CAAC;AAED,cAAY,MAAM,IAAI;AACtB,mDAA2B,IAAI;AAE/B,SAAO;AAEP,UAAQ,cAAc,QAAQ,IAAI;AAElC,MAAI,SAAS;AACT,UAAM;AACN,YAAQ,yCAAyC;AAAA,EACrD;AAEA,YAAU;AACV,mBAAiB;AACjB,SAAO;AACX;AArFsB;AAsFtB,QAAQ,YAAY,QAAQ;AAE5B,gBAAgB,cAAc,OAAO,GAAG,SAAmB;AACvD,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACP,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,OAAO;AACH,UAAM,OAAO,KAAK,YAAY;AAC9B,aAAS,IAAI;AAAA,EACjB;AACJ,GAAG,IAAI;AAGP,SAAS,aAAa,MAAgC;AAClD,QAAM,EAAC,YAAY,KAAI,IAAI,OAAO,UAAU;AAE5C,MAAI,OAAO,SAAS;AAAU,WAAO;AAErC,MAAI,CAAC;AAAY,WAAO;AAExB,MAAI,YAAY,EAAC,GAAG,KAAI;AAExB,QAAM,aAAa,cAAc;AAGjC,aAAW,QAAQ,YAAY;AAC3B,UAAM,SAAS,WAAW,IAAI;AAC9B,eAAW,SAAS,QAAQ;AAExB,UAAI,OAAgB;AAEpB,UAAI,QAAQ,UAAU,KAAK,MAAM;AAC7B,eAAO,KAAK,KAAK,SAAS,WAAW,IAAI,IAAI;AAAA,MACjD;AAEA,UAAI,QAAQ,WAAW,KAAK,OAAO;AAC/B,eAAO,KAAK,MAAM,SAAS,WAAW,KAAK,IAAI;AAAA,MACnD;AAEA,UAAI,CAAC,MAAM;AACP,cAAM,iBAAiB,OAAO,KAAK;AACnC,oBAAY,OAAO,OAAO,CAAC,GAAG,WAAW,gBAAgB;AAAA,UACvD,WAAW,OAAO,OAAO,CAAC,GAAG,UAAU,WAAW,eAAe,SAAS;AAAA,QAC5E,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAGX;AAtCS;AAwCF,SAAS,YAAY;AACxB,eAAa,KAAK,MAAM;AAExB,aAAW;AACX,cAAY,OAAO,KAAK;AACxB,mDAA2B,KAAK;AAGhC,UAAQ,cAAc,QAAQ,KAAK;AAEnC,MAAI,gBAAgB;AAChB,mBAAe;AAAA,EACnB;AACA,SAAO;AACX;AAdgB;;;ACtJT,SAAS,WAAW;AACvB,QAAM,yCAAyC,OAAO,YAAyBC,SAAgB;AAC3F,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,0CAA0C,MAAM;AAClD,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,QAAM,qCAAqC,MAAM;AAC7C,aAAS,EAAE,MAAM,WAAW,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EACtD,CAAC;AACL;AAZgB;;;ACAT,SAAS,YAAY;AACxB,MAAI,aAAa;AAEjB,KAAG,4BAA4B,MAAM;AACjC,iBAAa;AAAA,EACjB,CAAC;AAED,KAAG,6BAA6B,MAAM;AAClC,QAAG;AACC,cAAQ,cAAc,gBAAgB;AAAA,EAC9C,CAAC;AAED,QAAM,yBAAyB,OAAO,YAAyBC,SAAgB;AAC3E,QAAI,CAAC,WAAW;AAAO,iBAAW,QAAQ,WAAW,kBAAkB;AACvE,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,uBAAuB,OAAO,OAAY;AAC5C,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,OAAG,UAAU;AAAA,EACjB,CAAC;AAED,QAAM,wBAAwB,OAAO,YAAyB,OAAY;AACtE,UAAM,uBAAuB,UAAU;AACvC,QAAI;AAAI,SAAG;AAAA,EACf,CAAC;AAED,QAAM,6BAA6B,OAAO,aAAkB;AACxD,YAAQ,cAAc,gBAAgB,QAAQ;AAAA,EAClD,CAAC;AACL;AA/BgB;;;ACChB,SAAS,cAAc,MAAc,IAAS;AAC1C,KAAG,sCAAsC,MAAM,CAAC,UAAe;AAC3D,UAAM,EAAE;AAAA,EACZ,CAAC;AACL;AAJS;AAMF,SAAS,iBAAiB;AAC7B,gBAAc,4BAA4B,MAAM;AAC5C,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,gBAAc,eAAe,CAACC,SAAgB;AAC1C,WAAO,eAAeA,IAAG;AAAA,EAC7B,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,UAAM,YAAiB,aAAaA,IAAG,EAAE,CAAC;AAC1C,QAAI,cAAc,CAAC;AACnB,eAAW,MAAM,WAAW;AACxB,YAAM,WAAW,UAAU,EAAE;AAC7B,kBAAY,KAAK;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,UAAU,SAAS;AAAA,QACnB,SAAS,SAAS;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,eAAe,CAACA,SAAgB;AAC1C,UAAM,QAAc,SAASA,IAAG,EAAE,CAAC;AACnC,QAAI,WAAW,CAAC;AAChB,eAAW,MAAM,OAAO;AACpB,YAAM,OAAO,MAAM,EAAE;AACrB,eAAS,KAAK;AAAA,QACV,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAClB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,mBAAmB,CAACA,SAAgB;AAC9C,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,cAAc,CAACA,SAAgB;AAEzC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,WAAO,cAAcA,IAAG;AAAA,EAC5B,CAAC;AAED,gBAAc,kBAAkB,CAAC,UAAkB;AAC/C,cAAU,YAAY,CAAC;AACvB,aAAS,KAAK,KAAK;AAAA,EACvB,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,UAAe;AAE1D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,MAAM;AACtC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,MAAa,YAAiB;AAE/D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,cAAc,OAAOA,MAAa,MAAW,WAAgB;AAEvE,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,kBAAkB,MAAM;AAClC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,aAAkB;AAC7D,UAAM,cAAc;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,IACtB;AACA,gBAAYA,MAAK,WAAW;AAAA,EAChC,CAAC;AAED,gBAAc,oBAAoB,CAACA,MAAa,eAAoB;AAChE,eAAW,aAAa,YAAY;AAChC,YAAM,cAAc;AAAA,QAChB,OAAO,UAAU;AAAA,QACjB,OAAO,UAAU;AAAA,QACjB,SAAS,UAAU;AAAA,MACvB;AACA,kBAAYA,MAAK,WAAW;AAAA,IAChC;AAAA,EACJ,CAAC;AAED,gBAAc,cAAc,CAACA,MAAa,SAAc;AACpD,UAAM,UAAU;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAClB;AACA,YAAQA,MAAK,OAAO;AAAA,EACxB,CAAC;AAED,gBAAc,eAAe,CAACA,MAAa,UAAe;AACtD,eAAW,QAAQ,OAAO;AACtB,YAAM,UAAU;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,MAClB;AACA,cAAQA,MAAK,OAAO;AAAA,IACxB;AAAA,EACJ,CAAC;AAMD,gBAAc,oBAAoB,CAACA,MAAa,eAA4B;AACxE,qBAAiBA,MAAK,UAAU;AAAA,EACpC,CAAC;AAED,gBAAc,iBAAiB,CAACA,MAAa,YAAuB;AAChE,kBAAcA,MAAK,OAAO;AAAA,EAC9B,CAAC;AACL;AA1IgB;;;ACJhB,QAAQ,0BAA0B,OAAO,eAAqC;AAC1E,MAAI;AAEJ,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AAC/C,UAAM,cAAsB,cAAc,MAAM,eAAe;AAC/D,yBAAqB,MAAM,sBAAmC,sCAAsC,WAAW;AAAA,EACnH,WAAW,OAAO,eAAe;AAAU,yBAAqB;AAEhE,MAAI,CAAC,oBAAoB;AACrB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AAEA,QAAM,uBAAuB,kBAAkB;AACnD,CAAC;AAED,QAAQ,0BAA0B,OAAO,gBAAwB;AAC7D,gBAAc,eAAe,MAAM,eAAe;AAClD,SAAO,MAAM,sBAAmC,sCAAsC,WAAW;AACrG,CAAC;AAED,QAAQ,mBAAmB,OAAO,OAAkB;AAEhD,QAAM,SAAS,EAAE,MAAM,cAAc,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI;AACjE,MAAI;AAAI,OAAG;AACf,CAAC;AAED,GAAG,gCAAgC,CAAC,SAA0B;AAC1D,WAAS,IAAI;AACjB,CAAC;AAED,MAAM,iCAAiC,YAAY;AAC/C,SAAO,CAAC,UAAU,KAAK,EAAE,aAAa,GAAG;AACrC,UAAM,MAAM,GAAG;AAAA,EACnB;AACA,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAC3C,CAAC;AAED,MAAM,mBAAmB,OAAO,aAAqB;AACjD,MAAI,aAAa,uBAAuB,KAAK,UAAU,KAAK,EAAE,aAAa,GAAG;AAC1E,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,QAAI,CAAC;AAAY;AACjB,UAAM,uBAAuB,UAAU;AAAA,EAC3C;AACJ,CAAC;AAED,IAAM,gBAAgB,UAAU,aAAa,MAAM;AACnD,IAAM,OAAO,OAAO,UAAU,gBAAgB,IAAI,CAAC;AAEnD,IAAI,QAAQ,QAAQ,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AAC/E,WAAS;AACb,WAAW,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AACtE,YAAU;AACd;AAEA,eAAe;AAEf,gBAAgB,cAAc,YAAY;AACtC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,YAAY,mBAAmB,GAAG;AACxC,QAAM,QAAQ,aAAa,GAAG;AAE9B,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAEvC,kBAAgB,KAAK,SAAS;AAC9B,QAAM,GAAI;AACV,kBAAgB,KAAK,MAAM;AAC3B,eAAa,KAAK,KAAK;AAC3B,GAAG,KAAK;", + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = pedHandle == PlayerPedId() ? await getTattoos() : []\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nexport function setFaceFeatures(pedHandle: number, data: THeadStructure) {\r\n if (!data) return console.warn('No data provided for setFaceFeatures')\r\n \r\n\r\n for (const feature in data) {\r\n const value = data[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetFaceFeatures', setFaceFeatures);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) setFaceFeatures(pedHandle, headStructure)\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "mappings": ";;;;AAAO,IAAI,MAAM;AAEV,IAAM,YAAY,wBAAC,cAAsB;AAC5C,QAAM;AACV,GAFyB;AAalB,IAAM,eAAe,wBAAC,QAAgB,SAAc;AACvD,iBAAe;AAAA,IACX;AAAA,IACA;AAAA,EACJ,CAAC;AACL,GAL4B;AAOrB,IAAM,QAAQ,wBAAC,OAAe,IAAI,QAAQ,SAAO,WAAW,KAAK,EAAE,CAAC,GAAtD;AAEd,IAAM,eAAe,8BAAO,UAA4C;AAC3E,MAAI,YAAoB,OAAO,UAAU,WAAW,QAAQ,WAAW,KAAK;AAE5E,MAAI,CAAC,aAAa,SAAS,KAAK,CAAC,iBAAiB,SAAS,GAAG;AAO1D,YAAQ,KAAK,oCAAoC,KAAK,GAAG;AACzD,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,SAAS;AAAG,WAAO;AAEtC,eAAa,SAAS;AAEtB,QAAM,qBAAqB,6BAAqB;AAC5C,WAAO,IAAI,QAAQ,aAAW;AAC1B,YAAM,WAAW,YAAY,MAAM;AAC/B,YAAI,eAAe,SAAS,GAAG;AAC3B,wBAAc,QAAQ;AACtB,kBAAQ;AAAA,QACZ;AAAA,MACJ,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL,GAT2B;AAW3B,QAAM,mBAAmB;AAEzB,SAAO;AACX,GAhC4B;AAsC5B,IAAM,eAAe,uBAAuB;AAC5C,IAAM,cAAsC,CAAC;AAC7C,IAAM,eAAyD,CAAC;AAEhE,SAAS,WAAW,WAAmBA,QAAsB;AACzD,MAAIA,UAASA,SAAQ,GAAG;AACpB,UAAM,cAAc,aAAa;AAEjC,SAAK,YAAY,SAAS,KAAK,KAAK;AAAa,aAAO;AAExD,gBAAY,SAAS,IAAI,cAAcA;AAAA,EAC3C;AAEA,SAAO;AACX;AAVS;AAYT,MAAM,UAAU,YAAY,IAAI,CAAC,QAAgB,SAAc;AAC3D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,WAAW,QAAQ,GAAG,IAAI;AACrC,CAAC;AAEM,SAAS,sBACZ,cAAsB,MACL;AACjB,MAAI,CAAC,WAAW,WAAW,CAAC,GAAG;AAC3B;AAAA,EACJ;AAEA,MAAI;AAEJ,KAAG;AACC,UAAM,GAAG,SAAS,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,MAAS,EAAE,CAAC;AAAA,EAClE,SAAS,aAAa,GAAG;AACzB,UAAQ,UAAU,SAAS,IAAI,cAAc,KAAK,GAAG,IAAI;AAEzD,SAAO,IAAI,QAAW,CAAC,YAAY;AAC/B,iBAAa,GAAG,IAAI;AAAA,EACxB,CAAC;AACL;AAjBgB;AAmBT,SAAS,iBAAiB,WAAW,IAAI;AAC5C,QAAM,UAAU,SAAS,IAAI,OAAO,UAAU,QAAQ,SAAS;AAC3D,QAAI;AACJ,QAAI;AACA,iBAAW,MAAM,GAAG,GAAG,IAAI;AAAA,IAC/B,SACO,GAAG;AACN,cAAQ,MAAM,mDAAmD,SAAS,EAAE;AAC5E,cAAQ,IAAI,KAAK,EAAE,KAAK,IAAI;AAAA,IAChC;AACA,YAAQ,UAAU,QAAQ,IAAI,KAAK,QAAQ;AAAA,EAC/C,CAAC;AACL;AAZgB;AAgBT,IAAM,gBAAgB,wBAAC,oBAA4B;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,UAAM,oBAAoB,6BAAM;AAC5B,UAAI,uBAAuB,eAAe,GAAG;AACzC,cAAM,aAAa,QAAQ,cAAc,OAAO,EAAE;AAClD,YAAI,oBAAoB,iBAAiB,cAAc,UAAU,UAAU,OAAO;AAClF,YAAI,CAAC,mBAAmB;AACpB,kBAAQ,MAAM,GAAG,UAAU,qEAAqE;AAChG,8BAAoB,iBAAiB,cAAc,gBAAgB;AAAA,QACvE;AACA,gBAAQ,iBAAiB;AAAA,MAC7B,OAAO;AACH,mBAAW,mBAAmB,GAAG;AAAA,MACrC;AAAA,IACJ,GAZ0B;AAa1B,sBAAkB;AAAA,EACtB,CAAC;AACL,GAjB6B;AA2BtB,IAAM,YAAY,QAAQ;AAE1B,IAAM,gBAAgB,6BAAM;AAC/B,SAAO,UAAU,KAAK,EAAE,cAAc;AAC1C,GAF6B;AAItB,IAAM,iBAAiB,6BAAM;AAChC,QAAM,KAAK,cAAc,EAAE;AAC3B,SAAO;AACX,GAH8B;AAKvB,IAAM,uBAAuB,6BAAM;AACtC,QAAM,SAAS,cAAc,EAAE;AAC/B,SAAO,WAAW,SAAS,qBAAqB;AACpD,GAHoC;AAK7B,SAAS,MAAM,IAA2B;AAC7C,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACzD;AAFgB;AAIT,SAAS,OAAO,KAAqB;AACxC,MAAI,CAAC,IAAI,SAAS,GAAG;AAAG,WAAO;AAC/B,SAAO,IAAI,QAAQ,MAAM,EAAE;AAC/B;AAHgB;AAKT,SAAS,aAAuD;AACnE,QAAM,MAAM,cAAc,EAAE;AAC5B,SAAO,MAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI;AAC1D;AAHgB;AAKT,SAAS,mBAAmBC,MAAa;AAC5C,QAAM,QAAQ,eAAeA,IAAG;AAChC,SAAO,UAAU,WAAW,kBAAkB,KAAK,UAAU,WAAW,kBAAkB;AAC9F;AAHgB;;;AC3KhB,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAE7B,IAAI,UAAmB;AACvB,IAAI,cAAsB;AAC1B,IAAI,MAAqB;AACzB,IAAI,SAAiB;AACrB,IAAI,SAAiB;AACrB,IAAI,eAA+B;AACnC,IAAI,SAAwB;AAC5B,IAAI,cAAuB;AAE3B,IAAI,cAAkC;AAEtC,IAAM,cAA4B;AAAA,EAC9B,OAAO;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,CAAC,OAAO,KAAK;AAAA,EAChB,OAAO,CAAC,OAAO,KAAK;AACxB;AAEA,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,MAAM,wBAAC,YAA4B;AACxC,SAAO,KAAK,IAAK,UAAU,KAAK,KAAM,GAAG;AAC1C,GAFY;AAIZ,IAAM,YAAY,6BAAgB;AACjC,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,KACH,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAC3D;AACD,QAAM,IAAI,IAAI,MAAM,IAAI;AAExB,SAAO,CAAC,GAAG,GAAG,CAAC;AAChB,GAVkB;AAYlB,IAAM,iBAAiB,wBAAC,QAAiB,WAA0B;AAClE,MAAI,CAAC,WAAW,CAAC,gBAAgB;AAAa;AAE9C,WAAS,UAAU;AACnB,WAAS,UAAU;AAEnB,YAAU;AACV,YAAU;AAEP,QAAM,gBAAgB,gBAAgB,WAAW,gBAAgB;AACjE,QAAM,WAAW,gBAAgB,KAAO;AAExC,QAAM,UAAU,gBAAgB;AAChC,QAAM,WAAW,UAAU,IAAM;AAEpC,WAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ;AAEtD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B;AAAA,IACC;AAAA,IACA,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,EAClB;AACA,kBAAgB,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AACpE,GA1BuB;AA4BvB,IAAM,aAAa,8BAAO,QAAiB,aAAsB;AAChE,QAAM,UAAkB,iBAAiB,GAAG,IAAI;AAChD,aAAW,YAAY;AAEvB,gBAAc;AACd,gBAAc;AACd,WAAS;AAET,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;AAE5B,QAAM,SAAiB;AAAA,IACtB;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,iBAAe;AACf,gBAAc;AACd,WAAS;AACT,QAAM;AAEN,kBAAgB,QAAQ,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,yBAAuB,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAEhD,QAAM,MAAM,GAAG;AAEf,0BAAwB,QAAQ,IAAI;AACpC,gBAAc,QAAQ,GAAG;AACzB,eAAa,QAAQ,GAAG;AACxB,oBAAkB,QAAQ,GAAG;AAC7B,WAAS,MAAM;AAEf,aAAW,QAAQ,IAAI;AACxB,GAxCmB;AA0CnB,IAAM,WAAW,wBAAC,eAAuB;AACxC,MAAI,EAAE,aAAa,GAAG,KAAK,cAAc;AAAM;AAC/C,cAAY;AACZ,aAAW,UAAU,CAAC;AACvB,GAJiB;AAMV,IAAM,cAAc,6BAAM;AAChC,MAAI;AAAS;AACb,YAAU;AACV,gBAAc;AACd,QAAM,UAAU,2BAA2B,IAAI;AAC/C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,OAAO,GAAK,GAAK,CAAG;AACtE,cAAY,KAAK,GAAG,GAAG,CAAC;AACxB,mBAAiB,MAAM,MAAM,KAAM,MAAM,IAAI;AAE1C,YAAU,SAAS,WAAW;AAClC,GAV2B;AAYpB,IAAM,aAAa,6BAAY;AACrC,MAAI,CAAC;AAAS;AACd,YAAU;AAEV,mBAAiB,OAAO,MAAM,KAAK,MAAM,KAAK;AAC9C,aAAW,KAAK,IAAI;AACpB,QAAM;AACN,iBAAe;AAChB,GAR0B;AAU1B,IAAM,YAAY,wBAAC,MAA2B,WAAW,gBAAsB;AAE9E,QAAM,OAAsC,YAAY,IAAI;AAEzD,QAAM,cAAc,MAAM,QAAQ,IAAI;AAEtC,gBAAc;AAEd,MAAI,CAAC,eAAe,SAAS,GAAG;AAC5B,UAAM,CAACC,IAAGC,IAAGC,EAAC,IAAc,gBAAgB,KAAK,KAAK;AACtD;AAAA,MACI;AAAA,QACI,GAAGF;AAAA,QACH,GAAGC;AAAA,QACH,GAAGC,KAAI;AAAA,MACX;AAAA,MACA;AAAA,IACJ;AACA;AAAA,EACJ;AAGA,MAAI,WAAW;AAAsB,eAAW;AAEhD,MAAI,aAAa;AACb,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAE3E,UAAM,CAAC,IAAI,IAAI,EAAE,IAAc,iBAAiB,KAAK,KAAK,CAAC,GAAG,GAAK,GAAK,CAAG;AAG3E,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK,MAAM;AAAA,EACxB,OAAO;AACH,QAAI,CAAC,GAAG,GAAG,CAAC,IAAc,iBAAiB,KAAK,MAAM,GAAK,GAAK,CAAG;AAAA,EACvE;AAEH;AAAA,IACC;AAAA,MACC;AAAA,MACA;AAAA,MACA,GAAG,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACD;AAED,GA9CkB;AAgDlB,wDAAqC,CAAC,MAAM,OAAO;AAC/C,iBAAe,KAAK,GAAG,KAAK,CAAC;AAC7B,KAAG,CAAC;AACR,CAAC;AAID,8DAAwC,CAAC,MAAgB,OAAiB;AACzE,UAAQ,MAAM;AAAA,IACP,KAAK;AACD,gBAAU,SAAS,uBAAuB;AAC1C;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB;AAAA,IACJ,KAAK;AACD,gBAAU,MAAM;AAChB;AAAA,IACJ,KAAK;AACD,gBAAU,OAAO;AACjB,qBAAe;AACf;AAAA,EACX;AACA,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,CAAC,MAAM,OAAO;AAClD,MAAI,SAAS,QAAQ;AAEd,UAAM,UAAU,gBAAgB,UAAU,0BAA0B;AAE1E,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,UAAU,UAAU;AAAA,EAClD,WAAW,SAAS,MAAM;AACzB,UAAM,cAAsB,cAAc;AAC1C,kBAAc,eAAe,MAAM,MAAM;AAAA,EAC1C;AAEA,gBAAc;AACd,iBAAe;AACf,KAAG,CAAC;AACL,CAAC;;;AC5OD,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACfA,IAAO,eAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACrBA,IAAO,oBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACbA,IAAO,gBAAQ;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACDO,SAAS,eAAe,QAAgB;AAC3C,QAAMC,UAAS,QAAQ;AACvB,QAAM,SAASA,QAAO,OAAO;AAE7B,SAAO,OAAO,UAAU,CAAC,UAAkB,WAAW,KAAK,MAAM,MAAM;AAC3E;AALgB;AAOT,SAAS,QAAQ,WAA8B;AAClD,SAAO;AAAA,IACH,OAAO,gBAAgB,SAAS;AAAA,IAChC,WAAW,yBAAyB,SAAS;AAAA,EACjD;AACJ;AALgB;AAMhB,QAAQ,WAAW,OAAO;AAEnB,SAAS,iBAAiB,WAAmB;AAEhD,QAAM,SAAS,IAAI,YAAY,EAAE;AACjC,SAAO,QAAQ,aAAa,sBAAsB,WAAW,IAAI,YAAY,MAAM,CAAC;AAEpF,QAAM,EAAE,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI,YAAY,MAAM;AAC1I,QAAM,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,IAAI,IAAI,aAAa,QAAQ,EAAE;AAW5E,SAAO;AAAA,IACH;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA;AAAA,IAEA,WAAW,QAAQ,SAAS;AAAA,EAChC;AACJ;AAjCgB;AAkChB,QAAQ,gBAAgB,gBAAgB;AAEjC,SAAS,eAAe,WAAmB;AAC9C,MAAI,SAA4B,CAAC;AACjC,MAAI,WAAyB,CAAC;AAE9B,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,WAAO,OAAO,IAAI,wBAAwB,CAAC;AAE3C,QAAI,YAAY,YAAY;AACxB,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,eAAe,SAAS;AAAA,MAC1C;AAAA,IACJ,OAAO;AACH,YAAM,CAAC,GAAG,cAAc,YAAY,YAAY,aAAa,cAAc,IAAI,sBAAsB,WAAW,CAAC;AACjH,eAAS,OAAO,IAAI;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,cAAc,iBAAiB,MAAM,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,CAAC,UAAU,MAAM;AAC5B;AA7BgB;AA8BhB,QAAQ,kBAAkB,cAAc;AAEjC,SAAS,iBAAiB,WAAmB;AAChD,QAAM,WAAW,eAAe,SAAS;AAEzC,MAAI,aAAa,WAAW,kBAAkB,KAAK,aAAa,WAAW,kBAAkB;AAAG;AAEhG,MAAI,aAAa,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,aAAc,QAAQ,KAAK;AAC3C,UAAM,UAAU,aAAc,CAAC;AAC/B,eAAW,OAAO,IAAI;AAAA,MAClB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,kBAAkB,WAAW,CAAC;AAAA,IACzC;AAAA,EACJ;AAEA,SAAO;AACX;AAhBgB;AAiBhB,QAAQ,oBAAoB,gBAAgB;AAErC,SAAS,aAAa,WAAmB;AAC5C,MAAI,YAAY,CAAC;AACjB,MAAI,iBAAiB,CAAC;AAEtB,WAAS,IAAI,GAAG,IAAI,kBAAe,QAAQ,KAAK;AAC5C,UAAM,OAAO,kBAAe,CAAC;AAC7B,UAAM,UAAU,wBAAwB,WAAW,CAAC;AAEpD,mBAAe,IAAI,IAAI;AAAA,MACnB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,iCAAiC,WAAW,CAAC;AAAA,MACpD,UAAU,gCAAgC,WAAW,GAAG,OAAO;AAAA,IACnE;AACA,cAAU,IAAI,IAAI;AAAA,MACd,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,wBAAwB,WAAW,CAAC;AAAA,MAC3C,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,WAAW,cAAc;AACrC;AAvBgB;AAwBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,SAAS,WAAmB;AACxC,MAAI,QAAQ,CAAC;AACb,MAAI,aAAa,CAAC;AAElB,WAAS,IAAI,GAAG,IAAI,cAAW,QAAQ,KAAK;AACxC,UAAM,OAAO,cAAW,CAAC;AACzB,UAAM,UAAU,gBAAgB,WAAW,CAAC;AAE5C,eAAW,IAAI,IAAI;AAAA,MACf,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,qCAAqC,WAAW,CAAC;AAAA,MACxD,UAAU,oCAAoC,WAAW,GAAG,OAAO;AAAA,IACvE;AAEA,UAAM,IAAI,IAAI;AAAA,MACV,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,gBAAgB,WAAW,CAAC;AAAA,MACnC,SAAS,uBAAuB,WAAW,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,CAAC,OAAO,UAAU;AAC7B;AAxBgB;AAyBhB,QAAQ,YAAY,QAAQ;AAG5B,eAAsB,cAAc,WAAyC;AACzE,QAAM,CAAC,UAAU,MAAM,IAAI,eAAe,SAAS;AACnD,QAAM,CAAC,WAAW,SAAS,IAAI,aAAa,SAAS;AACrD,QAAM,CAAC,OAAO,SAAS,IAAI,SAAS,SAAS;AAC7C,QAAM,QAAQ,eAAe,SAAS;AACtC,QAAM,UAAU,aAAa,YAAY,IAAI,MAAM,WAAW,IAAI,CAAC;AAEnE,SAAO;AAAA,IACH,YAAY,eAAe,KAAK;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ,SAAS;AAAA,IAC5B,WAAW,iBAAiB,SAAS;AAAA,IACrC,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,eAAe,iBAAiB,SAAS;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AArBsB;AAsBtB,QAAQ,iBAAiB,aAAa;AACtC,iBAAiB,sCAAsC,MAAM;AACzD,YAAU,YAAY,CAAC;AACvB,SAAO,cAAc,GAAG;AAC5B,CAAC;AAEM,SAAS,cAAc,WAA6B;AACvD,QAAM,CAAC,SAAS,IAAI,aAAa,SAAS;AAC1C,QAAM,CAAC,KAAK,IAAI,SAAS,SAAS;AAClC,QAAM,CAAC,QAAQ,IAAI,eAAe,SAAS;AAE3C,SAAO;AAAA,IACH,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACJ;AACJ;AAVgB;AAWhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,WAAW,WAA0B;AACjD,SAAO;AAAA,IACH,WAAW,iBAAiB,SAAS;AAAA,IACrC,eAAe,iBAAiB,SAAS;AAAA,IACzC,WAAW,QAAQ,SAAS;AAAA,IAC5B,OAAO,eAAe,SAAS;AAAA,EACnC;AACJ;AAPgB;AAQhB,QAAQ,cAAc,UAAU;AAEzB,SAAS,gBAAgB;AAC5B,MAAI,cAAc,CAAC;AAEnB,QAAM,CAAC,aAAa,iBAAiB,IAAI,QAAQ,cAAc,QAAQ;AACvE,WAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AAC/C,UAAM,WAAW,kBAAkB,CAAC;AACpC,UAAM,OAAO,SAAS;AACtB,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS;AACvB,gBAAY,KAAK,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,IACX;AAEA,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,YAAM,UAAU,YAAY,CAAC;AAC7B,kBAAY,KAAK,EAAE,KAAK,KAAK;AAAA,QACzB,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,WAAW,eAAe,GAAG,MAAM,WAAW,kBAAkB;AAEtE,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,UAAM,UAAU,WAAW,GAAG;AAC9B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,aAAa,QAAQ,CAAC;AAC5B,UAAI,SAAS;AAEb,YAAM,cAAc,WAAW,YAAY;AAC3C,YAAM,iBAAiB,YAAY,SAAS,IAAI;AAChD,UAAI,kBAAkB,UAAU;AAC5B,iBAAS;AAAA,MACb,WAAW,CAAC,kBAAkB,CAAC,UAAU;AACrC,iBAAS;AAAA,MACb;AAEA,UAAI,OAAO;AACX,UAAI,OAAO;AAEX,UAAI,QAAQ;AACR,eAAO,WAAW,MAAM;AACxB,eAAO,+BAA+B,SAAS,IAAI;AAAA,MACvD;AAEA,UAAI,SAAS,MAAM,MAAM;AACrB,cAAM,cAAc,YAAY,IAAI,EAAE,KAAK,CAAC,EAAE;AAE9C,oBAAY,KAAK;AAAA,UACb,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAlEgB;AAoEhB,eAAsB,aAAiC;AACnD,SAAO,MAAM,sBAAsB,iCAAiC,KAAK,CAAC;AAC9E;AAFsB;AAGtB,QAAQ,cAAc,UAAU;AAGhC,iBAAiB,gDAAgD,CAAC,SAAoC;AAClG,MAAI,KAAK,SAAS;AAAS,YAAQ,kBAAkB,EAAE,oBAAoB,KAAK,IAAI;AACpF,MAAI,KAAK,SAAS;AAAY,YAAQ,qBAAqB,EAAE,oBAAoB,KAAK,IAAI;AAC9F,CAAC;;;ACpSD,IAAO,kBAAQ;AAAA,EACX,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,MAC1D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,MACF,WAAW;AAAA,QACP,EAAE,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,SAAS;AAAA,QACtD,EAAE,WAAW,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,UAAU;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AACJ;;;AC9CO,SAAS,YAAY,WAAmB,MAAc;AACzD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,kCAAkC;AAEjE,2BAAyB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC;AAC3E,SAAO,gCAAgC,WAAW,KAAK,OAAO,KAAK,KAAK;AAC5E;AALgB;AAMhB,QAAQ,eAAe,WAAW;AAE3B,SAAS,QAAQ,WAAmB,MAAc;AACrD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,8BAA8B;AAE7D,MAAI,KAAK,UAAU,IAAI;AACnB,iBAAa,WAAW,KAAK,KAAK;AAClC;AAAA,EACJ;AAEA,kBAAgB,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK;AACtE,SAAO,oCAAoC,WAAW,KAAK,OAAO,KAAK,KAAK;AAChF;AAVgB;AAWhB,QAAQ,WAAW,OAAO;AAE1B,IAAM,cAAc,WAAW,kBAAkB;AAE1C,IAAM,WAAW,8BAAO,WAAmB,SAAiE;AAC/G,MAAI,QAAQ,QAAQ,SAAS,QAAW;AACpC,YAAQ,KAAK,+BAA+B;AAC5C,WAAO;AAAA,EACX;AAEA,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC1B,YAAQ,WAAW,IAAI;AAAA,EAC3B,WAAW,OAAO,SAAS,UAAU;AACjC,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ,KAAK,SAAS;AAAA,EAC1B;AAEA,MAAI,UAAU;AAAG,WAAO;AAExB,QAAM,aAAa,KAAK;AAExB,QAAM,WAAW,aAAa,SAAS;AACvC,MAAI,UAAU;AACV,mBAAe,SAAS,GAAG,KAAK;AAChC,gBAAY,YAAY;AACxB,cAAU,SAAS;AAAA,EACvB,OAAO;AACH,mBAAe,WAAW,KAAK;AAAA,EACnC;AAEA,2BAAyB,KAAK;AAC9B,kCAAgC,SAAS;AAEzC,MAAI,CAAC,mBAAmB,SAAS;AAAG,WAAO;AAE3C,QAAM,cAAc,OAAO,SAAS,YAAY,OAAO,SAAS;AAChE,QAAM,eAAe,CAAC,eAAe,KAAK,aAAa,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS;AAE5F,MAAI,cAAc;AACd,iBAAa,WAAY,KAA6B,SAAS;AAC/D,wBAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,EACzE,OAAO;AACH,QAAI,UAAU,WAAW,kBAAkB,GAAG;AAC1C,0BAAoB,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAK,GAAK,GAAK,KAAK;AAAA,IACzE,WAAW,UAAU,WAAW,kBAAkB,GAAG;AACjD,0BAAoB,WAAW,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK;AAAA,IAC3E;AAAA,EACJ;AAEA,SAAO;AACX,GAhDwB;AAiDxB,QAAQ,YAAY,QAAQ;AAErB,SAAS,eAAe,WAAmB,MAAc;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,oBAAkB,WAAW,KAAK,OAAO,KAAK,QAAQ,CAAG;AAC7D;AAJgB;AAKhB,QAAQ,kBAAkB,cAAc;AAEjC,SAAS,gBAAgB,WAAmB,MAAsB;AACrE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,sCAAsC;AAGrE,aAAW,WAAW,MAAM;AACxB,UAAM,QAAQ,KAAK,OAAO;AAC1B,mBAAe,WAAW,KAAK;AAAA,EACnC;AACJ;AARgB;AAShB,QAAQ,mBAAmB,eAAe;AAE1C,IAAM,aAAa,wBAAC,QAAgB,OAAO,IAAI,MAAM,GAAlC;AAEZ,SAAS,aAAa,WAAmB,MAAM;AAClD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,mCAAmC;AAElE,cAAY,aAAa;AAEzB,MAAI,CAAC,mBAAmB,SAAS;AAAG;AAEpC,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,cAAc,WAAW,KAAK,WAAW;AAC/C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,YAAY,KAAK;AAEvB,sBAAoB,WAAW,YAAY,aAAa,YAAY,WAAW,YAAY,WAAW,UAAU,SAAS,UAAU,SAAS;AAChJ;AAnBgB;AAoBhB,QAAQ,gBAAgB,YAAY;AAE7B,SAAS,eAAe,WAAmB,MAAM;AACpD,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,qCAAqC;AAEpE,QAAM,QAAQ,KAAK;AAEnB,MAAI,UAAU,IAAI;AACd,mBAAe,WAAW,KAAK,KAAK;AACpC;AAAA,EACJ;AAEA,QAAM,QAAQ,KAAK;AAGnB,MAAI,KAAK,OAAO,aAAa;AACzB,mBAAe,WAAW,KAAK,WAAW,KAAK,aAAa;AAC5D;AAAA,EACJ;AAEA,oBAAkB,WAAW,OAAO,OAAO,KAAK,iBAAiB,CAAG;AACpE,yBAAuB,WAAW,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW;AACjF;AApBgB;AAqBhB,QAAQ,kBAAkB,cAAc;AAGjC,SAAS,aAAa,MAAM;AAC/B,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AAEnB,aAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,eAAc,GAAG;AACnE,UAAM,aAAa,WAAW;AAC9B,UAAM,QAAQ,WAAW;AAEzB,QAAI,eAAe,cAAc,UAAU,UAAU,GAAG;AACpD,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAC1D,UAAI,oBAAoB,UAAU,UAAU,EAAE,OAAO;AACjD,iCAAyB,KAAK,OAAO,UAAU,UAAU,EAAE,OAAO,GAAG,CAAC;AAAA,MAC1E;AAAA,IACJ,WAAW,eAAe,UAAU,MAAM,UAAU,GAAG;AACnD,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAC9C,UAAI,gBAAgB,MAAM,UAAU,EAAE,OAAO;AACzC,wBAAgB,KAAK,OAAO,MAAM,UAAU,EAAE,OAAO,GAAG,KAAK;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,cAAc,WAAmB,MAAgB;AAC7D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,cAAc,KAAK;AACzB,aAAW,MAAM,WAAW;AACxB,UAAM,WAAW,UAAU,EAAE;AAC7B,gBAAY,WAAW,QAAQ;AAAA,EACnC;AAEA,aAAW,MAAM,OAAO;AACpB,UAAM,OAAO,MAAM,EAAE;AACrB,YAAQ,WAAW,IAAI;AAAA,EAC3B;AAEA,aAAW,MAAM,aAAa;AAC1B,UAAM,UAAU,YAAY,EAAE;AAC9B,mBAAe,WAAW,OAAO;AAAA,EACrC;AACJ;AApBgB;AAqBhB,QAAQ,iBAAiB,aAAa;AAE/B,IAAM,aAAa,8BAAO,WAAmB,SAAgB;AAChE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,iCAAiC;AAEhE,MAAI,CAAC;AAAW,WAAO,QAAQ,KAAK,sCAAsC;AAE1E,cAAY,MAAM,SAAS,WAAW,IAAI;AAE1C,QAAM,gBAAgB,KAAK;AAC3B,QAAM,YAAY,KAAK;AAEvB,MAAI;AAAW,iBAAa,WAAW,SAAS;AAEhD,MAAI;AAAe,oBAAgB,WAAW,aAAa;AAC/D,GAb0B;AAc1B,QAAQ,cAAc,UAAU;AAEzB,SAAS,cAAc,WAAmB,MAAiB;AAC9D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,oCAAoC;AAEnE,gCAA8B,SAAS;AAEvC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,aAAa,KAAK,CAAC,EAAE;AAC3B,QAAI,YAAY;AACZ,YAAM,aAAa,WAAW,WAAW,GAAG;AAC5C,YAAM,SAAS,WAAW;AAC1B,iCAA2B,WAAW,YAAY,MAAM;AAAA,IAC5D;AAAA,EACJ;AACJ;AAbgB;AAchB,QAAQ,iBAAiB,aAAa;AAE/B,SAAS,iBAAiB,WAAmB,MAAkB;AAClE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,KAAK;AACvB,kBAAgB,WAAW,OAAO,SAAS;AAC/C;AANgB;AAOhB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,iBAAiB,WAAmB,MAAmB;AACzE,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,uCAAuC;AAEtE,MAAI,aAAa,SAAS,GAAG;AACzB,2BAAuB,IAAI;AAC3B;AAAA,EACJ;AACA,QAAM,WAAW,WAAW,IAAI;AAChC,gBAAc,WAAW,IAAI;AAC7B,mBAAiB,WAAW,KAAK,SAAS;AAC1C,gBAAc,WAAW,KAAK,OAAO;AACzC;AAXsB;AAYtB,QAAQ,oBAAoB,gBAAgB;AAE5C,eAAsB,uBAAuB,MAAmB;AAC5D,MAAI,CAAC;AAAM,WAAO,QAAQ,KAAK,6CAA6C;AAE5E,YAAU,YAAY,CAAC;AACvB,QAAM,WAAW,KAAK,IAAI;AAE1B,YAAU,YAAY,CAAC;AACvB,gBAAc,KAAK,IAAI;AACvB,mBAAiB,KAAK,KAAK,SAAS;AACpC,gBAAc,KAAK,KAAK,OAAO;AACnC;AAVsB;AAYtB,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,cAAc,UAAU;AAChC,QAAQ,iBAAiB,aAAa;AACtC,QAAQ,oBAAoB,gBAAgB;;;AChP5C,sDAAoC,OAAO,YAAyB,OAAiB;AACpF,QAAM,uBAAuB,UAAU;AACvC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,kDAAkC,OAAO,YAAyB,OAAiB;AAClF,eAAa,UAAU;AAEvB,QAAM,MAAM,GAAG;AAEf,QAAM,gBAAgB,MAAM,cAAc,GAAG;AAC7C,gBAAc,UAAU,WAAW,WAAW;AAC9C,wBAAsB,uCAAuC,eAAe,GAAG,aAAa;AAE5F,gBAAc,KAAK,cAAc,OAAO;AAExC,YAAU;AACV,KAAG,CAAC;AACL,CAAC;AAED,0DAAsC,OAAO,OAAe,OAAiB;AAC5E,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG;AACnD,WAAO,GAAG,CAAC;AAAA,EACZ;AAGA,QAAM,SAAS,MAAM,SAAS,KAAK,IAAI;AAEpC,YAAU,MAAM;AAEnB,QAAM,aAAa,MAAM,cAAc,GAAG;AAE1C,aAAW,UAAU,CAAC;AAEtB,gBAAc,KAAK,CAAC,CAAC;AAErB,KAAG,UAAU;AACd,CAAC;AAED,wEAA6C,OAAO,GAAQ,OAAiB;AAC5E,QAAM,UAAU,cAAc;AAE9B,KAAG,OAAO;AACX,CAAC;AAED,0EAA8C,OAAO,MAAc,OAAiB;AACnF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,sEAA4C,OAAO,MAAc,OAAiB;AACjF,iBAAe,KAAK,IAAI;AACxB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,MAAc,OAAiB;AAC/E,eAAa,KAAK,IAAI;AACtB,KAAG,CAAC;AACL,CAAC;AAED,8DAAwC,OAAO,MAAiB,OAAiB;AAChF,gBAAc,KAAK,IAAI;AACvB,KAAG,CAAC;AACL,CAAC;AAED,wDAAqC,OAAO,MAAc,OAAiB;AAC1E,MAAI,UAAU,QAAQ,KAAK,IAAI;AAC/B,KAAG,OAAO;AACX,CAAC;AAED,gEAAyC,OAAO,MAAc,OAAiB;AAC9E,MAAI,UAAU,YAAY,KAAK,IAAI;AACnC,KAAG,OAAO;AACX,CAAC;AAED;AAAA;AAAA,EAAwC,OAAO,MAAmB,OAAiB;AAClF,UAAM,OAAO,gBAAe,KAAK,IAAI;AACrC,QAAI,CAAC;AAAM,aAAO,GAAG,KAAK;AAE1B,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC;AAAS,aAAO,GAAG,KAAK;AAE7B,QAAI,SAAS,QAAQ;AACpB,YAAM,cAAc,gBAAgB,KAAK,KAAK;AAE9C,UAAI,gBAAgB,IAAI;AACvB,gBAAQ,KAAK,OAAO;AACpB,WAAG,KAAK;AACR;AAAA,MACD,OAAO;AACN,qBAAa,KAAK,KAAK;AACvB,WAAG,IAAI;AACP;AAAA,MACD;AAAA,IACD,WAAW,SAAS,YAAY;AAC/B,YAAM,kBAAkB,wBAAwB,KAAK,KAAK;AAE1D,UAAI,QAAQ,UAAU,KAAK,KAAK;AAC/B,WAAG,KAAK;AACR;AAAA,MACD;AAEA,UAAI,QAAQ,UAAU,iBAAiB;AACtC,iCAAyB,KAAK,OAAO,KAAK,KAAK,GAAG,CAAC;AACnD,YAAI,MAAM;AACT,mBAAQ,IAAE,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC7C,kBAAM,WAAW,KAAK,UAAU,CAAC;AACjC,qCAAyB,KAAK,SAAS,WAAW,SAAS,SAAS,SAAS,SAAS,CAAC;AAAA,UACxF;AAAA,QACD;AACA,WAAG,IAAI;AACP;AAAA,MACD,OAAO;AACN,oBAAY,KAAK,OAAO;AACxB,iBAAQ,IAAE,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,sBAAY,KAAK,SAAS,CAAC,CAAC;AAAA,QAC7B;AACA,WAAG,KAAK;AACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA;AAEA,8DAAwC,OAAO,MAAW,OAAiB;AAC1E,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,EAAC,GAAE,GAAG,OAAiB;AACvE,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,EAAE;AAClF,KAAG,MAAM;AACV,CAAC;AAED,kEAA0C,OAAO,MAAW,OAAiB;AAC5E,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,IAAI;AACpF,KAAG,MAAM;AACV,CAAC;AAED,4DAAuC,OAAO,QAAqB,OAAiB;AACnF,gBAAc,KAAK,MAAM;AACzB,KAAG,CAAC;AACL,CAAC;AAED,kEAA0C,OAAO,EAAE,IAAI,WAAW,GAAG,OAAiB;AACrF,QAAM,eAAe,eAAe;AACpC,QAAM,SAAS,MAAM,sBAAsB,qCAAqC,cAAc,IAAI,UAAU;AAC5G,KAAG,MAAM;AACV,CAAC;AAED,gEAAyC,OAAO,EAAE,GAAG,GAAG,OAAiB;AACxE,QAAM,SAAS,MAAM,sBAAsB,oCAAoC,EAAE;AACjF,KAAG,MAAM;AACV,CAAC;AAED,8DAAwC,OAAO,MAA4C,OAAiB;AAC3G,QAAM,SAAS,MAAM,sBAAsB,mCAAmC,IAAI;AAClF,KAAG,MAAM;AACV,CAAC;AAED,MAAM,qCAAqC,CAAC,WAAwB;AACnE,gBAAc,KAAK,MAAM;AAC1B,CAAC;;;ACrLD,IAAM,SAAS,QAAQ;AACvB,IAAI,SAAS;AACb,IAAI,OAAO;AAEX,IAAI,iBAAiB;AACrB,IAAI,UAAU;AAEd,eAAsB,SAAS,MAAiD,WAAoB,OAAO;AACvG,MAAI,SAAS,QAAQ,MAAM;AACvB;AAAA,EACJ;AAEA,MAAI,YAAY,YAAY;AAC5B,QAAM,cAAc,OAAO,MAAM;AAEjC,QAAM,WAAW,OAAO,SAAS;AAEjC,QAAM,OAAO,WAAW,OAAO,KAAK;AAEpC,QAAM,OAAO,YAAY,IAAI;AAC7B,MAAI,CAAC;AAAM;AAEX,YAAU,SAAS;AAEnB,QAAM,eAAe,eAAe;AACpC,QAAM,OAAO,KAAK;AAClB,MAAI,YAAY,WAAW,QAAQ,KAAK;AAExC,WAAS,aAAa,SAAS;AAE/B,MAAI,UAAU,CAAC;AAEf,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AAAc,cAAU,MAAM,sBAAgC,mCAAmC,YAAY;AAEjH,MAAI,SAAS,CAAC;AAEd,QAAM,iBAAiB,KAAK,SAAS,UAAU;AAC/C,MAAI,gBAAgB;AAChB,aAAS,OAAO,OAAO;AAAA,EAC3B;AAEA,QAAM,eAAe,KAAK,SAAS,SAAS;AAC5C,MAAI;AACJ,MAAI,cAAc;AACd,cAAU,cAAc;AAAA,EAC5B;AAEA,QAAM,YAAY,aAAa,IAAI;AAEnC,MAAI,UAAU;AACV,UAAM,QAAQ,WAAW,qBAAqB,CAAC;AAC/C,gBAAY,MAAM,SAAS,WAAW,KAAK;AAC3C,YAAQ,uCAAuC;AAC/C,cAAU,IAAI,QAAQ,aAAW;AAC7B,uBAAiB;AAAA,IACrB,CAAC;AAED,cAAU,SAAS;AAAA,EACvB;AAEA,QAAM,aAAa,MAAM,cAAc,SAAS;AAEhD,cAAY;AAEZ,6CAAwB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,QAAQ,MAAM,cAAc,QAAQ;AAAA,EACxC,CAAC;AAED,cAAY,MAAM,IAAI;AACtB,mDAA2B,IAAI;AAE/B,SAAO;AAEP,UAAQ,cAAc,QAAQ,IAAI;AAElC,MAAI,SAAS;AACT,UAAM;AACN,YAAQ,yCAAyC;AAAA,EACrD;AAEA,YAAU;AACV,mBAAiB;AACjB,SAAO;AACX;AArFsB;AAsFtB,QAAQ,YAAY,QAAQ;AAE5B,gBAAgB,cAAc,OAAO,GAAG,SAAmB;AACvD,QAAM,OAAO,KAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACP,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,OAAO;AACH,UAAM,OAAO,KAAK,YAAY;AAC9B,aAAS,IAAI;AAAA,EACjB;AACJ,GAAG,IAAI;AAGP,SAAS,aAAa,MAAgC;AAClD,QAAM,EAAC,YAAY,KAAI,IAAI,OAAO,UAAU;AAE5C,MAAI,OAAO,SAAS;AAAU,WAAO;AAErC,MAAI,CAAC;AAAY,WAAO;AAExB,MAAI,YAAY,EAAC,GAAG,KAAI;AAExB,QAAM,aAAa,cAAc;AAGjC,aAAW,QAAQ,YAAY;AAC3B,UAAM,SAAS,WAAW,IAAI;AAC9B,eAAW,SAAS,QAAQ;AAExB,UAAI,OAAgB;AAEpB,UAAI,QAAQ,UAAU,KAAK,MAAM;AAC7B,eAAO,KAAK,KAAK,SAAS,WAAW,IAAI,IAAI;AAAA,MACjD;AAEA,UAAI,QAAQ,WAAW,KAAK,OAAO;AAC/B,eAAO,KAAK,MAAM,SAAS,WAAW,KAAK,IAAI;AAAA,MACnD;AAEA,UAAI,CAAC,MAAM;AACP,cAAM,iBAAiB,OAAO,KAAK;AACnC,oBAAY,OAAO,OAAO,CAAC,GAAG,WAAW,gBAAgB;AAAA,UACvD,WAAW,OAAO,OAAO,CAAC,GAAG,UAAU,WAAW,eAAe,SAAS;AAAA,QAC5E,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAGX;AAtCS;AAwCF,SAAS,YAAY;AACxB,eAAa,KAAK,MAAM;AAExB,aAAW;AACX,cAAY,OAAO,KAAK;AACxB,mDAA2B,KAAK;AAGhC,UAAQ,cAAc,QAAQ,KAAK;AAEnC,MAAI,gBAAgB;AAChB,mBAAe;AAAA,EACnB;AACA,SAAO;AACX;AAdgB;;;ACtJT,SAAS,WAAW;AACvB,QAAM,yCAAyC,OAAO,YAAyBC,SAAgB;AAC3F,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,0CAA0C,MAAM;AAClD,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,QAAM,qCAAqC,MAAM;AAC7C,aAAS,EAAE,MAAM,WAAW,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EACtD,CAAC;AACL;AAZgB;;;ACAT,SAAS,YAAY;AACxB,MAAI,aAAa;AAEjB,KAAG,4BAA4B,MAAM;AACjC,iBAAa;AAAA,EACjB,CAAC;AAED,KAAG,6BAA6B,MAAM;AAClC,QAAG;AACC,cAAQ,cAAc,gBAAgB;AAAA,EAC9C,CAAC;AAED,QAAM,yBAAyB,OAAO,YAAyBC,SAAgB;AAC3E,QAAI,CAAC,WAAW;AAAO,iBAAW,QAAQ,WAAW,kBAAkB;AACvE,UAAM,iBAAiBA,MAAK,UAAU;AAAA,EAC1C,CAAC;AAED,QAAM,uBAAuB,OAAO,OAAY;AAC5C,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,OAAG,UAAU;AAAA,EACjB,CAAC;AAED,QAAM,wBAAwB,OAAO,YAAyB,OAAY;AACtE,UAAM,uBAAuB,UAAU;AACvC,QAAI;AAAI,SAAG;AAAA,EACf,CAAC;AAED,QAAM,6BAA6B,OAAO,aAAkB;AACxD,YAAQ,cAAc,gBAAgB,QAAQ;AAAA,EAClD,CAAC;AACL;AA/BgB;;;ACChB,SAAS,cAAc,MAAc,IAAS;AAC1C,KAAG,sCAAsC,MAAM,CAAC,UAAe;AAC3D,UAAM,EAAE;AAAA,EACZ,CAAC;AACL;AAJS;AAMF,SAAS,iBAAiB;AAC7B,gBAAc,4BAA4B,MAAM;AAC5C,YAAQ,cAAc,gBAAgB;AAAA,EAC1C,CAAC;AAED,gBAAc,eAAe,CAACC,SAAgB;AAC1C,WAAO,eAAeA,IAAG;AAAA,EAC7B,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,UAAM,YAAiB,aAAaA,IAAG,EAAE,CAAC;AAC1C,QAAI,cAAc,CAAC;AACnB,eAAW,MAAM,WAAW;AACxB,YAAM,WAAW,UAAU,EAAE;AAC7B,kBAAY,KAAK;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,UAAU,SAAS;AAAA,QACnB,SAAS,SAAS;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,eAAe,CAACA,SAAgB;AAC1C,UAAM,QAAc,SAASA,IAAG,EAAE,CAAC;AACnC,QAAI,WAAW,CAAC;AAChB,eAAW,MAAM,OAAO;AACpB,YAAM,OAAO,MAAM,EAAE;AACrB,eAAS,KAAK;AAAA,QACV,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAClB,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AAED,gBAAc,mBAAmB,CAACA,SAAgB;AAC9C,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,SAAgB;AACjD,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAE5D,CAAC;AAED,gBAAc,cAAc,CAACA,SAAgB;AAEzC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,oBAAoB,CAACA,SAAgB;AAC/C,WAAO,cAAcA,IAAG;AAAA,EAC5B,CAAC;AAED,gBAAc,kBAAkB,CAAC,UAAkB;AAC/C,cAAU,YAAY,CAAC;AACvB,aAAS,KAAK,KAAK;AAAA,EACvB,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,UAAe;AAE1D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,MAAM;AACtC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,sBAAsB,CAACA,MAAa,YAAiB;AAE/D,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,cAAc,OAAOA,MAAa,MAAW,WAAgB;AAEvE,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,kBAAkB,MAAM;AAClC,WAAO,QAAQ,KAAK,oCAAoC;AAAA,EAC5D,CAAC;AAED,gBAAc,mBAAmB,CAACA,MAAa,aAAkB;AAC7D,UAAM,cAAc;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS;AAAA,IACtB;AACA,gBAAYA,MAAK,WAAW;AAAA,EAChC,CAAC;AAED,gBAAc,oBAAoB,CAACA,MAAa,eAAoB;AAChE,eAAW,aAAa,YAAY;AAChC,YAAM,cAAc;AAAA,QAChB,OAAO,UAAU;AAAA,QACjB,OAAO,UAAU;AAAA,QACjB,SAAS,UAAU;AAAA,MACvB;AACA,kBAAYA,MAAK,WAAW;AAAA,IAChC;AAAA,EACJ,CAAC;AAED,gBAAc,cAAc,CAACA,MAAa,SAAc;AACpD,UAAM,UAAU;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAClB;AACA,YAAQA,MAAK,OAAO;AAAA,EACxB,CAAC;AAED,gBAAc,eAAe,CAACA,MAAa,UAAe;AACtD,eAAW,QAAQ,OAAO;AACtB,YAAM,UAAU;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,MAClB;AACA,cAAQA,MAAK,OAAO;AAAA,IACxB;AAAA,EACJ,CAAC;AAMD,gBAAc,oBAAoB,CAACA,MAAa,eAA4B;AACxE,qBAAiBA,MAAK,UAAU;AAAA,EACpC,CAAC;AAED,gBAAc,iBAAiB,CAACA,MAAa,YAAuB;AAChE,kBAAcA,MAAK,OAAO;AAAA,EAC9B,CAAC;AACL;AA1IgB;;;ACJhB,QAAQ,0BAA0B,OAAO,eAAqC;AAC1E,MAAI;AAEJ,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AAC/C,UAAM,cAAsB,cAAc,MAAM,eAAe;AAC/D,yBAAqB,MAAM,sBAAmC,sCAAsC,WAAW;AAAA,EACnH,WAAW,OAAO,eAAe;AAAU,yBAAqB;AAEhE,MAAI,CAAC,oBAAoB;AACrB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AAEA,QAAM,uBAAuB,kBAAkB;AACnD,CAAC;AAED,QAAQ,0BAA0B,OAAO,gBAAwB;AAC7D,gBAAc,eAAe,MAAM,eAAe;AAClD,SAAO,MAAM,sBAAmC,sCAAsC,WAAW;AACrG,CAAC;AAED,QAAQ,mBAAmB,OAAO,OAAkB;AAEhD,QAAM,SAAS,EAAE,MAAM,cAAc,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI;AACjE,MAAI;AAAI,OAAG;AACf,CAAC;AAED,GAAG,gCAAgC,CAAC,SAA0B;AAC1D,WAAS,IAAI;AACjB,CAAC;AAED,MAAM,iCAAiC,YAAY;AAC/C,SAAO,CAAC,UAAU,KAAK,EAAE,aAAa,GAAG;AACrC,UAAM,MAAM,GAAG;AAAA,EACnB;AACA,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAC3C,CAAC;AAED,MAAM,mBAAmB,OAAO,aAAqB;AACjD,MAAI,aAAa,uBAAuB,KAAK,UAAU,KAAK,EAAE,aAAa,GAAG;AAC1E,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,QAAI,CAAC;AAAY;AACjB,UAAM,uBAAuB,UAAU;AAAA,EAC3C;AACJ,CAAC;AAED,IAAM,gBAAgB,UAAU,aAAa,MAAM;AACnD,IAAM,OAAO,OAAO,UAAU,gBAAgB,IAAI,CAAC;AAEnD,IAAI,QAAQ,QAAQ,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AAC/E,WAAS;AACb,WAAW,QAAQ,SAAS,iBAAiB,aAAa,KAAK,WAAW;AACtE,YAAU;AACd;AAEA,eAAe;AAEf,gBAAgB,cAAc,YAAY;AACtC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,YAAY,mBAAmB,GAAG;AACxC,QAAM,QAAQ,aAAa,GAAG;AAE9B,QAAM,aAAa,MAAM,sBAAmC,sCAAsC,WAAW;AAC7G,MAAI,CAAC;AAAY;AACjB,QAAM,uBAAuB,UAAU;AAEvC,kBAAgB,KAAK,SAAS;AAC9B,QAAM,GAAI;AACV,kBAAgB,KAAK,MAAM;AAC3B,eAAa,KAAK,KAAK;AAC3B,GAAG,KAAK;", "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] } diff --git a/src/client/appearance/getters.ts b/src/client/appearance/getters.ts index 4b144bf..89a4906 100644 --- a/src/client/appearance/getters.ts +++ b/src/client/appearance/getters.ts @@ -167,7 +167,7 @@ export async function getAppearance(pedHandle: number): Promise { const [drawables, drawTotal] = getDrawables(pedHandle) const [props, propTotal] = getProps(pedHandle) const model = GetEntityModel(pedHandle) - const tattoos = await getTattoos() + const tattoos = pedHandle == PlayerPedId() ? await getTattoos() : [] return { modelIndex: findModelIndex(model), From 53517c1e6fc2e5b57d299cfb00a01068f6f49d1e Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 16:24:27 +1000 Subject: [PATCH 29/30] ref!!(export renames): To be consistent. Will rename internal functions to match in the future --- dist/client/init.js | 40 ++++++++++++++++---------------- dist/client/init.js.map | 4 ++-- dist/server/init.js | 4 ++-- dist/server/init.js.map | 4 ++-- src/client/appearance/getters.ts | 23 +++++++++--------- src/client/appearance/setters.ts | 14 +++++------ src/server/appearance/getters.ts | 2 +- 7 files changed, 45 insertions(+), 46 deletions(-) diff --git a/dist/client/init.js b/dist/client/init.js index 1839236..e3757ab 100644 --- a/dist/client/init.js +++ b/dist/client/init.js @@ -393,14 +393,14 @@ function findModelIndex(target) { return models.findIndex((model) => GetHashKey(model) === target); } __name(findModelIndex, "findModelIndex"); -function getHair(pedHandle) { +function getHairColor(pedHandle) { return { color: GetPedHairColor(pedHandle), highlight: GetPedHairHighlightColor(pedHandle) }; } -__name(getHair, "getHair"); -exports("GetHair", getHair); +__name(getHairColor, "getHairColor"); +exports("GetPedHairColor", getHairColor); function getHeadBlendData(pedHandle) { const buffer = new ArrayBuffer(80); global.Citizen.invokeNative("0x2746bd9d88c5c5d0", pedHandle, new Uint32Array(buffer)); @@ -424,7 +424,7 @@ function getHeadBlendData(pedHandle) { }; } __name(getHeadBlendData, "getHeadBlendData"); -exports("GetHeadBlend", getHeadBlendData); +exports("GetPedHeadBlend", getHeadBlendData); function getHeadOverlay(pedHandle) { let totals = {}; let headData = {}; @@ -453,7 +453,7 @@ function getHeadOverlay(pedHandle) { return [headData, totals]; } __name(getHeadOverlay, "getHeadOverlay"); -exports("GetHeadOverlay", getHeadOverlay); +exports("GetPedHeadOverlay", getHeadOverlay); function getHeadStructure(pedHandle) { const pedModel = GetEntityModel(pedHandle); if (pedModel !== GetHashKey("mp_m_freemode_01") && pedModel !== GetHashKey("mp_f_freemode_01")) @@ -470,7 +470,7 @@ function getHeadStructure(pedHandle) { return faceStruct; } __name(getHeadStructure, "getHeadStructure"); -exports("GetHeadStructure", getHeadStructure); +exports("GetPedHeadStructure", getHeadStructure); function getDrawables(pedHandle) { let drawables = {}; let totalDrawables = {}; @@ -493,7 +493,7 @@ function getDrawables(pedHandle) { return [drawables, totalDrawables]; } __name(getDrawables, "getDrawables"); -exports("GetDrawables", getDrawables); +exports("GetPedDrawables", getDrawables); function getProps(pedHandle) { let props = {}; let totalProps = {}; @@ -516,7 +516,7 @@ function getProps(pedHandle) { return [props, totalProps]; } __name(getProps, "getProps"); -exports("GetProps", getProps); +exports("GetPedProps", getProps); async function getAppearance(pedHandle) { const [headData, totals] = getHeadOverlay(pedHandle); const [drawables, drawTotal] = getDrawables(pedHandle); @@ -526,7 +526,7 @@ async function getAppearance(pedHandle) { return { modelIndex: findModelIndex(model), model, - hairColor: getHair(pedHandle), + hairColor: getHairColor(pedHandle), headBlend: getHeadBlendData(pedHandle), headOverlay: headData, headOverlayTotal: totals, @@ -539,7 +539,7 @@ async function getAppearance(pedHandle) { }; } __name(getAppearance, "getAppearance"); -exports("GetAppearance", getAppearance); +exports("GetPedAppearance", getAppearance); onServerCallback("bl_appearance:client:getAppearance", () => { updatePed(PlayerPedId()); return getAppearance(ped); @@ -560,7 +560,7 @@ function getPedSkin(pedHandle) { return { headBlend: getHeadBlendData(pedHandle), headStructure: getHeadStructure(pedHandle), - hairColor: getHair(pedHandle), + hairColor: getHairColor(pedHandle), model: GetEntityModel(pedHandle) }; } @@ -628,7 +628,7 @@ async function getTattoos() { return await triggerServerCallback("bl_appearance:server:getTattoos") || []; } __name(getTattoos, "getTattoos"); -exports("GetTattoos", getTattoos); +exports("GetPlayerTattoos", getTattoos); onServerCallback("bl_appearance:client:migration:setAppearance", (data) => { if (data.type === "fivem") exports["fivem-appearance"].setPlayerAppearance(data.data); @@ -698,7 +698,7 @@ function setDrawable(pedHandle, data) { return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value); } __name(setDrawable, "setDrawable"); -exports("SetDrawable", setDrawable); +exports("SetPedDrawable", setDrawable); function setProp(pedHandle, data) { if (!data) return console.warn("No data provided for setProp"); @@ -710,7 +710,7 @@ function setProp(pedHandle, data) { return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value); } __name(setProp, "setProp"); -exports("SetProp", setProp); +exports("SetPedProp", setProp); var defMaleHash = GetHashKey("mp_m_freemode_01"); var setModel = /* @__PURE__ */ __name(async (pedHandle, data) => { if (data == null || data === void 0) { @@ -754,14 +754,14 @@ var setModel = /* @__PURE__ */ __name(async (pedHandle, data) => { } return pedHandle; }, "setModel"); -exports("SetModel", setModel); +exports("SetPedModel", setModel); function setFaceFeature(pedHandle, data) { if (!data) return console.warn("No data provided for setFaceFeature"); SetPedFaceFeature(pedHandle, data.index, data.value + 0); } __name(setFaceFeature, "setFaceFeature"); -exports("SetFaceFeature", setFaceFeature); +exports("SetPedFaceFeature", setFaceFeature); function setFaceFeatures(pedHandle, data) { if (!data) return console.warn("No data provided for setFaceFeatures"); @@ -771,7 +771,7 @@ function setFaceFeatures(pedHandle, data) { } } __name(setFaceFeatures, "setFaceFeatures"); -exports("SetFaceFeatures", setFaceFeatures); +exports("SetPedFaceFeatures", setFaceFeatures); var isPositive = /* @__PURE__ */ __name((val) => val >= 0 ? val : 0, "isPositive"); function setHeadBlend(pedHandle, data) { if (!data) @@ -792,7 +792,7 @@ function setHeadBlend(pedHandle, data) { SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent); } __name(setHeadBlend, "setHeadBlend"); -exports("SetHeadBlend", setHeadBlend); +exports("SetPedHeadBlend", setHeadBlend); function setHeadOverlay(pedHandle, data) { if (!data) return console.warn("No data provided for setHeadOverlay"); @@ -810,7 +810,7 @@ function setHeadOverlay(pedHandle, data) { SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor); } __name(setHeadOverlay, "setHeadOverlay"); -exports("SetHeadOverlay", setHeadOverlay); +exports("SetPedHeadOverlay", setHeadOverlay); function resetToggles(data) { const drawables = data.drawables; const props = data.props; @@ -1413,4 +1413,4 @@ RegisterCommand("reloadskin", async () => { SetEntityHealth(ped, health); SetPedArmour(ped, armor); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyKHBlZEhhbmRsZTogbnVtYmVyKTogVEhhaXJEYXRhIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IEdldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhpZ2hsaWdodDogR2V0UGVkSGFpckhpZ2hsaWdodENvbG9yKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKCdHZXRIYWlyJywgZ2V0SGFpcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0SGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBlYXJhbmNlKHBlZEhhbmRsZTogbnVtYmVyKTogUHJvbWlzZTxUQXBwZWFyYW5jZT4ge1xyXG4gICAgY29uc3QgW2hlYWREYXRhLCB0b3RhbHNdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2RyYXdhYmxlcywgZHJhd1RvdGFsXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHMsIHByb3BUb3RhbF0gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBtb2RlbCA9IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IHRhdHRvb3MgPSBwZWRIYW5kbGUgPT0gUGxheWVyUGVkSWQoKSA/IGF3YWl0IGdldFRhdHRvb3MoKSA6IFtdXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RlbEluZGV4OiBmaW5kTW9kZWxJbmRleChtb2RlbCksXHJcbiAgICAgICAgbW9kZWw6IG1vZGVsLFxyXG4gICAgICAgIGhhaXJDb2xvcjogZ2V0SGFpcihwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRCbGVuZDogZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhlYWRPdmVybGF5OiBoZWFkRGF0YSBhcyBUSGVhZE92ZXJsYXksXHJcbiAgICAgICAgaGVhZE92ZXJsYXlUb3RhbDogdG90YWxzIGFzIFRIZWFkT3ZlcmxheVRvdGFsLFxyXG4gICAgICAgIGhlYWRTdHJ1Y3R1cmU6IGdldEhlYWRTdHJ1Y3R1cmUocGVkSGFuZGxlKSxcclxuICAgICAgICBkcmF3YWJsZXM6IGRyYXdhYmxlcyxcclxuICAgICAgICBwcm9wczogcHJvcHMsXHJcbiAgICAgICAgZHJhd1RvdGFsOiBkcmF3VG90YWwsXHJcbiAgICAgICAgcHJvcFRvdGFsOiBwcm9wVG90YWwsXHJcbiAgICAgICAgdGF0dG9vczogdGF0dG9vc1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRBcHBlYXJhbmNlXCIsIGdldEFwcGVhcmFuY2UpXHJcbm9uU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCAoKSA9PiB7XHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKHBlZClcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGVkQ2xvdGhlcyhwZWRIYW5kbGU6IG51bWJlcik6IFRDbG90aGVzIHtcclxuICAgIGNvbnN0IFtkcmF3YWJsZXNdID0gZ2V0RHJhd2FibGVzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtwcm9wc10gPSBnZXRQcm9wcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbaGVhZERhdGFdID0gZ2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlKVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaGVhZE92ZXJsYXk6IGhlYWREYXRhIGFzIFRIZWFkT3ZlcmxheSxcclxuICAgICAgICBkcmF3YWJsZXM6IGRyYXdhYmxlcyxcclxuICAgICAgICBwcm9wczogcHJvcHMsXHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cyhcIkdldFBlZENsb3RoZXNcIiwgZ2V0UGVkQ2xvdGhlcylcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZWRTa2luKHBlZEhhbmRsZTogbnVtYmVyKTogVFNraW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkQmxlbmQ6IGdldEhlYWRCbGVuZERhdGEocGVkSGFuZGxlKSxcclxuICAgICAgICBoZWFkU3RydWN0dXJlOiBnZXRIZWFkU3RydWN0dXJlKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyKHBlZEhhbmRsZSksXHJcbiAgICAgICAgbW9kZWw6IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkU2tpblwiLCBnZXRQZWRTa2luKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhdHRvb0RhdGEoKSB7XHJcbiAgICBsZXQgdGF0dG9vWm9uZXMgPSBbXVxyXG5cclxuICAgIGNvbnN0IFtUQVRUT09fTElTVCwgVEFUVE9PX0NBVEVHT1JJRVNdID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLnRhdHRvb3MoKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fQ0FURUdPUklFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gVEFUVE9PX0NBVEVHT1JJRVNbaV1cclxuICAgICAgICBjb25zdCB6b25lID0gY2F0ZWdvcnkuem9uZVxyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gY2F0ZWdvcnkubGFiZWxcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNhdGVnb3J5LmluZGV4XHJcbiAgICAgICAgdGF0dG9vWm9uZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgICAgICAgIHpvbmVJbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgIGRsY3M6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFRBVFRPT19MSVNULmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRsY0RhdGEgPSBUQVRUT09fTElTVFtqXVxyXG4gICAgICAgICAgICB0YXR0b29ab25lc1tpbmRleF0uZGxjcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBkbGNEYXRhLmRsYyxcclxuICAgICAgICAgICAgICAgIGRsY0luZGV4OiBqLFxyXG4gICAgICAgICAgICAgICAgdGF0dG9vczogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNGZW1hbGUgPSBHZXRFbnRpdHlNb2RlbChwZWQpID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gVEFUVE9PX0xJU1RbaV1cclxuICAgICAgICBjb25zdCB7IGRsYywgdGF0dG9vcyB9ID0gZGF0YVxyXG4gICAgICAgIGNvbnN0IGRsY0hhc2ggPSBHZXRIYXNoS2V5KGRsYylcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhdHRvb3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IHRhdHRvb3Nbal1cclxuICAgICAgICAgICAgbGV0IHRhdHRvbyA9IG51bGxcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyVGF0dG9vID0gdGF0dG9vRGF0YS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRmVtYWxlVGF0dG9vID0gbG93ZXJUYXR0b28uaW5jbHVkZXMoXCJfZlwiKVxyXG4gICAgICAgICAgICBpZiAoaXNGZW1hbGVUYXR0b28gJiYgaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGZW1hbGVUYXR0b28gJiYgIWlzRmVtYWxlKSB7XHJcbiAgICAgICAgICAgICAgICB0YXR0b28gPSB0YXR0b29EYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gbnVsbFxyXG4gICAgICAgICAgICBsZXQgem9uZSA9IC0xXHJcblxyXG4gICAgICAgICAgICBpZiAodGF0dG9vKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNoID0gR2V0SGFzaEtleSh0YXR0b28pXHJcbiAgICAgICAgICAgICAgICB6b25lID0gR2V0UGVkRGVjb3JhdGlvblpvbmVGcm9tSGFzaGVzKGRsY0hhc2gsIGhhc2gpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh6b25lICE9PSAtMSAmJiBoYXNoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lVGF0dG9vcyA9IHRhdHRvb1pvbmVzW3pvbmVdLmRsY3NbaV0udGF0dG9vc1xyXG5cclxuICAgICAgICAgICAgICAgIHpvbmVUYXR0b29zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YXR0b28sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRsYzogZGxjLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGF0dG9vWm9uZXNcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRhdHRvb3MoKTogUHJvbWlzZTxUVGF0dG9vW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldFRhdHRvb3MnKSB8fCBbXVxyXG59XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBnZXRUYXR0b29zKTtcclxuLy9taWdyYXRpb25cclxuXHJcbm9uU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50Om1pZ3JhdGlvbjpzZXRBcHBlYXJhbmNlJywgKGRhdGE6IHt0eXBlOiBzdHJpbmcsIGRhdGE6IGFueX0pID0+IHtcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdmaXZlbScpIGV4cG9ydHNbJ2ZpdmVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdpbGxlbml1bScpIGV4cG9ydHNbJ2lsbGVuaXVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxufSk7IiwgImV4cG9ydCBkZWZhdWx0IHtcclxuICAgIGhhdHM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMCxcclxuICAgIH0sXHJcbiAgICBnbGFzc2VzOiB7XHJcbiAgICAgICAgdHlwZTogXCJwcm9wXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICB9LFxyXG4gICAgbWFza3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIHNoaXJ0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogOCxcclxuICAgICAgICBvZmY6IDE1LFxyXG4gICAgICAgIGhvb2s6IHtcclxuICAgICAgICAgICAgZHJhd2FibGVzOiBbXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMywgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAndG9yc29zJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDgsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3NoaXJ0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGphY2tldHM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDExLFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMTEsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ2phY2tldHMnIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB2ZXN0OiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA5LFxyXG4gICAgICAgIG9mZjogMCxcclxuICAgIH0sXHJcbiAgICBsZWdzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA0LFxyXG4gICAgICAgIG9mZjogMTgsXHJcbiAgICB9LFxyXG4gICAgc2hvZXM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDYsXHJcbiAgICAgICAgb2ZmOiAzNCxcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEhhaXJDb2xvciwgVENsb3RoZXMsIFRTa2luLCBUVmFsdWUsIFRIZWFkU3RydWN0dXJlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcclxuaW1wb3J0IFRPR0dMRV9JTkRFWEVTIGZyb20gXCJAZGF0YS90b2dnbGVzXCJcclxuaW1wb3J0IHsgcmVxdWVzdE1vZGVsLCBwZWQsIHVwZGF0ZVBlZCwgaXNQZWRGcmVlbW9kZU1vZGVsfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSBcIkB0eXBpbmdzL3RhdHRvb3NcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREcmF3YWJsZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldERyYXdhYmxlJylcclxuXHJcbiAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIDApXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0RHJhd2FibGUnLCBzZXREcmF3YWJsZSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFByb3AnKVxyXG5cclxuICAgIGlmIChkYXRhLnZhbHVlID09PSAtMSkge1xyXG4gICAgICAgIENsZWFyUGVkUHJvcChwZWRIYW5kbGUsIGRhdGEuaW5kZXgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgU2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCBmYWxzZSlcclxuICAgIHJldHVybiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0UHJvcCcsIHNldFByb3ApO1xyXG5cclxuY29uc3QgZGVmTWFsZUhhc2ggPSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldE1vZGVsID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQXBwZWFyYW5jZSB8IFRTa2luIHwgbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRNb2RlbCcpXHJcbiAgICAgICAgcmV0dXJuIHBlZEhhbmRsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbW9kZWw6IG51bWJlcjtcclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBtb2RlbCA9IEdldEhhc2hLZXkoZGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9kZWwgPSBkYXRhLm1vZGVsIHx8IGRlZk1hbGVIYXNoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtb2RlbCA9PT0gMCkgcmV0dXJuIHBlZEhhbmRsZTtcclxuXHJcbiAgICBhd2FpdCByZXF1ZXN0TW9kZWwobW9kZWwpO1xyXG5cclxuICAgIGNvbnN0IGlzUGxheWVyID0gSXNQZWRBUGxheWVyKHBlZEhhbmRsZSk7XHJcbiAgICBpZiAoaXNQbGF5ZXIpIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChQbGF5ZXJJZCgpLCBtb2RlbCk7XHJcbiAgICAgICAgcGVkSGFuZGxlID0gUGxheWVyUGVkSWQoKTtcclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICBTZXRNb2RlbEFzTm9Mb25nZXJOZWVkZWQobW9kZWwpO1xyXG4gICAgU2V0UGVkRGVmYXVsdENvbXBvbmVudFZhcmlhdGlvbihwZWRIYW5kbGUpO1xyXG5cclxuICAgIGlmICghaXNQZWRGcmVlbW9kZU1vZGVsKHBlZEhhbmRsZSkpIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgY29uc3QgaXNKdXN0TW9kZWwgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGRhdGEgPT09ICdudW1iZXInO1xyXG4gICAgY29uc3QgaGFzSGVhZEJsZW5kID0gIWlzSnVzdE1vZGVsICYmIGRhdGEuaGVhZEJsZW5kICYmIE9iamVjdC5rZXlzKGRhdGEuaGVhZEJsZW5kKS5sZW5ndGggPiAwO1xyXG5cclxuICAgIGlmIChoYXNIZWFkQmxlbmQpIHtcclxuICAgICAgICBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCAoZGF0YSBhcyBUQXBwZWFyYW5jZSB8IFRTa2luKS5oZWFkQmxlbmQpO1xyXG4gICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIGZhbHNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKSkge1xyXG4gICAgICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgNDUsIDIxLCAwLCAyMCwgMTUsIDAsIDAuMywgMC4xLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbn07XHJcbmV4cG9ydHMoJ1NldE1vZGVsJywgc2V0TW9kZWwpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RmFjZUZlYXR1cmUnKVxyXG5cclxuICAgIFNldFBlZEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSArIDAuMClcclxufVxyXG5leHBvcnRzKCdTZXRGYWNlRmVhdHVyZScsIHNldEZhY2VGZWF0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIZWFkU3RydWN0dXJlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlcycpXHJcbiAgICAgICAgXHJcblxyXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIGluIGRhdGEpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbZmVhdHVyZV1cclxuICAgICAgICBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIHZhbHVlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldEZhY2VGZWF0dXJlcycsIHNldEZhY2VGZWF0dXJlcyk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlLCBoZWFkU3RydWN0dXJlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVGF0dG9vW10pIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkVGF0dG9vcycpXHJcblxyXG4gICAgQ2xlYXJQZWREZWNvcmF0aW9uc0xlYXZlU2NhcnMocGVkSGFuZGxlKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRhdHRvb0RhdGEgPSBkYXRhW2ldLnRhdHRvb1xyXG4gICAgICAgIGlmICh0YXR0b29EYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBHZXRIYXNoS2V5KHRhdHRvb0RhdGEuZGxjKVxyXG4gICAgICAgICAgICBjb25zdCB0YXR0b28gPSB0YXR0b29EYXRhLmhhc2hcclxuICAgICAgICAgICAgQWRkUGVkRGVjb3JhdGlvbkZyb21IYXNoZXMocGVkSGFuZGxlLCBjb2xsZWN0aW9uLCB0YXR0b28pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUSGFpckNvbG9yKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEhhaXJDb2xvcnMnKVxyXG5cclxuICAgIGNvbnN0IGNvbG9yID0gZGF0YS5jb2xvclxyXG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gZGF0YS5oaWdobGlnaHRcclxuICAgIFNldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUsIGNvbG9yLCBoaWdobGlnaHQpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBlZEFwcGVhcmFuY2UocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEFwcGVhcmFuY2UnKVxyXG5cclxuICAgIGlmIChJc1BlZEFQbGF5ZXIocGVkSGFuZGxlKSkge1xyXG4gICAgICAgIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkSGFuZGxlLCBkYXRhKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZSwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZSwgZGF0YS50YXR0b29zKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEFwcGVhcmFuY2UnLCBzZXRQZWRBcHBlYXJhbmNlKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBsYXllclBlZEFwcGVhcmFuY2UnKVxyXG4gICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBhZnRlciBzY3JpcHRzIHNldCB0aGVpciBvd24gbW9kZWwsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYmVmb3JlIHdlIHNldCB0aGUgYXBwZWFyYW5jZVxyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICBhd2FpdCBzZXRQZWRTa2luKHBlZCwgZGF0YSlcclxuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYWdhaW4gYWZ0ZXIgc2V0dGluZyB0aGUgc2tpbiBiZWNhdXNlIFNldFBsYXllck1vZGVsIHdpbGwgc2V0IGEgbmV3IFBsYXllclBlZElkXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIHNldFBlZENsb3RoZXMocGVkLCBkYXRhKVxyXG4gICAgc2V0UGVkSGFpckNvbG9ycyhwZWQsIGRhdGEuaGFpckNvbG9yKVxyXG4gICAgc2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEudGF0dG9vcylcclxufVxyXG5cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpXHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKVxyXG5leHBvcnRzKCdTZXRQZWRUYXR0b29zJywgc2V0UGVkVGF0dG9vcylcclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpIiwgImltcG9ydCB7IFJlY2VpdmUgfSBmcm9tICdAZXZlbnRzJztcclxuaW1wb3J0IHtcclxuXHRyZXNldFRvZ2dsZXMsXHJcblx0c2V0RHJhd2FibGUsXHJcblx0c2V0RmFjZUZlYXR1cmUsXHJcblx0c2V0SGVhZEJsZW5kLFxyXG5cdHNldEhlYWRPdmVybGF5LFxyXG5cdHNldE1vZGVsLFxyXG5cdHNldFBlZENsb3RoZXMsXHJcblx0c2V0UGVkVGF0dG9vcyxcclxuXHRzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlLFxyXG5cdHNldFByb3AsXHJcbn0gZnJvbSAnLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xyXG5pbXBvcnQgeyBjbG9zZU1lbnUgfSBmcm9tICcuL21lbnUnO1xyXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSwgVFRvZ2dsZURhdGEsIFRWYWx1ZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xyXG5pbXBvcnQgeyBkZWxheSwgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgcGVkLCB1cGRhdGVQZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgVE9HR0xFX0lOREVYRVMgZnJvbSAnQGRhdGEvdG9nZ2xlcyc7XHJcbmltcG9ydCB7IFRPdXRmaXREYXRhIH0gZnJvbSAnQHR5cGluZ3Mvb3V0Zml0cyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tICdAdHlwaW5ncy90YXR0b29zJztcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5jYW5jZWwsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0YXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKTtcclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2F2ZSwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRyZXNldFRvZ2dsZXMoYXBwZWFyYW5jZSk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDEwMCk7XHJcblxyXG5cdGNvbnN0IG5ld0FwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblx0bmV3QXBwZWFyYW5jZS50YXR0b29zID0gYXBwZWFyYW5jZS50YXR0b29zIHx8IG51bGxcclxuXHR0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVBcHBlYXJhbmNlJywgZ2V0RnJhbWV3b3JrSUQoKSwgbmV3QXBwZWFyYW5jZSk7XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBuZXdBcHBlYXJhbmNlLnRhdHRvb3MpO1xyXG5cclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0TW9kZWwsIGFzeW5jIChtb2RlbDogc3RyaW5nLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBoYXNoID0gR2V0SGFzaEtleShtb2RlbCk7XHJcblx0aWYgKCFJc01vZGVsSW5DZGltYWdlKGhhc2gpIHx8ICFJc01vZGVsVmFsaWQoaGFzaCkpIHtcclxuXHRcdHJldHVybiBjYigwKTtcclxuXHR9XHJcblxyXG5cclxuXHRjb25zdCBuZXdQZWQgPSBhd2FpdCBzZXRNb2RlbChwZWQsIGhhc2gpO1xyXG5cclxuICAgIHVwZGF0ZVBlZChuZXdQZWQpXHJcblxyXG5cdGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblxyXG5cdGFwcGVhcmFuY2UudGF0dG9vcyA9IFtdO1xyXG5cclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgW10pO1xyXG5cclxuXHRjYihhcHBlYXJhbmNlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZ2V0TW9kZWxUYXR0b29zLCBhc3luYyAoXzogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpO1xyXG5cclxuXHRjYih0YXR0b29zKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZFN0cnVjdHVyZSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0RmFjZUZlYXR1cmUocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZE92ZXJsYXksIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldEhlYWRPdmVybGF5KHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRCbGVuZCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZEJsZW5kKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldFRhdHRvb3MsIGFzeW5jIChkYXRhOiBUVGF0dG9vW10sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0UHJvcCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0bGV0IHRleHR1cmUgPSBzZXRQcm9wKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldERyYXdhYmxlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldERyYXdhYmxlKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnRvZ2dsZUl0ZW0sIGFzeW5jIChkYXRhOiBUVG9nZ2xlRGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgaXRlbSA9IFRPR0dMRV9JTkRFWEVTW2RhdGEuaXRlbV07XHJcblx0aWYgKCFpdGVtKSByZXR1cm4gY2IoZmFsc2UpO1xyXG5cclxuXHRjb25zdCBjdXJyZW50ID0gZGF0YS5kYXRhO1xyXG5cdGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XHJcblx0Y29uc3QgaW5kZXggPSBpdGVtLmluZGV4O1xyXG5cdGNvbnN0IGhvb2sgPSBpdGVtLmhvb2s7XHJcblx0Y29uc3QgaG9va0RhdGEgPSBkYXRhLmhvb2tEYXRhO1xyXG5cclxuXHRpZiAoIWN1cnJlbnQpIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGlmICh0eXBlID09PSAncHJvcCcpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50UHJvcCA9PT0gLTEpIHtcclxuXHRcdFx0c2V0UHJvcChwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdENsZWFyUGVkUHJvcChwZWQsIGluZGV4KTtcclxuXHRcdFx0Y2IodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9IGVsc2UgaWYgKHR5cGUgPT09ICdkcmF3YWJsZScpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnREcmF3YWJsZSA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBpdGVtLm9mZikge1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY3VycmVudC52YWx1ZSA9PT0gY3VycmVudERyYXdhYmxlKSB7XHJcblx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBpdGVtLm9mZiwgMCwgMCk7XHJcblx0XHRcdGlmIChob29rKSB7XHJcblx0XHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rLmRyYXdhYmxlcz8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGNvbnN0IGhvb2tJdGVtID0gaG9vay5kcmF3YWJsZXNbaV07XHJcblx0XHRcdFx0XHRTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBob29rSXRlbS5jb21wb25lbnQsIGhvb2tJdGVtLnZhcmlhbnQsIGhvb2tJdGVtLnRleHR1cmUsIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c2V0RHJhd2FibGUocGVkLCBjdXJyZW50KTtcclxuXHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rRGF0YT8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRzZXREcmF3YWJsZShwZWQsIGhvb2tEYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuKTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlT3V0Zml0LCBhc3luYyAoZGF0YTogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5kZWxldGVPdXRmaXQsIGFzeW5jICh7aWR9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmRlbGV0ZU91dGZpdCcsIGlkKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5yZW5hbWVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVuYW1lT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudXNlT3V0Zml0LCBhc3luYyAob3V0Zml0OiBUT3V0Zml0RGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmltcG9ydE91dGZpdCwgYXN5bmMgKHsgaWQsIG91dGZpdE5hbWUgfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKTtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGZyYW1ld29ya2RJZCwgaWQsIG91dGZpdE5hbWUpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmZldGNoT3V0Zml0LCBhc3luYyAoeyBpZCB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmZldGNoT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLml0ZW1PdXRmaXQsIGFzeW5jIChkYXRhOiB7b3V0Zml0OiBUT3V0Zml0RGF0YSwgbGFiZWw6IHN0cmluZ30sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aXRlbU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxub25OZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnVzZU91dGZpSXRlbScsIChvdXRmaXQ6IFRPdXRmaXREYXRhKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcbn0pIiwgImltcG9ydCB7IGdldEZyYW1ld29ya0lELCByZXF1ZXN0TG9jYWxlLCBzZW5kTlVJRXZlbnQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgdXBkYXRlUGVkLCBwZWQsIGdldFBsYXllckRhdGEsIGdldEpvYkluZm8sIGdldFBsYXllckdlbmRlck1vZGVsIH0gZnJvbSBcIkB1dGlsc1wiXHJcbmltcG9ydCB7IHN0YXJ0Q2FtZXJhLCBzdG9wQ2FtZXJhIH0gZnJvbSBcIi4vY2FtZXJhXCJcclxuaW1wb3J0IHR5cGUgeyBUQXBwZWFyYW5jZVpvbmUsIFRNZW51VHlwZXMgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IE91dGZpdCB9IGZyb20gXCJAdHlwaW5ncy9vdXRmaXRzXCJcclxuaW1wb3J0IHsgU2VuZCB9IGZyb20gXCJAZXZlbnRzXCJcclxuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0VGF0dG9vRGF0YSB9IGZyb20gXCIuL2FwcGVhcmFuY2UvZ2V0dGVyc1wiXHJcbmltcG9ydCBcIi4vaGFuZGxlcnNcIlxyXG5pbXBvcnQgeyBzZXRNb2RlbCB9IGZyb20gXCIuL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXHJcblxyXG5jb25zdCBjb25maWcgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2VcclxubGV0IGFybW91ciA9IDBcclxubGV0IG9wZW4gPSBmYWxzZVxyXG5cclxubGV0IHJlc29sdmVQcm9taXNlID0gbnVsbDtcclxubGV0IHByb21pc2UgPSBudWxsO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5NZW51KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IFRBcHBlYXJhbmNlWm9uZVsndHlwZSddLCBjcmVhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAoem9uZSA9PT0gbnVsbCB8fCBvcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwZWRIYW5kbGUgPSBQbGF5ZXJQZWRJZCgpXHJcbiAgICBjb25zdCBjb25maWdNZW51cyA9IGNvbmZpZy5tZW51cygpXHJcblxyXG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZydcclxuXHJcbiAgICBjb25zdCB0eXBlID0gaXNTdHJpbmcgPyB6b25lIDogem9uZS50eXBlXHJcblxyXG4gICAgY29uc3QgbWVudSA9IGNvbmZpZ01lbnVzW3R5cGVdXHJcbiAgICBpZiAoIW1lbnUpIHJldHVyblxyXG5cclxuICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcblxyXG4gICAgY29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgdGFicyA9IG1lbnUudGFic1xyXG4gICAgbGV0IGFsbG93RXhpdCA9IGNyZWF0aW9uID8gZmFsc2UgOiBtZW51LmFsbG93RXhpdFxyXG5cclxuICAgIGFybW91ciA9IEdldFBlZEFybW91cihwZWRIYW5kbGUpXHJcblxyXG4gICAgbGV0IG91dGZpdHMgPSBbXVxyXG5cclxuICAgIGNvbnN0IGhhc091dGZpdFRhYiA9IHRhYnMuaW5jbHVkZXMoJ291dGZpdHMnKVxyXG4gICAgaWYgKGhhc091dGZpdFRhYikgb3V0Zml0cyA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxPdXRmaXRbXT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldE91dGZpdHMnLCBmcmFtZXdvcmtkSWQpIGFzIE91dGZpdFtdXHJcblxyXG4gICAgbGV0IG1vZGVscyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzSGVyaXRhZ2VUYWIgPSB0YWJzLmluY2x1ZGVzKCdoZXJpdGFnZScpXHJcbiAgICBpZiAoaGFzSGVyaXRhZ2VUYWIpIHtcclxuICAgICAgICBtb2RlbHMgPSBjb25maWcubW9kZWxzKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNUYXR0b29UYWIgPSB0YWJzLmluY2x1ZGVzKCd0YXR0b29zJylcclxuICAgIGxldCB0YXR0b29zXHJcbiAgICBpZiAoaGFzVGF0dG9vVGFiKSB7XHJcbiAgICAgICAgdGF0dG9vcyA9IGdldFRhdHRvb0RhdGEoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJsYWNrbGlzdCA9IGdldEJsYWNrbGlzdCh6b25lKVxyXG5cclxuICAgIGlmIChjcmVhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gR2V0SGFzaEtleShnZXRQbGF5ZXJHZW5kZXJNb2RlbCgpKTtcclxuICAgICAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgICAgICBlbWl0TmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JylcclxuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWRIYW5kbGUpXHJcblxyXG4gICAgc3RhcnRDYW1lcmEoKVxyXG5cclxuICAgIHNlbmROVUlFdmVudChTZW5kLmRhdGEsIHtcclxuICAgICAgICB0YWJzLFxyXG4gICAgICAgIGFwcGVhcmFuY2UsXHJcbiAgICAgICAgYmxhY2tsaXN0LFxyXG4gICAgICAgIHRhdHRvb3MsXHJcbiAgICAgICAgb3V0Zml0cyxcclxuICAgICAgICBtb2RlbHMsXHJcbiAgICAgICAgYWxsb3dFeGl0LFxyXG4gICAgICAgIGpvYjogZ2V0Sm9iSW5mbygpLFxyXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVxdWVzdExvY2FsZSgnbG9jYWxlJylcclxuICAgIH0pXHJcblxyXG4gICAgU2V0TnVpRm9jdXModHJ1ZSwgdHJ1ZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIHRydWUpXHJcblxyXG4gICAgb3BlbiA9IHRydWVcclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZCh0cnVlKVxyXG5cclxuICAgIGlmIChwcm9taXNlKSB7XHJcbiAgICAgICAgYXdhaXQgcHJvbWlzZVxyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlc2V0cm91dGluZ2J1Y2tldCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb21pc2UgPSBudWxsO1xyXG4gICAgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5leHBvcnRzKCdPcGVuTWVudScsIG9wZW5NZW51KVxyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdhcHBlYXJhbmNlJywgYXN5bmMgKF8sIGFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCB0eXBlID0gYXJnc1swXVxyXG4gICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHpvbmUgPSB0eXBlLnRvTG93ZXJDYXNlKCkgYXMgVE1lbnVUeXBlc1xyXG4gICAgICAgIG9wZW5NZW51KHpvbmUpXHJcbiAgICB9XHJcbn0sIHRydWUpXHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0QmxhY2tsaXN0KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IHN0cmluZykge1xyXG4gICAgY29uc3Qge2dyb3VwVHlwZXMsIGJhc2V9ID0gY29uZmlnLmJsYWNrbGlzdCgpXHJcblxyXG4gICAgaWYgKHR5cGVvZiB6b25lID09PSAnc3RyaW5nJykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBpZiAoIWdyb3VwVHlwZXMpIHJldHVybiBiYXNlXHJcblxyXG4gICAgbGV0IGJsYWNrbGlzdCA9IHsuLi5iYXNlfVxyXG5cclxuICAgIGNvbnN0IHBsYXllckRhdGEgPSBnZXRQbGF5ZXJEYXRhKClcclxuXHJcblxyXG4gICAgZm9yIChjb25zdCB0eXBlIGluIGdyb3VwVHlwZXMpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cFR5cGVzW3R5cGVdXHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiBncm91cHMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2VcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09ICdqb2JzJyAmJiB6b25lLmpvYnMpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmpvYnMuaW5jbHVkZXMocGxheWVyRGF0YS5qb2IubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2dhbmdzJyAmJiB6b25lLmdhbmdzKSB7XHJcbiAgICAgICAgICAgICAgICBza2lwID0gem9uZS5nYW5ncy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmdhbmcubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFza2lwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEJsYWNrbGlzdCA9IGdyb3Vwc1tncm91cF1cclxuICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdCwgZ3JvdXBCbGFja2xpc3QsIHtcclxuICAgICAgICAgICAgICAgICAgZHJhd2FibGVzOiBPYmplY3QuYXNzaWduKHt9LCBibGFja2xpc3QuZHJhd2FibGVzLCBncm91cEJsYWNrbGlzdC5kcmF3YWJsZXMpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBibGFja2xpc3RcclxuXHJcbiAgICAvLyByZXR1cm4gYmxhY2tsaXN0XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7XHJcbiAgICBTZXRQZWRBcm1vdXIocGVkLCBhcm1vdXIpXHJcblxyXG4gICAgc3RvcENhbWVyYSgpXHJcbiAgICBTZXROdWlGb2N1cyhmYWxzZSwgZmFsc2UpXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC52aXNpYmxlLCBmYWxzZSlcclxuXHJcblxyXG4gICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmhpZGVIdWQoZmFsc2UpXHJcblxyXG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XHJcbiAgICAgICAgcmVzb2x2ZVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIG9wZW4gPSBmYWxzZVxyXG59XHJcbiIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgb3Blbk1lbnUgfSBmcm9tIFwiLi4vbWVudVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBRQkJyaWRnZSgpIHtcbiAgICBvbk5ldCgncWItY2xvdGhpbmc6Y2xpZW50OmxvYWRQbGF5ZXJDbG90aGluZycsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGVzOmNsaWVudDpDcmVhdGVGaXJzdENoYXJhY3RlcicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6b3Blbk91dGZpdE1lbnUnLCAoKSA9PiB7XG4gICAgICAgIG9wZW5NZW51KHsgdHlwZTogXCJvdXRmaXRzXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0pICBcbiAgICB9KVxufSIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGxheWVyUGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gXCJAdXRpbHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gRVNYQnJpZGdlKCkge1xuICAgIGxldCBmaXJzdFNwYXduID0gZmFsc2VcblxuICAgIG9uKFwiZXN4X3NraW46cmVzZXRGaXJzdFNwYXduXCIsICgpID0+IHtcbiAgICAgICAgZmlyc3RTcGF3biA9IHRydWVcbiAgICB9KTtcblxuICAgIG9uKFwiZXN4X3NraW46cGxheWVyUmVnaXN0ZXJlZFwiLCAoKSA9PiB7XG4gICAgICAgIGlmKGZpcnN0U3Bhd24pXG4gICAgICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbjInLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghYXBwZWFyYW5jZS5tb2RlbCkgYXBwZWFyYW5jZS5tb2RlbCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpO1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpnZXRTa2luJywgYXN5bmMgKGNiOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXG4gICAgICAgIGNiKGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IGFueSkgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXG4gICAgICAgIGlmIChjYikgY2IoKVxuICAgIH0pXG5cbiAgICBvbk5ldCgnZXN4X3NraW46b3BlblNhdmVhYmxlTWVudScsIGFzeW5jIChvblN1Ym1pdDogYW55KSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24ob25TdWJtaXQpXG4gICAgfSlcbn0iLCAiaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0RHJhd2FibGVzLCBnZXRQcm9wcyB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2dldHRlcnNcIjtcbmltcG9ydCB7IHNldERyYXdhYmxlLCBzZXRNb2RlbCwgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGVkVGF0dG9vcywgc2V0UHJvcCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIjtcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiO1xuaW1wb3J0IHsgcGVkLCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCI7XG5cbmZ1bmN0aW9uIGV4cG9ydEhhbmRsZXIobmFtZTogc3RyaW5nLCBjYjogYW55KSB7XG4gICAgb24oJ19fY2Z4X2V4cG9ydF9pbGxlbml1bS1hcHBlYXJhbmNlXycgKyBuYW1lLCAoc2V0Q0I6IGFueSkgPT4ge1xuICAgICAgICBzZXRDQihjYik7XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlsbGVuaXVtQ29tcGF0KCkge1xuICAgIGV4cG9ydEhhbmRsZXIoJ3N0YXJ0UGxheWVyQ3VzdG9taXphdGlvbicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRNb2RlbCcsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gR2V0RW50aXR5TW9kZWwocGVkKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBkcmF3YWJsZXM6IGFueSA9IGdldERyYXdhYmxlcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3ZHJhd2FibGUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBkcmF3YWJsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyYXdhYmxlID0gZHJhd2FibGVzW2lkXTtcbiAgICAgICAgICAgIG5ld2RyYXdhYmxlLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZDogZHJhd2FibGUuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IGRyYXdhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IGRyYXdhYmxlLnRleHR1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZFByb3BzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSAgZ2V0UHJvcHMocGVkKVswXTtcbiAgICAgICAgbGV0IG5ld1Byb3BzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpZF07XG4gICAgICAgICAgICBuZXdQcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9wX2lkOiBwcm9wLmluZGV4LFxuICAgICAgICAgICAgICAgIGRyYXdhYmxlOiBwcm9wLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZEJsZW5kRGF0YShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkRmFjZUZlYXR1cmVzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZFN0cnVjdHVyZShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZE92ZXJsYXlzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZE92ZXJsYXkocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhhaXInLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGFpcihwZWQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRBcHBlYXJhbmNlJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJNb2RlbCcsIChtb2RlbDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxuICAgICAgICBzZXRNb2RlbChwZWQsIG1vZGVsKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRCbGVuZCcsIChwZWQ6IG51bWJlciwgYmxlbmQ6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRCbGVuZChwZWQsIGJsZW5kKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRmFjZUZlYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIsIG92ZXJsYXk6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRPdmVybGF5KHBlZCwgb3ZlcmxheSk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhhaXInLCBhc3luYyAocGVkOiBudW1iZXIsIGhhaXI6IGFueSwgdGF0dG9vOiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRQZWRIYWlyQ29sb3JzKHBlZCwgaGFpcik7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEV5ZUNvbG9yJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnQnLCAocGVkOiBudW1iZXIsIGRyYXdhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICBpbmRleDogZHJhd2FibGUuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgdmFsdWU6IGRyYXdhYmxlLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlciwgY29tcG9uZW50czogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RyYXdhYmxlID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnQuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29tcG9uZW50LnRleHR1cmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRQcm9wJywgKHBlZDogbnVtYmVyLCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICB2YWx1ZTogcHJvcC5kcmF3YWJsZSxcbiAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldFByb3AocGVkLCBuZXdQcm9wKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3BzJywgKHBlZDogbnVtYmVyLCBwcm9wczogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogcHJvcC5wcm9wX2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJBcHBlYXJhbmNlJywgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgLy8gICAgIHJldHVybiBjb25zb2xlLndhcm4oJ05lZWQgdG8gYmUgaW1wbGVtZW50ZWQnKTtcbiAgICAvLyB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIsIGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgICAgIHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkVGF0dG9vcycsIChwZWQ6IG51bWJlciwgdGF0dG9vczogVFRhdHRvb1tdKSA9PiB7XG4gICAgICAgIHNldFBlZFRhdHRvb3MocGVkLCB0YXR0b29zKVxuICAgIH0pO1xufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEFwcGVhcmFuY2Vab25lIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxyXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuL21lbnVcIlxyXG5pbXBvcnQgeyBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuaW1wb3J0IHsgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBnZXRGcmFtZXdvcmtJRCwgRGVsYXksIGJsX2JyaWRnZSwgcGVkLCBkZWxheSwgZm9ybWF0LCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgUUJCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvcWJcIlxyXG5pbXBvcnQgeyBFU1hCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvZXN4XCJcclxuaW1wb3J0IHsgaWxsZW5pdW1Db21wYXQgfSBmcm9tIFwiLi9jb21wYXQvaWxsZW5pdW1cIlxyXG5cclxuZXhwb3J0cygnU2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSB8IHN0cmluZykgPT4ge1xyXG4gICAgbGV0IHJlc29sdmVkQXBwZWFyYW5jZTogVEFwcGVhcmFuY2U7XHJcbiAgICBcclxuICAgIGlmICghYXBwZWFyYW5jZSB8fCB0eXBlb2YgYXBwZWFyYW5jZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRDogc3RyaW5nID0gYXBwZWFyYW5jZSB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpO1xyXG4gICAgICAgIHJlc29sdmVkQXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRCkgYXMgVEFwcGVhcmFuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcHBlYXJhbmNlID09PSAnb2JqZWN0JykgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFyZXNvbHZlZEFwcGVhcmFuY2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZhbGlkIGFwcGVhcmFuY2UgZm91bmQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShyZXNvbHZlZEFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcbmV4cG9ydHMoJ0dldFBsYXllclBlZEFwcGVhcmFuY2UnLCBhc3luYyAoZnJhbWV3b3JrSUQ6IHN0cmluZykgPT4ge1xyXG4gICAgZnJhbWV3b3JrSUQgPSBmcmFtZXdvcmtJRCB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICByZXR1cm4gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG59KVxyXG5cclxuZXhwb3J0cygnSW5pdGlhbENyZWF0aW9uJywgYXN5bmMgKGNiPzogRnVuY3Rpb24pID0+IHtcclxuICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBuZWVkcyB0byBiZSB0eXBlIG9mIFRBcHBlYXJhbmNlWm9uZSBtZWFuaW5nIGl0IG5lZWRzIGEgY29vcmRzIHByb3BlcnR5LCBidXQgaW4gdGhpcyBjYXNlIGl0J3Mgbm90IHVzZWRcclxuICAgIGF3YWl0IG9wZW5NZW51KHsgdHlwZTogXCJhcHBlYXJhbmNlXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0sIHRydWUpXHJcbiAgICBpZiAoY2IpIGNiKClcclxufSlcclxuXHJcbm9uKCdibF9hcHBlYXJhbmNlOmNsaWVudDp1c2Vab25lJywgKHpvbmU6IFRBcHBlYXJhbmNlWm9uZSkgPT4ge1xyXG4gICAgb3Blbk1lbnUoem9uZSlcclxufSlcclxuXHJcbm9uTmV0KCdibF9icmlkZ2U6Y2xpZW50OnBsYXllckxvYWRlZCcsIGFzeW5jICgpID0+IHtcclxuICAgIHdoaWxlICghYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGF3YWl0IERlbGF5KDEwMCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxufSlcclxuXHJcbm9uTmV0KCdvblJlc291cmNlU3RhcnQnLCBhc3luYyAocmVzb3VyY2U6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHJlc291cmNlID09PSBHZXRDdXJyZW50UmVzb3VyY2VOYW1lKCkgJiYgYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICAgICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3QgZnJhbWV3b3JrTmFtZSA9IGJsX2JyaWRnZS5nZXRGcmFtZXdvcmsoJ2NvcmUnKVxyXG5jb25zdCBjb3JlID0gZm9ybWF0KEdldENvbnZhcignYmw6ZnJhbWV3b3JrJywgJ3FiJykpXHJcblxyXG5pZiAoY29yZSA9PSAncWInIHx8IGNvcmUgPT0gJ3FieCcgJiYgR2V0UmVzb3VyY2VTdGF0ZShmcmFtZXdvcmtOYW1lKSA9PSAnc3RhcnRlZCcpIHtcclxuICAgIFFCQnJpZGdlKCk7XHJcbn0gZWxzZSBpZiAoY29yZSA9PSAnZXN4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgRVNYQnJpZGdlKCk7XHJcbn1cclxuXHJcbmlsbGVuaXVtQ29tcGF0KCk7XHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ3JlbG9hZHNraW4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGhlYWx0aCA9IEdldEVudGl0eUhlYWx0aChwZWQpO1xyXG4gICAgY29uc3QgbWF4aGVhbHRoID0gR2V0RW50aXR5TWF4SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBhcm1vciA9IEdldFBlZEFybW91cihwZWQpO1xyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxuXHJcbiAgICBTZXRQZWRNYXhIZWFsdGgocGVkLCBtYXhoZWFsdGgpXHJcbiAgICBkZWxheSgxMDAwKSBcclxuICAgIFNldEVudGl0eUhlYWx0aChwZWQsIGhlYWx0aClcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW9yKVxyXG59LCBmYWxzZSlcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQUFPLElBQUksTUFBTTtBQUVWLElBQU0sWUFBWSx3QkFBQyxjQUFzQjtBQUM1QyxRQUFNO0FBQ1YsR0FGeUI7QUFhbEIsSUFBTSxlQUFlLHdCQUFDLFFBQWdCLFNBQWM7QUFDdkQsaUJBQWU7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBLEVBQ0osQ0FBQztBQUNMLEdBTDRCO0FBT3JCLElBQU0sUUFBUSx3QkFBQyxPQUFlLElBQUksUUFBUSxTQUFPLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBdEQ7QUFFZCxJQUFNLGVBQWUsOEJBQU8sVUFBNEM7QUFDM0UsTUFBSSxZQUFvQixPQUFPLFVBQVUsV0FBVyxRQUFRLFdBQVcsS0FBSztBQUU1RSxNQUFJLENBQUMsYUFBYSxTQUFTLEtBQUssQ0FBQyxpQkFBaUIsU0FBUyxHQUFHO0FBTzFELFlBQVEsS0FBSyxvQ0FBb0MsS0FBSyxHQUFHO0FBQ3pELFdBQU87QUFBQSxFQUNYO0FBRUEsTUFBSSxlQUFlLFNBQVM7QUFBRyxXQUFPO0FBRXRDLGVBQWEsU0FBUztBQUV0QixRQUFNLHFCQUFxQiw2QkFBcUI7QUFDNUMsV0FBTyxJQUFJLFFBQVEsYUFBVztBQUMxQixZQUFNLFdBQVcsWUFBWSxNQUFNO0FBQy9CLFlBQUksZUFBZSxTQUFTLEdBQUc7QUFDM0Isd0JBQWMsUUFBUTtBQUN0QixrQkFBUTtBQUFBLFFBQ1o7QUFBQSxNQUNKLEdBQUcsR0FBRztBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0wsR0FUMkI7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O0FBQ2pCLFVBQU0sdUJBQXVCLFVBQVU7QUFBQSxFQUMzQztBQUNKLENBQUM7QUFFRCxJQUFNLGdCQUFnQixVQUFVLGFBQWEsTUFBTTtBQUNuRCxJQUFNLE9BQU8sT0FBTyxVQUFVLGdCQUFnQixJQUFJLENBQUM7QUFFbkQsSUFBSSxRQUFRLFFBQVEsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUMvRSxXQUFTO0FBQ2IsV0FBVyxRQUFRLFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxXQUFXO0FBQ3RFLFlBQVU7QUFDZDtBQUVBLGVBQWU7QUFFZixnQkFBZ0IsY0FBYyxZQUFZO0FBQ3RDLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxTQUFTLGdCQUFnQixHQUFHO0FBQ2xDLFFBQU0sWUFBWSxtQkFBbUIsR0FBRztBQUN4QyxRQUFNLFFBQVEsYUFBYSxHQUFHO0FBRTlCLFFBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxNQUFJLENBQUM7QUFBWTtBQUNqQixRQUFNLHVCQUF1QixVQUFVO0FBRXZDLGtCQUFnQixLQUFLLFNBQVM7QUFDOUIsUUFBTSxHQUFJO0FBQ1Ysa0JBQWdCLEtBQUssTUFBTTtBQUMzQixlQUFhLEtBQUssS0FBSztBQUMzQixHQUFHLEtBQUs7IiwKICAibmFtZXMiOiBbImRlbGF5IiwgInBlZCIsICJ4IiwgInkiLCAieiIsICJjb25maWciLCAicGVkIiwgInBlZCIsICJwZWQiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NsaWVudC91dGlscy9pbmRleC50cyIsICIuLi8uLi9zcmMvY2xpZW50L2NhbWVyYS50cyIsICIuLi8uLi9zcmMvZGF0YS9oZWFkLnRzIiwgIi4uLy4uL3NyYy9kYXRhL2ZhY2UudHMiLCAiLi4vLi4vc3JjL2RhdGEvZHJhd2FibGVzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3Byb3BzLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9kYXRhL3RvZ2dsZXMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9hcHBlYXJhbmNlL3NldHRlcnMudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9oYW5kbGVycy50cyIsICIuLi8uLi9zcmMvY2xpZW50L21lbnUudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvcWIudHMiLCAiLi4vLi4vc3JjL2NsaWVudC9icmlkZ2UvZXN4LnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvY29tcGF0L2lsbGVuaXVtLnRzIiwgIi4uLy4uL3NyYy9jbGllbnQvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGxldCBwZWQgPSAwXHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlUGVkID0gKHBlZEhhbmRsZTogbnVtYmVyKSA9PiB7XHJcbiAgICBwZWQgPSBwZWRIYW5kbGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlYnVnZGF0YSA9IChkYXRhOiBhbnkpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sIDIpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZE5VSUV2ZW50ID0gKGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcclxuICAgIFNlbmROVUlNZXNzYWdlKHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbixcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGF5ID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0TW9kZWwgPSBhc3luYyAobW9kZWw6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgICBsZXQgbW9kZWxIYXNoOiBudW1iZXIgPSB0eXBlb2YgbW9kZWwgPT09ICdudW1iZXInID8gbW9kZWwgOiBHZXRIYXNoS2V5KG1vZGVsKVxyXG5cclxuICAgIGlmICghSXNNb2RlbFZhbGlkKG1vZGVsSGFzaCkgJiYgIUlzTW9kZWxJbkNkaW1hZ2UobW9kZWxIYXNoKSkge1xyXG4gICAgICAgIC8vIGV4cG9ydHMuYmxfYnJpZGdlLm5vdGlmeSgpKHtcclxuICAgICAgICAvLyAgICAgdGl0bGU6ICdJbnZhbGlkIG1vZGVsIScsXHJcbiAgICAgICAgLy8gICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgLy8gICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgY29uc29sZS53YXJuKGBhdHRlbXB0ZWQgdG8gbG9hZCBpbnZhbGlkIG1vZGVsICcke21vZGVsfSdgKTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFzTW9kZWxMb2FkZWQobW9kZWxIYXNoKSkgcmV0dXJuIG1vZGVsSGFzaFxyXG4gICAgXHJcbiAgICBSZXF1ZXN0TW9kZWwobW9kZWxIYXNoKTtcclxuXHJcbiAgICBjb25zdCB3YWl0Rm9yTW9kZWxMb2FkZWQgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChIYXNNb2RlbExvYWRlZChtb2RlbEhhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB3YWl0Rm9yTW9kZWxMb2FkZWQoKTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxIYXNoO1xyXG59O1xyXG5cclxuXHJcbi8vY2FsbGJhY2tcclxuLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL2NsaWVudC9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcbmNvbnN0IGV2ZW50VGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbmNvbnN0IGFjdGl2ZUV2ZW50czogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuZnVuY3Rpb24gZXZlbnRUaW1lcihldmVudE5hbWU6IHN0cmluZywgZGVsYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IEdldEdhbWVUaW1lcigpO1xyXG5cclxuICAgICAgICBpZiAoKGV2ZW50VGltZXJzW2V2ZW50TmFtZV0gfHwgMCkgPiBjdXJyZW50VGltZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBldmVudFRpbWVyc1tldmVudE5hbWVdID0gY3VycmVudFRpbWUgKyBkZWxheTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZSA9IGFjdGl2ZUV2ZW50c1trZXldO1xyXG4gICAgcmV0dXJuIHJlc29sdmUgJiYgcmVzb2x2ZSguLi5hcmdzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNlcnZlckNhbGxiYWNrPFQgPSB1bmtub3duPihcclxuICAgIGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlcclxuKTogUHJvbWlzZTxUPiB8IHZvaWQge1xyXG4gICAgaWYgKCFldmVudFRpbWVyKGV2ZW50TmFtZSwgMCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBrZXkgPSBgJHtldmVudE5hbWV9OiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDEwMDAwMCArIDEpKX1gO1xyXG4gICAgfSB3aGlsZSAoYWN0aXZlRXZlbnRzW2tleV0pO1xyXG4gICAgZW1pdE5ldChgX2JsX2NiXyR7ZXZlbnROYW1lfWAsIHJlc291cmNlTmFtZSwga2V5LCAuLi5hcmdzKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICBhY3RpdmVFdmVudHNba2V5XSA9IHJlc29sdmU7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNlcnZlckNhbGxiYWNrKGV2ZW50TmFtZSwgY2IpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlLCBrZXksIC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYiguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgY2FsbGJhY2sgZXZlbnQgJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbWl0TmV0KGBfYmxfY2JfJHtyZXNvdXJjZX1gLCBrZXksIHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL2xvY2FsZVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2NhbGUgPSAocmVzb3VyY2VTZXROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrUmVzb3VyY2VGaWxlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoUmVxdWVzdFJlc291cmNlRmlsZVNldChyZXNvdXJjZVNldE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmNvbmZpZygpLmxvY2FsZVxyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvJHtjdXJyZW50TGFufS5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZpbGVDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjdXJyZW50TGFufS5qc29uIG5vdCBmb3VuZCBpbiBsb2NhbGUsIHBsZWFzZSB2ZXJpZnkhLCB3ZSB1c2VkIGVuZ2xpc2ggZm9yIG5vdyFgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZpbGVDb250ZW50ID0gTG9hZFJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIGBsb2NhbGUvZW4uanNvbmApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGxvY2FsZUZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tSZXNvdXJjZUZpbGUsIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2hlY2tSZXNvdXJjZUZpbGUoKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9jYWxlID0gYXN5bmMgKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCBsb2NhbGUgPSBhd2FpdCByZXF1ZXN0TG9jYWxlKCdsb2NhbGUnKTtcclxuICAgIGxldCBhcmdJbmRleCA9IDA7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gbG9jYWxlW2lkXS5yZXBsYWNlKC8lcy9nLCAobWF0Y2g6IHN0cmluZykgPT4gYXJnSW5kZXggPCBhcmdzLmxlbmd0aCA/IGFyZ3NbYXJnSW5kZXhdIDogbWF0Y2gpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmxfYnJpZGdlID0gZXhwb3J0cy5ibF9icmlkZ2VcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJEYXRhID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGJsX2JyaWRnZS5jb3JlKCkuZ2V0UGxheWVyRGF0YSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGcmFtZXdvcmtJRCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gZ2V0UGxheWVyRGF0YSgpLmNpZFxyXG4gICAgcmV0dXJuIGlkXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXJHZW5kZXJNb2RlbCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGdlbmRlciA9IGdldFBsYXllckRhdGEoKS5nZW5kZXJcclxuICAgIHJldHVybiBnZW5kZXIgPT09ICdtYWxlJyA/ICdtcF9tX2ZyZWVtb2RlXzAxJyA6ICdtcF9mX2ZyZWVtb2RlXzAxJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyLmluY2x1ZGVzKFwiJ1wiKSkgcmV0dXJuIHN0cjtcclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJy9nLCBcIlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEpvYkluZm8oKTogeyBuYW1lOiBzdHJpbmcsIGlzQm9zczogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBqb2IgPSBnZXRQbGF5ZXJEYXRhKCkuam9iXHJcbiAgICByZXR1cm4gam9iID8geyBuYW1lOiBqb2IubmFtZSwgaXNCb3NzOiBqb2IuaXNCb3NzIH0gOiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BlZEZyZWVtb2RlTW9kZWwocGVkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkKVxyXG4gICAgcmV0dXJuIG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSB8fCBtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIilcclxufSAgICIsICJpbXBvcnQgeyBDYW1lcmEsIFZlY3RvcjMsIFRDYW1lcmFCb25lcyB9IGZyb20gJ0B0eXBpbmdzL2NhbWVyYSc7XHJcbmltcG9ydCB7IGRlbGF5LCBwZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBSZWNlaXZlIH0gZnJvbSAnQGV2ZW50cyc7XHJcblxyXG5jb25zdCBXSE9MRV9CT0RZX01BWF9ESVNUQU5DRSA9IDIuMDtcclxuY29uc3QgREVGQVVMVF9NQVhfRElTVEFOQ0UgPSAxLjA7XHJcblxyXG5sZXQgcnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5sZXQgY2FtRGlzdGFuY2U6IG51bWJlciA9IDEuODtcclxubGV0IGNhbTogQ2FtZXJhIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbmdsZVk6IG51bWJlciA9IDAuMDtcclxubGV0IGFuZ2xlWjogbnVtYmVyID0gMC4wO1xyXG5sZXQgdGFyZ2V0Q29vcmRzOiBWZWN0b3IzIHwgbnVsbCA9IG51bGw7XHJcbmxldCBvbGRDYW06IENhbWVyYSB8IG51bGwgPSBudWxsO1xyXG5sZXQgY2hhbmdpbmdDYW06IGJvb2xlYW4gPSBmYWxzZTtcclxubGV0IGxhc3RYOiBudW1iZXIgPSAwO1xyXG5sZXQgY3VycmVudEJvbmU6IGtleW9mIFRDYW1lcmFCb25lcyA9ICdoZWFkJztcclxuXHJcbmNvbnN0IENhbWVyYUJvbmVzOiBUQ2FtZXJhQm9uZXMgPSB7XHJcbiAgICB3aG9sZTogMCxcclxuXHRoZWFkOiAzMTA4NixcclxuXHR0b3JzbzogMjQ4MTgsXHJcblx0bGVnczogWzE2MzM1LCA0NjA3OF0sXHJcbiAgICBzaG9lczogWzE0MjAxLCA1MjMwMV0sXHJcbn07XHJcblxyXG5jb25zdCBjb3MgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5jb3MoKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBzaW4gPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRyZXR1cm4gTWF0aC5zaW4oKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MCk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRBbmdsZXMgPSAoKTogbnVtYmVyW10gPT4ge1xyXG5cdGNvbnN0IHggPVxyXG5cdFx0KChjb3MoYW5nbGVaKSAqIGNvcyhhbmdsZVkpICsgY29zKGFuZ2xlWSkgKiBjb3MoYW5nbGVaKSkgLyAyKSAqXHJcblx0XHRjYW1EaXN0YW5jZTtcclxuXHRjb25zdCB5ID1cclxuXHRcdCgoc2luKGFuZ2xlWikgKiBjb3MoYW5nbGVZKSArIGNvcyhhbmdsZVkpICogc2luKGFuZ2xlWikpIC8gMikgKlxyXG5cdFx0Y2FtRGlzdGFuY2U7XHJcblx0Y29uc3QgeiA9IHNpbihhbmdsZVkpICogY2FtRGlzdGFuY2U7XHJcblxyXG5cdHJldHVybiBbeCwgeSwgel07XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1Qb3NpdGlvbiA9IChtb3VzZVg/OiBudW1iZXIsIG1vdXNlWT86IG51bWJlcik6IHZvaWQgPT4ge1xyXG5cdGlmICghcnVubmluZyB8fCAhdGFyZ2V0Q29vcmRzIHx8IGNoYW5naW5nQ2FtKSByZXR1cm47XHJcblxyXG5cdG1vdXNlWCA9IG1vdXNlWCA/PyAwLjA7XHJcblx0bW91c2VZID0gbW91c2VZID8/IDAuMDtcclxuXHJcblx0YW5nbGVaIC09IG1vdXNlWDtcclxuXHRhbmdsZVkgKz0gbW91c2VZO1xyXG5cclxuICAgIGNvbnN0IGlzSGVhZE9yV2hvbGUgPSBjdXJyZW50Qm9uZSA9PT0gJ3dob2xlJyB8fCBjdXJyZW50Qm9uZSA9PT0gJ2hlYWQnO1xyXG4gICAgY29uc3QgbWF4QW5nbGUgPSBpc0hlYWRPcldob2xlID8gODkuMCA6IDcwLjA7XHJcbiAgICBcclxuICAgIGNvbnN0IGlzU2hvZXMgPSBjdXJyZW50Qm9uZSA9PT0gJ3Nob2VzJztcclxuICAgIGNvbnN0IG1pbkFuZ2xlID0gaXNTaG9lcyA/IDUuMCA6IC0yMC4wO1xyXG5cclxuXHRhbmdsZVkgPSBNYXRoLm1pbihNYXRoLm1heChhbmdsZVksIG1pbkFuZ2xlKSwgbWF4QW5nbGUpO1xyXG5cclxuXHRjb25zdCBbeCwgeSwgel0gPSBnZXRBbmdsZXMoKTtcclxuXHJcblx0U2V0Q2FtQ29vcmQoXHJcblx0XHRjYW0sXHJcblx0XHR0YXJnZXRDb29yZHMueCArIHgsXHJcblx0XHR0YXJnZXRDb29yZHMueSArIHksXHJcblx0XHR0YXJnZXRDb29yZHMueiArIHpcclxuXHQpO1xyXG5cdFBvaW50Q2FtQXRDb29yZChjYW0sIHRhcmdldENvb3Jkcy54LCB0YXJnZXRDb29yZHMueSwgdGFyZ2V0Q29vcmRzLnopO1xyXG59O1xyXG5cclxuY29uc3QgbW92ZUNhbWVyYSA9IGFzeW5jIChjb29yZHM6IFZlY3RvcjMsIGRpc3RhbmNlPzogbnVtYmVyKSA9PiB7XHJcblx0Y29uc3QgaGVhZGluZzogbnVtYmVyID0gR2V0RW50aXR5SGVhZGluZyhwZWQpICsgOTQ7XHJcblx0ZGlzdGFuY2UgPSBkaXN0YW5jZSA/PyAxLjA7XHJcblxyXG5cdGNoYW5naW5nQ2FtID0gdHJ1ZTtcclxuXHRjYW1EaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cdGFuZ2xlWiA9IGhlYWRpbmc7XHJcblxyXG5cdGNvbnN0IFt4LCB5LCB6XSA9IGdldEFuZ2xlcygpO1xyXG5cclxuXHRjb25zdCBuZXdjYW06IENhbWVyYSA9IENyZWF0ZUNhbVdpdGhQYXJhbXMoXHJcblx0XHQnREVGQVVMVF9TQ1JJUFRFRF9DQU1FUkEnLFxyXG5cdFx0Y29vcmRzLnggKyB4LFxyXG5cdFx0Y29vcmRzLnkgKyB5LFxyXG5cdFx0Y29vcmRzLnogKyB6LFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0MC4wLFxyXG5cdFx0NzAuMCxcclxuXHRcdGZhbHNlLFxyXG5cdFx0MFxyXG5cdCk7XHJcblxyXG5cdHRhcmdldENvb3JkcyA9IGNvb3JkcztcclxuXHRjaGFuZ2luZ0NhbSA9IGZhbHNlO1xyXG5cdG9sZENhbSA9IGNhbTtcclxuXHRjYW0gPSBuZXdjYW07XHJcblxyXG5cdFBvaW50Q2FtQXRDb29yZChuZXdjYW0sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnopO1xyXG5cdFNldENhbUFjdGl2ZVdpdGhJbnRlcnAobmV3Y2FtLCBvbGRDYW0sIDI1MCwgMCwgMCk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDI1MCk7XHJcblxyXG5cdFNldENhbVVzZVNoYWxsb3dEb2ZNb2RlKG5ld2NhbSwgdHJ1ZSk7XHJcblx0U2V0Q2FtTmVhckRvZihuZXdjYW0sIDAuNCk7XHJcblx0U2V0Q2FtRmFyRG9mKG5ld2NhbSwgMS4yKTtcclxuXHRTZXRDYW1Eb2ZTdHJlbmd0aChuZXdjYW0sIDAuMyk7XHJcblx0dXNlSGlEb2YobmV3Y2FtKTtcclxuXHJcblx0RGVzdHJveUNhbShvbGRDYW0sIHRydWUpO1xyXG59O1xyXG5cclxuY29uc3QgdXNlSGlEb2YgPSAoY3VycmVudGNhbTogQ2FtZXJhKSA9PiB7XHJcblx0aWYgKCEoRG9lc0NhbUV4aXN0KGNhbSkgJiYgY3VycmVudGNhbSA9PSBjYW0pKSByZXR1cm47XHJcblx0U2V0VXNlSGlEb2YoKTtcclxuXHRzZXRUaW1lb3V0KHVzZUhpRG9mLCAwKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydENhbWVyYSA9ICgpID0+IHtcclxuXHRpZiAocnVubmluZykgcmV0dXJuO1xyXG5cdHJ1bm5pbmcgPSB0cnVlO1xyXG5cdGNhbURpc3RhbmNlID0gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0VcclxuXHRjYW0gPSBDcmVhdGVDYW0oJ0RFRkFVTFRfU0NSSVBURURfQ0FNRVJBJywgdHJ1ZSk7XHJcblx0Y29uc3QgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCAzMTA4NiwgMC4wLCAwLjAsIDAuMCk7XHJcblx0U2V0Q2FtQ29vcmQoY2FtLCB4LCB5LCB6KTtcclxuXHRSZW5kZXJTY3JpcHRDYW1zKHRydWUsIHRydWUsIDEwMDAsIHRydWUsIHRydWUpO1xyXG5cdC8vIG1vdmVDYW1lcmEoeyB4OiB4LCB5OiB5LCB6OiB6IH0sIGNhbURpc3RhbmNlKTtcclxuICAgIHNldENhbWVyYSgnd2hvbGUnLCBjYW1EaXN0YW5jZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RvcENhbWVyYSA9ICgpOiB2b2lkID0+IHtcclxuXHRpZiAoIXJ1bm5pbmcpIHJldHVybjtcclxuXHRydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdFJlbmRlclNjcmlwdENhbXMoZmFsc2UsIHRydWUsIDI1MCwgdHJ1ZSwgZmFsc2UpO1xyXG5cdERlc3Ryb3lDYW0oY2FtLCB0cnVlKTtcclxuXHRjYW0gPSBudWxsO1xyXG5cdHRhcmdldENvb3JkcyA9IG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBzZXRDYW1lcmEgPSAodHlwZT86IGtleW9mIFRDYW1lcmFCb25lcywgZGlzdGFuY2UgPSBjYW1EaXN0YW5jZSk6IHZvaWQgPT4ge1xyXG5cclxuXHRjb25zdCBib25lOiBudW1iZXIgfCBudW1iZXJbXSB8IHVuZGVmaW5lZCA9IENhbWVyYUJvbmVzW3R5cGVdO1xyXG5cclxuICAgIGNvbnN0IGlzQm9uZUFycmF5ID0gQXJyYXkuaXNBcnJheShib25lKVxyXG5cclxuICAgIGN1cnJlbnRCb25lID0gdHlwZTtcclxuXHJcbiAgICBpZiAoIWlzQm9uZUFycmF5ICYmIGJvbmUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBbeCwgeSwgel06IG51bWJlcltdID0gR2V0RW50aXR5Q29vcmRzKHBlZCwgZmFsc2UpO1xyXG4gICAgICAgIG1vdmVDYW1lcmEoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgICAgejogeiArIDAuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGlzdGFuY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdHMgbm90IHdob2xlIGJvZHksIHRoZW4gd2UgbmVlZCB0byBsaW1pdCB0aGUgZGlzdGFuY2VcclxuICAgIGlmIChkaXN0YW5jZSA+IERFRkFVTFRfTUFYX0RJU1RBTkNFKSBkaXN0YW5jZSA9IERFRkFVTFRfTUFYX0RJU1RBTkNFO1xyXG5cclxuICAgIGlmIChpc0JvbmVBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHoxXTogbnVtYmVyW10gPSBHZXRQZWRCb25lQ29vcmRzKHBlZCwgYm9uZVswXSwgMC4wLCAwLjAsIDAuMClcclxuXHJcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgejJdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lWzFdLCAwLjAsIDAuMCwgMC4wKVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHBvaW50c1xyXG4gICAgICAgIHZhciB4ID0gKHgxICsgeDIpIC8gMjtcclxuICAgICAgICB2YXIgeSA9ICh5MSArIHkyKSAvIDI7XHJcbiAgICAgICAgdmFyIHogPSAoejEgKyB6MikgLyAyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgW3gsIHksIHpdOiBudW1iZXJbXSA9IEdldFBlZEJvbmVDb29yZHMocGVkLCBib25lLCAwLjAsIDAuMCwgMC4wKVxyXG4gICAgfVxyXG5cclxuXHRtb3ZlQ2FtZXJhKFxyXG5cdFx0e1xyXG5cdFx0XHR4OiB4LFxyXG5cdFx0XHR5OiB5LFxyXG5cdFx0XHR6OiB6ICsgMC4wLFxyXG5cdFx0fSxcclxuXHRcdGRpc3RhbmNlXHJcblx0KTtcclxuXHJcbn07XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuY2FtTW92ZSwgKGRhdGEsIGNiKSA9PiB7XHJcbiAgICBzZXRDYW1Qb3NpdGlvbihkYXRhLngsIGRhdGEueSk7XHJcbiAgICBjYigxKTtcclxufSk7XHJcblxyXG50eXBlIFRTZWN0aW9uID0gJ3dob2xlJyB8ICdoZWFkJyB8ICd0b3JzbycgfCAnbGVncycgfCAnc2hvZXMnO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVNlY3Rpb24sICh0eXBlOiBUU2VjdGlvbiwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnd2hvbGUnOlxyXG4gICAgICAgICAgICBzZXRDYW1lcmEoJ3dob2xlJywgV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdoZWFkJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdoZWFkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RvcnNvJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCd0b3JzbycpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsZWdzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdsZWdzJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Nob2VzJzpcclxuICAgICAgICAgICAgc2V0Q2FtZXJhKCdzaG9lcycpO1xyXG4gICAgICAgICAgICBzZXRDYW1Qb3NpdGlvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHR9XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmNhbVpvb20sIChkYXRhLCBjYikgPT4ge1xyXG5cdGlmIChkYXRhID09PSAnZG93bicpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IGN1cnJlbnRCb25lID09PSAnd2hvbGUnID8gV0hPTEVfQk9EWV9NQVhfRElTVEFOQ0UgOiBERUZBVUxUX01BWF9ESVNUQU5DRTtcclxuXHJcblx0XHRjb25zdCBuZXdEaXN0YW5jZTogbnVtYmVyID0gY2FtRGlzdGFuY2UgKyAwLjA1O1xyXG5cdFx0Y2FtRGlzdGFuY2UgPSBuZXdEaXN0YW5jZSA+PSBtYXhab29tID8gbWF4Wm9vbSA6IG5ld0Rpc3RhbmNlO1xyXG5cdH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VwJykge1xyXG5cdFx0Y29uc3QgbmV3RGlzdGFuY2U6IG51bWJlciA9IGNhbURpc3RhbmNlIC0gMC4wNTtcclxuXHRcdGNhbURpc3RhbmNlID0gbmV3RGlzdGFuY2UgPD0gMC4zID8gMC4zIDogbmV3RGlzdGFuY2U7XHJcblx0fVxyXG5cclxuXHRjYW1EaXN0YW5jZSA9IGNhbURpc3RhbmNlO1xyXG5cdHNldENhbVBvc2l0aW9uKCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG4iLCAiZXhwb3J0IGRlZmF1bHQgW1xuICAgIFwiQmxlbWlzaGVzXCIsXG4gICAgXCJGYWNpYWxIYWlyXCIsXG4gICAgXCJFeWVicm93c1wiLFxuICAgIFwiQWdlaW5nXCIsXG4gICAgXCJNYWtldXBcIixcbiAgICBcIkJsdXNoXCIsXG4gICAgXCJDb21wbGV4aW9uXCIsXG4gICAgXCJTdW5EYW1hZ2VcIixcbiAgICBcIkxpcHN0aWNrXCIsXG4gICAgXCJNb2xlc0ZyZWNrbGVzXCIsXG4gICAgXCJDaGVzdEhhaXJcIixcbiAgICBcIkJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkFkZEJvZHlCbGVtaXNoZXNcIixcbiAgICBcIkV5ZUNvbG9yXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJOb3NlX1dpZHRoXCIsXG4gICAgXCJOb3NlX1BlYWtfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTGVuZ2h0XCIsXG4gICAgXCJOb3NlX0JvbmVfSGVpZ2h0XCIsXG4gICAgXCJOb3NlX1BlYWtfTG93ZXJpbmdcIixcbiAgICBcIk5vc2VfQm9uZV9Ud2lzdFwiLFxuICAgIFwiRXllQnJvd25fSGVpZ2h0XCIsXG4gICAgXCJFeWVCcm93bl9Gb3J3YXJkXCIsXG4gICAgXCJDaGVla3NfQm9uZV9IaWdoXCIsXG4gICAgXCJDaGVla3NfQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hlZWtzX1dpZHRoXCIsXG4gICAgXCJFeWVzX09wZW5uaW5nXCIsXG4gICAgXCJMaXBzX1RoaWNrbmVzc1wiLFxuICAgIFwiSmF3X0JvbmVfV2lkdGhcIixcbiAgICBcIkphd19Cb25lX0JhY2tfTGVuZ2h0XCIsXG4gICAgXCJDaGluX0JvbmVfTG93ZXJpbmdcIixcbiAgICBcIkNoaW5fQm9uZV9MZW5ndGhcIixcbiAgICBcIkNoaW5fQm9uZV9XaWR0aFwiLFxuICAgIFwiQ2hpbl9Ib2xlXCIsXG4gICAgXCJOZWNrX1RoaWtuZXNzXCJcbl1cbiIsICJleHBvcnQgZGVmYXVsdCBbXG4gICAgXCJmYWNlXCIsXG4gICAgXCJtYXNrc1wiLFxuICAgIFwiaGFpclwiLFxuICAgIFwidG9yc29zXCIsXG4gICAgXCJsZWdzXCIsXG4gICAgXCJiYWdzXCIsXG4gICAgXCJzaG9lc1wiLFxuICAgIFwibmVja1wiLFxuICAgIFwic2hpcnRzXCIsXG4gICAgXCJ2ZXN0XCIsXG4gICAgXCJkZWNhbHNcIixcbiAgICBcImphY2tldHNcIlxuXVxuIiwgImV4cG9ydCBkZWZhdWx0IFtcbiAgICBcImhhdHNcIixcbiAgICBcImdsYXNzZXNcIixcbiAgICBcImVhcnJpbmdzXCIsXG4gICAgXCJtb3V0aFwiLFxuICAgIFwibGhhbmRcIixcbiAgICBcInJoYW5kXCIsXG4gICAgXCJ3YXRjaGVzXCIsXG4gICAgXCJicmFjZWxldHNcIlxuXVxuIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUSGFpckRhdGEsIFRIZWFkT3ZlcmxheSwgVEhlYWRPdmVybGF5VG90YWwsIFRDbG90aGVzLCBUU2tpbiB9IGZyb20gXCJAdHlwaW5ncy9hcHBlYXJhbmNlXCJcclxuaW1wb3J0IEhFQURfT1ZFUkxBWVMgZnJvbSBcIkBkYXRhL2hlYWRcIlxyXG5pbXBvcnQgRkFDRV9GRUFUVVJFUyBmcm9tIFwiQGRhdGEvZmFjZVwiXHJcbmltcG9ydCBEUkFXQUJMRV9OQU1FUyBmcm9tIFwiQGRhdGEvZHJhd2FibGVzXCJcclxuaW1wb3J0IFBST1BfTkFNRVMgZnJvbSBcIkBkYXRhL3Byb3BzXCJcclxuaW1wb3J0IHsgcGVkLCBvblNlcnZlckNhbGxiYWNrLCB1cGRhdGVQZWQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gJ0B1dGlscyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSW5kZXgodGFyZ2V0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZVxyXG4gICAgY29uc3QgbW9kZWxzID0gY29uZmlnLm1vZGVscygpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVscy5maW5kSW5kZXgoKG1vZGVsOiBzdHJpbmcpID0+IEdldEhhc2hLZXkobW9kZWwpID09PSB0YXJnZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIYWlyQ29sb3IocGVkSGFuZGxlOiBudW1iZXIpOiBUSGFpckRhdGEge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjb2xvcjogR2V0UGVkSGFpckNvbG9yKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGlnaGxpZ2h0OiBHZXRQZWRIYWlySGlnaGxpZ2h0Q29sb3IocGVkSGFuZGxlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ0dldFBlZEhhaXJDb2xvcicsIGdldEhhaXJDb2xvcik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZEJsZW5kRGF0YShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BlZHIwZm9udG91cmEvZml2ZW0tYXBwZWFyYW5jZS9ibG9iL21haW4vZ2FtZS9zcmMvY2xpZW50L2luZGV4LnRzI0w2N1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgwKTtcclxuICAgIGdsb2JhbC5DaXRpemVuLmludm9rZU5hdGl2ZSgnMHgyNzQ2YmQ5ZDg4YzVjNWQwJywgcGVkSGFuZGxlLCBuZXcgVWludDMyQXJyYXkoYnVmZmVyKSk7XHJcblxyXG4gICAgY29uc3QgeyAwOiBzaGFwZUZpcnN0LCAyOiBzaGFwZVNlY29uZCwgNDogc2hhcGVUaGlyZCwgNjogc2tpbkZpcnN0LCA4OiBza2luU2Vjb25kLCAxODogaGFzUGFyZW50LCAxMDogc2tpblRoaXJkIH0gPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IHsgMDogc2hhcGVNaXgsIDI6IHNraW5NaXgsIDQ6IHRoaXJkTWl4IH0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciwgNDgpO1xyXG5cclxuICAgIC8qICAgXHJcbiAgICAgICAgMDogc2hhcGVGaXJzdCxcclxuICAgICAgICAyOiBzaGFwZVNlY29uZCxcclxuICAgICAgICA0OiBzaGFwZVRoaXJkLFxyXG4gICAgICAgIDY6IHNraW5GaXJzdCxcclxuICAgICAgICA4OiBza2luU2Vjb25kLFxyXG4gICAgICAgIDEwOiBza2luVGhpcmQsXHJcbiAgICAgICAgMTg6IGhhc1BhcmVudCxcclxuICAgICovXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNoYXBlRmlyc3QsICAgLy8gZmF0aGVyXHJcbiAgICAgICAgc2hhcGVTZWNvbmQsIC8vIG1vdGhlclxyXG4gICAgICAgIHNoYXBlVGhpcmQsXHJcblxyXG4gICAgICAgIHNraW5GaXJzdCxcclxuICAgICAgICBza2luU2Vjb25kLFxyXG4gICAgICAgIHNraW5UaGlyZCxcclxuXHJcbiAgICAgICAgc2hhcGVNaXgsIC8vIHJlc2VtYmxhbmNlXHJcblxyXG4gICAgICAgIHRoaXJkTWl4LFxyXG4gICAgICAgIHNraW5NaXgsICAgLy8gc2tpbnBlcmNlbnRcclxuXHJcbiAgICAgICAgaGFzUGFyZW50OiBCb29sZWFuKGhhc1BhcmVudCksXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydHMoJ0dldFBlZEhlYWRCbGVuZCcsIGdldEhlYWRCbGVuZERhdGEpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdG90YWxzOiBUSGVhZE92ZXJsYXlUb3RhbCA9IHt9O1xyXG4gICAgbGV0IGhlYWREYXRhOiBUSGVhZE92ZXJsYXkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IEhFQURfT1ZFUkxBWVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gSEVBRF9PVkVSTEFZU1tpXTtcclxuICAgICAgICB0b3RhbHNbb3ZlcmxheV0gPSBHZXROdW1IZWFkT3ZlcmxheVZhbHVlcyhpKTtcclxuXHJcbiAgICAgICAgaWYgKG92ZXJsYXkgPT09IFwiRXllQ29sb3JcIikge1xyXG4gICAgICAgICAgICBoZWFkRGF0YVtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiBvdmVybGF5LFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5VmFsdWU6IEdldFBlZEV5ZUNvbG9yKHBlZEhhbmRsZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBbXywgb3ZlcmxheVZhbHVlLCBjb2xvdXJUeXBlLCBmaXJzdENvbG9yLCBzZWNvbmRDb2xvciwgb3ZlcmxheU9wYWNpdHldID0gR2V0UGVkSGVhZE92ZXJsYXlEYXRhKHBlZEhhbmRsZSwgaSk7XHJcbiAgICAgICAgICAgIGhlYWREYXRhW292ZXJsYXldID0ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlWYWx1ZTogb3ZlcmxheVZhbHVlID09PSAyNTUgPyAtMSA6IG92ZXJsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGNvbG91clR5cGU6IGNvbG91clR5cGUsXHJcbiAgICAgICAgICAgICAgICBmaXJzdENvbG9yOiBmaXJzdENvbG9yLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kQ29sb3I6IHNlY29uZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheU9wYWNpdHk6IG92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbaGVhZERhdGEsIHRvdGFsc107XHJcbn1cclxuZXhwb3J0cygnR2V0UGVkSGVhZE92ZXJsYXknLCBnZXRIZWFkT3ZlcmxheSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGVkTW9kZWwgPSBHZXRFbnRpdHlNb2RlbChwZWRIYW5kbGUpXHJcblxyXG4gICAgaWYgKHBlZE1vZGVsICE9PSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKSAmJiBwZWRNb2RlbCAhPT0gR2V0SGFzaEtleShcIm1wX2ZfZnJlZW1vZGVfMDFcIikpIHJldHVyblxyXG5cclxuICAgIGxldCBmYWNlU3RydWN0ID0ge31cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRkFDRV9GRUFUVVJFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBGQUNFX0ZFQVRVUkVTW2ldXHJcbiAgICAgICAgZmFjZVN0cnVjdFtvdmVybGF5XSA9IHtcclxuICAgICAgICAgICAgaWQ6IG92ZXJsYXksXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkRmFjZUZlYXR1cmUocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFjZVN0cnVjdFxyXG59XHJcbmV4cG9ydHMoJ0dldFBlZEhlYWRTdHJ1Y3R1cmUnLCBnZXRIZWFkU3RydWN0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREcmF3YWJsZXMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBkcmF3YWJsZXMgPSB7fVxyXG4gICAgbGV0IHRvdGFsRHJhd2FibGVzID0ge31cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERSQVdBQkxFX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IERSQVdBQkxFX05BTUVTW2ldXHJcbiAgICAgICAgY29uc3QgY3VycmVudCA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxEcmF3YWJsZXNbbmFtZV0gPSB7XHJcbiAgICAgICAgICAgIGlkOiBuYW1lLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgdG90YWw6IEdldE51bWJlck9mUGVkRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFRleHR1cmVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSwgY3VycmVudClcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhd2FibGVzW25hbWVdID0ge1xyXG4gICAgICAgICAgICBpZDogbmFtZSxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHZhbHVlOiBHZXRQZWREcmF3YWJsZVZhcmlhdGlvbihwZWRIYW5kbGUsIGkpLFxyXG4gICAgICAgICAgICB0ZXh0dXJlOiBHZXRQZWRUZXh0dXJlVmFyaWF0aW9uKHBlZEhhbmRsZSwgaSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtkcmF3YWJsZXMsIHRvdGFsRHJhd2FibGVzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFBlZERyYXdhYmxlcycsIGdldERyYXdhYmxlcyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocGVkSGFuZGxlOiBudW1iZXIpIHtcclxuICAgIGxldCBwcm9wcyA9IHt9XHJcbiAgICBsZXQgdG90YWxQcm9wcyA9IHt9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBQUk9QX05BTUVTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IFBST1BfTkFNRVNbaV1cclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSlcclxuXHJcbiAgICAgICAgdG90YWxQcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB0b3RhbDogR2V0TnVtYmVyT2ZQZWRQcm9wRHJhd2FibGVWYXJpYXRpb25zKHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmVzOiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGksIGN1cnJlbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wc1tuYW1lXSA9IHtcclxuICAgICAgICAgICAgaWQ6IG5hbWUsXHJcbiAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICB2YWx1ZTogR2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgaSksXHJcbiAgICAgICAgICAgIHRleHR1cmU6IEdldFBlZFByb3BUZXh0dXJlSW5kZXgocGVkSGFuZGxlLCBpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW3Byb3BzLCB0b3RhbFByb3BzXVxyXG59XHJcbmV4cG9ydHMoJ0dldFBlZFByb3BzJywgZ2V0UHJvcHMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFwcGVhcmFuY2UocGVkSGFuZGxlOiBudW1iZXIpOiBQcm9taXNlPFRBcHBlYXJhbmNlPiB7XHJcbiAgICBjb25zdCBbaGVhZERhdGEsIHRvdGFsc10gPSBnZXRIZWFkT3ZlcmxheShwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbZHJhd2FibGVzLCBkcmF3VG90YWxdID0gZ2V0RHJhd2FibGVzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IFtwcm9wcywgcHJvcFRvdGFsXSA9IGdldFByb3BzKHBlZEhhbmRsZSlcclxuICAgIGNvbnN0IG1vZGVsID0gR2V0RW50aXR5TW9kZWwocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgdGF0dG9vcyA9IHBlZEhhbmRsZSA9PSBQbGF5ZXJQZWRJZCgpID8gYXdhaXQgZ2V0VGF0dG9vcygpIDogW11cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGVsSW5kZXg6IGZpbmRNb2RlbEluZGV4KG1vZGVsKSxcclxuICAgICAgICBtb2RlbDogbW9kZWwsXHJcbiAgICAgICAgaGFpckNvbG9yOiBnZXRIYWlyQ29sb3IocGVkSGFuZGxlKSxcclxuICAgICAgICBoZWFkQmxlbmQ6IGdldEhlYWRCbGVuZERhdGEocGVkSGFuZGxlKSxcclxuICAgICAgICBoZWFkT3ZlcmxheTogaGVhZERhdGEgYXMgVEhlYWRPdmVybGF5LFxyXG4gICAgICAgIGhlYWRPdmVybGF5VG90YWw6IHRvdGFscyBhcyBUSGVhZE92ZXJsYXlUb3RhbCxcclxuICAgICAgICBoZWFkU3RydWN0dXJlOiBnZXRIZWFkU3RydWN0dXJlKHBlZEhhbmRsZSksXHJcbiAgICAgICAgZHJhd2FibGVzOiBkcmF3YWJsZXMsXHJcbiAgICAgICAgcHJvcHM6IHByb3BzLFxyXG4gICAgICAgIGRyYXdUb3RhbDogZHJhd1RvdGFsLFxyXG4gICAgICAgIHByb3BUb3RhbDogcHJvcFRvdGFsLFxyXG4gICAgICAgIHRhdHRvb3M6IHRhdHRvb3NcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkQXBwZWFyYW5jZVwiLCBnZXRBcHBlYXJhbmNlKVxyXG5vblNlcnZlckNhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgKCkgPT4ge1xyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICByZXR1cm4gZ2V0QXBwZWFyYW5jZShwZWQpXHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlZENsb3RoZXMocGVkSGFuZGxlOiBudW1iZXIpOiBUQ2xvdGhlcyB7XHJcbiAgICBjb25zdCBbZHJhd2FibGVzXSA9IGdldERyYXdhYmxlcyhwZWRIYW5kbGUpXHJcbiAgICBjb25zdCBbcHJvcHNdID0gZ2V0UHJvcHMocGVkSGFuZGxlKVxyXG4gICAgY29uc3QgW2hlYWREYXRhXSA9IGdldEhlYWRPdmVybGF5KHBlZEhhbmRsZSlcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRPdmVybGF5OiBoZWFkRGF0YSBhcyBUSGVhZE92ZXJsYXksXHJcbiAgICAgICAgZHJhd2FibGVzOiBkcmF3YWJsZXMsXHJcbiAgICAgICAgcHJvcHM6IHByb3BzLFxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoXCJHZXRQZWRDbG90aGVzXCIsIGdldFBlZENsb3RoZXMpXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGVkU2tpbihwZWRIYW5kbGU6IG51bWJlcik6IFRTa2luIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaGVhZEJsZW5kOiBnZXRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSksXHJcbiAgICAgICAgaGVhZFN0cnVjdHVyZTogZ2V0SGVhZFN0cnVjdHVyZShwZWRIYW5kbGUpLFxyXG4gICAgICAgIGhhaXJDb2xvcjogZ2V0SGFpckNvbG9yKHBlZEhhbmRsZSksXHJcbiAgICAgICAgbW9kZWw6IEdldEVudGl0eU1vZGVsKHBlZEhhbmRsZSlcclxuICAgIH1cclxufVxyXG5leHBvcnRzKFwiR2V0UGVkU2tpblwiLCBnZXRQZWRTa2luKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhdHRvb0RhdGEoKSB7XHJcbiAgICBsZXQgdGF0dG9vWm9uZXMgPSBbXVxyXG5cclxuICAgIGNvbnN0IFtUQVRUT09fTElTVCwgVEFUVE9PX0NBVEVHT1JJRVNdID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlLnRhdHRvb3MoKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUQVRUT09fQ0FURUdPUklFUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gVEFUVE9PX0NBVEVHT1JJRVNbaV1cclxuICAgICAgICBjb25zdCB6b25lID0gY2F0ZWdvcnkuem9uZVxyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gY2F0ZWdvcnkubGFiZWxcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNhdGVnb3J5LmluZGV4XHJcbiAgICAgICAgdGF0dG9vWm9uZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgICAgICAgIHpvbmVJbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgIGRsY3M6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFRBVFRPT19MSVNULmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRsY0RhdGEgPSBUQVRUT09fTElTVFtqXVxyXG4gICAgICAgICAgICB0YXR0b29ab25lc1tpbmRleF0uZGxjcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBkbGNEYXRhLmRsYyxcclxuICAgICAgICAgICAgICAgIGRsY0luZGV4OiBqLFxyXG4gICAgICAgICAgICAgICAgdGF0dG9vczogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNGZW1hbGUgPSBHZXRFbnRpdHlNb2RlbChwZWQpID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVEFUVE9PX0xJU1QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gVEFUVE9PX0xJU1RbaV1cclxuICAgICAgICBjb25zdCB7IGRsYywgdGF0dG9vcyB9ID0gZGF0YVxyXG4gICAgICAgIGNvbnN0IGRsY0hhc2ggPSBHZXRIYXNoS2V5KGRsYylcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhdHRvb3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGF0dG9vRGF0YSA9IHRhdHRvb3Nbal1cclxuICAgICAgICAgICAgbGV0IHRhdHRvbyA9IG51bGxcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyVGF0dG9vID0gdGF0dG9vRGF0YS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRmVtYWxlVGF0dG9vID0gbG93ZXJUYXR0b28uaW5jbHVkZXMoXCJfZlwiKVxyXG4gICAgICAgICAgICBpZiAoaXNGZW1hbGVUYXR0b28gJiYgaXNGZW1hbGUpIHtcclxuICAgICAgICAgICAgICAgIHRhdHRvbyA9IHRhdHRvb0RhdGFcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGZW1hbGVUYXR0b28gJiYgIWlzRmVtYWxlKSB7XHJcbiAgICAgICAgICAgICAgICB0YXR0b28gPSB0YXR0b29EYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gbnVsbFxyXG4gICAgICAgICAgICBsZXQgem9uZSA9IC0xXHJcblxyXG4gICAgICAgICAgICBpZiAodGF0dG9vKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNoID0gR2V0SGFzaEtleSh0YXR0b28pXHJcbiAgICAgICAgICAgICAgICB6b25lID0gR2V0UGVkRGVjb3JhdGlvblpvbmVGcm9tSGFzaGVzKGRsY0hhc2gsIGhhc2gpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh6b25lICE9PSAtMSAmJiBoYXNoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lVGF0dG9vcyA9IHRhdHRvb1pvbmVzW3pvbmVdLmRsY3NbaV0udGF0dG9vc1xyXG5cclxuICAgICAgICAgICAgICAgIHpvbmVUYXR0b29zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YXR0b28sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRsYzogZGxjLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGF0dG9vWm9uZXNcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRhdHRvb3MoKTogUHJvbWlzZTxUVGF0dG9vW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldFRhdHRvb3MnKSB8fCBbXVxyXG59XHJcbmV4cG9ydHMoJ0dldFBsYXllclRhdHRvb3MnLCBnZXRUYXR0b29zKTtcclxuLy9taWdyYXRpb25cclxuXHJcbm9uU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50Om1pZ3JhdGlvbjpzZXRBcHBlYXJhbmNlJywgKGRhdGE6IHt0eXBlOiBzdHJpbmcsIGRhdGE6IGFueX0pID0+IHtcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdmaXZlbScpIGV4cG9ydHNbJ2ZpdmVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdpbGxlbml1bScpIGV4cG9ydHNbJ2lsbGVuaXVtLWFwcGVhcmFuY2UnXS5zZXRQbGF5ZXJBcHBlYXJhbmNlKGRhdGEuZGF0YSlcclxufSk7IiwgImV4cG9ydCBkZWZhdWx0IHtcclxuICAgIGhhdHM6IHtcclxuICAgICAgICB0eXBlOiBcInByb3BcIixcclxuICAgICAgICBpbmRleDogMCxcclxuICAgIH0sXHJcbiAgICBnbGFzc2VzOiB7XHJcbiAgICAgICAgdHlwZTogXCJwcm9wXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICB9LFxyXG4gICAgbWFza3M6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgb2ZmOiAwLFxyXG4gICAgfSxcclxuICAgIHNoaXJ0czoge1xyXG4gICAgICAgIHR5cGU6IFwiZHJhd2FibGVcIixcclxuICAgICAgICBpbmRleDogOCxcclxuICAgICAgICBvZmY6IDE1LFxyXG4gICAgICAgIGhvb2s6IHtcclxuICAgICAgICAgICAgZHJhd2FibGVzOiBbXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMywgdmFyaWFudDogMTUsIHRleHR1cmU6IDAsIGlkOiAndG9yc29zJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBjb21wb25lbnQ6IDgsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ3NoaXJ0cycgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGphY2tldHM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDExLFxyXG4gICAgICAgIG9mZjogMTUsXHJcbiAgICAgICAgaG9vazoge1xyXG4gICAgICAgICAgICBkcmF3YWJsZXM6IFtcclxuICAgICAgICAgICAgICAgIHsgY29tcG9uZW50OiAzLCB2YXJpYW50OiAxNSwgdGV4dHVyZTogMCwgaWQ6ICd0b3Jzb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNvbXBvbmVudDogMTEsIHZhcmlhbnQ6IDE1LCB0ZXh0dXJlOiAwLCBpZDogJ2phY2tldHMnIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB2ZXN0OiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA5LFxyXG4gICAgICAgIG9mZjogMCxcclxuICAgIH0sXHJcbiAgICBsZWdzOiB7XHJcbiAgICAgICAgdHlwZTogXCJkcmF3YWJsZVwiLFxyXG4gICAgICAgIGluZGV4OiA0LFxyXG4gICAgICAgIG9mZjogMTgsXHJcbiAgICB9LFxyXG4gICAgc2hvZXM6IHtcclxuICAgICAgICB0eXBlOiBcImRyYXdhYmxlXCIsXHJcbiAgICAgICAgaW5kZXg6IDYsXHJcbiAgICAgICAgb2ZmOiAzNCxcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEhhaXJDb2xvciwgVENsb3RoZXMsIFRTa2luLCBUVmFsdWUsIFRIZWFkU3RydWN0dXJlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcclxuaW1wb3J0IFRPR0dMRV9JTkRFWEVTIGZyb20gXCJAZGF0YS90b2dnbGVzXCJcclxuaW1wb3J0IHsgcmVxdWVzdE1vZGVsLCBwZWQsIHVwZGF0ZVBlZCwgaXNQZWRGcmVlbW9kZU1vZGVsfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBUVGF0dG9vIH0gZnJvbSBcIkB0eXBpbmdzL3RhdHRvb3NcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREcmF3YWJsZShwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldERyYXdhYmxlJylcclxuXHJcbiAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkSGFuZGxlLCBkYXRhLmluZGV4LCBkYXRhLnZhbHVlLCBkYXRhLnRleHR1cmUsIDApXHJcbiAgICByZXR1cm4gR2V0TnVtYmVyT2ZQZWRUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkRHJhd2FibGUnLCBzZXREcmF3YWJsZSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcChwZWRIYW5kbGU6IG51bWJlciwgZGF0YTogVFZhbHVlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFByb3AnKVxyXG5cclxuICAgIGlmIChkYXRhLnZhbHVlID09PSAtMSkge1xyXG4gICAgICAgIENsZWFyUGVkUHJvcChwZWRIYW5kbGUsIGRhdGEuaW5kZXgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgU2V0UGVkUHJvcEluZGV4KHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSwgZGF0YS50ZXh0dXJlLCBmYWxzZSlcclxuICAgIHJldHVybiBHZXROdW1iZXJPZlBlZFByb3BUZXh0dXJlVmFyaWF0aW9ucyhwZWRIYW5kbGUsIGRhdGEuaW5kZXgsIGRhdGEudmFsdWUpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkUHJvcCcsIHNldFByb3ApO1xyXG5cclxuY29uc3QgZGVmTWFsZUhhc2ggPSBHZXRIYXNoS2V5KFwibXBfbV9mcmVlbW9kZV8wMVwiKVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldE1vZGVsID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQXBwZWFyYW5jZSB8IFRTa2luIHwgbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRNb2RlbCcpXHJcbiAgICAgICAgcmV0dXJuIHBlZEhhbmRsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbW9kZWw6IG51bWJlcjtcclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBtb2RlbCA9IEdldEhhc2hLZXkoZGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIG1vZGVsID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9kZWwgPSBkYXRhLm1vZGVsIHx8IGRlZk1hbGVIYXNoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtb2RlbCA9PT0gMCkgcmV0dXJuIHBlZEhhbmRsZTtcclxuXHJcbiAgICBhd2FpdCByZXF1ZXN0TW9kZWwobW9kZWwpO1xyXG5cclxuICAgIGNvbnN0IGlzUGxheWVyID0gSXNQZWRBUGxheWVyKHBlZEhhbmRsZSk7XHJcbiAgICBpZiAoaXNQbGF5ZXIpIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChQbGF5ZXJJZCgpLCBtb2RlbCk7XHJcbiAgICAgICAgcGVkSGFuZGxlID0gUGxheWVyUGVkSWQoKTtcclxuICAgICAgICB1cGRhdGVQZWQocGVkSGFuZGxlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBTZXRQbGF5ZXJNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICBTZXRNb2RlbEFzTm9Mb25nZXJOZWVkZWQobW9kZWwpO1xyXG4gICAgU2V0UGVkRGVmYXVsdENvbXBvbmVudFZhcmlhdGlvbihwZWRIYW5kbGUpO1xyXG5cclxuICAgIGlmICghaXNQZWRGcmVlbW9kZU1vZGVsKHBlZEhhbmRsZSkpIHJldHVybiBwZWRIYW5kbGU7XHJcblxyXG4gICAgY29uc3QgaXNKdXN0TW9kZWwgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGRhdGEgPT09ICdudW1iZXInO1xyXG4gICAgY29uc3QgaGFzSGVhZEJsZW5kID0gIWlzSnVzdE1vZGVsICYmIGRhdGEuaGVhZEJsZW5kICYmIE9iamVjdC5rZXlzKGRhdGEuaGVhZEJsZW5kKS5sZW5ndGggPiAwO1xyXG5cclxuICAgIGlmIChoYXNIZWFkQmxlbmQpIHtcclxuICAgICAgICBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCAoZGF0YSBhcyBUQXBwZWFyYW5jZSB8IFRTa2luKS5oZWFkQmxlbmQpO1xyXG4gICAgICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjAsIDAuMCwgMC4wLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChtb2RlbCA9PT0gR2V0SGFzaEtleShcIm1wX21fZnJlZW1vZGVfMDFcIikpIHtcclxuICAgICAgICAgICAgU2V0UGVkSGVhZEJsZW5kRGF0YShwZWRIYW5kbGUsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMCwgMC4wLCAwLjAsIGZhbHNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBHZXRIYXNoS2V5KFwibXBfZl9mcmVlbW9kZV8wMVwiKSkge1xyXG4gICAgICAgICAgICBTZXRQZWRIZWFkQmxlbmREYXRhKHBlZEhhbmRsZSwgNDUsIDIxLCAwLCAyMCwgMTUsIDAsIDAuMywgMC4xLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZWRIYW5kbGU7XHJcbn07XHJcbmV4cG9ydHMoJ1NldFBlZE1vZGVsJywgc2V0TW9kZWwpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZhY2VGZWF0dXJlKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVmFsdWUpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0RmFjZUZlYXR1cmUnKVxyXG5cclxuICAgIFNldFBlZEZhY2VGZWF0dXJlKHBlZEhhbmRsZSwgZGF0YS5pbmRleCwgZGF0YS52YWx1ZSArIDAuMClcclxufVxyXG5leHBvcnRzKCdTZXRQZWRGYWNlRmVhdHVyZScsIHNldEZhY2VGZWF0dXJlKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRIZWFkU3RydWN0dXJlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldEZhY2VGZWF0dXJlcycpXHJcbiAgICAgICAgXHJcblxyXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIGluIGRhdGEpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbZmVhdHVyZV1cclxuICAgICAgICBzZXRGYWNlRmVhdHVyZShwZWRIYW5kbGUsIHZhbHVlKVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEZhY2VGZWF0dXJlcycsIHNldEZhY2VGZWF0dXJlcyk7XHJcblxyXG5jb25zdCBpc1Bvc2l0aXZlID0gKHZhbDogbnVtYmVyKSA9PiB2YWwgPj0gMCA/IHZhbCA6IDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRIZWFkQmxlbmQocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZEJsZW5kJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBwZWRIYW5kbGUgfHwgcGVkXHJcblxyXG4gICAgaWYgKCFpc1BlZEZyZWVtb2RlTW9kZWwocGVkSGFuZGxlKSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qgc2hhcGVGaXJzdCA9IGlzUG9zaXRpdmUoZGF0YS5zaGFwZUZpcnN0KVxyXG4gICAgY29uc3Qgc2hhcGVTZWNvbmQgPSBpc1Bvc2l0aXZlKGRhdGEuc2hhcGVTZWNvbmQpXHJcbiAgICBjb25zdCBzaGFwZVRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNoYXBlVGhpcmQpXHJcbiAgICBjb25zdCBza2luRmlyc3QgPSBpc1Bvc2l0aXZlKGRhdGEuc2tpbkZpcnN0KVxyXG4gICAgY29uc3Qgc2tpblNlY29uZCA9IGlzUG9zaXRpdmUoZGF0YS5za2luU2Vjb25kKVxyXG4gICAgY29uc3Qgc2tpblRoaXJkID0gaXNQb3NpdGl2ZShkYXRhLnNraW5UaGlyZClcclxuICAgIGNvbnN0IHNoYXBlTWl4ID0gZGF0YS5zaGFwZU1peCArIDAuMFxyXG4gICAgY29uc3Qgc2tpbk1peCA9IGRhdGEuc2tpbk1peCArIDAuMFxyXG4gICAgY29uc3QgdGhpcmRNaXggPSBkYXRhLnRoaXJkTWl4ICsgMC4wXHJcbiAgICBjb25zdCBoYXNQYXJlbnQgPSBkYXRhLmhhc1BhcmVudFxyXG5cclxuICAgIFNldFBlZEhlYWRCbGVuZERhdGEocGVkSGFuZGxlLCBzaGFwZUZpcnN0LCBzaGFwZVNlY29uZCwgc2hhcGVUaGlyZCwgc2tpbkZpcnN0LCBza2luU2Vjb25kLCBza2luVGhpcmQsIHNoYXBlTWl4LCBza2luTWl4LCB0aGlyZE1peCwgaGFzUGFyZW50KVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEhlYWRCbGVuZCcsIHNldEhlYWRCbGVuZCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlOiBudW1iZXIsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0SGVhZE92ZXJsYXknKVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gZGF0YS5pbmRleFxyXG5cclxuICAgIGlmIChpbmRleCA9PT0gMTMpIHtcclxuICAgICAgICBTZXRQZWRFeWVDb2xvcihwZWRIYW5kbGUsIGRhdGEudmFsdWUpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLm92ZXJsYXlWYWx1ZVxyXG5cclxuICAgIC8qIEhhaXIgY29sb3IgZG9lcyBub3QgaGF2ZSBhbiBpbmRleCwgb25seSBhbiBJRCBzbyB3ZSdsbCBjaGVjayBmb3IgdGhhdCAqL1xyXG4gICAgaWYgKGRhdGEuaWQgPT09ICdoYWlyQ29sb3InKSB7XHJcbiAgICAgICAgU2V0UGVkSGFpclRpbnQocGVkSGFuZGxlLCBkYXRhLmhhaXJDb2xvciwgZGF0YS5oYWlySGlnaGxpZ2h0KVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBTZXRQZWRIZWFkT3ZlcmxheShwZWRIYW5kbGUsIGluZGV4LCB2YWx1ZSwgZGF0YS5vdmVybGF5T3BhY2l0eSArIDAuMClcclxuICAgIFNldFBlZEhlYWRPdmVybGF5Q29sb3IocGVkSGFuZGxlLCBpbmRleCwgMSwgZGF0YS5maXJzdENvbG9yLCBkYXRhLnNlY29uZENvbG9yKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEhlYWRPdmVybGF5Jywgc2V0SGVhZE92ZXJsYXkpO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFRvZ2dsZXMoZGF0YSkge1xyXG4gICAgY29uc3QgZHJhd2FibGVzID0gZGF0YS5kcmF3YWJsZXNcclxuICAgIGNvbnN0IHByb3BzID0gZGF0YS5wcm9wc1xyXG5cclxuICAgIGZvciAoY29uc3QgW3RvZ2dsZUl0ZW0sIHRvZ2dsZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFRPR0dMRV9JTkRFWEVTKSkge1xyXG4gICAgICAgIGNvbnN0IHRvZ2dsZVR5cGUgPSB0b2dnbGVEYXRhLnR5cGVcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRvZ2dsZURhdGEuaW5kZXhcclxuXHJcbiAgICAgICAgaWYgKHRvZ2dsZVR5cGUgPT09IFwiZHJhd2FibGVcIiAmJiBkcmF3YWJsZXNbdG9nZ2xlSXRlbV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERyYXdhYmxlID0gR2V0UGVkRHJhd2FibGVWYXJpYXRpb24ocGVkLCBpbmRleClcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnREcmF3YWJsZSAhPT0gZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBpbmRleCwgZHJhd2FibGVzW3RvZ2dsZUl0ZW1dLnZhbHVlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b2dnbGVUeXBlID09PSBcInByb3BcIiAmJiBwcm9wc1t0b2dnbGVJdGVtXSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcCA9IEdldFBlZFByb3BJbmRleChwZWQsIGluZGV4KVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFByb3AgIT09IHByb3BzW3RvZ2dsZUl0ZW1dLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBTZXRQZWRQcm9wSW5kZXgocGVkLCBpbmRleCwgcHJvcHNbdG9nZ2xlSXRlbV0udmFsdWUsIDAsIGZhbHNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRDbG90aGVzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRDbG90aGVzJylcclxuXHJcbiAgICBjb25zdCBkcmF3YWJsZXMgPSBkYXRhLmRyYXdhYmxlc1xyXG4gICAgY29uc3QgcHJvcHMgPSBkYXRhLnByb3BzXHJcbiAgICBjb25zdCBoZWFkT3ZlcmxheSA9IGRhdGEuaGVhZE92ZXJsYXlcclxuICAgIGZvciAoY29uc3QgaWQgaW4gZHJhd2FibGVzKSB7XHJcbiAgICAgICAgY29uc3QgZHJhd2FibGUgPSBkcmF3YWJsZXNbaWRdXHJcbiAgICAgICAgc2V0RHJhd2FibGUocGVkSGFuZGxlLCBkcmF3YWJsZSlcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGlkIGluIHByb3BzKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2lkXVxyXG4gICAgICAgIHNldFByb3AocGVkSGFuZGxlLCBwcm9wKVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaWQgaW4gaGVhZE92ZXJsYXkpIHtcclxuICAgICAgICBjb25zdCBvdmVybGF5ID0gaGVhZE92ZXJsYXlbaWRdXHJcbiAgICAgICAgc2V0SGVhZE92ZXJsYXkocGVkSGFuZGxlLCBvdmVybGF5KVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZENsb3RoZXMnLCBzZXRQZWRDbG90aGVzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRQZWRTa2luID0gYXN5bmMgKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUU2tpbikgPT4ge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gY29uc29sZS53YXJuKCdObyBkYXRhIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBpZiAoIXBlZEhhbmRsZSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gcGVkSGFuZGxlIHByb3ZpZGVkIGZvciBzZXRQZWRTa2luJylcclxuXHJcbiAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIGRhdGEpXHJcblxyXG4gICAgY29uc3QgaGVhZFN0cnVjdHVyZSA9IGRhdGEuaGVhZFN0cnVjdHVyZVxyXG4gICAgY29uc3QgaGVhZEJsZW5kID0gZGF0YS5oZWFkQmxlbmRcclxuXHJcbiAgICBpZiAoaGVhZEJsZW5kKSBzZXRIZWFkQmxlbmQocGVkSGFuZGxlLCBoZWFkQmxlbmQpXHJcbiAgICBcclxuICAgIGlmIChoZWFkU3RydWN0dXJlKSBzZXRGYWNlRmVhdHVyZXMocGVkSGFuZGxlLCBoZWFkU3RydWN0dXJlKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUVGF0dG9vW10pIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNvbnNvbGUud2FybignTm8gZGF0YSBwcm92aWRlZCBmb3Igc2V0UGVkVGF0dG9vcycpXHJcblxyXG4gICAgQ2xlYXJQZWREZWNvcmF0aW9uc0xlYXZlU2NhcnMocGVkSGFuZGxlKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRhdHRvb0RhdGEgPSBkYXRhW2ldLnRhdHRvb1xyXG4gICAgICAgIGlmICh0YXR0b29EYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBHZXRIYXNoS2V5KHRhdHRvb0RhdGEuZGxjKVxyXG4gICAgICAgICAgICBjb25zdCB0YXR0b28gPSB0YXR0b29EYXRhLmhhc2hcclxuICAgICAgICAgICAgQWRkUGVkRGVjb3JhdGlvbkZyb21IYXNoZXMocGVkSGFuZGxlLCBjb2xsZWN0aW9uLCB0YXR0b28pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZFRhdHRvb3MnLCBzZXRQZWRUYXR0b29zKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZTogbnVtYmVyLCBkYXRhOiBUSGFpckNvbG9yKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEhhaXJDb2xvcnMnKVxyXG5cclxuICAgIGNvbnN0IGNvbG9yID0gZGF0YS5jb2xvclxyXG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gZGF0YS5oaWdobGlnaHRcclxuICAgIFNldFBlZEhhaXJDb2xvcihwZWRIYW5kbGUsIGNvbG9yLCBoaWdobGlnaHQpXHJcbn1cclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFBlZEFwcGVhcmFuY2UocGVkSGFuZGxlOiBudW1iZXIsIGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBlZEFwcGVhcmFuY2UnKVxyXG5cclxuICAgIGlmIChJc1BlZEFQbGF5ZXIocGVkSGFuZGxlKSkge1xyXG4gICAgICAgIHNldFBsYXllclBlZEFwcGVhcmFuY2UoZGF0YSlcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGF3YWl0IHNldFBlZFNraW4ocGVkSGFuZGxlLCBkYXRhKVxyXG4gICAgc2V0UGVkQ2xvdGhlcyhwZWRIYW5kbGUsIGRhdGEpXHJcbiAgICBzZXRQZWRIYWlyQ29sb3JzKHBlZEhhbmRsZSwgZGF0YS5oYWlyQ29sb3IpXHJcbiAgICBzZXRQZWRUYXR0b29zKHBlZEhhbmRsZSwgZGF0YS50YXR0b29zKVxyXG59XHJcbmV4cG9ydHMoJ1NldFBlZEFwcGVhcmFuY2UnLCBzZXRQZWRBcHBlYXJhbmNlKTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGRhdGE6IFRBcHBlYXJhbmNlKSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBjb25zb2xlLndhcm4oJ05vIGRhdGEgcHJvdmlkZWQgZm9yIHNldFBsYXllclBlZEFwcGVhcmFuY2UnKVxyXG4gICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBhZnRlciBzY3JpcHRzIHNldCB0aGVpciBvd24gbW9kZWwsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYmVmb3JlIHdlIHNldCB0aGUgYXBwZWFyYW5jZVxyXG4gICAgdXBkYXRlUGVkKFBsYXllclBlZElkKCkpXHJcbiAgICBhd2FpdCBzZXRQZWRTa2luKHBlZCwgZGF0YSlcclxuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwZWQgYWdhaW4gYWZ0ZXIgc2V0dGluZyB0aGUgc2tpbiBiZWNhdXNlIFNldFBsYXllck1vZGVsIHdpbGwgc2V0IGEgbmV3IFBsYXllclBlZElkXHJcbiAgICB1cGRhdGVQZWQoUGxheWVyUGVkSWQoKSlcclxuICAgIHNldFBlZENsb3RoZXMocGVkLCBkYXRhKVxyXG4gICAgc2V0UGVkSGFpckNvbG9ycyhwZWQsIGRhdGEuaGFpckNvbG9yKVxyXG4gICAgc2V0UGVkVGF0dG9vcyhwZWQsIGRhdGEudGF0dG9vcylcclxufVxyXG5cclxuZXhwb3J0cygnU2V0UGVkQ2xvdGhlcycsIHNldFBlZENsb3RoZXMpXHJcbmV4cG9ydHMoJ1NldFBlZFNraW4nLCBzZXRQZWRTa2luKVxyXG5leHBvcnRzKCdTZXRQZWRUYXR0b29zJywgc2V0UGVkVGF0dG9vcylcclxuZXhwb3J0cygnU2V0UGVkSGFpckNvbG9ycycsIHNldFBlZEhhaXJDb2xvcnMpIiwgImltcG9ydCB7IFJlY2VpdmUgfSBmcm9tICdAZXZlbnRzJztcclxuaW1wb3J0IHtcclxuXHRyZXNldFRvZ2dsZXMsXHJcblx0c2V0RHJhd2FibGUsXHJcblx0c2V0RmFjZUZlYXR1cmUsXHJcblx0c2V0SGVhZEJsZW5kLFxyXG5cdHNldEhlYWRPdmVybGF5LFxyXG5cdHNldE1vZGVsLFxyXG5cdHNldFBlZENsb3RoZXMsXHJcblx0c2V0UGVkVGF0dG9vcyxcclxuXHRzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlLFxyXG5cdHNldFByb3AsXHJcbn0gZnJvbSAnLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xyXG5pbXBvcnQgeyBjbG9zZU1lbnUgfSBmcm9tICcuL21lbnUnO1xyXG5pbXBvcnQgeyBUQXBwZWFyYW5jZSwgVFRvZ2dsZURhdGEsIFRWYWx1ZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xyXG5pbXBvcnQgeyBkZWxheSwgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgcGVkLCB1cGRhdGVQZWQgfSBmcm9tICdAdXRpbHMnO1xyXG5pbXBvcnQgeyBnZXRBcHBlYXJhbmNlLCBnZXRUYXR0b29EYXRhIH0gZnJvbSAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgVE9HR0xFX0lOREVYRVMgZnJvbSAnQGRhdGEvdG9nZ2xlcyc7XHJcbmltcG9ydCB7IFRPdXRmaXREYXRhIH0gZnJvbSAnQHR5cGluZ3Mvb3V0Zml0cyc7XHJcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tICdAdHlwaW5ncy90YXR0b29zJztcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5jYW5jZWwsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0YXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKTtcclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2F2ZSwgYXN5bmMgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRyZXNldFRvZ2dsZXMoYXBwZWFyYW5jZSk7XHJcblxyXG5cdGF3YWl0IGRlbGF5KDEwMCk7XHJcblxyXG5cdGNvbnN0IG5ld0FwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblx0bmV3QXBwZWFyYW5jZS50YXR0b29zID0gYXBwZWFyYW5jZS50YXR0b29zIHx8IG51bGxcclxuXHR0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVBcHBlYXJhbmNlJywgZ2V0RnJhbWV3b3JrSUQoKSwgbmV3QXBwZWFyYW5jZSk7XHJcblxyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBuZXdBcHBlYXJhbmNlLnRhdHRvb3MpO1xyXG5cclxuXHRjbG9zZU1lbnUoKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0TW9kZWwsIGFzeW5jIChtb2RlbDogc3RyaW5nLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCBoYXNoID0gR2V0SGFzaEtleShtb2RlbCk7XHJcblx0aWYgKCFJc01vZGVsSW5DZGltYWdlKGhhc2gpIHx8ICFJc01vZGVsVmFsaWQoaGFzaCkpIHtcclxuXHRcdHJldHVybiBjYigwKTtcclxuXHR9XHJcblxyXG5cclxuXHRjb25zdCBuZXdQZWQgPSBhd2FpdCBzZXRNb2RlbChwZWQsIGhhc2gpO1xyXG5cclxuICAgIHVwZGF0ZVBlZChuZXdQZWQpXHJcblxyXG5cdGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCBnZXRBcHBlYXJhbmNlKHBlZCk7XHJcblxyXG5cdGFwcGVhcmFuY2UudGF0dG9vcyA9IFtdO1xyXG5cclxuXHRzZXRQZWRUYXR0b29zKHBlZCwgW10pO1xyXG5cclxuXHRjYihhcHBlYXJhbmNlKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuZ2V0TW9kZWxUYXR0b29zLCBhc3luYyAoXzogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCB0YXR0b29zID0gZ2V0VGF0dG9vRGF0YSgpO1xyXG5cclxuXHRjYih0YXR0b29zKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZFN0cnVjdHVyZSwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0RmFjZUZlYXR1cmUocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0SGVhZE92ZXJsYXksIGFzeW5jIChkYXRhOiBUVmFsdWUsIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldEhlYWRPdmVybGF5KHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldEhlYWRCbGVuZCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0SGVhZEJsZW5kKHBlZCwgZGF0YSk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldFRhdHRvb3MsIGFzeW5jIChkYXRhOiBUVGF0dG9vW10sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdHNldFBlZFRhdHRvb3MocGVkLCBkYXRhKTtcclxuXHRjYigxKTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUuc2V0UHJvcCwgYXN5bmMgKGRhdGE6IFRWYWx1ZSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0bGV0IHRleHR1cmUgPSBzZXRQcm9wKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnNldERyYXdhYmxlLCBhc3luYyAoZGF0YTogVFZhbHVlLCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRsZXQgdGV4dHVyZSA9IHNldERyYXdhYmxlKHBlZCwgZGF0YSk7XHJcblx0Y2IodGV4dHVyZSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLnRvZ2dsZUl0ZW0sIGFzeW5jIChkYXRhOiBUVG9nZ2xlRGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgaXRlbSA9IFRPR0dMRV9JTkRFWEVTW2RhdGEuaXRlbV07XHJcblx0aWYgKCFpdGVtKSByZXR1cm4gY2IoZmFsc2UpO1xyXG5cclxuXHRjb25zdCBjdXJyZW50ID0gZGF0YS5kYXRhO1xyXG5cdGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XHJcblx0Y29uc3QgaW5kZXggPSBpdGVtLmluZGV4O1xyXG5cdGNvbnN0IGhvb2sgPSBpdGVtLmhvb2s7XHJcblx0Y29uc3QgaG9va0RhdGEgPSBkYXRhLmhvb2tEYXRhO1xyXG5cclxuXHRpZiAoIWN1cnJlbnQpIHJldHVybiBjYihmYWxzZSk7XHJcblxyXG5cdGlmICh0eXBlID09PSAncHJvcCcpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnRQcm9wID0gR2V0UGVkUHJvcEluZGV4KHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50UHJvcCA9PT0gLTEpIHtcclxuXHRcdFx0c2V0UHJvcChwZWQsIGN1cnJlbnQpO1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdENsZWFyUGVkUHJvcChwZWQsIGluZGV4KTtcclxuXHRcdFx0Y2IodHJ1ZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9IGVsc2UgaWYgKHR5cGUgPT09ICdkcmF3YWJsZScpIHtcclxuXHRcdGNvbnN0IGN1cnJlbnREcmF3YWJsZSA9IEdldFBlZERyYXdhYmxlVmFyaWF0aW9uKHBlZCwgaW5kZXgpO1xyXG5cclxuXHRcdGlmIChjdXJyZW50LnZhbHVlID09PSBpdGVtLm9mZikge1xyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY3VycmVudC52YWx1ZSA9PT0gY3VycmVudERyYXdhYmxlKSB7XHJcblx0XHRcdFNldFBlZENvbXBvbmVudFZhcmlhdGlvbihwZWQsIGluZGV4LCBpdGVtLm9mZiwgMCwgMCk7XHJcblx0XHRcdGlmIChob29rKSB7XHJcblx0XHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rLmRyYXdhYmxlcz8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGNvbnN0IGhvb2tJdGVtID0gaG9vay5kcmF3YWJsZXNbaV07XHJcblx0XHRcdFx0XHRTZXRQZWRDb21wb25lbnRWYXJpYXRpb24ocGVkLCBob29rSXRlbS5jb21wb25lbnQsIGhvb2tJdGVtLnZhcmlhbnQsIGhvb2tJdGVtLnRleHR1cmUsIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRjYih0cnVlKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c2V0RHJhd2FibGUocGVkLCBjdXJyZW50KTtcclxuXHRcdFx0Zm9yKGxldCBpPTA7IGkgPCBob29rRGF0YT8ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRzZXREcmF3YWJsZShwZWQsIGhvb2tEYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYihmYWxzZSk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuKTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5zYXZlT3V0Zml0LCBhc3luYyAoZGF0YTogYW55LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBkYXRhKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5kZWxldGVPdXRmaXQsIGFzeW5jICh7aWR9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmRlbGV0ZU91dGZpdCcsIGlkKTtcclxuXHRjYihyZXN1bHQpO1xyXG59KTtcclxuXHJcblJlZ2lzdGVyTnVpQ2FsbGJhY2soUmVjZWl2ZS5yZW5hbWVPdXRmaXQsIGFzeW5jIChkYXRhOiBhbnksIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVuYW1lT3V0Zml0JywgZGF0YSk7XHJcblx0Y2IocmVzdWx0KTtcclxufSk7XHJcblxyXG5SZWdpc3Rlck51aUNhbGxiYWNrKFJlY2VpdmUudXNlT3V0Zml0LCBhc3luYyAob3V0Zml0OiBUT3V0Zml0RGF0YSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcblx0Y2IoMSk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmltcG9ydE91dGZpdCwgYXN5bmMgKHsgaWQsIG91dGZpdE5hbWUgfSwgY2I6IEZ1bmN0aW9uKSA9PiB7XHJcblx0Y29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKTtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGZyYW1ld29ya2RJZCwgaWQsIG91dGZpdE5hbWUpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLmZldGNoT3V0Zml0LCBhc3luYyAoeyBpZCB9LCBjYjogRnVuY3Rpb24pID0+IHtcclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmZldGNoT3V0Zml0JywgaWQpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJOdWlDYWxsYmFjayhSZWNlaXZlLml0ZW1PdXRmaXQsIGFzeW5jIChkYXRhOiB7b3V0Zml0OiBUT3V0Zml0RGF0YSwgbGFiZWw6IHN0cmluZ30sIGNiOiBGdW5jdGlvbikgPT4ge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aXRlbU91dGZpdCcsIGRhdGEpO1xyXG5cdGNiKHJlc3VsdCk7XHJcbn0pO1xyXG5cclxub25OZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnVzZU91dGZpSXRlbScsIChvdXRmaXQ6IFRPdXRmaXREYXRhKSA9PiB7XHJcblx0c2V0UGVkQ2xvdGhlcyhwZWQsIG91dGZpdCk7XHJcbn0pIiwgImltcG9ydCB7IGdldEZyYW1ld29ya0lELCByZXF1ZXN0TG9jYWxlLCBzZW5kTlVJRXZlbnQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjaywgdXBkYXRlUGVkLCBwZWQsIGdldFBsYXllckRhdGEsIGdldEpvYkluZm8sIGdldFBsYXllckdlbmRlck1vZGVsIH0gZnJvbSBcIkB1dGlsc1wiXHJcbmltcG9ydCB7IHN0YXJ0Q2FtZXJhLCBzdG9wQ2FtZXJhIH0gZnJvbSBcIi4vY2FtZXJhXCJcclxuaW1wb3J0IHR5cGUgeyBUQXBwZWFyYW5jZVpvbmUsIFRNZW51VHlwZXMgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiXHJcbmltcG9ydCB7IE91dGZpdCB9IGZyb20gXCJAdHlwaW5ncy9vdXRmaXRzXCJcclxuaW1wb3J0IHsgU2VuZCB9IGZyb20gXCJAZXZlbnRzXCJcclxuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0VGF0dG9vRGF0YSB9IGZyb20gXCIuL2FwcGVhcmFuY2UvZ2V0dGVyc1wiXHJcbmltcG9ydCBcIi4vaGFuZGxlcnNcIlxyXG5pbXBvcnQgeyBzZXRNb2RlbCB9IGZyb20gXCIuL2FwcGVhcmFuY2Uvc2V0dGVyc1wiXHJcblxyXG5jb25zdCBjb25maWcgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2VcclxubGV0IGFybW91ciA9IDBcclxubGV0IG9wZW4gPSBmYWxzZVxyXG5cclxubGV0IHJlc29sdmVQcm9taXNlID0gbnVsbDtcclxubGV0IHByb21pc2UgPSBudWxsO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5NZW51KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IFRBcHBlYXJhbmNlWm9uZVsndHlwZSddLCBjcmVhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAoem9uZSA9PT0gbnVsbCB8fCBvcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwZWRIYW5kbGUgPSBQbGF5ZXJQZWRJZCgpXHJcbiAgICBjb25zdCBjb25maWdNZW51cyA9IGNvbmZpZy5tZW51cygpXHJcblxyXG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZydcclxuXHJcbiAgICBjb25zdCB0eXBlID0gaXNTdHJpbmcgPyB6b25lIDogem9uZS50eXBlXHJcblxyXG4gICAgY29uc3QgbWVudSA9IGNvbmZpZ01lbnVzW3R5cGVdXHJcbiAgICBpZiAoIW1lbnUpIHJldHVyblxyXG5cclxuICAgIHVwZGF0ZVBlZChwZWRIYW5kbGUpXHJcblxyXG4gICAgY29uc3QgZnJhbWV3b3JrZElkID0gZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgY29uc3QgdGFicyA9IG1lbnUudGFic1xyXG4gICAgbGV0IGFsbG93RXhpdCA9IGNyZWF0aW9uID8gZmFsc2UgOiBtZW51LmFsbG93RXhpdFxyXG5cclxuICAgIGFybW91ciA9IEdldFBlZEFybW91cihwZWRIYW5kbGUpXHJcblxyXG4gICAgbGV0IG91dGZpdHMgPSBbXVxyXG5cclxuICAgIGNvbnN0IGhhc091dGZpdFRhYiA9IHRhYnMuaW5jbHVkZXMoJ291dGZpdHMnKVxyXG4gICAgaWYgKGhhc091dGZpdFRhYikgb3V0Zml0cyA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxPdXRmaXRbXT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldE91dGZpdHMnLCBmcmFtZXdvcmtkSWQpIGFzIE91dGZpdFtdXHJcblxyXG4gICAgbGV0IG1vZGVscyA9IFtdXHJcblxyXG4gICAgY29uc3QgaGFzSGVyaXRhZ2VUYWIgPSB0YWJzLmluY2x1ZGVzKCdoZXJpdGFnZScpXHJcbiAgICBpZiAoaGFzSGVyaXRhZ2VUYWIpIHtcclxuICAgICAgICBtb2RlbHMgPSBjb25maWcubW9kZWxzKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNUYXR0b29UYWIgPSB0YWJzLmluY2x1ZGVzKCd0YXR0b29zJylcclxuICAgIGxldCB0YXR0b29zXHJcbiAgICBpZiAoaGFzVGF0dG9vVGFiKSB7XHJcbiAgICAgICAgdGF0dG9vcyA9IGdldFRhdHRvb0RhdGEoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJsYWNrbGlzdCA9IGdldEJsYWNrbGlzdCh6b25lKVxyXG5cclxuICAgIGlmIChjcmVhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gR2V0SGFzaEtleShnZXRQbGF5ZXJHZW5kZXJNb2RlbCgpKTtcclxuICAgICAgICBwZWRIYW5kbGUgPSBhd2FpdCBzZXRNb2RlbChwZWRIYW5kbGUsIG1vZGVsKTtcclxuICAgICAgICBlbWl0TmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JylcclxuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlUGVkKHBlZEhhbmRsZSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXdhaXQgZ2V0QXBwZWFyYW5jZShwZWRIYW5kbGUpXHJcblxyXG4gICAgc3RhcnRDYW1lcmEoKVxyXG5cclxuICAgIHNlbmROVUlFdmVudChTZW5kLmRhdGEsIHtcclxuICAgICAgICB0YWJzLFxyXG4gICAgICAgIGFwcGVhcmFuY2UsXHJcbiAgICAgICAgYmxhY2tsaXN0LFxyXG4gICAgICAgIHRhdHRvb3MsXHJcbiAgICAgICAgb3V0Zml0cyxcclxuICAgICAgICBtb2RlbHMsXHJcbiAgICAgICAgYWxsb3dFeGl0LFxyXG4gICAgICAgIGpvYjogZ2V0Sm9iSW5mbygpLFxyXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVxdWVzdExvY2FsZSgnbG9jYWxlJylcclxuICAgIH0pXHJcblxyXG4gICAgU2V0TnVpRm9jdXModHJ1ZSwgdHJ1ZSlcclxuICAgIHNlbmROVUlFdmVudChTZW5kLnZpc2libGUsIHRydWUpXHJcblxyXG4gICAgb3BlbiA9IHRydWVcclxuXHJcbiAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuaGlkZUh1ZCh0cnVlKVxyXG5cclxuICAgIGlmIChwcm9taXNlKSB7XHJcbiAgICAgICAgYXdhaXQgcHJvbWlzZVxyXG4gICAgICAgIGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlc2V0cm91dGluZ2J1Y2tldCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb21pc2UgPSBudWxsO1xyXG4gICAgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5leHBvcnRzKCdPcGVuTWVudScsIG9wZW5NZW51KVxyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdhcHBlYXJhbmNlJywgYXN5bmMgKF8sIGFyZ3M6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBjb25zdCB0eXBlID0gYXJnc1swXVxyXG4gICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHpvbmUgPSB0eXBlLnRvTG93ZXJDYXNlKCkgYXMgVE1lbnVUeXBlc1xyXG4gICAgICAgIG9wZW5NZW51KHpvbmUpXHJcbiAgICB9XHJcbn0sIHRydWUpXHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0QmxhY2tsaXN0KHpvbmU6IFRBcHBlYXJhbmNlWm9uZSB8IHN0cmluZykge1xyXG4gICAgY29uc3Qge2dyb3VwVHlwZXMsIGJhc2V9ID0gY29uZmlnLmJsYWNrbGlzdCgpXHJcblxyXG4gICAgaWYgKHR5cGVvZiB6b25lID09PSAnc3RyaW5nJykgcmV0dXJuIGJhc2VcclxuXHJcbiAgICBpZiAoIWdyb3VwVHlwZXMpIHJldHVybiBiYXNlXHJcblxyXG4gICAgbGV0IGJsYWNrbGlzdCA9IHsuLi5iYXNlfVxyXG5cclxuICAgIGNvbnN0IHBsYXllckRhdGEgPSBnZXRQbGF5ZXJEYXRhKClcclxuXHJcblxyXG4gICAgZm9yIChjb25zdCB0eXBlIGluIGdyb3VwVHlwZXMpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cFR5cGVzW3R5cGVdXHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiBncm91cHMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2VcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09ICdqb2JzJyAmJiB6b25lLmpvYnMpIHtcclxuICAgICAgICAgICAgICAgIHNraXAgPSB6b25lLmpvYnMuaW5jbHVkZXMocGxheWVyRGF0YS5qb2IubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2dhbmdzJyAmJiB6b25lLmdhbmdzKSB7XHJcbiAgICAgICAgICAgICAgICBza2lwID0gem9uZS5nYW5ncy5pbmNsdWRlcyhwbGF5ZXJEYXRhLmdhbmcubmFtZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFza2lwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEJsYWNrbGlzdCA9IGdyb3Vwc1tncm91cF1cclxuICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IE9iamVjdC5hc3NpZ24oe30sIGJsYWNrbGlzdCwgZ3JvdXBCbGFja2xpc3QsIHtcclxuICAgICAgICAgICAgICAgICAgZHJhd2FibGVzOiBPYmplY3QuYXNzaWduKHt9LCBibGFja2xpc3QuZHJhd2FibGVzLCBncm91cEJsYWNrbGlzdC5kcmF3YWJsZXMpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBibGFja2xpc3RcclxuXHJcbiAgICAvLyByZXR1cm4gYmxhY2tsaXN0XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9zZU1lbnUoKSB7XHJcbiAgICBTZXRQZWRBcm1vdXIocGVkLCBhcm1vdXIpXHJcblxyXG4gICAgc3RvcENhbWVyYSgpXHJcbiAgICBTZXROdWlGb2N1cyhmYWxzZSwgZmFsc2UpXHJcbiAgICBzZW5kTlVJRXZlbnQoU2VuZC52aXNpYmxlLCBmYWxzZSlcclxuXHJcblxyXG4gICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLmhpZGVIdWQoZmFsc2UpXHJcblxyXG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XHJcbiAgICAgICAgcmVzb2x2ZVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIG9wZW4gPSBmYWxzZVxyXG59XHJcbiIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgb3Blbk1lbnUgfSBmcm9tIFwiLi4vbWVudVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBRQkJyaWRnZSgpIHtcbiAgICBvbk5ldCgncWItY2xvdGhpbmc6Y2xpZW50OmxvYWRQbGF5ZXJDbG90aGluZycsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgcGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0UGVkQXBwZWFyYW5jZShwZWQsIGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGVzOmNsaWVudDpDcmVhdGVGaXJzdENoYXJhY3RlcicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSlcblxuICAgIG9uTmV0KCdxYi1jbG90aGluZzpjbGllbnQ6b3Blbk91dGZpdE1lbnUnLCAoKSA9PiB7XG4gICAgICAgIG9wZW5NZW51KHsgdHlwZTogXCJvdXRmaXRzXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0pICBcbiAgICB9KVxufSIsICJcbmltcG9ydCB7IFRBcHBlYXJhbmNlIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxuaW1wb3J0IHsgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGxheWVyUGVkQXBwZWFyYW5jZSB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIlxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIHRyaWdnZXJTZXJ2ZXJDYWxsYmFjayB9IGZyb20gXCJAdXRpbHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gRVNYQnJpZGdlKCkge1xuICAgIGxldCBmaXJzdFNwYXduID0gZmFsc2VcblxuICAgIG9uKFwiZXN4X3NraW46cmVzZXRGaXJzdFNwYXduXCIsICgpID0+IHtcbiAgICAgICAgZmlyc3RTcGF3biA9IHRydWVcbiAgICB9KTtcblxuICAgIG9uKFwiZXN4X3NraW46cGxheWVyUmVnaXN0ZXJlZFwiLCAoKSA9PiB7XG4gICAgICAgIGlmKGZpcnN0U3Bhd24pXG4gICAgICAgICAgICBleHBvcnRzLmJsX2FwcGVhcmFuY2UuSW5pdGlhbENyZWF0aW9uKClcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbjInLCBhc3luYyAoYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UsIHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICghYXBwZWFyYW5jZS5tb2RlbCkgYXBwZWFyYW5jZS5tb2RlbCA9IEdldEhhc2hLZXkoXCJtcF9tX2ZyZWVtb2RlXzAxXCIpO1xuICAgICAgICBhd2FpdCBzZXRQZWRBcHBlYXJhbmNlKHBlZCwgYXBwZWFyYW5jZSlcbiAgICB9KTtcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpnZXRTa2luJywgYXN5bmMgKGNiOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWV3b3JrSUQgPSBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXG4gICAgICAgIGNiKGFwcGVhcmFuY2UpXG4gICAgfSlcblxuICAgIG9uTmV0KCdza2luY2hhbmdlcjpsb2FkU2tpbicsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSwgY2I6IGFueSkgPT4ge1xuICAgICAgICBhd2FpdCBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlKGFwcGVhcmFuY2UpXG4gICAgICAgIGlmIChjYikgY2IoKVxuICAgIH0pXG5cbiAgICBvbk5ldCgnZXN4X3NraW46b3BlblNhdmVhYmxlTWVudScsIGFzeW5jIChvblN1Ym1pdDogYW55KSA9PiB7XG4gICAgICAgIGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5Jbml0aWFsQ3JlYXRpb24ob25TdWJtaXQpXG4gICAgfSlcbn0iLCAiaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xuaW1wb3J0IHsgZ2V0QXBwZWFyYW5jZSwgZ2V0RHJhd2FibGVzLCBnZXRQcm9wcyB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL2dldHRlcnNcIjtcbmltcG9ydCB7IHNldERyYXdhYmxlLCBzZXRNb2RlbCwgc2V0UGVkQXBwZWFyYW5jZSwgc2V0UGVkVGF0dG9vcywgc2V0UHJvcCB9IGZyb20gXCIuLi9hcHBlYXJhbmNlL3NldHRlcnNcIjtcbmltcG9ydCB7IFRUYXR0b28gfSBmcm9tIFwiQHR5cGluZ3MvdGF0dG9vc1wiO1xuaW1wb3J0IHsgcGVkLCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCI7XG5cbmZ1bmN0aW9uIGV4cG9ydEhhbmRsZXIobmFtZTogc3RyaW5nLCBjYjogYW55KSB7XG4gICAgb24oJ19fY2Z4X2V4cG9ydF9pbGxlbml1bS1hcHBlYXJhbmNlXycgKyBuYW1lLCAoc2V0Q0I6IGFueSkgPT4ge1xuICAgICAgICBzZXRDQihjYik7XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlsbGVuaXVtQ29tcGF0KCkge1xuICAgIGV4cG9ydEhhbmRsZXIoJ3N0YXJ0UGxheWVyQ3VzdG9taXphdGlvbicsICgpID0+IHtcbiAgICAgICAgZXhwb3J0cy5ibF9hcHBlYXJhbmNlLkluaXRpYWxDcmVhdGlvbigpXG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRNb2RlbCcsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gR2V0RW50aXR5TW9kZWwocGVkKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBkcmF3YWJsZXM6IGFueSA9IGdldERyYXdhYmxlcyhwZWQpWzBdO1xuICAgICAgICBsZXQgbmV3ZHJhd2FibGUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBkcmF3YWJsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyYXdhYmxlID0gZHJhd2FibGVzW2lkXTtcbiAgICAgICAgICAgIG5ld2RyYXdhYmxlLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZDogZHJhd2FibGUuaW5kZXgsXG4gICAgICAgICAgICAgICAgZHJhd2FibGU6IGRyYXdhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IGRyYXdhYmxlLnRleHR1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZFByb3BzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSAgZ2V0UHJvcHMocGVkKVswXTtcbiAgICAgICAgbGV0IG5ld1Byb3BzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpZF07XG4gICAgICAgICAgICBuZXdQcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwcm9wX2lkOiBwcm9wLmluZGV4LFxuICAgICAgICAgICAgICAgIGRyYXdhYmxlOiBwcm9wLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZEJsZW5kJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZEJsZW5kRGF0YShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkRmFjZUZlYXR1cmVzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZFN0cnVjdHVyZShwZWQpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignZ2V0UGVkSGVhZE92ZXJsYXlzJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGVhZE92ZXJsYXkocGVkKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ2dldFBlZEhhaXInLCAocGVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy9yZXR1cm4gZ2V0SGFpcihwZWQpO1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdnZXRQZWRBcHBlYXJhbmNlJywgKHBlZDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKHBlZCk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJNb2RlbCcsIChtb2RlbDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHVwZGF0ZVBlZChQbGF5ZXJQZWRJZCgpKVxuICAgICAgICBzZXRNb2RlbChwZWQsIG1vZGVsKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhlYWRCbGVuZCcsIChwZWQ6IG51bWJlciwgYmxlbmQ6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRCbGVuZChwZWQsIGJsZW5kKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignWW91IFN0aWxsIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkRmFjZUZlYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRIZWFkT3ZlcmxheXMnLCAocGVkOiBudW1iZXIsIG92ZXJsYXk6IGFueSkgPT4ge1xuICAgICAgICAvL3NldEhlYWRPdmVybGF5KHBlZCwgb3ZlcmxheSk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEhhaXInLCBhc3luYyAocGVkOiBudW1iZXIsIGhhaXI6IGFueSwgdGF0dG9vOiBhbnkpID0+IHtcbiAgICAgICAgLy9zZXRQZWRIYWlyQ29sb3JzKHBlZCwgaGFpcik7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ1lvdSBTdGlsbCBjYW5ub3QgdXNlIHRoaXMgZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEV5ZUNvbG9yJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCdZb3UgU3RpbGwgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRDb21wb25lbnQnLCAocGVkOiBudW1iZXIsIGRyYXdhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RHJhd2FibGUgPSB7XG4gICAgICAgICAgICBpbmRleDogZHJhd2FibGUuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgdmFsdWU6IGRyYXdhYmxlLmRyYXdhYmxlLFxuICAgICAgICAgICAgdGV4dHVyZTogZHJhd2FibGUudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkQ29tcG9uZW50cycsIChwZWQ6IG51bWJlciwgY29tcG9uZW50czogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RyYXdhYmxlID0ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBjb21wb25lbnQuY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnQuZHJhd2FibGUsXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29tcG9uZW50LnRleHR1cmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldERyYXdhYmxlKHBlZCwgbmV3RHJhd2FibGUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleHBvcnRIYW5kbGVyKCdzZXRQZWRQcm9wJywgKHBlZDogbnVtYmVyLCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgIGluZGV4OiBwcm9wLnByb3BfaWQsXG4gICAgICAgICAgICB2YWx1ZTogcHJvcC5kcmF3YWJsZSxcbiAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICB9XG4gICAgICAgIHNldFByb3AocGVkLCBuZXdQcm9wKTtcbiAgICB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZFByb3BzJywgKHBlZDogbnVtYmVyLCBwcm9wczogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJvcCA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogcHJvcC5wcm9wX2lkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLmRyYXdhYmxlLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHByb3AudGV4dHVyZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UHJvcChwZWQsIG5ld1Byb3ApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBleHBvcnRIYW5kbGVyKCdzZXRQbGF5ZXJBcHBlYXJhbmNlJywgKGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgLy8gICAgIHJldHVybiBjb25zb2xlLndhcm4oJ05lZWQgdG8gYmUgaW1wbGVtZW50ZWQnKTtcbiAgICAvLyB9KTtcblxuICAgIGV4cG9ydEhhbmRsZXIoJ3NldFBlZEFwcGVhcmFuY2UnLCAocGVkOiBudW1iZXIsIGFwcGVhcmFuY2U6IFRBcHBlYXJhbmNlKSA9PiB7XG4gICAgICAgIHNldFBlZEFwcGVhcmFuY2UocGVkLCBhcHBlYXJhbmNlKVxuICAgIH0pO1xuXG4gICAgZXhwb3J0SGFuZGxlcignc2V0UGVkVGF0dG9vcycsIChwZWQ6IG51bWJlciwgdGF0dG9vczogVFRhdHRvb1tdKSA9PiB7XG4gICAgICAgIHNldFBlZFRhdHRvb3MocGVkLCB0YXR0b29zKVxuICAgIH0pO1xufSIsICJpbXBvcnQgeyBUQXBwZWFyYW5jZSwgVEFwcGVhcmFuY2Vab25lIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIlxyXG5pbXBvcnQgeyBvcGVuTWVudSB9IGZyb20gXCIuL21lbnVcIlxyXG5pbXBvcnQgeyBzZXRQbGF5ZXJQZWRBcHBlYXJhbmNlIH0gZnJvbSBcIi4vYXBwZWFyYW5jZS9zZXR0ZXJzXCJcclxuaW1wb3J0IHsgdHJpZ2dlclNlcnZlckNhbGxiYWNrLCBnZXRGcmFtZXdvcmtJRCwgRGVsYXksIGJsX2JyaWRnZSwgcGVkLCBkZWxheSwgZm9ybWF0LCB1cGRhdGVQZWQgfSBmcm9tIFwiQHV0aWxzXCJcclxuaW1wb3J0IHsgUUJCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvcWJcIlxyXG5pbXBvcnQgeyBFU1hCcmlkZ2UgfSBmcm9tIFwiLi9icmlkZ2UvZXN4XCJcclxuaW1wb3J0IHsgaWxsZW5pdW1Db21wYXQgfSBmcm9tIFwiLi9jb21wYXQvaWxsZW5pdW1cIlxyXG5cclxuZXhwb3J0cygnU2V0UGxheWVyUGVkQXBwZWFyYW5jZScsIGFzeW5jIChhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSB8IHN0cmluZykgPT4ge1xyXG4gICAgbGV0IHJlc29sdmVkQXBwZWFyYW5jZTogVEFwcGVhcmFuY2U7XHJcbiAgICBcclxuICAgIGlmICghYXBwZWFyYW5jZSB8fCB0eXBlb2YgYXBwZWFyYW5jZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCBmcmFtZXdvcmtJRDogc3RyaW5nID0gYXBwZWFyYW5jZSB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpO1xyXG4gICAgICAgIHJlc29sdmVkQXBwZWFyYW5jZSA9IGF3YWl0IHRyaWdnZXJTZXJ2ZXJDYWxsYmFjazxUQXBwZWFyYW5jZT4oJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldEFwcGVhcmFuY2UnLCBmcmFtZXdvcmtJRCkgYXMgVEFwcGVhcmFuY2U7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcHBlYXJhbmNlID09PSAnb2JqZWN0JykgcmVzb2x2ZWRBcHBlYXJhbmNlID0gYXBwZWFyYW5jZTtcclxuICAgIFxyXG4gICAgaWYgKCFyZXNvbHZlZEFwcGVhcmFuY2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZhbGlkIGFwcGVhcmFuY2UgZm91bmQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShyZXNvbHZlZEFwcGVhcmFuY2UpO1xyXG59KTtcclxuXHJcbmV4cG9ydHMoJ0dldFBsYXllclBlZEFwcGVhcmFuY2UnLCBhc3luYyAoZnJhbWV3b3JrSUQ6IHN0cmluZykgPT4ge1xyXG4gICAgZnJhbWV3b3JrSUQgPSBmcmFtZXdvcmtJRCB8fCBhd2FpdCBnZXRGcmFtZXdvcmtJRCgpXHJcbiAgICByZXR1cm4gYXdhaXQgdHJpZ2dlclNlcnZlckNhbGxiYWNrPFRBcHBlYXJhbmNlPignYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGZyYW1ld29ya0lEKVxyXG59KVxyXG5cclxuZXhwb3J0cygnSW5pdGlhbENyZWF0aW9uJywgYXN5bmMgKGNiPzogRnVuY3Rpb24pID0+IHtcclxuICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBuZWVkcyB0byBiZSB0eXBlIG9mIFRBcHBlYXJhbmNlWm9uZSBtZWFuaW5nIGl0IG5lZWRzIGEgY29vcmRzIHByb3BlcnR5LCBidXQgaW4gdGhpcyBjYXNlIGl0J3Mgbm90IHVzZWRcclxuICAgIGF3YWl0IG9wZW5NZW51KHsgdHlwZTogXCJhcHBlYXJhbmNlXCIsIGNvb3JkczogWzAsIDAsIDAsIDBdIH0sIHRydWUpXHJcbiAgICBpZiAoY2IpIGNiKClcclxufSlcclxuXHJcbm9uKCdibF9hcHBlYXJhbmNlOmNsaWVudDp1c2Vab25lJywgKHpvbmU6IFRBcHBlYXJhbmNlWm9uZSkgPT4ge1xyXG4gICAgb3Blbk1lbnUoem9uZSlcclxufSlcclxuXHJcbm9uTmV0KCdibF9icmlkZ2U6Y2xpZW50OnBsYXllckxvYWRlZCcsIGFzeW5jICgpID0+IHtcclxuICAgIHdoaWxlICghYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGF3YWl0IERlbGF5KDEwMCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxufSlcclxuXHJcbm9uTmV0KCdvblJlc291cmNlU3RhcnQnLCBhc3luYyAocmVzb3VyY2U6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHJlc291cmNlID09PSBHZXRDdXJyZW50UmVzb3VyY2VOYW1lKCkgJiYgYmxfYnJpZGdlLmNvcmUoKS5wbGF5ZXJMb2FkZWQoKSkge1xyXG4gICAgICAgIGNvbnN0IGZyYW1ld29ya0lEID0gYXdhaXQgZ2V0RnJhbWV3b3JrSUQoKVxyXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICAgICAgaWYgKCFhcHBlYXJhbmNlKSByZXR1cm47XHJcbiAgICAgICAgYXdhaXQgc2V0UGxheWVyUGVkQXBwZWFyYW5jZShhcHBlYXJhbmNlKVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3QgZnJhbWV3b3JrTmFtZSA9IGJsX2JyaWRnZS5nZXRGcmFtZXdvcmsoJ2NvcmUnKVxyXG5jb25zdCBjb3JlID0gZm9ybWF0KEdldENvbnZhcignYmw6ZnJhbWV3b3JrJywgJ3FiJykpXHJcblxyXG5pZiAoY29yZSA9PSAncWInIHx8IGNvcmUgPT0gJ3FieCcgJiYgR2V0UmVzb3VyY2VTdGF0ZShmcmFtZXdvcmtOYW1lKSA9PSAnc3RhcnRlZCcpIHtcclxuICAgIFFCQnJpZGdlKCk7XHJcbn0gZWxzZSBpZiAoY29yZSA9PSAnZXN4JyAmJiBHZXRSZXNvdXJjZVN0YXRlKGZyYW1ld29ya05hbWUpID09ICdzdGFydGVkJykge1xyXG4gICAgRVNYQnJpZGdlKCk7XHJcbn1cclxuXHJcbmlsbGVuaXVtQ29tcGF0KCk7XHJcblxyXG5SZWdpc3RlckNvbW1hbmQoJ3JlbG9hZHNraW4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJRCA9IGF3YWl0IGdldEZyYW1ld29ya0lEKClcclxuICAgIGNvbnN0IGhlYWx0aCA9IEdldEVudGl0eUhlYWx0aChwZWQpO1xyXG4gICAgY29uc3QgbWF4aGVhbHRoID0gR2V0RW50aXR5TWF4SGVhbHRoKHBlZCk7XHJcbiAgICBjb25zdCBhcm1vciA9IEdldFBlZEFybW91cihwZWQpO1xyXG5cclxuICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhd2FpdCB0cmlnZ2VyU2VydmVyQ2FsbGJhY2s8VEFwcGVhcmFuY2U+KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZnJhbWV3b3JrSUQpXHJcbiAgICBpZiAoIWFwcGVhcmFuY2UpIHJldHVybjtcclxuICAgIGF3YWl0IHNldFBsYXllclBlZEFwcGVhcmFuY2UoYXBwZWFyYW5jZSlcclxuXHJcbiAgICBTZXRQZWRNYXhIZWFsdGgocGVkLCBtYXhoZWFsdGgpXHJcbiAgICBkZWxheSgxMDAwKSBcclxuICAgIFNldEVudGl0eUhlYWx0aChwZWQsIGhlYWx0aClcclxuICAgIFNldFBlZEFybW91cihwZWQsIGFybW9yKVxyXG59LCBmYWxzZSlcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQUFPLElBQUksTUFBTTtBQUVWLElBQU0sWUFBWSx3QkFBQyxjQUFzQjtBQUM1QyxRQUFNO0FBQ1YsR0FGeUI7QUFhbEIsSUFBTSxlQUFlLHdCQUFDLFFBQWdCLFNBQWM7QUFDdkQsaUJBQWU7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBLEVBQ0osQ0FBQztBQUNMLEdBTDRCO0FBT3JCLElBQU0sUUFBUSx3QkFBQyxPQUFlLElBQUksUUFBUSxTQUFPLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBdEQ7QUFFZCxJQUFNLGVBQWUsOEJBQU8sVUFBNEM7QUFDM0UsTUFBSSxZQUFvQixPQUFPLFVBQVUsV0FBVyxRQUFRLFdBQVcsS0FBSztBQUU1RSxNQUFJLENBQUMsYUFBYSxTQUFTLEtBQUssQ0FBQyxpQkFBaUIsU0FBUyxHQUFHO0FBTzFELFlBQVEsS0FBSyxvQ0FBb0MsS0FBSyxHQUFHO0FBQ3pELFdBQU87QUFBQSxFQUNYO0FBRUEsTUFBSSxlQUFlLFNBQVM7QUFBRyxXQUFPO0FBRXRDLGVBQWEsU0FBUztBQUV0QixRQUFNLHFCQUFxQiw2QkFBcUI7QUFDNUMsV0FBTyxJQUFJLFFBQVEsYUFBVztBQUMxQixZQUFNLFdBQVcsWUFBWSxNQUFNO0FBQy9CLFlBQUksZUFBZSxTQUFTLEdBQUc7QUFDM0Isd0JBQWMsUUFBUTtBQUN0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Y0FBYyxNQUFNLGVBQWU7QUFDekMsVUFBTSxhQUFhLE1BQU0sc0JBQW1DLHNDQUFzQyxXQUFXO0FBQzdHLFFBQUksQ0FBQztBQUFZO0FBQ2pCLFVBQU0sdUJBQXVCLFVBQVU7QUFBQSxFQUMzQztBQUNKLENBQUM7QUFFRCxJQUFNLGdCQUFnQixVQUFVLGFBQWEsTUFBTTtBQUNuRCxJQUFNLE9BQU8sT0FBTyxVQUFVLGdCQUFnQixJQUFJLENBQUM7QUFFbkQsSUFBSSxRQUFRLFFBQVEsUUFBUSxTQUFTLGlCQUFpQixhQUFhLEtBQUssV0FBVztBQUMvRSxXQUFTO0FBQ2IsV0FBVyxRQUFRLFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxXQUFXO0FBQ3RFLFlBQVU7QUFDZDtBQUVBLGVBQWU7QUFFZixnQkFBZ0IsY0FBYyxZQUFZO0FBQ3RDLFFBQU0sY0FBYyxNQUFNLGVBQWU7QUFDekMsUUFBTSxTQUFTLGdCQUFnQixHQUFHO0FBQ2xDLFFBQU0sWUFBWSxtQkFBbUIsR0FBRztBQUN4QyxRQUFNLFFBQVEsYUFBYSxHQUFHO0FBRTlCLFFBQU0sYUFBYSxNQUFNLHNCQUFtQyxzQ0FBc0MsV0FBVztBQUM3RyxNQUFJLENBQUM7QUFBWTtBQUNqQixRQUFNLHVCQUF1QixVQUFVO0FBRXZDLGtCQUFnQixLQUFLLFNBQVM7QUFDOUIsUUFBTSxHQUFJO0FBQ1Ysa0JBQWdCLEtBQUssTUFBTTtBQUMzQixlQUFhLEtBQUssS0FBSztBQUMzQixHQUFHLEtBQUs7IiwKICAibmFtZXMiOiBbImRlbGF5IiwgInBlZCIsICJ4IiwgInkiLCAieiIsICJjb25maWciLCAicGVkIiwgInBlZCIsICJwZWQiXQp9Cg== diff --git a/dist/client/init.js.map b/dist/client/init.js.map index bf55095..7c7c5ef 100644 --- a/dist/client/init.js.map +++ b/dist/client/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/client/utils/index.ts", "../../src/client/camera.ts", "../../src/data/head.ts", "../../src/data/face.ts", "../../src/data/drawables.ts", "../../src/data/props.ts", "../../src/client/appearance/getters.ts", "../../src/data/toggles.ts", "../../src/client/appearance/setters.ts", "../../src/client/handlers.ts", "../../src/client/menu.ts", "../../src/client/bridge/qb.ts", "../../src/client/bridge/esx.ts", "../../src/client/compat/illenium.ts", "../../src/client/init.ts"], - "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHair(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetHair', getHair);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetProps', getProps);\r\n\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = pedHandle == PlayerPedId() ? await getTattoos() : []\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHair(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHair(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetFaceFeature', setFaceFeature);\r\n\r\nexport function setFaceFeatures(pedHandle: number, data: THeadStructure) {\r\n if (!data) return console.warn('No data provided for setFaceFeatures')\r\n \r\n\r\n for (const feature in data) {\r\n const value = data[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetFaceFeatures', setFaceFeatures);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) setFaceFeatures(pedHandle, headStructure)\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], - "mappings": "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", + "sourcesContent": ["export let ped = 0\r\n\r\nexport const updatePed = (pedHandle: number) => {\r\n ped = pedHandle\r\n}\r\n\r\nexport const debugdata = (data: any) => {\r\n console.log(JSON.stringify(data, (key, value) => {\r\n if (typeof value === \"string\") {\r\n return value.replace(/\\n/g, \"\\\\n\");\r\n }\r\n return value;\r\n }, 2))\r\n}\r\n\r\nexport const sendNUIEvent = (action: string, data: any) => {\r\n SendNUIMessage({\r\n action: action,\r\n data: data\r\n });\r\n}\r\n\r\nexport const delay = (ms: number) => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const requestModel = async (model: string | number): Promise => {\r\n let modelHash: number = typeof model === 'number' ? model : GetHashKey(model)\r\n\r\n if (!IsModelValid(modelHash) && !IsModelInCdimage(modelHash)) {\r\n // exports.bl_bridge.notify()({\r\n // title: 'Invalid model!',\r\n // type: 'error',\r\n // duration: 1000\r\n // })\r\n\r\n console.warn(`attempted to load invalid model '${model}'`);\r\n return 0;\r\n }\r\n\r\n if (HasModelLoaded(modelHash)) return modelHash\r\n \r\n RequestModel(modelHash);\r\n\r\n const waitForModelLoaded = (): Promise => {\r\n return new Promise(resolve => {\r\n const interval = setInterval(() => {\r\n if (HasModelLoaded(modelHash)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n await waitForModelLoaded();\r\n\r\n return modelHash;\r\n};\r\n\r\n\r\n//callback\r\n//https://github.com/overextended/ox_lib/blob/master/package/client/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\nconst eventTimers: Record = {};\r\nconst activeEvents: Record void> = {};\r\n\r\nfunction eventTimer(eventName: string, delay: number | null) {\r\n if (delay && delay > 0) {\r\n const currentTime = GetGameTimer();\r\n\r\n if ((eventTimers[eventName] || 0) > currentTime) return false;\r\n\r\n eventTimers[eventName] = currentTime + delay;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nonNet(`_bl_cb_${resourceName}`, (key: string, ...args: any) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerServerCallback(\r\n eventName: string, ...args: any\r\n): Promise | void {\r\n if (!eventTimer(eventName, 0)) {\r\n return;\r\n }\r\n\r\n let key: string;\r\n\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, resourceName, key, ...args);\r\n\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n};\r\n\r\nexport function onServerCallback(eventName, cb) {\r\n onNet(`_bl_cb_${eventName}`, async (resource, key, ...args) => {\r\n let response;\r\n try {\r\n response = await cb(...args);\r\n }\r\n catch (e) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n emitNet(`_bl_cb_${resource}`, key, response);\r\n });\r\n}\r\n\r\n//locale\r\n\r\nexport const requestLocale = (resourceSetName: string) => {\r\n return new Promise((resolve) => {\r\n const checkResourceFile = () => {\r\n if (RequestResourceFileSet(resourceSetName)) {\r\n const currentLan = exports.bl_appearance.config().locale\r\n let localeFileContent = LoadResourceFile(resourceName, `locale/${currentLan}.json`);\r\n if (!localeFileContent) {\r\n console.error(`${currentLan}.json not found in locale, please verify!, we used english for now!`)\r\n localeFileContent = LoadResourceFile(resourceName, `locale/en.json`)\r\n }\r\n resolve(localeFileContent);\r\n } else {\r\n setTimeout(checkResourceFile, 100);\r\n }\r\n }\r\n checkResourceFile();\r\n });\r\n}\r\n\r\nexport const locale = async (id: string, ...args: string[]) => {\r\n const locale = await requestLocale('locale');\r\n let argIndex = 0;\r\n\r\n const result = locale[id].replace(/%s/g, (match: string) => argIndex < args.length ? args[argIndex] : match);\r\n return result\r\n}\r\n\r\nexport const bl_bridge = exports.bl_bridge\r\n\r\nexport const getPlayerData = () => {\r\n return bl_bridge.core().getPlayerData()\r\n}\r\n\r\nexport const getFrameworkID = () => {\r\n const id = getPlayerData().cid\r\n return id\r\n}\r\n\r\nexport const getPlayerGenderModel = () => {\r\n const gender = getPlayerData().gender\r\n return gender === 'male' ? 'mp_m_freemode_01' : 'mp_f_freemode_01'\r\n}\r\n\r\nexport function Delay(ms: number): Promise {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function format(str: string): string {\r\n if (!str.includes(\"'\")) return str;\r\n return str.replace(/'/g, \"\");\r\n}\r\n\r\nexport function getJobInfo(): { name: string, isBoss: boolean } | null {\r\n const job = getPlayerData().job\r\n return job ? { name: job.name, isBoss: job.isBoss } : null\r\n}\r\n\r\nexport function isPedFreemodeModel(ped: number) {\r\n const model = GetEntityModel(ped)\r\n return model === GetHashKey(\"mp_m_freemode_01\") || model === GetHashKey(\"mp_f_freemode_01\")\r\n} ", "import { Camera, Vector3, TCameraBones } from '@typings/camera';\r\nimport { delay, ped } from '@utils';\r\nimport { Receive } from '@events';\r\n\r\nconst WHOLE_BODY_MAX_DISTANCE = 2.0;\r\nconst DEFAULT_MAX_DISTANCE = 1.0;\r\n\r\nlet running: boolean = false;\r\nlet camDistance: number = 1.8;\r\nlet cam: Camera | null = null;\r\nlet angleY: number = 0.0;\r\nlet angleZ: number = 0.0;\r\nlet targetCoords: Vector3 | null = null;\r\nlet oldCam: Camera | null = null;\r\nlet changingCam: boolean = false;\r\nlet lastX: number = 0;\r\nlet currentBone: keyof TCameraBones = 'head';\r\n\r\nconst CameraBones: TCameraBones = {\r\n whole: 0,\r\n\thead: 31086,\r\n\ttorso: 24818,\r\n\tlegs: [16335, 46078],\r\n shoes: [14201, 52301],\r\n};\r\n\r\nconst cos = (degrees: number): number => {\r\n\treturn Math.cos((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst sin = (degrees: number): number => {\r\n\treturn Math.sin((degrees * Math.PI) / 180);\r\n};\r\n\r\nconst getAngles = (): number[] => {\r\n\tconst x =\r\n\t\t((cos(angleZ) * cos(angleY) + cos(angleY) * cos(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst y =\r\n\t\t((sin(angleZ) * cos(angleY) + cos(angleY) * sin(angleZ)) / 2) *\r\n\t\tcamDistance;\r\n\tconst z = sin(angleY) * camDistance;\r\n\r\n\treturn [x, y, z];\r\n};\r\n\r\nconst setCamPosition = (mouseX?: number, mouseY?: number): void => {\r\n\tif (!running || !targetCoords || changingCam) return;\r\n\r\n\tmouseX = mouseX ?? 0.0;\r\n\tmouseY = mouseY ?? 0.0;\r\n\r\n\tangleZ -= mouseX;\r\n\tangleY += mouseY;\r\n\r\n const isHeadOrWhole = currentBone === 'whole' || currentBone === 'head';\r\n const maxAngle = isHeadOrWhole ? 89.0 : 70.0;\r\n \r\n const isShoes = currentBone === 'shoes';\r\n const minAngle = isShoes ? 5.0 : -20.0;\r\n\r\n\tangleY = Math.min(Math.max(angleY, minAngle), maxAngle);\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tSetCamCoord(\r\n\t\tcam,\r\n\t\ttargetCoords.x + x,\r\n\t\ttargetCoords.y + y,\r\n\t\ttargetCoords.z + z\r\n\t);\r\n\tPointCamAtCoord(cam, targetCoords.x, targetCoords.y, targetCoords.z);\r\n};\r\n\r\nconst moveCamera = async (coords: Vector3, distance?: number) => {\r\n\tconst heading: number = GetEntityHeading(ped) + 94;\r\n\tdistance = distance ?? 1.0;\r\n\r\n\tchangingCam = true;\r\n\tcamDistance = distance;\r\n\tangleZ = heading;\r\n\r\n\tconst [x, y, z] = getAngles();\r\n\r\n\tconst newcam: Camera = CreateCamWithParams(\r\n\t\t'DEFAULT_SCRIPTED_CAMERA',\r\n\t\tcoords.x + x,\r\n\t\tcoords.y + y,\r\n\t\tcoords.z + z,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t0.0,\r\n\t\t70.0,\r\n\t\tfalse,\r\n\t\t0\r\n\t);\r\n\r\n\ttargetCoords = coords;\r\n\tchangingCam = false;\r\n\toldCam = cam;\r\n\tcam = newcam;\r\n\r\n\tPointCamAtCoord(newcam, coords.x, coords.y, coords.z);\r\n\tSetCamActiveWithInterp(newcam, oldCam, 250, 0, 0);\r\n\r\n\tawait delay(250);\r\n\r\n\tSetCamUseShallowDofMode(newcam, true);\r\n\tSetCamNearDof(newcam, 0.4);\r\n\tSetCamFarDof(newcam, 1.2);\r\n\tSetCamDofStrength(newcam, 0.3);\r\n\tuseHiDof(newcam);\r\n\r\n\tDestroyCam(oldCam, true);\r\n};\r\n\r\nconst useHiDof = (currentcam: Camera) => {\r\n\tif (!(DoesCamExist(cam) && currentcam == cam)) return;\r\n\tSetUseHiDof();\r\n\tsetTimeout(useHiDof, 0);\r\n};\r\n\r\nexport const startCamera = () => {\r\n\tif (running) return;\r\n\trunning = true;\r\n\tcamDistance = WHOLE_BODY_MAX_DISTANCE\r\n\tcam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true);\r\n\tconst [x, y, z]: number[] = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0);\r\n\tSetCamCoord(cam, x, y, z);\r\n\tRenderScriptCams(true, true, 1000, true, true);\r\n\t// moveCamera({ x: x, y: y, z: z }, camDistance);\r\n setCamera('whole', camDistance);\r\n};\r\n\r\nexport const stopCamera = (): void => {\r\n\tif (!running) return;\r\n\trunning = false;\r\n\r\n\tRenderScriptCams(false, true, 250, true, false);\r\n\tDestroyCam(cam, true);\r\n\tcam = null;\r\n\ttargetCoords = null;\r\n};\r\n\r\nconst setCamera = (type?: keyof TCameraBones, distance = camDistance): void => {\r\n\r\n\tconst bone: number | number[] | undefined = CameraBones[type];\r\n\r\n const isBoneArray = Array.isArray(bone)\r\n\r\n currentBone = type;\r\n\r\n if (!isBoneArray && bone === 0) {\r\n const [x, y, z]: number[] = GetEntityCoords(ped, false);\r\n moveCamera(\r\n {\r\n x: x,\r\n y: y,\r\n z: z + 0.0,\r\n },\r\n distance\r\n );\r\n return;\r\n }\r\n\r\n // If its not whole body, then we need to limit the distance\r\n if (distance > DEFAULT_MAX_DISTANCE) distance = DEFAULT_MAX_DISTANCE;\r\n\r\n if (isBoneArray) {\r\n const [x1, y1, z1]: number[] = GetPedBoneCoords(ped, bone[0], 0.0, 0.0, 0.0)\r\n\r\n const [x2, y2, z2]: number[] = GetPedBoneCoords(ped, bone[1], 0.0, 0.0, 0.0)\r\n\r\n // get the middle of the two points\r\n var x = (x1 + x2) / 2;\r\n var y = (y1 + y2) / 2;\r\n var z = (z1 + z2) / 2;\r\n } else {\r\n var [x, y, z]: number[] = GetPedBoneCoords(ped, bone, 0.0, 0.0, 0.0)\r\n }\r\n\r\n\tmoveCamera(\r\n\t\t{\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z + 0.0,\r\n\t\t},\r\n\t\tdistance\r\n\t);\r\n\r\n};\r\n\r\nRegisterNuiCallback(Receive.camMove, (data, cb) => {\r\n setCamPosition(data.x, data.y);\r\n cb(1);\r\n});\r\n\r\ntype TSection = 'whole' | 'head' | 'torso' | 'legs' | 'shoes';\r\n\r\nRegisterNuiCallback(Receive.camSection, (type: TSection, cb: Function) => {\r\n\tswitch (type) {\r\n case 'whole':\r\n setCamera('whole', WHOLE_BODY_MAX_DISTANCE);\r\n break;\r\n case 'head':\r\n setCamera('head');\r\n break;\r\n case 'torso':\r\n setCamera('torso');\r\n break;\r\n case 'legs':\r\n setCamera('legs');\r\n break;\r\n case 'shoes':\r\n setCamera('shoes');\r\n setCamPosition();\r\n break;\r\n\t}\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.camZoom, (data, cb) => {\r\n\tif (data === 'down') {\r\n\r\n const maxZoom = currentBone === 'whole' ? WHOLE_BODY_MAX_DISTANCE : DEFAULT_MAX_DISTANCE;\r\n\r\n\t\tconst newDistance: number = camDistance + 0.05;\r\n\t\tcamDistance = newDistance >= maxZoom ? maxZoom : newDistance;\r\n\t} else if (data === 'up') {\r\n\t\tconst newDistance: number = camDistance - 0.05;\r\n\t\tcamDistance = newDistance <= 0.3 ? 0.3 : newDistance;\r\n\t}\r\n\r\n\tcamDistance = camDistance;\r\n\tsetCamPosition();\r\n\tcb(1);\r\n});\r\n", "export default [\n \"Blemishes\",\n \"FacialHair\",\n \"Eyebrows\",\n \"Ageing\",\n \"Makeup\",\n \"Blush\",\n \"Complexion\",\n \"SunDamage\",\n \"Lipstick\",\n \"MolesFreckles\",\n \"ChestHair\",\n \"BodyBlemishes\",\n \"AddBodyBlemishes\",\n \"EyeColor\"\n]\n", "export default [\n \"Nose_Width\",\n \"Nose_Peak_Height\",\n \"Nose_Peak_Lenght\",\n \"Nose_Bone_Height\",\n \"Nose_Peak_Lowering\",\n \"Nose_Bone_Twist\",\n \"EyeBrown_Height\",\n \"EyeBrown_Forward\",\n \"Cheeks_Bone_High\",\n \"Cheeks_Bone_Width\",\n \"Cheeks_Width\",\n \"Eyes_Openning\",\n \"Lips_Thickness\",\n \"Jaw_Bone_Width\",\n \"Jaw_Bone_Back_Lenght\",\n \"Chin_Bone_Lowering\",\n \"Chin_Bone_Length\",\n \"Chin_Bone_Width\",\n \"Chin_Hole\",\n \"Neck_Thikness\"\n]\n", "export default [\n \"face\",\n \"masks\",\n \"hair\",\n \"torsos\",\n \"legs\",\n \"bags\",\n \"shoes\",\n \"neck\",\n \"shirts\",\n \"vest\",\n \"decals\",\n \"jackets\"\n]\n", "export default [\n \"hats\",\n \"glasses\",\n \"earrings\",\n \"mouth\",\n \"lhand\",\n \"rhand\",\n \"watches\",\n \"bracelets\"\n]\n", "import { TAppearance, THairData, THeadOverlay, THeadOverlayTotal, TClothes, TSkin } from \"@typings/appearance\"\r\nimport HEAD_OVERLAYS from \"@data/head\"\r\nimport FACE_FEATURES from \"@data/face\"\r\nimport DRAWABLE_NAMES from \"@data/drawables\"\r\nimport PROP_NAMES from \"@data/props\"\r\nimport { ped, onServerCallback, updatePed, triggerServerCallback } from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\"\r\n\r\nexport function findModelIndex(target: number) {\r\n const config = exports.bl_appearance\r\n const models = config.models()\r\n\r\n return models.findIndex((model: string) => GetHashKey(model) === target)\r\n}\r\n\r\nexport function getHairColor(pedHandle: number): THairData {\r\n return {\r\n color: GetPedHairColor(pedHandle),\r\n highlight: GetPedHairHighlightColor(pedHandle)\r\n }\r\n}\r\nexports('GetPedHairColor', getHairColor);\r\n\r\nexport function getHeadBlendData(pedHandle: number) {\r\n // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67\r\n const buffer = new ArrayBuffer(80);\r\n global.Citizen.invokeNative('0x2746bd9d88c5c5d0', pedHandle, new Uint32Array(buffer));\r\n\r\n const { 0: shapeFirst, 2: shapeSecond, 4: shapeThird, 6: skinFirst, 8: skinSecond, 18: hasParent, 10: skinThird } = new Uint32Array(buffer);\r\n const { 0: shapeMix, 2: skinMix, 4: thirdMix } = new Float32Array(buffer, 48);\r\n\r\n /* \r\n 0: shapeFirst,\r\n 2: shapeSecond,\r\n 4: shapeThird,\r\n 6: skinFirst,\r\n 8: skinSecond,\r\n 10: skinThird,\r\n 18: hasParent,\r\n */\r\n return {\r\n shapeFirst, // father\r\n shapeSecond, // mother\r\n shapeThird,\r\n\r\n skinFirst,\r\n skinSecond,\r\n skinThird,\r\n\r\n shapeMix, // resemblance\r\n\r\n thirdMix,\r\n skinMix, // skinpercent\r\n\r\n hasParent: Boolean(hasParent),\r\n };\r\n}\r\nexports('GetPedHeadBlend', getHeadBlendData);\r\n\r\nexport function getHeadOverlay(pedHandle: number) {\r\n let totals: THeadOverlayTotal = {};\r\n let headData: THeadOverlay = {};\r\n\r\n for (let i = 0; i < HEAD_OVERLAYS.length; i++) {\r\n const overlay = HEAD_OVERLAYS[i];\r\n totals[overlay] = GetNumHeadOverlayValues(i);\r\n\r\n if (overlay === \"EyeColor\") {\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: GetPedEyeColor(pedHandle)\r\n };\r\n } else {\r\n const [_, overlayValue, colourType, firstColor, secondColor, overlayOpacity] = GetPedHeadOverlayData(pedHandle, i);\r\n headData[overlay] = {\r\n id: overlay,\r\n index: i,\r\n overlayValue: overlayValue === 255 ? -1 : overlayValue,\r\n colourType: colourType,\r\n firstColor: firstColor,\r\n secondColor: secondColor,\r\n overlayOpacity: overlayOpacity\r\n };\r\n }\r\n }\r\n\r\n return [headData, totals];\r\n}\r\nexports('GetPedHeadOverlay', getHeadOverlay);\r\n\r\nexport function getHeadStructure(pedHandle: number) {\r\n const pedModel = GetEntityModel(pedHandle)\r\n\r\n if (pedModel !== GetHashKey(\"mp_m_freemode_01\") && pedModel !== GetHashKey(\"mp_f_freemode_01\")) return\r\n\r\n let faceStruct = {}\r\n for (let i = 0; i < FACE_FEATURES.length; i++) {\r\n const overlay = FACE_FEATURES[i]\r\n faceStruct[overlay] = {\r\n id: overlay,\r\n index: i,\r\n value: GetPedFaceFeature(pedHandle, i)\r\n }\r\n }\r\n\r\n return faceStruct\r\n}\r\nexports('GetPedHeadStructure', getHeadStructure);\r\n\r\nexport function getDrawables(pedHandle: number) {\r\n let drawables = {}\r\n let totalDrawables = {}\r\n\r\n for (let i = 0; i < DRAWABLE_NAMES.length; i++) {\r\n const name = DRAWABLE_NAMES[i]\r\n const current = GetPedDrawableVariation(pedHandle, i)\r\n\r\n totalDrawables[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedTextureVariations(pedHandle, i, current)\r\n }\r\n drawables[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedDrawableVariation(pedHandle, i),\r\n texture: GetPedTextureVariation(pedHandle, i)\r\n }\r\n }\r\n\r\n return [drawables, totalDrawables]\r\n}\r\nexports('GetPedDrawables', getDrawables);\r\n\r\nexport function getProps(pedHandle: number) {\r\n let props = {}\r\n let totalProps = {}\r\n\r\n for (let i = 0; i < PROP_NAMES.length; i++) {\r\n const name = PROP_NAMES[i]\r\n const current = GetPedPropIndex(pedHandle, i)\r\n\r\n totalProps[name] = {\r\n id: name,\r\n index: i,\r\n total: GetNumberOfPedPropDrawableVariations(pedHandle, i),\r\n textures: GetNumberOfPedPropTextureVariations(pedHandle, i, current)\r\n }\r\n\r\n props[name] = {\r\n id: name,\r\n index: i,\r\n value: GetPedPropIndex(pedHandle, i),\r\n texture: GetPedPropTextureIndex(pedHandle, i)\r\n }\r\n }\r\n\r\n return [props, totalProps]\r\n}\r\nexports('GetPedProps', getProps);\r\n\r\nexport async function getAppearance(pedHandle: number): Promise {\r\n const [headData, totals] = getHeadOverlay(pedHandle)\r\n const [drawables, drawTotal] = getDrawables(pedHandle)\r\n const [props, propTotal] = getProps(pedHandle)\r\n const model = GetEntityModel(pedHandle)\r\n const tattoos = pedHandle == PlayerPedId() ? await getTattoos() : []\r\n\r\n return {\r\n modelIndex: findModelIndex(model),\r\n model: model,\r\n hairColor: getHairColor(pedHandle),\r\n headBlend: getHeadBlendData(pedHandle),\r\n headOverlay: headData as THeadOverlay,\r\n headOverlayTotal: totals as THeadOverlayTotal,\r\n headStructure: getHeadStructure(pedHandle),\r\n drawables: drawables,\r\n props: props,\r\n drawTotal: drawTotal,\r\n propTotal: propTotal,\r\n tattoos: tattoos\r\n }\r\n}\r\nexports(\"GetPedAppearance\", getAppearance)\r\nonServerCallback('bl_appearance:client:getAppearance', () => {\r\n updatePed(PlayerPedId())\r\n return getAppearance(ped)\r\n});\r\n\r\nexport function getPedClothes(pedHandle: number): TClothes {\r\n const [drawables] = getDrawables(pedHandle)\r\n const [props] = getProps(pedHandle)\r\n const [headData] = getHeadOverlay(pedHandle)\r\n\r\n return {\r\n headOverlay: headData as THeadOverlay,\r\n drawables: drawables,\r\n props: props,\r\n }\r\n}\r\nexports(\"GetPedClothes\", getPedClothes)\r\n\r\nexport function getPedSkin(pedHandle: number): TSkin {\r\n return {\r\n headBlend: getHeadBlendData(pedHandle),\r\n headStructure: getHeadStructure(pedHandle),\r\n hairColor: getHairColor(pedHandle),\r\n model: GetEntityModel(pedHandle)\r\n }\r\n}\r\nexports(\"GetPedSkin\", getPedSkin)\r\n\r\nexport function getTattooData() {\r\n let tattooZones = []\r\n\r\n const [TATTOO_LIST, TATTOO_CATEGORIES] = exports.bl_appearance.tattoos()\r\n for (let i = 0; i < TATTOO_CATEGORIES.length; i++) {\r\n const category = TATTOO_CATEGORIES[i]\r\n const zone = category.zone\r\n const label = category.label\r\n const index = category.index\r\n tattooZones[index] = {\r\n zone: zone,\r\n label: label,\r\n zoneIndex: index,\r\n dlcs: []\r\n }\r\n\r\n for (let j = 0; j < TATTOO_LIST.length; j++) {\r\n const dlcData = TATTOO_LIST[j]\r\n tattooZones[index].dlcs.push({\r\n label: dlcData.dlc,\r\n dlcIndex: j,\r\n tattoos: []\r\n })\r\n }\r\n }\r\n\r\n const isFemale = GetEntityModel(ped) === GetHashKey(\"mp_f_freemode_01\")\r\n\r\n for (let i = 0; i < TATTOO_LIST.length; i++) {\r\n const data = TATTOO_LIST[i]\r\n const { dlc, tattoos } = data\r\n const dlcHash = GetHashKey(dlc)\r\n for (let j = 0; j < tattoos.length; j++) {\r\n const tattooData = tattoos[j]\r\n let tattoo = null\r\n\r\n const lowerTattoo = tattooData.toLowerCase()\r\n const isFemaleTattoo = lowerTattoo.includes(\"_f\")\r\n if (isFemaleTattoo && isFemale) {\r\n tattoo = tattooData\r\n } else if (!isFemaleTattoo && !isFemale) {\r\n tattoo = tattooData\r\n }\r\n\r\n let hash = null\r\n let zone = -1\r\n\r\n if (tattoo) {\r\n hash = GetHashKey(tattoo)\r\n zone = GetPedDecorationZoneFromHashes(dlcHash, hash)\r\n }\r\n\r\n if (zone !== -1 && hash) {\r\n const zoneTattoos = tattooZones[zone].dlcs[i].tattoos\r\n\r\n zoneTattoos.push({\r\n label: tattoo,\r\n hash: hash,\r\n zone: zone,\r\n dlc: dlc,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return tattooZones\r\n}\r\n\r\nexport async function getTattoos(): Promise {\r\n return await triggerServerCallback('bl_appearance:server:getTattoos') || []\r\n}\r\nexports('GetPlayerTattoos', getTattoos);\r\n//migration\r\n\r\nonServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => {\r\n if (data.type === 'fivem') exports['fivem-appearance'].setPlayerAppearance(data.data)\r\n if (data.type === 'illenium') exports['illenium-appearance'].setPlayerAppearance(data.data)\r\n});", "export default {\r\n hats: {\r\n type: \"prop\",\r\n index: 0,\r\n },\r\n glasses: {\r\n type: \"prop\",\r\n index: 1,\r\n },\r\n masks: {\r\n type: \"drawable\",\r\n index: 1,\r\n off: 0,\r\n },\r\n shirts: {\r\n type: \"drawable\",\r\n index: 8,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 8, variant: 15, texture: 0, id: 'shirts' }\r\n ]\r\n }\r\n },\r\n jackets: {\r\n type: \"drawable\",\r\n index: 11,\r\n off: 15,\r\n hook: {\r\n drawables: [\r\n { component: 3, variant: 15, texture: 0, id: 'torsos' },\r\n { component: 11, variant: 15, texture: 0, id: 'jackets' }\r\n ]\r\n }\r\n },\r\n vest: {\r\n type: \"drawable\",\r\n index: 9,\r\n off: 0,\r\n },\r\n legs: {\r\n type: \"drawable\",\r\n index: 4,\r\n off: 18,\r\n },\r\n shoes: {\r\n type: \"drawable\",\r\n index: 6,\r\n off: 34,\r\n }\r\n}", "import { TAppearance, THairColor, TClothes, TSkin, TValue, THeadStructure } from \"@typings/appearance\";\r\nimport TOGGLE_INDEXES from \"@data/toggles\"\r\nimport { requestModel, ped, updatePed, isPedFreemodeModel} from '@utils';\r\nimport { TTattoo } from \"@typings/tattoos\";\r\n\r\nexport function setDrawable(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setDrawable')\r\n\r\n SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0)\r\n return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetPedDrawable', setDrawable);\r\n\r\nexport function setProp(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setProp')\r\n\r\n if (data.value === -1) {\r\n ClearPedProp(pedHandle, data.index)\r\n return\r\n }\r\n\r\n SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false)\r\n return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value)\r\n}\r\nexports('SetPedProp', setProp);\r\n\r\nconst defMaleHash = GetHashKey(\"mp_m_freemode_01\")\r\n\r\nexport const setModel = async (pedHandle: number, data: TAppearance | TSkin | number | string): Promise => {\r\n if (data == null || data === undefined) {\r\n console.warn('No data provided for setModel')\r\n return pedHandle;\r\n }\r\n\r\n let model: number;\r\n if (typeof data === 'string') {\r\n model = GetHashKey(data);\r\n } else if (typeof data === 'number') {\r\n model = data;\r\n } else {\r\n model = data.model || defMaleHash;\r\n }\r\n\r\n if (model === 0) return pedHandle;\r\n\r\n await requestModel(model);\r\n\r\n const isPlayer = IsPedAPlayer(pedHandle);\r\n if (isPlayer) {\r\n SetPlayerModel(PlayerId(), model);\r\n pedHandle = PlayerPedId();\r\n updatePed(pedHandle)\r\n } else {\r\n SetPlayerModel(pedHandle, model);\r\n }\r\n\r\n SetModelAsNoLongerNeeded(model);\r\n SetPedDefaultComponentVariation(pedHandle);\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return pedHandle;\r\n\r\n const isJustModel = typeof data === 'string' || typeof data === 'number';\r\n const hasHeadBlend = !isJustModel && data.headBlend && Object.keys(data.headBlend).length > 0;\r\n\r\n if (hasHeadBlend) {\r\n setHeadBlend(pedHandle, (data as TAppearance | TSkin).headBlend);\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else {\r\n if (model === GetHashKey(\"mp_m_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, false);\r\n } else if (model === GetHashKey(\"mp_f_freemode_01\")) {\r\n SetPedHeadBlendData(pedHandle, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false);\r\n }\r\n }\r\n\r\n return pedHandle;\r\n};\r\nexports('SetPedModel', setModel);\r\n\r\nexport function setFaceFeature(pedHandle: number, data: TValue) {\r\n if (!data) return console.warn('No data provided for setFaceFeature')\r\n\r\n SetPedFaceFeature(pedHandle, data.index, data.value + 0.0)\r\n}\r\nexports('SetPedFaceFeature', setFaceFeature);\r\n\r\nexport function setFaceFeatures(pedHandle: number, data: THeadStructure) {\r\n if (!data) return console.warn('No data provided for setFaceFeatures')\r\n \r\n\r\n for (const feature in data) {\r\n const value = data[feature]\r\n setFaceFeature(pedHandle, value)\r\n }\r\n}\r\nexports('SetPedFaceFeatures', setFaceFeatures);\r\n\r\nconst isPositive = (val: number) => val >= 0 ? val : 0\r\n\r\nexport function setHeadBlend(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadBlend')\r\n\r\n pedHandle = pedHandle || ped\r\n\r\n if (!isPedFreemodeModel(pedHandle)) return\r\n\r\n const shapeFirst = isPositive(data.shapeFirst)\r\n const shapeSecond = isPositive(data.shapeSecond)\r\n const shapeThird = isPositive(data.shapeThird)\r\n const skinFirst = isPositive(data.skinFirst)\r\n const skinSecond = isPositive(data.skinSecond)\r\n const skinThird = isPositive(data.skinThird)\r\n const shapeMix = data.shapeMix + 0.0\r\n const skinMix = data.skinMix + 0.0\r\n const thirdMix = data.thirdMix + 0.0\r\n const hasParent = data.hasParent\r\n\r\n SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent)\r\n}\r\nexports('SetPedHeadBlend', setHeadBlend);\r\n\r\nexport function setHeadOverlay(pedHandle: number, data) {\r\n if (!data) return console.warn('No data provided for setHeadOverlay')\r\n\r\n const index = data.index\r\n\r\n if (index === 13) {\r\n SetPedEyeColor(pedHandle, data.value)\r\n return\r\n }\r\n\r\n const value = data.overlayValue\r\n\r\n /* Hair color does not have an index, only an ID so we'll check for that */\r\n if (data.id === 'hairColor') {\r\n SetPedHairTint(pedHandle, data.hairColor, data.hairHighlight)\r\n return;\r\n }\r\n\r\n SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0)\r\n SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor)\r\n}\r\nexports('SetPedHeadOverlay', setHeadOverlay);\r\n\r\n\r\nexport function resetToggles(data) {\r\n const drawables = data.drawables\r\n const props = data.props\r\n\r\n for (const [toggleItem, toggleData] of Object.entries(TOGGLE_INDEXES)) {\r\n const toggleType = toggleData.type\r\n const index = toggleData.index\r\n\r\n if (toggleType === \"drawable\" && drawables[toggleItem]) {\r\n const currentDrawable = GetPedDrawableVariation(ped, index)\r\n if (currentDrawable !== drawables[toggleItem].value) {\r\n SetPedComponentVariation(ped, index, drawables[toggleItem].value, 0, 0)\r\n }\r\n } else if (toggleType === \"prop\" && props[toggleItem]) {\r\n const currentProp = GetPedPropIndex(ped, index)\r\n if (currentProp !== props[toggleItem].value) {\r\n SetPedPropIndex(ped, index, props[toggleItem].value, 0, false)\r\n }\r\n }\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport function setPedClothes(pedHandle: number, data: TClothes) {\r\n if (!data) return console.warn('No data provided for setPedClothes')\r\n\r\n const drawables = data.drawables\r\n const props = data.props\r\n const headOverlay = data.headOverlay\r\n for (const id in drawables) {\r\n const drawable = drawables[id]\r\n setDrawable(pedHandle, drawable)\r\n }\r\n\r\n for (const id in props) {\r\n const prop = props[id]\r\n setProp(pedHandle, prop)\r\n }\r\n\r\n for (const id in headOverlay) {\r\n const overlay = headOverlay[id]\r\n setHeadOverlay(pedHandle, overlay)\r\n }\r\n}\r\nexports('SetPedClothes', setPedClothes);\r\n\r\nexport const setPedSkin = async (pedHandle: number, data: TSkin) => {\r\n if (!data) return console.warn('No data provided for setPedSkin')\r\n\r\n if (!pedHandle) return console.warn('No pedHandle provided for setPedSkin')\r\n\r\n pedHandle = await setModel(pedHandle, data)\r\n\r\n const headStructure = data.headStructure\r\n const headBlend = data.headBlend\r\n\r\n if (headBlend) setHeadBlend(pedHandle, headBlend)\r\n \r\n if (headStructure) setFaceFeatures(pedHandle, headStructure)\r\n}\r\nexports('SetPedSkin', setPedSkin);\r\n\r\nexport function setPedTattoos(pedHandle: number, data: TTattoo[]) {\r\n if (!data) return console.warn('No data provided for setPedTattoos')\r\n\r\n ClearPedDecorationsLeaveScars(pedHandle)\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const tattooData = data[i].tattoo\r\n if (tattooData) {\r\n const collection = GetHashKey(tattooData.dlc)\r\n const tattoo = tattooData.hash\r\n AddPedDecorationFromHashes(pedHandle, collection, tattoo)\r\n }\r\n }\r\n}\r\nexports('SetPedTattoos', setPedTattoos);\r\n\r\nexport function setPedHairColors(pedHandle: number, data: THairColor) {\r\n if (!data) return console.warn('No data provided for setPedHairColors')\r\n\r\n const color = data.color\r\n const highlight = data.highlight\r\n SetPedHairColor(pedHandle, color, highlight)\r\n}\r\nexports('SetPedHairColors', setPedHairColors);\r\n\r\nexport async function setPedAppearance(pedHandle: number, data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPedAppearance')\r\n\r\n if (IsPedAPlayer(pedHandle)) {\r\n setPlayerPedAppearance(data)\r\n return\r\n }\r\n await setPedSkin(pedHandle, data)\r\n setPedClothes(pedHandle, data)\r\n setPedHairColors(pedHandle, data.hairColor)\r\n setPedTattoos(pedHandle, data.tattoos)\r\n}\r\nexports('SetPedAppearance', setPedAppearance);\r\n\r\nexport async function setPlayerPedAppearance(data: TAppearance) {\r\n if (!data) return console.warn('No data provided for setPlayerPedAppearance')\r\n // Since this function is usually called after scripts set their own model, we need to update the ped before we set the appearance\r\n updatePed(PlayerPedId())\r\n await setPedSkin(ped, data)\r\n // We need to update the ped again after setting the skin because SetPlayerModel will set a new PlayerPedId\r\n updatePed(PlayerPedId())\r\n setPedClothes(ped, data)\r\n setPedHairColors(ped, data.hairColor)\r\n setPedTattoos(ped, data.tattoos)\r\n}\r\n\r\nexports('SetPedClothes', setPedClothes)\r\nexports('SetPedSkin', setPedSkin)\r\nexports('SetPedTattoos', setPedTattoos)\r\nexports('SetPedHairColors', setPedHairColors)", "import { Receive } from '@events';\r\nimport {\r\n\tresetToggles,\r\n\tsetDrawable,\r\n\tsetFaceFeature,\r\n\tsetHeadBlend,\r\n\tsetHeadOverlay,\r\n\tsetModel,\r\n\tsetPedClothes,\r\n\tsetPedTattoos,\r\n\tsetPlayerPedAppearance,\r\n\tsetProp,\r\n} from './appearance/setters';\r\nimport { closeMenu } from './menu';\r\nimport { TAppearance, TToggleData, TValue } from '@typings/appearance';\r\nimport { delay, getFrameworkID, triggerServerCallback, ped, updatePed } from '@utils';\r\nimport { getAppearance, getTattooData } from './appearance/getters';\r\nimport TOGGLE_INDEXES from '@data/toggles';\r\nimport { TOutfitData } from '@typings/outfits';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nRegisterNuiCallback(Receive.cancel, async (appearance: TAppearance, cb: Function) => {\r\n\tawait setPlayerPedAppearance(appearance);\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.save, async (appearance: TAppearance, cb: Function) => {\r\n\tresetToggles(appearance);\r\n\r\n\tawait delay(100);\r\n\r\n\tconst newAppearance = await getAppearance(ped);\r\n\tnewAppearance.tattoos = appearance.tattoos || null\r\n\ttriggerServerCallback('bl_appearance:server:saveAppearance', getFrameworkID(), newAppearance);\r\n\r\n\tsetPedTattoos(ped, newAppearance.tattoos);\r\n\r\n\tcloseMenu();\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setModel, async (model: string, cb: Function) => {\r\n\tconst hash = GetHashKey(model);\r\n\tif (!IsModelInCdimage(hash) || !IsModelValid(hash)) {\r\n\t\treturn cb(0);\r\n\t}\r\n\r\n\r\n\tconst newPed = await setModel(ped, hash);\r\n\r\n updatePed(newPed)\r\n\r\n\tconst appearance = await getAppearance(ped);\r\n\r\n\tappearance.tattoos = [];\r\n\r\n\tsetPedTattoos(ped, []);\r\n\r\n\tcb(appearance);\r\n});\r\n\r\nRegisterNuiCallback(Receive.getModelTattoos, async (_: any, cb: Function) => {\r\n\tconst tattoos = getTattooData();\r\n\r\n\tcb(tattoos);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadStructure, async (data: TValue, cb: Function) => {\r\n\tsetFaceFeature(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadOverlay, async (data: TValue, cb: Function) => {\r\n\tsetHeadOverlay(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setHeadBlend, async (data: TValue, cb: Function) => {\r\n\tsetHeadBlend(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setTattoos, async (data: TTattoo[], cb: Function) => {\r\n\tsetPedTattoos(ped, data);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setProp, async (data: TValue, cb: Function) => {\r\n\tlet texture = setProp(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.setDrawable, async (data: TValue, cb: Function) => {\r\n\tlet texture = setDrawable(ped, data);\r\n\tcb(texture);\r\n});\r\n\r\nRegisterNuiCallback(Receive.toggleItem, async (data: TToggleData, cb: Function) => {\r\n\tconst item = TOGGLE_INDEXES[data.item];\r\n\tif (!item) return cb(false);\r\n\r\n\tconst current = data.data;\r\n\tconst type = item.type;\r\n\tconst index = item.index;\r\n\tconst hook = item.hook;\r\n\tconst hookData = data.hookData;\r\n\r\n\tif (!current) return cb(false);\r\n\r\n\tif (type === 'prop') {\r\n\t\tconst currentProp = GetPedPropIndex(ped, index);\r\n\r\n\t\tif (currentProp === -1) {\r\n\t\t\tsetProp(ped, current);\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tClearPedProp(ped, index);\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else if (type === 'drawable') {\r\n\t\tconst currentDrawable = GetPedDrawableVariation(ped, index);\r\n\r\n\t\tif (current.value === item.off) {\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (current.value === currentDrawable) {\r\n\t\t\tSetPedComponentVariation(ped, index, item.off, 0, 0);\r\n\t\t\tif (hook) {\r\n\t\t\t\tfor(let i=0; i < hook.drawables?.length; i++) {\r\n\t\t\t\t\tconst hookItem = hook.drawables[i];\r\n\t\t\t\t\tSetPedComponentVariation(ped, hookItem.component, hookItem.variant, hookItem.texture, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcb(true);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tsetDrawable(ped, current);\r\n\t\t\tfor(let i=0; i < hookData?.length; i++) {\r\n\t\t\t\tsetDrawable(ped, hookData[i]);\r\n\t\t\t}\r\n\t\t\tcb(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n);\r\n\r\nRegisterNuiCallback(Receive.saveOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:saveOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.deleteOutfit, async ({id}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:deleteOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.renameOutfit, async (data: any, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:renameOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.useOutfit, async (outfit: TOutfitData, cb: Function) => {\r\n\tsetPedClothes(ped, outfit);\r\n\tcb(1);\r\n});\r\n\r\nRegisterNuiCallback(Receive.importOutfit, async ({ id, outfitName }, cb: Function) => {\r\n\tconst frameworkdId = getFrameworkID();\r\n\tconst result = await triggerServerCallback('bl_appearance:server:importOutfit', frameworkdId, id, outfitName);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.fetchOutfit, async ({ id }, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:fetchOutfit', id);\r\n\tcb(result);\r\n});\r\n\r\nRegisterNuiCallback(Receive.itemOutfit, async (data: {outfit: TOutfitData, label: string}, cb: Function) => {\r\n\tconst result = await triggerServerCallback('bl_appearance:server:itemOutfit', data);\r\n\tcb(result);\r\n});\r\n\r\nonNet('bl_appearance:server:useOutfiItem', (outfit: TOutfitData) => {\r\n\tsetPedClothes(ped, outfit);\r\n})", "import { getFrameworkID, requestLocale, sendNUIEvent, triggerServerCallback, updatePed, ped, getPlayerData, getJobInfo, getPlayerGenderModel } from \"@utils\"\r\nimport { startCamera, stopCamera } from \"./camera\"\r\nimport type { TAppearanceZone, TMenuTypes } from \"@typings/appearance\"\r\nimport { Outfit } from \"@typings/outfits\"\r\nimport { Send } from \"@events\"\r\nimport { getAppearance, getTattooData } from \"./appearance/getters\"\r\nimport \"./handlers\"\r\nimport { setModel } from \"./appearance/setters\"\r\n\r\nconst config = exports.bl_appearance\r\nlet armour = 0\r\nlet open = false\r\n\r\nlet resolvePromise = null;\r\nlet promise = null;\r\n\r\nexport async function openMenu(zone: TAppearanceZone | TAppearanceZone['type'], creation: boolean = false) {\r\n if (zone === null || open) {\r\n return;\r\n }\r\n\r\n let pedHandle = PlayerPedId()\r\n const configMenus = config.menus()\r\n\r\n const isString = typeof zone === 'string'\r\n\r\n const type = isString ? zone : zone.type\r\n\r\n const menu = configMenus[type]\r\n if (!menu) return\r\n\r\n updatePed(pedHandle)\r\n\r\n const frameworkdId = getFrameworkID()\r\n const tabs = menu.tabs\r\n let allowExit = creation ? false : menu.allowExit\r\n\r\n armour = GetPedArmour(pedHandle)\r\n\r\n let outfits = []\r\n\r\n const hasOutfitTab = tabs.includes('outfits')\r\n if (hasOutfitTab) outfits = await triggerServerCallback('bl_appearance:server:getOutfits', frameworkdId) as Outfit[]\r\n\r\n let models = []\r\n\r\n const hasHeritageTab = tabs.includes('heritage')\r\n if (hasHeritageTab) {\r\n models = config.models()\r\n }\r\n\r\n const hasTattooTab = tabs.includes('tattoos')\r\n let tattoos\r\n if (hasTattooTab) {\r\n tattoos = getTattooData()\r\n }\r\n\r\n const blacklist = getBlacklist(zone)\r\n\r\n if (creation) {\r\n const model = GetHashKey(getPlayerGenderModel());\r\n pedHandle = await setModel(pedHandle, model);\r\n emitNet('bl_appearance:server:setroutingbucket')\r\n promise = new Promise(resolve => {\r\n resolvePromise = resolve;\r\n });\r\n\r\n updatePed(pedHandle)\r\n }\r\n\r\n const appearance = await getAppearance(pedHandle)\r\n\r\n startCamera()\r\n\r\n sendNUIEvent(Send.data, {\r\n tabs,\r\n appearance,\r\n blacklist,\r\n tattoos,\r\n outfits,\r\n models,\r\n allowExit,\r\n job: getJobInfo(),\r\n locale: await requestLocale('locale')\r\n })\r\n\r\n SetNuiFocus(true, true)\r\n sendNUIEvent(Send.visible, true)\r\n\r\n open = true\r\n\r\n exports.bl_appearance.hideHud(true)\r\n\r\n if (promise) {\r\n await promise\r\n emitNet('bl_appearance:server:resetroutingbucket');\r\n }\r\n\r\n promise = null;\r\n resolvePromise = null;\r\n return true\r\n}\r\nexports('OpenMenu', openMenu)\r\n\r\nRegisterCommand('appearance', async (_, args: string[]) => {\r\n const type = args[0]\r\n if (!type) {\r\n exports.bl_appearance.InitialCreation()\r\n } else {\r\n const zone = type.toLowerCase() as TMenuTypes\r\n openMenu(zone)\r\n }\r\n}, true)\r\n\r\n\r\nfunction getBlacklist(zone: TAppearanceZone | string) {\r\n const {groupTypes, base} = config.blacklist()\r\n\r\n if (typeof zone === 'string') return base\r\n\r\n if (!groupTypes) return base\r\n\r\n let blacklist = {...base}\r\n\r\n const playerData = getPlayerData()\r\n\r\n\r\n for (const type in groupTypes) {\r\n const groups = groupTypes[type]\r\n for (const group in groups) {\r\n\r\n let skip: boolean = false\r\n \r\n if (type == 'jobs' && zone.jobs) {\r\n skip = zone.jobs.includes(playerData.job.name)\r\n }\r\n\r\n if (type == 'gangs' && zone.gangs) {\r\n skip = zone.gangs.includes(playerData.gang.name)\r\n }\r\n\r\n if (!skip) {\r\n const groupBlacklist = groups[group]\r\n blacklist = Object.assign({}, blacklist, groupBlacklist, {\r\n drawables: Object.assign({}, blacklist.drawables, groupBlacklist.drawables)\r\n })\r\n }\r\n }\r\n }\r\n\r\n return blacklist\r\n\r\n // return blacklist\r\n}\r\n\r\nexport function closeMenu() {\r\n SetPedArmour(ped, armour)\r\n\r\n stopCamera()\r\n SetNuiFocus(false, false)\r\n sendNUIEvent(Send.visible, false)\r\n\r\n\r\n exports.bl_appearance.hideHud(false)\r\n\r\n if (resolvePromise) {\r\n resolvePromise();\r\n }\r\n open = false\r\n}\r\n", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance } from \"../appearance/setters\"\nimport { openMenu } from \"../menu\"\n\nexport function QBBridge() {\n onNet('qb-clothing:client:loadPlayerClothing', async (appearance: TAppearance, ped: number) => {\n await setPedAppearance(ped, appearance)\n })\n\n onNet('qb-clothes:client:CreateFirstCharacter', () => {\n exports.bl_appearance.InitialCreation()\n })\n\n onNet('qb-clothing:client:openOutfitMenu', () => {\n openMenu({ type: \"outfits\", coords: [0, 0, 0, 0] }) \n })\n}", "\nimport { TAppearance } from \"@typings/appearance\"\nimport { setPedAppearance, setPlayerPedAppearance } from \"../appearance/setters\"\nimport { getFrameworkID, triggerServerCallback } from \"@utils\"\n\nexport function ESXBridge() {\n let firstSpawn = false\n\n on(\"esx_skin:resetFirstSpawn\", () => {\n firstSpawn = true\n });\n\n on(\"esx_skin:playerRegistered\", () => {\n if(firstSpawn)\n exports.bl_appearance.InitialCreation()\n });\n\n onNet('skinchanger:loadSkin2', async (appearance: TAppearance, ped: number) => {\n if (!appearance.model) appearance.model = GetHashKey(\"mp_m_freemode_01\");\n await setPedAppearance(ped, appearance)\n });\n\n onNet('skinchanger:getSkin', async (cb: any) => {\n const frameworkID = await getFrameworkID()\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\n cb(appearance)\n })\n\n onNet('skinchanger:loadSkin', async (appearance: TAppearance, cb: any) => {\n await setPlayerPedAppearance(appearance)\n if (cb) cb()\n })\n\n onNet('esx_skin:openSaveableMenu', async (onSubmit: any) => {\n exports.bl_appearance.InitialCreation(onSubmit)\n })\n}", "import { TAppearance } from \"@typings/appearance\";\nimport { getAppearance, getDrawables, getProps } from \"../appearance/getters\";\nimport { setDrawable, setModel, setPedAppearance, setPedTattoos, setProp } from \"../appearance/setters\";\nimport { TTattoo } from \"@typings/tattoos\";\nimport { ped, updatePed } from \"@utils\";\n\nfunction exportHandler(name: string, cb: any) {\n on('__cfx_export_illenium-appearance_' + name, (setCB: any) => {\n setCB(cb);\n })\n}\n\nexport function illeniumCompat() {\n exportHandler('startPlayerCustomization', () => {\n exports.bl_appearance.InitialCreation()\n });\n\n exportHandler('getPedModel', (ped: number) => {\n return GetEntityModel(ped)\n });\n\n exportHandler('getPedComponents', (ped: number) => {\n const drawables: any = getDrawables(ped)[0];\n let newdrawable = [];\n for (const id of drawables) {\n const drawable = drawables[id];\n newdrawable.push({\n component_id: drawable.index,\n drawable: drawable.value,\n texture: drawable.texture\n })\n }\n });\n\n exportHandler('getPedProps', (ped: number) => {\n const props: any = getProps(ped)[0];\n let newProps = [];\n for (const id of props) {\n const prop = props[id];\n newProps.push({\n prop_id: prop.index,\n drawable: prop.value,\n texture: prop.texture\n })\n }\n });\n\n exportHandler('getPedHeadBlend', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadBlendData(ped);\n });\n\n exportHandler('getPedFaceFeatures', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadStructure(ped);\n });\n\n exportHandler('getPedHeadOverlays', (ped: number) => {\n return console.warn('You Still cannot use this function');\n //return getHeadOverlay(ped);\n });\n\n exportHandler('getPedHair', (ped: number) => {\n //return getHair(ped);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('getPedAppearance', (ped: number) => {\n return getAppearance(ped);\n });\n\n exportHandler('setPlayerModel', (model: number) => {\n updatePed(PlayerPedId())\n setModel(ped, model);\n });\n\n exportHandler('setPedHeadBlend', (ped: number, blend: any) => {\n //setHeadBlend(ped, blend);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedFaceFeatures', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHeadOverlays', (ped: number, overlay: any) => {\n //setHeadOverlay(ped, overlay);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedHair', async (ped: number, hair: any, tattoo: any) => {\n //setPedHairColors(ped, hair);\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedEyeColor', () => {\n return console.warn('You Still cannot use this function');\n });\n\n exportHandler('setPedComponent', (ped: number, drawable: any) => {\n const newDrawable = {\n index: drawable.component_id,\n value: drawable.drawable,\n texture: drawable.texture\n }\n setDrawable(ped, newDrawable);\n });\n\n exportHandler('setPedComponents', (ped: number, components: any) => {\n for (const component of components) {\n const newDrawable = {\n index: component.component_id,\n value: component.drawable,\n texture: component.texture\n }\n setDrawable(ped, newDrawable);\n }\n });\n\n exportHandler('setPedProp', (ped: number, prop: any) => {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n });\n\n exportHandler('setPedProps', (ped: number, props: any) => {\n for (const prop of props) {\n const newProp = {\n index: prop.prop_id,\n value: prop.drawable,\n texture: prop.texture\n }\n setProp(ped, newProp);\n }\n });\n\n // exportHandler('setPlayerAppearance', (appearance: TAppearance) => {\n // return console.warn('Need to be implemented');\n // });\n\n exportHandler('setPedAppearance', (ped: number, appearance: TAppearance) => {\n setPedAppearance(ped, appearance)\n });\n\n exportHandler('setPedTattoos', (ped: number, tattoos: TTattoo[]) => {\n setPedTattoos(ped, tattoos)\n });\n}", "import { TAppearance, TAppearanceZone } from \"@typings/appearance\"\r\nimport { openMenu } from \"./menu\"\r\nimport { setPlayerPedAppearance } from \"./appearance/setters\"\r\nimport { triggerServerCallback, getFrameworkID, Delay, bl_bridge, ped, delay, format, updatePed } from \"@utils\"\r\nimport { QBBridge } from \"./bridge/qb\"\r\nimport { ESXBridge } from \"./bridge/esx\"\r\nimport { illeniumCompat } from \"./compat/illenium\"\r\n\r\nexports('SetPlayerPedAppearance', async (appearance: TAppearance | string) => {\r\n let resolvedAppearance: TAppearance;\r\n \r\n if (!appearance || typeof appearance === 'string') {\r\n const frameworkID: string = appearance || await getFrameworkID();\r\n resolvedAppearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID) as TAppearance;\r\n } else if (typeof appearance === 'object') resolvedAppearance = appearance;\r\n \r\n if (!resolvedAppearance) {\r\n throw new Error('No valid appearance found');\r\n }\r\n \r\n await setPlayerPedAppearance(resolvedAppearance);\r\n});\r\n\r\nexports('GetPlayerPedAppearance', async (frameworkID: string) => {\r\n frameworkID = frameworkID || await getFrameworkID()\r\n return await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n})\r\n\r\nexports('InitialCreation', async (cb?: Function) => {\r\n // The first argument needs to be type of TAppearanceZone meaning it needs a coords property, but in this case it's not used\r\n await openMenu({ type: \"appearance\", coords: [0, 0, 0, 0] }, true)\r\n if (cb) cb()\r\n})\r\n\r\non('bl_appearance:client:useZone', (zone: TAppearanceZone) => {\r\n openMenu(zone)\r\n})\r\n\r\nonNet('bl_bridge:client:playerLoaded', async () => {\r\n while (!bl_bridge.core().playerLoaded()) {\r\n await Delay(100);\r\n }\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n})\r\n\r\nonNet('onResourceStart', async (resource: string) => {\r\n if (resource === GetCurrentResourceName() && bl_bridge.core().playerLoaded()) {\r\n const frameworkID = await getFrameworkID()\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n }\r\n})\r\n\r\nconst frameworkName = bl_bridge.getFramework('core')\r\nconst core = format(GetConvar('bl:framework', 'qb'))\r\n\r\nif (core == 'qb' || core == 'qbx' && GetResourceState(frameworkName) == 'started') {\r\n QBBridge();\r\n} else if (core == 'esx' && GetResourceState(frameworkName) == 'started') {\r\n ESXBridge();\r\n}\r\n\r\nilleniumCompat();\r\n\r\nRegisterCommand('reloadskin', async () => {\r\n const frameworkID = await getFrameworkID()\r\n const health = GetEntityHealth(ped);\r\n const maxhealth = GetEntityMaxHealth(ped);\r\n const armor = GetPedArmour(ped);\r\n\r\n const appearance = await triggerServerCallback('bl_appearance:server:getAppearance', frameworkID)\r\n if (!appearance) return;\r\n await setPlayerPedAppearance(appearance)\r\n\r\n SetPedMaxHealth(ped, maxhealth)\r\n delay(1000) \r\n SetEntityHealth(ped, health)\r\n SetPedArmour(ped, armor)\r\n}, false)\r\n"], + "mappings": "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", "names": ["delay", "ped", "x", "y", "z", "config", "ped", "ped", "ped"] } diff --git a/dist/server/init.js b/dist/server/init.js index 5389fd6..297ac61 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -562,7 +562,7 @@ async function getAppearance(src, frameworkId) { } __name(getAppearance, "getAppearance"); onClientCallback("bl_appearance:server:getAppearance", getAppearance); -exports("GetAppearance", function(id) { +exports("GetPlayerAppearance", function(id) { return getAppearance(null, id); }); @@ -598,4 +598,4 @@ RegisterCommand("migrate", async (source2) => { const importedModule = await globImport_migrate_ts(`./migrate/${config2.previousClothing === "fivem-appearance" ? "fivem" : config2.previousClothing}.ts`); importedModule.default(source2); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0BvdmVyZXh0ZW5kZWQvb3hteXNxbC9NeVNRTC50cyIsICIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9zZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9lc3gudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9taWdyYXRlL2ZpdmVtLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9pbGxlbml1bS50cyIsICIuLi8uLi9zcmMvc2VydmVyL21pZ3JhdGUvcWIudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9hcHBlYXJhbmNlL291dGZpdHMudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9pbml0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ0eXBlIFF1ZXJ5ID0gc3RyaW5nIHwgbnVtYmVyO1xyXG50eXBlIFBhcmFtcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdIHwgRnVuY3Rpb247XHJcbnR5cGUgQ2FsbGJhY2s8VD4gPSAocmVzdWx0OiBUIHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgVHJhbnNhY3Rpb24gPVxyXG4gIHwgc3RyaW5nW11cclxuICB8IFtzdHJpbmcsIFBhcmFtc11bXVxyXG4gIHwgeyBxdWVyeTogc3RyaW5nOyB2YWx1ZXM6IFBhcmFtcyB9W11cclxuICB8IHsgcXVlcnk6IHN0cmluZzsgcGFyYW1ldGVyczogUGFyYW1zIH1bXTtcclxuXHJcbmludGVyZmFjZSBSZXN1bHQge1xyXG4gIFtjb2x1bW46IHN0cmluZyB8IG51bWJlcl06IGFueTtcclxuICBhZmZlY3RlZFJvd3M/OiBudW1iZXI7XHJcbiAgZmllbGRDb3VudD86IG51bWJlcjtcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGluc2VydElkPzogbnVtYmVyO1xyXG4gIHNlcnZlclN0YXR1cz86IG51bWJlcjtcclxuICB3YXJuaW5nU3RhdHVzPzogbnVtYmVyO1xyXG4gIGNoYW5nZWRSb3dzPzogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm93IHtcclxuICBbY29sdW1uOiBzdHJpbmcgfCBudW1iZXJdOiB1bmtub3duO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT3hNeVNRTCB7XHJcbiAgc3RvcmU6IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgcXVlcnk6IDxUID0gUmVzdWx0IHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBzaW5nbGU6IDxUID0gUm93IHwgbnVsbD4oXHJcbiAgICBxdWVyeTogUXVlcnksXHJcbiAgICBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxFeGNsdWRlPFQsIFtdPj4sXHJcbiAgICBjYj86IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PlxyXG4gICkgPT4gUHJvbWlzZTxFeGNsdWRlPFQsIFtdPj47XHJcbiAgc2NhbGFyOiA8VCA9IHVua25vd24gfCBudWxsPihcclxuICAgIHF1ZXJ5OiBRdWVyeSxcclxuICAgIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PixcclxuICAgIGNiPzogQ2FsbGJhY2s8RXhjbHVkZTxULCBbXT4+XHJcbiAgKSA9PiBQcm9taXNlPEV4Y2x1ZGU8VCwgW10+PjtcclxuICB1cGRhdGU6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBpbnNlcnQ6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBwcmVwYXJlOiA8VCA9IGFueT4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICByYXdFeGVjdXRlOiA8VCA9IFJlc3VsdCB8IG51bGw+KHF1ZXJ5OiBRdWVyeSwgcGFyYW1zPzogUGFyYW1zIHwgQ2FsbGJhY2s8VD4sIGNiPzogQ2FsbGJhY2s8VD4pID0+IFByb21pc2U8VD47XHJcbiAgdHJhbnNhY3Rpb246IChxdWVyeTogVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPGJvb2xlYW4+LCBjYj86IENhbGxiYWNrPGJvb2xlYW4+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIGlzUmVhZHk6ICgpID0+IGJvb2xlYW47XHJcbiAgYXdhaXRDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPHRydWU+O1xyXG59XHJcblxyXG5jb25zdCBRdWVyeVN0b3JlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XHJcbn1cclxuXHJcbmNvbnN0IHNhZmVBcmdzID0gKHF1ZXJ5OiBRdWVyeSB8IFRyYW5zYWN0aW9uLCBwYXJhbXM/OiBhbnksIGNiPzogRnVuY3Rpb24sIHRyYW5zYWN0aW9uPzogdHJ1ZSkgPT4ge1xyXG4gIGlmICh0eXBlb2YgcXVlcnkgPT09ICdudW1iZXInKSBxdWVyeSA9IFF1ZXJ5U3RvcmVbcXVlcnldO1xyXG5cclxuICBpZiAodHJhbnNhY3Rpb24pIHtcclxuICAgIGFzc2VydCh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnLCBgRmlyc3QgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0LCByZWNpZXZlZCAke3R5cGVvZiBxdWVyeX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXNzZXJ0KHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycsIGBGaXJzdCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1UeXBlID0gdHlwZW9mIHBhcmFtcztcclxuICAgIGFzc2VydChcclxuICAgICAgcGFyYW1UeXBlID09PSAnb2JqZWN0JyB8fCBwYXJhbVR5cGUgPT09ICdmdW5jdGlvbicsXHJcbiAgICAgIGBTZWNvbmQgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0IG9yIGZ1bmN0aW9uLCByZWNlaXZlZCAke3BhcmFtVHlwZX1gXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY2IgJiYgcGFyYW1UeXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNiID0gcGFyYW1zO1xyXG4gICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2IgIT09IHVuZGVmaW5lZCkgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJywgYFRoaXJkIGFyZ3VtZW50IGV4cGVjdGVkIGZ1bmN0aW9uLCByZWNlaXZlZCAke3R5cGVvZiBjYn1gKTtcclxuXHJcbiAgcmV0dXJuIFtxdWVyeSwgcGFyYW1zLCBjYl07XHJcbn07XHJcblxyXG5jb25zdCBleHAgPSBnbG9iYWwuZXhwb3J0cy5veG15c3FsO1xyXG5jb25zdCBjdXJyZW50UmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpO1xyXG5cclxuZnVuY3Rpb24gZXhlY3V0ZShtZXRob2Q6IHN0cmluZywgcXVlcnk6IFF1ZXJ5IHwgVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleHBbbWV0aG9kXShcclxuICAgICAgcXVlcnksXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgKHJlc3VsdCwgZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSxcclxuICAgICAgY3VycmVudFJlc291cmNlTmFtZSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KSBhcyBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBveG15c3FsOiBPeE15U1FMID0ge1xyXG4gIHN0b3JlKHF1ZXJ5KSB7XHJcbiAgICBhc3NlcnQodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJywgYFF1ZXJ5IGV4cGVjdHMgYSBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG5cclxuICAgIHJldHVybiBRdWVyeVN0b3JlLnB1c2gocXVlcnkpO1xyXG4gIH0sXHJcbiAgcmVhZHkoY2FsbGJhY2spIHtcclxuICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgIHdoaWxlIChHZXRSZXNvdXJjZVN0YXRlKCdveG15c3FsJykgIT09ICdzdGFydGVkJykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgYXN5bmMgcXVlcnkocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdxdWVyeScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNpbmdsZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NpbmdsZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNjYWxhcihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NjYWxhcicsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHVwZGF0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3VwZGF0ZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIGluc2VydChxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ2luc2VydCcsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHByZXBhcmUocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdwcmVwYXJlJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgYXN5bmMgcmF3RXhlY3V0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3Jhd0V4ZWN1dGUnLCBxdWVyeSwgcGFyYW1zKTtcclxuICAgIHJldHVybiBjYiA/IGNiKHJlc3VsdCkgOiByZXN1bHQ7XHJcbiAgfSxcclxuICBhc3luYyB0cmFuc2FjdGlvbihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiLCB0cnVlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3RyYW5zYWN0aW9uJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgaXNSZWFkeSgpIHtcclxuICAgIHJldHVybiBleHAuaXNSZWFkeSgpO1xyXG4gIH0sXHJcbiAgYXN5bmMgYXdhaXRDb25uZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGV4cC5hd2FpdENvbm5lY3Rpb24oKTtcclxuICB9LFxyXG59O1xyXG4iLCAiLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL3NlcnZlci9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcblxyXG5jb25zdCBhY3RpdmVFdmVudHMgPSB7fTtcclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5LCAuLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zdCByZXNvbHZlID0gYWN0aXZlRXZlbnRzW2tleV07XHJcbiAgICByZXR1cm4gcmVzb2x2ZSAmJiByZXNvbHZlKC4uLmFyZ3MpO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHBsYXllcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQga2V5OiBzdHJpbmc7XHJcbiAgICBkbyB7XHJcbiAgICAgICAga2V5ID0gYCR7ZXZlbnROYW1lfToke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgxMDAwMDAgKyAxKSl9OiR7cGxheWVySWR9YDtcclxuICAgIH0gd2hpbGUgKGFjdGl2ZUV2ZW50c1trZXldKTtcclxuICAgIGVtaXROZXQoYF9ibF9jYl8ke2V2ZW50TmFtZX1gLCBwbGF5ZXJJZCwgcmVzb3VyY2VOYW1lLCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgYWN0aXZlRXZlbnRzW2tleV0gPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkNsaWVudENhbGxiYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBjYjogKHBsYXllcklkOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IHNvdXJjZTtcclxuICAgICAgICBsZXQgcmVzcG9uc2U6IGFueTtcclxuICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNiKHNyYywgLi4uYXJncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyBjYWxsYmFjayBldmVudCAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGVtaXROZXQoYF9ibF9jYl8ke3Jlc291cmNlfWAsIHNyYywga2V5LCByZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBibF9icmlkZ2UgPSBleHBvcnRzLmJsX2JyaWRnZVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcmUgPSBibF9icmlkZ2UuY29yZSgpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyRGF0YSA9IChzcmM6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIGNvcmUuR2V0UGxheWVyKHNyYylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZyYW1ld29ya0lEID0gKHNyYzogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBwbGF5ZXIuaWRcclxufVxyXG5cclxuXHJcbmNvbnN0IGJsX2NvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5jb25maWcoKVxyXG5leHBvcnQgY29uc3QgY29uZmlnID0gYmxfY29uZmlnIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQ2xvdGhlcywgVFNraW4gfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2ssIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTa2luKHNyYzogbnVtYmVyLCBza2luOiBUU2tpbikge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgc2tpbiA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoc2tpbiksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZVNraW4nLCBzYXZlU2tpbik7XHJcbmV4cG9ydHMoJ1NhdmVTa2luJywgc2F2ZVNraW4pO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDbG90aGVzKHNyYzogbnVtYmVyLCBjbG90aGVzOiBUQ2xvdGhlcykge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgY2xvdGhlcyA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoY2xvdGhlcyksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUNsb3RoZXMnLCBzYXZlQ2xvdGhlcyk7XHJcbmV4cG9ydHMoJ1NhdmVDbG90aGVzJywgc2F2ZUNsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUYXR0b29zKHNyYzogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBhcHBlYXJhbmNlIFNFVCB0YXR0b29zID0gPyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeSh0YXR0b29zKSwgZnJhbWV3b3JrSWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlVGF0dG9vcycsIHNhdmVUYXR0b29zKTtcclxuZXhwb3J0cygnU2F2ZVRhdHRvb3MnLCBzYXZlVGF0dG9vcyk7XHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVBcHBlYXJhbmNlKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKHNyYyAmJiBmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXllcklkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZnJhbWV3b3JrSWQgIT09IHBsYXllcklkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignWW91IGFyZSB0cnlpbmcgdG8gc2F2ZSBhbiBhcHBlYXJhbmNlIGZvciBhIGRpZmZlcmVudCBwbGF5ZXInLCBzcmMsIGZyYW1ld29ya0lkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblx0aWYgKCFmcmFtZXdvcmtJZCkge1xyXG5cdFx0ZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgY2xvdGhlcyA9IHtcclxuXHRcdGRyYXdhYmxlczogYXBwZWFyYW5jZS5kcmF3YWJsZXMsXHJcblx0XHRwcm9wczogYXBwZWFyYW5jZS5wcm9wcyxcclxuXHRcdGhlYWRPdmVybGF5OiBhcHBlYXJhbmNlLmhlYWRPdmVybGF5LFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHNraW4gPSB7XHJcblx0XHRoZWFkQmxlbmQ6IGFwcGVhcmFuY2UuaGVhZEJsZW5kLFxyXG5cdFx0aGVhZFN0cnVjdHVyZTogYXBwZWFyYW5jZS5oZWFkU3RydWN0dXJlLFxyXG5cdFx0aGFpckNvbG9yOiBhcHBlYXJhbmNlLmhhaXJDb2xvcixcclxuXHRcdG1vZGVsOiBhcHBlYXJhbmNlLm1vZGVsLFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgW107XHJcblxyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuXHRcdCdJTlNFUlQgSU5UTyBhcHBlYXJhbmNlIChpZCwgY2xvdGhlcywgc2tpbiwgdGF0dG9vcykgVkFMVUVTICg/LCA/LCA/LCA/KSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBjbG90aGVzID0gVkFMVUVTKGNsb3RoZXMpLCBza2luID0gVkFMVUVTKHNraW4pLCB0YXR0b29zID0gVkFMVUVTKHRhdHRvb3MpOycsXHJcblx0XHRbXHJcblx0XHRcdGZyYW1ld29ya0lkLFxyXG5cdFx0XHRKU09OLnN0cmluZ2lmeShjbG90aGVzKSxcclxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoc2tpbiksXHJcblx0XHRcdEpTT04uc3RyaW5naWZ5KHRhdHRvb3MpLFxyXG5cdFx0XVxyXG5cdCk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBzYXZlQXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ1NhdmVBcHBlYXJhbmNlJywgZnVuY3Rpb24oaWQsIGFwcGVhcmFuY2UpIHtcclxuICAgIHJldHVybiBzYXZlQXBwZWFyYW5jZShudWxsLCBpZCwgYXBwZWFyYW5jZSlcclxufSk7XHJcbiIsICIiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2AnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmaXZlbScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbGxlbml1bScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgZW1pdE5ldCgncWItY2xvdGhlczpsb2FkU2tpbicsIHNyYywgMCwgZWxlbWVudC5tb2RlbCwgZWxlbWVudC5za2luKTtcbiAgICAgICAgYXdhaXQgZGVsYXkoMjAwKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCBzcmMpIGFzIFRBcHBlYXJhbmNlXG4gICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tIFwiQG92ZXJleHRlbmRlZC9veG15c3FsXCI7XHJcbmltcG9ydCB7IGNvbmZpZywgY29yZSwgZ2V0RnJhbWV3b3JrSUQsIGdldFBsYXllckRhdGEsIG9uQ2xpZW50Q2FsbGJhY2sgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE91dGZpdHMoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGpvYiA9IGNvcmUuR2V0UGxheWVyKHNyYykuam9iIHx8IHsgbmFtZTogJ3Vua25vd24nLCBncmFkZTogeyBuYW1lOiAndW5rbm93bicgfSB9XHJcblx0bGV0IHJlc3BvbnNlID0gYXdhaXQgb3hteXNxbC5wcmVwYXJlKFxyXG5cdFx0J1NFTEVDVCAqIEZST00gb3V0Zml0cyBXSEVSRSBwbGF5ZXJfaWQgPSA/IE9SIChqb2JuYW1lID0gPyBBTkQgam9icmFuayA8PSA/KScsXHJcblx0XHRbZnJhbWV3b3JrSWQsIGpvYi5uYW1lLCBqb2IuZ3JhZGUubmFtZV1cclxuXHQpO1xyXG5cdGlmICghcmVzcG9uc2UpIHJldHVybiBbXTtcclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcmVzcG9uc2UgPSBbcmVzcG9uc2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG91dGZpdHMgPSByZXNwb25zZS5tYXAoXHJcbiAgICAgICAgKG91dGZpdDogeyBpZDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBvdXRmaXQ6IHN0cmluZzsgam9ibmFtZT86IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogb3V0Zml0LmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IG91dGZpdC5sYWJlbCxcclxuICAgICAgICAgICAgICAgIG91dGZpdDogSlNPTi5wYXJzZShvdXRmaXQub3V0Zml0KSxcclxuICAgICAgICAgICAgICAgIGpvYm5hbWU6IG91dGZpdC5qb2JuYW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG91dGZpdHM7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGdldE91dGZpdHMpO1xyXG5leHBvcnRzKCdHZXRPdXRmaXRzJywgZ2V0T3V0Zml0cyk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZW5hbWVPdXRmaXQoc3JjOiBudW1iZXIsIGRhdGE6IHsgaWQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIG91dGZpdHMgU0VUIGxhYmVsID0gPyBXSEVSRSBwbGF5ZXJfaWQgPSA/IEFORCBpZCA9ID8nLFxyXG4gICAgICAgIFtkYXRhLmxhYmVsLCBmcmFtZXdvcmtJZCwgZGF0YS5pZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcbmV4cG9ydHMoJ1JlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPdXRmaXQoc3JjOiBudW1iZXIsIGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdERUxFVEUgRlJPTSBvdXRmaXRzIFdIRVJFIHBsYXllcl9pZCA9ID8gQU5EIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBpZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0ID4gMDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5leHBvcnRzKCdEZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2F2ZU91dGZpdChzcmM6IG51bWJlciwgZGF0YTogT3V0Zml0KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBsZXQgam9ibmFtZSA9IG51bGw7XHJcbiAgICBsZXQgam9icmFuayA9IDA7XHJcbiAgICBpZiAoZGF0YS5qb2IpIHtcclxuICAgICAgICBqb2JuYW1lID0gZGF0YS5qb2IubmFtZTtcclxuICAgICAgICBqb2JyYW5rID0gZGF0YS5qb2IucmFuaztcclxuICAgIH1cclxuICAgIGNvbnN0IGlkID0gYXdhaXQgb3hteXNxbC5pbnNlcnQoXHJcbiAgICAgICAgJ0lOU0VSVCBJTlRPIG91dGZpdHMgKHBsYXllcl9pZCwgbGFiZWwsIG91dGZpdCwgam9ibmFtZSwgam9icmFuaykgVkFMVUVTICg/LCA/LCA/LCA/LCA/KScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBkYXRhLmxhYmVsLCBKU09OLnN0cmluZ2lmeShkYXRhLm91dGZpdCksIGpvYm5hbWUsIGpvYnJhbmtdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGlkO1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBzYXZlT3V0Zml0KTtcclxuZXhwb3J0cygnU2F2ZU91dGZpdCcsIHNhdmVPdXRmaXQpO1xyXG5cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoT3V0Zml0KF86IG51bWJlciwgaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBvdXRmaXQgRlJPTSBvdXRmaXRzIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGZldGNoT3V0Zml0KTtcclxuZXhwb3J0cygnRmV0Y2hPdXRmaXQnLCBmZXRjaE91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRPdXRmaXQoXzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBvdXRmaXRJZDogbnVtYmVyLCBvdXRmaXROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucXVlcnkoXHJcbiAgICAgICAgJ1NFTEVDVCBsYWJlbCwgb3V0Zml0IEZST00gb3V0Zml0cyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtvdXRmaXRJZF1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ091dGZpdCBub3QgZm91bmQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SWQgPSBhd2FpdCBveG15c3FsLmluc2VydChcclxuICAgICAgICAnSU5TRVJUIElOVE8gb3V0Zml0cyAocGxheWVyX2lkLCBsYWJlbCwgb3V0Zml0KSBWQUxVRVMgKD8sID8sID8pJyxcclxuICAgICAgICBbZnJhbWV3b3JrSWQsIG91dGZpdE5hbWUsIHJlc3VsdC5vdXRmaXRdXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG5ld0lkOiBuZXdJZCB9O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcbmV4cG9ydHMoJ0ltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcblxyXG5jb25zdCBvdXRmaXRJdGVtID0gY29uZmlnLm91dGZpdEl0ZW1cclxuXHJcbmlmICghb3V0Zml0SXRlbSkge1xyXG4gICAgY29uc29sZS53YXJuKCdibF9hcHBlYXJhbmNlOiBObyBvdXRmaXQgaXRlbSBjb25maWd1cmVkLCBwbGVhc2Ugc2V0IGl0IGluIGNvbmZpZy5sdWEnKVxyXG59XHJcblxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgYXN5bmMgKHNyYywgZGF0YSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGNvcmUuR2V0UGxheWVyKHNyYylcclxuXHRwbGF5ZXIuYWRkSXRlbShvdXRmaXRJdGVtLCAxLCBkYXRhKVxyXG59KTtcclxuXHJcbmNvcmUuUmVnaXN0ZXJVc2FibGVJdGVtKG91dGZpdEl0ZW0sIGFzeW5jIChzb3VyY2U6IG51bWJlciwgc2xvdDogbnVtYmVyLCBtZXRhZGF0YToge291dGZpdDogT3V0Zml0LCBsYWJlbDogc3RyaW5nfSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGdldFBsYXllckRhdGEoc291cmNlKVxyXG5cdGlmIChwbGF5ZXI/LnJlbW92ZUl0ZW0ob3V0Zml0SXRlbSwgMSwgc2xvdCkpIFxyXG5cdFx0ZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0Zml0SXRlbScsIHNvdXJjZSwgbWV0YWRhdGEub3V0Zml0KVxyXG59KSIsICJpbXBvcnQgJy4vYXBwZWFyYW5jZS9vdXRmaXRzJztcclxuaW1wb3J0ICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuXHJcbm94bXlzcWwucmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgdGFibGUgY2FsbGVkIGFwcGVhcmFuY2VcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUIDEgRlJPTSBhcHBlYXJhbmNlIExJTUlUIDEnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgYXBwZWFyYW5jZSB0YWJsZS4gTW9zdCBsaWtlbHkgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0OiAnLCBlcnJvcik7XHJcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgYWRkaXRpb25hbCBlcnJvciBoYW5kbGluZyBvciByZWNvdmVyeSBsb2dpYyBoZXJlIGlmIG5lZWRlZFxyXG4gICAgfVxyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIHNvdXJjZSlcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIDApXHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdtaWdyYXRlJywgYXN5bmMgKHNvdXJjZTogbnVtYmVyKSA9PiB7XHJcblx0c291cmNlID0gc291cmNlICE9PSAwID8gc291cmNlIDogcGFyc2VJbnQoZ2V0UGxheWVycygpWzBdKVxyXG5cdGNvbnN0IGJsX2FwcGVhcmFuY2UgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2U7XHJcblx0Y29uc3QgY29uZmlnID0gYmxfYXBwZWFyYW5jZS5jb25maWcoKTtcclxuXHRjb25zdCBpbXBvcnRlZE1vZHVsZSA9IGF3YWl0IGltcG9ydChgLi9taWdyYXRlLyR7Y29uZmlnLnByZXZpb3VzQ2xvdGhpbmcgPT09ICdmaXZlbS1hcHBlYXJhbmNlJyA/ICdmaXZlbScgOiBjb25maWcucHJldmlvdXNDbG90aGluZ30udHNgKVxyXG5cdGltcG9ydGVkTW9kdWxlLmRlZmF1bHQoc291cmNlKVxyXG59LCBmYWxzZSk7XHJcbiIsICJpbXBvcnQgeyBveG15c3FsIH0gZnJvbSBcIkBvdmVyZXh0ZW5kZWQvb3hteXNxbFwiO1xyXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgb25DbGllbnRDYWxsYmFjayB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBTa2luREIgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0U2tpbihzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHNraW4gRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRTa2luJywgZ2V0U2tpbik7XHJcbmV4cG9ydHMoJ0dldFNraW4nLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFNraW4obnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2xvdGhlcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIGNsb3RoZXMgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRDbG90aGVzJywgZ2V0Q2xvdGhlcyk7XHJcbmV4cG9ydHMoJ0dldENsb3RoZXMnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldENsb3RoZXMobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHRhdHRvb3MgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKSB8fCBbXTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRUYXR0b29zJywgZ2V0VGF0dG9vcyk7XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFRhdHRvb3MobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwZWFyYW5jZShzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCAmJiAhc3JjKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZTogU2tpbkRCID0gYXdhaXQgb3hteXNxbC5zaW5nbGUoXHJcbiAgICAgICAgJ1NFTEVDVCAqIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8gTElNSVQgMScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBhcHBlYXJhbmNlID0ge1xyXG4gICAgICAgIC4uLkpTT04ucGFyc2UocmVzcG9uc2Uuc2tpbiksXHJcbiAgICAgICAgLi4uSlNPTi5wYXJzZShyZXNwb25zZS5jbG90aGVzKSxcclxuICAgICAgICB0YXR0b29zOiBKU09OLnBhcnNlKHJlc3BvbnNlLnRhdHRvb3MpLFxyXG4gICAgfVxyXG4gICAgYXBwZWFyYW5jZS5pZCA9IHJlc3BvbnNlLmlkXHJcbiAgICByZXR1cm4gYXBwZWFyYW5jZTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZ2V0QXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ0dldEFwcGVhcmFuY2UnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UobnVsbCwgaWQpXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFFBQU0sYUFBdUIsQ0FBQTtBQUU3QixhQUFTLE9BQU8sV0FBb0IsU0FBZTtBQUNqRCxVQUFJLENBQUM7QUFBVyxjQUFNLElBQUksVUFBVSxPQUFPO0lBQzdDO0FBRlM7QUFJVCxRQUFNLFdBQVcsd0JBQUMsT0FBNEIsUUFBYyxJQUFlLGdCQUFzQjtBQUMvRixVQUFJLE9BQU8sVUFBVTtBQUFVLGdCQUFRLFdBQVcsS0FBSztBQUV2RCxVQUFJLGFBQWE7QUFDZixlQUFPLE9BQU8sVUFBVSxVQUFVLDRDQUE0QyxPQUFPLEtBQUssRUFBRTthQUN2RjtBQUNMLGVBQU8sT0FBTyxVQUFVLFVBQVUsNENBQTRDLE9BQU8sS0FBSyxFQUFFOztBQUc5RixVQUFJLFFBQVE7QUFDVixjQUFNLFlBQVksT0FBTztBQUN6QixlQUNFLGNBQWMsWUFBWSxjQUFjLFlBQ3hDLHlEQUF5RCxTQUFTLEVBQUU7QUFHdEUsWUFBSSxDQUFDLE1BQU0sY0FBYyxZQUFZO0FBQ25DLGVBQUs7QUFDTCxtQkFBUzs7O0FBSWIsVUFBSSxPQUFPO0FBQVcsZUFBTyxPQUFPLE9BQU8sWUFBWSw4Q0FBOEMsT0FBTyxFQUFFLEVBQUU7QUFFaEgsYUFBTyxDQUFDLE9BQU8sUUFBUSxFQUFFO0lBQzNCLEdBekJpQjtBQTJCakIsUUFBTSxNQUFNLE9BQU8sUUFBUTtBQUMzQixRQUFNLHNCQUFzQix1QkFBc0I7QUFFbEQsYUFBUyxRQUFRLFFBQWdCLE9BQTRCLFFBQWU7QUFDMUUsYUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVU7QUFDckMsWUFBSSxNQUFNLEVBQ1IsT0FDQSxRQUNBLENBQUMsUUFBUSxVQUFTO0FBQ2hCLGNBQUk7QUFBTyxtQkFBTyxPQUFPLEtBQUs7QUFDOUIsa0JBQVEsTUFBTTtRQUNoQixHQUNBLHFCQUNBLElBQUk7TUFFUixDQUFDO0lBQ0g7QUFiUztBQWVJLElBQUFBLFNBQUEsVUFBbUI7TUFDOUIsTUFBTSxPQUFLO0FBQ1QsZUFBTyxPQUFPLFVBQVUsVUFBVSxvQ0FBb0MsT0FBTyxLQUFLLEVBQUU7QUFFcEYsZUFBTyxXQUFXLEtBQUssS0FBSztNQUM5QjtNQUNBLE1BQU0sVUFBUTtBQUNaLHFCQUFhLFlBQVc7QUFDdEIsaUJBQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFXLGtCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN4RyxtQkFBUTtRQUNWLENBQUM7TUFDSDtNQUNBLE1BQU0sTUFBTSxPQUFPLFFBQVEsSUFBRTtBQUMzQixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFNBQVMsT0FBTyxNQUFNO0FBQ25ELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBRTtBQUM3QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFdBQVcsT0FBTyxNQUFNO0FBQ3JELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sV0FBVyxPQUFPLFFBQVEsSUFBRTtBQUNoQyxTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLGNBQWMsT0FBTyxNQUFNO0FBQ3hELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMz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RTtBQUNqQyxDQUFDOzs7QUR6RUQsSUFBQUMsa0JBQXdCOzs7Ozs7Ozs7OztBQUV4Qix3QkFBUSxNQUFNLFlBQVk7QUFFdEIsTUFBSTtBQUNBLFVBQU0sd0JBQVEsTUFBTSxrQ0FBa0M7QUFBQSxFQUMxRCxTQUFTLE9BQU87QUFDWixZQUFRLE1BQU0sMkVBQTJFLEtBQUs7QUFBQSxFQUVsRztBQUNKLENBQUM7QUFFRCxNQUFNLHlDQUF5QyxNQUFNO0FBQ3BELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxNQUFNO0FBQ2pELENBQUM7QUFFRCxNQUFNLDJDQUEyQyxNQUFNO0FBQ3RELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxnQkFBZ0IsV0FBVyxPQUFPQyxZQUFtQjtBQUNwRCxFQUFBQSxVQUFTQSxZQUFXLElBQUlBLFVBQVMsU0FBUyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsUUFBTUMsVUFBUyxjQUFjLE9BQU87QUFDcEMsUUFBTSxpQkFBaUIsTUFBYSxtQ0FBYUEsUUFBTyxxQkFBcUIscUJBQXFCLFVBQVVBLFFBQU8sZ0JBQWdCO0FBQ25JLGlCQUFlLFFBQVFELE9BQU07QUFDOUIsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJleHBvcnRzIiwgImltcG9ydF9veG15c3FsIiwgImltcG9ydF9veG15c3FsIiwgInJlc3BvbnNlIiwgImltcG9ydF9veG15c3FsIiwgImRlbGF5IiwgIm1pZ3JhdGUiLCAicmVzcG9uc2UiLCAiaW1wb3J0X294bXlzcWwiLCAiZGVsYXkiLCAibWlncmF0ZSIsICJyZXNwb25zZSIsICJzb3VyY2UiLCAiaW1wb3J0X294bXlzcWwiLCAiaW1wb3J0X294bXlzcWwiLCAic291cmNlIiwgImNvbmZpZyJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0BvdmVyZXh0ZW5kZWQvb3hteXNxbC9NeVNRTC50cyIsICIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9zZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9lc3gudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9taWdyYXRlL2ZpdmVtLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9pbGxlbml1bS50cyIsICIuLi8uLi9zcmMvc2VydmVyL21pZ3JhdGUvcWIudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9hcHBlYXJhbmNlL291dGZpdHMudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9pbml0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ0eXBlIFF1ZXJ5ID0gc3RyaW5nIHwgbnVtYmVyO1xyXG50eXBlIFBhcmFtcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdIHwgRnVuY3Rpb247XHJcbnR5cGUgQ2FsbGJhY2s8VD4gPSAocmVzdWx0OiBUIHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgVHJhbnNhY3Rpb24gPVxyXG4gIHwgc3RyaW5nW11cclxuICB8IFtzdHJpbmcsIFBhcmFtc11bXVxyXG4gIHwgeyBxdWVyeTogc3RyaW5nOyB2YWx1ZXM6IFBhcmFtcyB9W11cclxuICB8IHsgcXVlcnk6IHN0cmluZzsgcGFyYW1ldGVyczogUGFyYW1zIH1bXTtcclxuXHJcbmludGVyZmFjZSBSZXN1bHQge1xyXG4gIFtjb2x1bW46IHN0cmluZyB8IG51bWJlcl06IGFueTtcclxuICBhZmZlY3RlZFJvd3M/OiBudW1iZXI7XHJcbiAgZmllbGRDb3VudD86IG51bWJlcjtcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGluc2VydElkPzogbnVtYmVyO1xyXG4gIHNlcnZlclN0YXR1cz86IG51bWJlcjtcclxuICB3YXJuaW5nU3RhdHVzPzogbnVtYmVyO1xyXG4gIGNoYW5nZWRSb3dzPzogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm93IHtcclxuICBbY29sdW1uOiBzdHJpbmcgfCBudW1iZXJdOiB1bmtub3duO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT3hNeVNRTCB7XHJcbiAgc3RvcmU6IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgcXVlcnk6IDxUID0gUmVzdWx0IHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBzaW5nbGU6IDxUID0gUm93IHwgbnVsbD4oXHJcbiAgICBxdWVyeTogUXVlcnksXHJcbiAgICBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxFeGNsdWRlPFQsIFtdPj4sXHJcbiAgICBjYj86IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PlxyXG4gICkgPT4gUHJvbWlzZTxFeGNsdWRlPFQsIFtdPj47XHJcbiAgc2NhbGFyOiA8VCA9IHVua25vd24gfCBudWxsPihcclxuICAgIHF1ZXJ5OiBRdWVyeSxcclxuICAgIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PixcclxuICAgIGNiPzogQ2FsbGJhY2s8RXhjbHVkZTxULCBbXT4+XHJcbiAgKSA9PiBQcm9taXNlPEV4Y2x1ZGU8VCwgW10+PjtcclxuICB1cGRhdGU6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBpbnNlcnQ6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBwcmVwYXJlOiA8VCA9IGFueT4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICByYXdFeGVjdXRlOiA8VCA9IFJlc3VsdCB8IG51bGw+KHF1ZXJ5OiBRdWVyeSwgcGFyYW1zPzogUGFyYW1zIHwgQ2FsbGJhY2s8VD4sIGNiPzogQ2FsbGJhY2s8VD4pID0+IFByb21pc2U8VD47XHJcbiAgdHJhbnNhY3Rpb246IChxdWVyeTogVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPGJvb2xlYW4+LCBjYj86IENhbGxiYWNrPGJvb2xlYW4+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIGlzUmVhZHk6ICgpID0+IGJvb2xlYW47XHJcbiAgYXdhaXRDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPHRydWU+O1xyXG59XHJcblxyXG5jb25zdCBRdWVyeVN0b3JlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XHJcbn1cclxuXHJcbmNvbnN0IHNhZmVBcmdzID0gKHF1ZXJ5OiBRdWVyeSB8IFRyYW5zYWN0aW9uLCBwYXJhbXM/OiBhbnksIGNiPzogRnVuY3Rpb24sIHRyYW5zYWN0aW9uPzogdHJ1ZSkgPT4ge1xyXG4gIGlmICh0eXBlb2YgcXVlcnkgPT09ICdudW1iZXInKSBxdWVyeSA9IFF1ZXJ5U3RvcmVbcXVlcnldO1xyXG5cclxuICBpZiAodHJhbnNhY3Rpb24pIHtcclxuICAgIGFzc2VydCh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnLCBgRmlyc3QgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0LCByZWNpZXZlZCAke3R5cGVvZiBxdWVyeX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXNzZXJ0KHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycsIGBGaXJzdCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1UeXBlID0gdHlwZW9mIHBhcmFtcztcclxuICAgIGFzc2VydChcclxuICAgICAgcGFyYW1UeXBlID09PSAnb2JqZWN0JyB8fCBwYXJhbVR5cGUgPT09ICdmdW5jdGlvbicsXHJcbiAgICAgIGBTZWNvbmQgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0IG9yIGZ1bmN0aW9uLCByZWNlaXZlZCAke3BhcmFtVHlwZX1gXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY2IgJiYgcGFyYW1UeXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNiID0gcGFyYW1zO1xyXG4gICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2IgIT09IHVuZGVmaW5lZCkgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJywgYFRoaXJkIGFyZ3VtZW50IGV4cGVjdGVkIGZ1bmN0aW9uLCByZWNlaXZlZCAke3R5cGVvZiBjYn1gKTtcclxuXHJcbiAgcmV0dXJuIFtxdWVyeSwgcGFyYW1zLCBjYl07XHJcbn07XHJcblxyXG5jb25zdCBleHAgPSBnbG9iYWwuZXhwb3J0cy5veG15c3FsO1xyXG5jb25zdCBjdXJyZW50UmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpO1xyXG5cclxuZnVuY3Rpb24gZXhlY3V0ZShtZXRob2Q6IHN0cmluZywgcXVlcnk6IFF1ZXJ5IHwgVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleHBbbWV0aG9kXShcclxuICAgICAgcXVlcnksXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgKHJlc3VsdCwgZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSxcclxuICAgICAgY3VycmVudFJlc291cmNlTmFtZSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KSBhcyBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBveG15c3FsOiBPeE15U1FMID0ge1xyXG4gIHN0b3JlKHF1ZXJ5KSB7XHJcbiAgICBhc3NlcnQodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJywgYFF1ZXJ5IGV4cGVjdHMgYSBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG5cclxuICAgIHJldHVybiBRdWVyeVN0b3JlLnB1c2gocXVlcnkpO1xyXG4gIH0sXHJcbiAgcmVhZHkoY2FsbGJhY2spIHtcclxuICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgIHdoaWxlIChHZXRSZXNvdXJjZVN0YXRlKCdveG15c3FsJykgIT09ICdzdGFydGVkJykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgYXN5bmMgcXVlcnkocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdxdWVyeScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNpbmdsZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NpbmdsZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNjYWxhcihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NjYWxhcicsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHVwZGF0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3VwZGF0ZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIGluc2VydChxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ2luc2VydCcsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHByZXBhcmUocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdwcmVwYXJlJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgYXN5bmMgcmF3RXhlY3V0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3Jhd0V4ZWN1dGUnLCBxdWVyeSwgcGFyYW1zKTtcclxuICAgIHJldHVybiBjYiA/IGNiKHJlc3VsdCkgOiByZXN1bHQ7XHJcbiAgfSxcclxuICBhc3luYyB0cmFuc2FjdGlvbihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiLCB0cnVlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3RyYW5zYWN0aW9uJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgaXNSZWFkeSgpIHtcclxuICAgIHJldHVybiBleHAuaXNSZWFkeSgpO1xyXG4gIH0sXHJcbiAgYXN5bmMgYXdhaXRDb25uZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGV4cC5hd2FpdENvbm5lY3Rpb24oKTtcclxuICB9LFxyXG59O1xyXG4iLCAiLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL3NlcnZlci9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcblxyXG5jb25zdCBhY3RpdmVFdmVudHMgPSB7fTtcclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5LCAuLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zdCByZXNvbHZlID0gYWN0aXZlRXZlbnRzW2tleV07XHJcbiAgICByZXR1cm4gcmVzb2x2ZSAmJiByZXNvbHZlKC4uLmFyZ3MpO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHBsYXllcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQga2V5OiBzdHJpbmc7XHJcbiAgICBkbyB7XHJcbiAgICAgICAga2V5ID0gYCR7ZXZlbnROYW1lfToke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgxMDAwMDAgKyAxKSl9OiR7cGxheWVySWR9YDtcclxuICAgIH0gd2hpbGUgKGFjdGl2ZUV2ZW50c1trZXldKTtcclxuICAgIGVtaXROZXQoYF9ibF9jYl8ke2V2ZW50TmFtZX1gLCBwbGF5ZXJJZCwgcmVzb3VyY2VOYW1lLCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgYWN0aXZlRXZlbnRzW2tleV0gPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkNsaWVudENhbGxiYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBjYjogKHBsYXllcklkOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IHNvdXJjZTtcclxuICAgICAgICBsZXQgcmVzcG9uc2U6IGFueTtcclxuICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNiKHNyYywgLi4uYXJncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyBjYWxsYmFjayBldmVudCAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGVtaXROZXQoYF9ibF9jYl8ke3Jlc291cmNlfWAsIHNyYywga2V5LCByZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBibF9icmlkZ2UgPSBleHBvcnRzLmJsX2JyaWRnZVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcmUgPSBibF9icmlkZ2UuY29yZSgpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyRGF0YSA9IChzcmM6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIGNvcmUuR2V0UGxheWVyKHNyYylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZyYW1ld29ya0lEID0gKHNyYzogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBwbGF5ZXIuaWRcclxufVxyXG5cclxuXHJcbmNvbnN0IGJsX2NvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5jb25maWcoKVxyXG5leHBvcnQgY29uc3QgY29uZmlnID0gYmxfY29uZmlnIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQ2xvdGhlcywgVFNraW4gfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2ssIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTa2luKHNyYzogbnVtYmVyLCBza2luOiBUU2tpbikge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgc2tpbiA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoc2tpbiksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZVNraW4nLCBzYXZlU2tpbik7XHJcbmV4cG9ydHMoJ1NhdmVTa2luJywgc2F2ZVNraW4pO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDbG90aGVzKHNyYzogbnVtYmVyLCBjbG90aGVzOiBUQ2xvdGhlcykge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgY2xvdGhlcyA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoY2xvdGhlcyksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUNsb3RoZXMnLCBzYXZlQ2xvdGhlcyk7XHJcbmV4cG9ydHMoJ1NhdmVDbG90aGVzJywgc2F2ZUNsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUYXR0b29zKHNyYzogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBhcHBlYXJhbmNlIFNFVCB0YXR0b29zID0gPyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeSh0YXR0b29zKSwgZnJhbWV3b3JrSWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlVGF0dG9vcycsIHNhdmVUYXR0b29zKTtcclxuZXhwb3J0cygnU2F2ZVRhdHRvb3MnLCBzYXZlVGF0dG9vcyk7XHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVBcHBlYXJhbmNlKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKHNyYyAmJiBmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXllcklkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZnJhbWV3b3JrSWQgIT09IHBsYXllcklkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignWW91IGFyZSB0cnlpbmcgdG8gc2F2ZSBhbiBhcHBlYXJhbmNlIGZvciBhIGRpZmZlcmVudCBwbGF5ZXInLCBzcmMsIGZyYW1ld29ya0lkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblx0aWYgKCFmcmFtZXdvcmtJZCkge1xyXG5cdFx0ZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgY2xvdGhlcyA9IHtcclxuXHRcdGRyYXdhYmxlczogYXBwZWFyYW5jZS5kcmF3YWJsZXMsXHJcblx0XHRwcm9wczogYXBwZWFyYW5jZS5wcm9wcyxcclxuXHRcdGhlYWRPdmVybGF5OiBhcHBlYXJhbmNlLmhlYWRPdmVybGF5LFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHNraW4gPSB7XHJcblx0XHRoZWFkQmxlbmQ6IGFwcGVhcmFuY2UuaGVhZEJsZW5kLFxyXG5cdFx0aGVhZFN0cnVjdHVyZTogYXBwZWFyYW5jZS5oZWFkU3RydWN0dXJlLFxyXG5cdFx0aGFpckNvbG9yOiBhcHBlYXJhbmNlLmhhaXJDb2xvcixcclxuXHRcdG1vZGVsOiBhcHBlYXJhbmNlLm1vZGVsLFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgW107XHJcblxyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuXHRcdCdJTlNFUlQgSU5UTyBhcHBlYXJhbmNlIChpZCwgY2xvdGhlcywgc2tpbiwgdGF0dG9vcykgVkFMVUVTICg/LCA/LCA/LCA/KSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBjbG90aGVzID0gVkFMVUVTKGNsb3RoZXMpLCBza2luID0gVkFMVUVTKHNraW4pLCB0YXR0b29zID0gVkFMVUVTKHRhdHRvb3MpOycsXHJcblx0XHRbXHJcblx0XHRcdGZyYW1ld29ya0lkLFxyXG5cdFx0XHRKU09OLnN0cmluZ2lmeShjbG90aGVzKSxcclxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoc2tpbiksXHJcblx0XHRcdEpTT04uc3RyaW5naWZ5KHRhdHRvb3MpLFxyXG5cdFx0XVxyXG5cdCk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBzYXZlQXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ1NhdmVBcHBlYXJhbmNlJywgZnVuY3Rpb24oaWQsIGFwcGVhcmFuY2UpIHtcclxuICAgIHJldHVybiBzYXZlQXBwZWFyYW5jZShudWxsLCBpZCwgYXBwZWFyYW5jZSlcclxufSk7XHJcbiIsICIiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2AnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmaXZlbScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbGxlbml1bScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgZW1pdE5ldCgncWItY2xvdGhlczpsb2FkU2tpbicsIHNyYywgMCwgZWxlbWVudC5tb2RlbCwgZWxlbWVudC5za2luKTtcbiAgICAgICAgYXdhaXQgZGVsYXkoMjAwKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCBzcmMpIGFzIFRBcHBlYXJhbmNlXG4gICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tIFwiQG92ZXJleHRlbmRlZC9veG15c3FsXCI7XHJcbmltcG9ydCB7IGNvbmZpZywgY29yZSwgZ2V0RnJhbWV3b3JrSUQsIGdldFBsYXllckRhdGEsIG9uQ2xpZW50Q2FsbGJhY2sgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE91dGZpdHMoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGpvYiA9IGNvcmUuR2V0UGxheWVyKHNyYykuam9iIHx8IHsgbmFtZTogJ3Vua25vd24nLCBncmFkZTogeyBuYW1lOiAndW5rbm93bicgfSB9XHJcblx0bGV0IHJlc3BvbnNlID0gYXdhaXQgb3hteXNxbC5wcmVwYXJlKFxyXG5cdFx0J1NFTEVDVCAqIEZST00gb3V0Zml0cyBXSEVSRSBwbGF5ZXJfaWQgPSA/IE9SIChqb2JuYW1lID0gPyBBTkQgam9icmFuayA8PSA/KScsXHJcblx0XHRbZnJhbWV3b3JrSWQsIGpvYi5uYW1lLCBqb2IuZ3JhZGUubmFtZV1cclxuXHQpO1xyXG5cdGlmICghcmVzcG9uc2UpIHJldHVybiBbXTtcclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcmVzcG9uc2UgPSBbcmVzcG9uc2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG91dGZpdHMgPSByZXNwb25zZS5tYXAoXHJcbiAgICAgICAgKG91dGZpdDogeyBpZDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBvdXRmaXQ6IHN0cmluZzsgam9ibmFtZT86IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogb3V0Zml0LmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IG91dGZpdC5sYWJlbCxcclxuICAgICAgICAgICAgICAgIG91dGZpdDogSlNPTi5wYXJzZShvdXRmaXQub3V0Zml0KSxcclxuICAgICAgICAgICAgICAgIGpvYm5hbWU6IG91dGZpdC5qb2JuYW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG91dGZpdHM7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGdldE91dGZpdHMpO1xyXG5leHBvcnRzKCdHZXRPdXRmaXRzJywgZ2V0T3V0Zml0cyk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZW5hbWVPdXRmaXQoc3JjOiBudW1iZXIsIGRhdGE6IHsgaWQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIG91dGZpdHMgU0VUIGxhYmVsID0gPyBXSEVSRSBwbGF5ZXJfaWQgPSA/IEFORCBpZCA9ID8nLFxyXG4gICAgICAgIFtkYXRhLmxhYmVsLCBmcmFtZXdvcmtJZCwgZGF0YS5pZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcbmV4cG9ydHMoJ1JlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPdXRmaXQoc3JjOiBudW1iZXIsIGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdERUxFVEUgRlJPTSBvdXRmaXRzIFdIRVJFIHBsYXllcl9pZCA9ID8gQU5EIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBpZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0ID4gMDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5leHBvcnRzKCdEZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2F2ZU91dGZpdChzcmM6IG51bWJlciwgZGF0YTogT3V0Zml0KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBsZXQgam9ibmFtZSA9IG51bGw7XHJcbiAgICBsZXQgam9icmFuayA9IDA7XHJcbiAgICBpZiAoZGF0YS5qb2IpIHtcclxuICAgICAgICBqb2JuYW1lID0gZGF0YS5qb2IubmFtZTtcclxuICAgICAgICBqb2JyYW5rID0gZGF0YS5qb2IucmFuaztcclxuICAgIH1cclxuICAgIGNvbnN0IGlkID0gYXdhaXQgb3hteXNxbC5pbnNlcnQoXHJcbiAgICAgICAgJ0lOU0VSVCBJTlRPIG91dGZpdHMgKHBsYXllcl9pZCwgbGFiZWwsIG91dGZpdCwgam9ibmFtZSwgam9icmFuaykgVkFMVUVTICg/LCA/LCA/LCA/LCA/KScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBkYXRhLmxhYmVsLCBKU09OLnN0cmluZ2lmeShkYXRhLm91dGZpdCksIGpvYm5hbWUsIGpvYnJhbmtdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGlkO1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBzYXZlT3V0Zml0KTtcclxuZXhwb3J0cygnU2F2ZU91dGZpdCcsIHNhdmVPdXRmaXQpO1xyXG5cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoT3V0Zml0KF86IG51bWJlciwgaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBvdXRmaXQgRlJPTSBvdXRmaXRzIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGZldGNoT3V0Zml0KTtcclxuZXhwb3J0cygnRmV0Y2hPdXRmaXQnLCBmZXRjaE91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRPdXRmaXQoXzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBvdXRmaXRJZDogbnVtYmVyLCBvdXRmaXROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucXVlcnkoXHJcbiAgICAgICAgJ1NFTEVDVCBsYWJlbCwgb3V0Zml0IEZST00gb3V0Zml0cyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtvdXRmaXRJZF1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ091dGZpdCBub3QgZm91bmQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SWQgPSBhd2FpdCBveG15c3FsLmluc2VydChcclxuICAgICAgICAnSU5TRVJUIElOVE8gb3V0Zml0cyAocGxheWVyX2lkLCBsYWJlbCwgb3V0Zml0KSBWQUxVRVMgKD8sID8sID8pJyxcclxuICAgICAgICBbZnJhbWV3b3JrSWQsIG91dGZpdE5hbWUsIHJlc3VsdC5vdXRmaXRdXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG5ld0lkOiBuZXdJZCB9O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcbmV4cG9ydHMoJ0ltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcblxyXG5jb25zdCBvdXRmaXRJdGVtID0gY29uZmlnLm91dGZpdEl0ZW1cclxuXHJcbmlmICghb3V0Zml0SXRlbSkge1xyXG4gICAgY29uc29sZS53YXJuKCdibF9hcHBlYXJhbmNlOiBObyBvdXRmaXQgaXRlbSBjb25maWd1cmVkLCBwbGVhc2Ugc2V0IGl0IGluIGNvbmZpZy5sdWEnKVxyXG59XHJcblxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgYXN5bmMgKHNyYywgZGF0YSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGNvcmUuR2V0UGxheWVyKHNyYylcclxuXHRwbGF5ZXIuYWRkSXRlbShvdXRmaXRJdGVtLCAxLCBkYXRhKVxyXG59KTtcclxuXHJcbmNvcmUuUmVnaXN0ZXJVc2FibGVJdGVtKG91dGZpdEl0ZW0sIGFzeW5jIChzb3VyY2U6IG51bWJlciwgc2xvdDogbnVtYmVyLCBtZXRhZGF0YToge291dGZpdDogT3V0Zml0LCBsYWJlbDogc3RyaW5nfSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGdldFBsYXllckRhdGEoc291cmNlKVxyXG5cdGlmIChwbGF5ZXI/LnJlbW92ZUl0ZW0ob3V0Zml0SXRlbSwgMSwgc2xvdCkpIFxyXG5cdFx0ZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0Zml0SXRlbScsIHNvdXJjZSwgbWV0YWRhdGEub3V0Zml0KVxyXG59KSIsICJpbXBvcnQgJy4vYXBwZWFyYW5jZS9vdXRmaXRzJztcclxuaW1wb3J0ICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuXHJcbm94bXlzcWwucmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgdGFibGUgY2FsbGVkIGFwcGVhcmFuY2VcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUIDEgRlJPTSBhcHBlYXJhbmNlIExJTUlUIDEnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgYXBwZWFyYW5jZSB0YWJsZS4gTW9zdCBsaWtlbHkgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0OiAnLCBlcnJvcik7XHJcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgYWRkaXRpb25hbCBlcnJvciBoYW5kbGluZyBvciByZWNvdmVyeSBsb2dpYyBoZXJlIGlmIG5lZWRlZFxyXG4gICAgfVxyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIHNvdXJjZSlcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIDApXHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdtaWdyYXRlJywgYXN5bmMgKHNvdXJjZTogbnVtYmVyKSA9PiB7XHJcblx0c291cmNlID0gc291cmNlICE9PSAwID8gc291cmNlIDogcGFyc2VJbnQoZ2V0UGxheWVycygpWzBdKVxyXG5cdGNvbnN0IGJsX2FwcGVhcmFuY2UgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2U7XHJcblx0Y29uc3QgY29uZmlnID0gYmxfYXBwZWFyYW5jZS5jb25maWcoKTtcclxuXHRjb25zdCBpbXBvcnRlZE1vZHVsZSA9IGF3YWl0IGltcG9ydChgLi9taWdyYXRlLyR7Y29uZmlnLnByZXZpb3VzQ2xvdGhpbmcgPT09ICdmaXZlbS1hcHBlYXJhbmNlJyA/ICdmaXZlbScgOiBjb25maWcucHJldmlvdXNDbG90aGluZ30udHNgKVxyXG5cdGltcG9ydGVkTW9kdWxlLmRlZmF1bHQoc291cmNlKVxyXG59LCBmYWxzZSk7XHJcbiIsICJpbXBvcnQgeyBveG15c3FsIH0gZnJvbSBcIkBvdmVyZXh0ZW5kZWQvb3hteXNxbFwiO1xyXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgb25DbGllbnRDYWxsYmFjayB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBTa2luREIgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0U2tpbihzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHNraW4gRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRTa2luJywgZ2V0U2tpbik7XHJcbmV4cG9ydHMoJ0dldFNraW4nLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFNraW4obnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2xvdGhlcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIGNsb3RoZXMgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRDbG90aGVzJywgZ2V0Q2xvdGhlcyk7XHJcbmV4cG9ydHMoJ0dldENsb3RoZXMnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldENsb3RoZXMobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHRhdHRvb3MgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKSB8fCBbXTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRUYXR0b29zJywgZ2V0VGF0dG9vcyk7XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFRhdHRvb3MobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwZWFyYW5jZShzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCAmJiAhc3JjKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZTogU2tpbkRCID0gYXdhaXQgb3hteXNxbC5zaW5nbGUoXHJcbiAgICAgICAgJ1NFTEVDVCAqIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8gTElNSVQgMScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBhcHBlYXJhbmNlID0ge1xyXG4gICAgICAgIC4uLkpTT04ucGFyc2UocmVzcG9uc2Uuc2tpbiksXHJcbiAgICAgICAgLi4uSlNPTi5wYXJzZShyZXNwb25zZS5jbG90aGVzKSxcclxuICAgICAgICB0YXR0b29zOiBKU09OLnBhcnNlKHJlc3BvbnNlLnRhdHRvb3MpLFxyXG4gICAgfVxyXG4gICAgYXBwZWFyYW5jZS5pZCA9IHJlc3BvbnNlLmlkXHJcbiAgICByZXR1cm4gYXBwZWFyYW5jZTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZ2V0QXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ0dldFBsYXllckFwcGVhcmFuY2UnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UobnVsbCwgaWQpXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFFBQU0sYUFBdUIsQ0FBQTtBQUU3QixhQUFTLE9BQU8sV0FBb0IsU0FBZTtBQUNqRCxVQUFJLENBQUM7QUFBVyxjQUFNLElBQUksVUFBVSxPQUFPO0lBQzdDO0FBRlM7QUFJVCxRQUFNLFdBQVcsd0JBQUMsT0FBNEIsUUFBYyxJQUFlLGdCQUFzQjtBQUMvRixVQUFJLE9BQU8sVUFBVTtBQUFVLGdCQUFRLFdBQVcsS0FBSztBQUV2RCxVQUFJLGFBQWE7QUFDZixlQUFPLE9BQU8sVUFBVSxVQUFVLDRDQUE0QyxPQUFPLEtBQUssRUFBRTthQUN2RjtBQUNMLGVBQU8sT0FBTyxVQUFVLFVBQVUsNENBQTRDLE9BQU8sS0FBSyxFQUFFOztBQUc5RixVQUFJLFFBQVE7QUFDVixjQUFNLFlBQVksT0FBTztBQUN6QixlQUNFLGNBQWMsWUFBWSxjQUFjLFlBQ3hDLHlEQUF5RCxTQUFTLEVBQUU7QUFHdEUsWUFBSSxDQUFDLE1BQU0sY0FBYyxZQUFZO0FBQ25DLGVBQUs7QUFDTCxtQkFBUzs7O0FBSWIsVUFBSSxPQUFPO0FBQVcsZUFBTyxPQUFPLE9BQU8sWUFBWSw4Q0FBOEMsT0FBTyxFQUFFLEVBQUU7QUFFaEgsYUFBTyxDQUFDLE9BQU8sUUFBUSxFQUFFO0lBQzNCLEdBekJpQjtBQTJCakIsUUFBTSxNQUFNLE9BQU8sUUFBUTtBQUMzQixRQUFNLHNCQUFzQix1QkFBc0I7QUFFbEQsYUFBUyxRQUFRLFFBQWdCLE9BQTRCLFFBQWU7QUFDMUUsYUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVU7QUFDckMsWUFBSSxNQUFNLEVBQ1IsT0FDQSxRQUNBLENBQUMsUUFBUSxVQUFTO0FBQ2hCLGNBQUk7QUFBTyxtQkFBTyxPQUFPLEtBQUs7QUFDOUIsa0JBQVEsTUFBTTtRQUNoQixHQUNBLHFCQUNBLElBQUk7TUFFUixDQUFDO0lBQ0g7QUFiUztBQWVJLElBQUFBLFNBQUEsVUFBbUI7TUFDOUIsTUFBTSxPQUFLO0FBQ1QsZUFBTyxPQUFPLFVBQVUsVUFBVSxvQ0FBb0MsT0FBTyxLQUFLLEVBQUU7QUFFcEYsZUFBTyxXQUFXLEtBQUssS0FBSztNQUM5QjtNQUNBLE1BQU0sVUFBUTtBQUNaLHFCQUFhLFlBQVc7QUFDdEIsaUJBQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFXLGtCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN4RyxtQkFBUTtRQUNWLENBQUM7TUFDSDtNQUNBLE1BQU0sTUFBTSxPQUFPLFFBQVEsSUFBRTtBQUMzQixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFNBQVMsT0FBTyxNQUFNO0FBQ25ELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBRTtBQUM3QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFdBQVcsT0FBTyxNQUFNO0FBQ3JELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sV0FBVyxPQUFPLFFBQVEsSUFBRTtBQUNoQyxTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLGNBQWMsT0FBTyxNQUFNO0FBQ3hELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFB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QU0sRUFBRTtBQUNqQyxDQUFDOzs7QUR6RUQsSUFBQUMsa0JBQXdCOzs7Ozs7Ozs7OztBQUV4Qix3QkFBUSxNQUFNLFlBQVk7QUFFdEIsTUFBSTtBQUNBLFVBQU0sd0JBQVEsTUFBTSxrQ0FBa0M7QUFBQSxFQUMxRCxTQUFTLE9BQU87QUFDWixZQUFRLE1BQU0sMkVBQTJFLEtBQUs7QUFBQSxFQUVsRztBQUNKLENBQUM7QUFFRCxNQUFNLHlDQUF5QyxNQUFNO0FBQ3BELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxNQUFNO0FBQ2pELENBQUM7QUFFRCxNQUFNLDJDQUEyQyxNQUFNO0FBQ3RELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxnQkFBZ0IsV0FBVyxPQUFPQyxZQUFtQjtBQUNwRCxFQUFBQSxVQUFTQSxZQUFXLElBQUlBLFVBQVMsU0FBUyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsUUFBTUMsVUFBUyxjQUFjLE9BQU87QUFDcEMsUUFBTSxpQkFBaUIsTUFBYSxtQ0FBYUEsUUFBTyxxQkFBcUIscUJBQXFCLFVBQVVBLFFBQU8sZ0JBQWdCO0FBQ25JLGlCQUFlLFFBQVFELE9BQU07QUFDOUIsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJleHBvcnRzIiwgImltcG9ydF9veG15c3FsIiwgImltcG9ydF9veG15c3FsIiwgInJlc3BvbnNlIiwgImltcG9ydF9veG15c3FsIiwgImRlbGF5IiwgIm1pZ3JhdGUiLCAicmVzcG9uc2UiLCAiaW1wb3J0X294bXlzcWwiLCAiZGVsYXkiLCAibWlncmF0ZSIsICJyZXNwb25zZSIsICJzb3VyY2UiLCAiaW1wb3J0X294bXlzcWwiLCAiaW1wb3J0X294bXlzcWwiLCAic291cmNlIiwgImNvbmZpZyJdCn0K diff --git a/dist/server/init.js.map b/dist/server/init.js.map index d710dc0..aa2e692 100644 --- a/dist/server/init.js.map +++ b/dist/server/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../node_modules/@overextended/oxmysql/MySQL.ts", "../../src/server/utils/index.ts", "../../src/server/appearance/setters.ts", "../../src/server/migrate/esx.ts", "../../src/server/migrate/fivem.ts", "../../src/server/migrate/illenium.ts", "../../src/server/migrate/qb.ts", "../../src/server/appearance/outfits.ts", "../../src/server/init.ts", "../../src/server/appearance/getters.ts"], - "sourcesContent": ["type Query = string | number;\r\ntype Params = Record | unknown[] | Function;\r\ntype Callback = (result: T | null) => void;\r\n\r\ntype Transaction =\r\n | string[]\r\n | [string, Params][]\r\n | { query: string; values: Params }[]\r\n | { query: string; parameters: Params }[];\r\n\r\ninterface Result {\r\n [column: string | number]: any;\r\n affectedRows?: number;\r\n fieldCount?: number;\r\n info?: string;\r\n insertId?: number;\r\n serverStatus?: number;\r\n warningStatus?: number;\r\n changedRows?: number;\r\n}\r\n\r\ninterface Row {\r\n [column: string | number]: unknown;\r\n}\r\n\r\ninterface OxMySQL {\r\n store: (query: string) => void;\r\n ready: (callback: () => void) => void;\r\n query: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n single: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n scalar: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n update: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n insert: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n prepare: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n rawExecute: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n transaction: (query: Transaction, params?: Params | Callback, cb?: Callback) => Promise;\r\n isReady: () => boolean;\r\n awaitConnection: () => Promise;\r\n}\r\n\r\nconst QueryStore: string[] = [];\r\n\r\nfunction assert(condition: boolean, message: string) {\r\n if (!condition) throw new TypeError(message);\r\n}\r\n\r\nconst safeArgs = (query: Query | Transaction, params?: any, cb?: Function, transaction?: true) => {\r\n if (typeof query === 'number') query = QueryStore[query];\r\n\r\n if (transaction) {\r\n assert(typeof query === 'object', `First argument expected object, recieved ${typeof query}`);\r\n } else {\r\n assert(typeof query === 'string', `First argument expected string, received ${typeof query}`);\r\n }\r\n\r\n if (params) {\r\n const paramType = typeof params;\r\n assert(\r\n paramType === 'object' || paramType === 'function',\r\n `Second argument expected object or function, received ${paramType}`\r\n );\r\n\r\n if (!cb && paramType === 'function') {\r\n cb = params;\r\n params = undefined;\r\n }\r\n }\r\n\r\n if (cb !== undefined) assert(typeof cb === 'function', `Third argument expected function, received ${typeof cb}`);\r\n\r\n return [query, params, cb];\r\n};\r\n\r\nconst exp = global.exports.oxmysql;\r\nconst currentResourceName = GetCurrentResourceName();\r\n\r\nfunction execute(method: string, query: Query | Transaction, params?: Params) {\r\n return new Promise((resolve, reject) => {\r\n exp[method](\r\n query,\r\n params,\r\n (result, error) => {\r\n if (error) return reject(error);\r\n resolve(result);\r\n },\r\n currentResourceName,\r\n true\r\n );\r\n }) as any;\r\n}\r\n\r\nexport const oxmysql: OxMySQL = {\r\n store(query) {\r\n assert(typeof query !== 'string', `Query expects a string, received ${typeof query}`);\r\n\r\n return QueryStore.push(query);\r\n },\r\n ready(callback) {\r\n setImmediate(async () => {\r\n while (GetResourceState('oxmysql') !== 'started') await new Promise((resolve) => setTimeout(resolve, 50));\r\n callback();\r\n });\r\n },\r\n async query(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('query', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async single(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('single', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async scalar(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('scalar', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async update(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('update', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async insert(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('insert', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async prepare(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('prepare', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async rawExecute(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('rawExecute', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async transaction(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb, true);\r\n const result = await execute('transaction', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n isReady() {\r\n return exp.isReady();\r\n },\r\n async awaitConnection() {\r\n return await exp.awaitConnection();\r\n },\r\n};\r\n", "//https://github.com/overextended/ox_lib/blob/master/package/server/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\n\r\nconst activeEvents = {};\r\nonNet(`_bl_cb_${resourceName}`, (key, ...args) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerClientCallback(eventName: string, playerId: string, ...args: any[]) {\r\n let key: string;\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args);\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n}\r\n\r\nexport function onClientCallback(eventName: string, cb: (playerId: number, ...args: any[]) => any) {\r\n onNet(`_bl_cb_${eventName}`, async (resource: string, key: string, ...args: any[]) => {\r\n const src = source;\r\n let response: any;\r\n \r\n try {\r\n response = await cb(src, ...args);\r\n } catch (e: any) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n \r\n emitNet(`_bl_cb_${resource}`, src, key, response);\r\n });\r\n}\r\n\r\nconst bl_bridge = exports.bl_bridge\r\n\r\nexport const core = bl_bridge.core()\r\n\r\nexport const getPlayerData = (src: number) => {\r\n return core.GetPlayer(src)\r\n}\r\n\r\nexport const getFrameworkID = (src: number) => {\r\n const player = core.GetPlayer(src)\r\n if (!player) return null\r\n return player.id\r\n}\r\n\r\n\r\nconst bl_config = exports.bl_appearance.config()\r\nexport const config = bl_config", "import { TAppearance, TClothes, TSkin } from '@typings/appearance';\r\nimport { getFrameworkID, onClientCallback, } from '../utils';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nexport async function saveSkin(src: number, skin: TSkin) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET skin = ? WHERE id = ?',\r\n [JSON.stringify(skin), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveSkin', saveSkin);\r\nexports('SaveSkin', saveSkin);\r\n\r\nexport async function saveClothes(src: number, clothes: TClothes) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET clothes = ? WHERE id = ?',\r\n [JSON.stringify(clothes), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveClothes', saveClothes);\r\nexports('SaveClothes', saveClothes);\r\n\r\nexport async function saveTattoos(src: number, tattoos: TTattoo[]) {\r\n const frameworkId = getFrameworkID(src);\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET tattoos = ? WHERE id = ?',\r\n [JSON.stringify(tattoos), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveTattoos', saveTattoos);\r\nexports('SaveTattoos', saveTattoos);\r\n\r\n\r\nexport async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) {\r\n if (src && frameworkId) {\r\n const playerId = getFrameworkID(src);\r\n \r\n if (frameworkId !== playerId) {\r\n console.warn('You are trying to save an appearance for a different player', src, frameworkId);\r\n return;\r\n }\r\n }\r\n\r\n\tif (!frameworkId) {\r\n\t\tframeworkId = getFrameworkID(src);\r\n\t}\r\n\r\n\tconst clothes = {\r\n\t\tdrawables: appearance.drawables,\r\n\t\tprops: appearance.props,\r\n\t\theadOverlay: appearance.headOverlay,\r\n\t};\r\n\r\n\tconst skin = {\r\n\t\theadBlend: appearance.headBlend,\r\n\t\theadStructure: appearance.headStructure,\r\n\t\thairColor: appearance.hairColor,\r\n\t\tmodel: appearance.model,\r\n\t};\r\n\r\n\tconst tattoos = appearance.tattoos || [];\r\n\r\n\tconst result = await oxmysql.prepare(\r\n\t\t'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);',\r\n\t\t[\r\n\t\t\tframeworkId,\r\n\t\t\tJSON.stringify(clothes),\r\n\t\t\tJSON.stringify(skin),\r\n\t\t\tJSON.stringify(tattoos),\r\n\t\t]\r\n\t);\r\n\r\n\treturn result;\r\n}\r\nonClientCallback('bl_appearance:server:saveAppearance', saveAppearance);\r\nexports('SaveAppearance', function(id, appearance) {\r\n return saveAppearance(null, id, appearance)\r\n});\r\n", "", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `players`');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'fivem',\n data: JSON.parse(element.skin)\n }) as TAppearance\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'illenium',\n data: JSON.parse(element.skin)\n })\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin);\n await delay(200);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { config, core, getFrameworkID, getPlayerData, onClientCallback } from \"../utils\";\r\nimport { Outfit } from \"@typings/outfits\";\r\n\r\nasync function getOutfits(src: number, frameworkId: string) {\r\n const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } }\r\n\tlet response = await oxmysql.prepare(\r\n\t\t'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)',\r\n\t\t[frameworkId, job.name, job.grade.name]\r\n\t);\r\n\tif (!response) return [];\r\n\r\n if (!Array.isArray(response)) {\r\n response = [response];\r\n }\r\n\r\n const outfits = response.map(\r\n (outfit: { id: number; label: string; outfit: string; jobname?: string }) => {\r\n return {\r\n id: outfit.id,\r\n label: outfit.label,\r\n outfit: JSON.parse(outfit.outfit),\r\n jobname: outfit.jobname,\r\n };\r\n }\r\n );\r\n\r\n return outfits;\r\n}\r\nonClientCallback('bl_appearance:server:getOutfits', getOutfits);\r\nexports('GetOutfits', getOutfits);\r\n\r\nasync function renameOutfit(src: number, data: { id: number; label: string }) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?',\r\n [data.label, frameworkId, data.id]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:renameOutfit', renameOutfit);\r\nexports('RenameOutfit', renameOutfit);\r\n\r\nasync function deleteOutfit(src: number, id: number) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'DELETE FROM outfits WHERE player_id = ? AND id = ?',\r\n [frameworkId, id]\r\n );\r\n return result > 0;\r\n}\r\nonClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit);\r\nexports('DeleteOutfit', deleteOutfit);\r\n\r\nasync function saveOutfit(src: number, data: Outfit) {\r\n const frameworkId = getFrameworkID(src);\r\n let jobname = null;\r\n let jobrank = 0;\r\n if (data.job) {\r\n jobname = data.job.name;\r\n jobrank = data.job.rank;\r\n }\r\n const id = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)',\r\n [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank]\r\n );\r\n return id;\r\n}\r\nonClientCallback('bl_appearance:server:saveOutfit', saveOutfit);\r\nexports('SaveOutfit', saveOutfit);\r\n\r\n\r\nasync function fetchOutfit(_: number, id: number) {\r\n const response = await oxmysql.prepare(\r\n 'SELECT outfit FROM outfits WHERE id = ?',\r\n [id]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit);\r\nexports('FetchOutfit', fetchOutfit);\r\n\r\nasync function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) {\r\n const result = await oxmysql.query(\r\n 'SELECT label, outfit FROM outfits WHERE id = ?',\r\n [outfitId]\r\n );\r\n\r\n if (!result || typeof result !== 'object' || Object.keys(result).length === 0) {\r\n return { success: false, message: 'Outfit not found' };\r\n }\r\n\r\n const newId = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)',\r\n [frameworkId, outfitName, result.outfit]\r\n );\r\n\r\n return { success: true, newId: newId };\r\n}\r\nonClientCallback('bl_appearance:server:importOutfit', importOutfit);\r\nexports('ImportOutfit', importOutfit);\r\n\r\nconst outfitItem = config.outfitItem\r\n\r\nif (!outfitItem) {\r\n console.warn('bl_appearance: No outfit item configured, please set it in config.lua')\r\n}\r\n\r\nonClientCallback('bl_appearance:server:itemOutfit', async (src, data) => {\r\n\tconst player = core.GetPlayer(src)\r\n\tplayer.addItem(outfitItem, 1, data)\r\n});\r\n\r\ncore.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => {\r\n\tconst player = getPlayerData(source)\r\n\tif (player?.removeItem(outfitItem, 1, slot)) \r\n\t\temitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit)\r\n})", "import './appearance/outfits';\r\nimport './appearance/setters';\r\nimport './appearance/getters';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\n\r\noxmysql.ready(async () => {\r\n // see if there is a table called appearance\r\n try {\r\n await oxmysql.query('SELECT 1 FROM appearance LIMIT 1');\r\n } catch (error) {\r\n console.error('Error checking appearance table. Most likely the table does not exist: ', error);\r\n // You can add additional error handling or recovery logic here if needed\r\n }\r\n});\r\n\r\nonNet('bl_appearance:server:setroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), source)\r\n});\r\n\r\nonNet('bl_appearance:server:resetroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), 0)\r\n});\r\n\r\nRegisterCommand('migrate', async (source: number) => {\r\n\tsource = source !== 0 ? source : parseInt(getPlayers()[0])\r\n\tconst bl_appearance = exports.bl_appearance;\r\n\tconst config = bl_appearance.config();\r\n\tconst importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`)\r\n\timportedModule.default(source)\r\n}, false);\r\n", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { getFrameworkID, onClientCallback } from \"../utils\";\r\nimport { SkinDB } from \"@typings/appearance\";\r\n\r\nasync function getSkin(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT skin FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getSkin', getSkin);\r\nexports('GetSkin', function(id) {\r\n return getSkin(null, id)\r\n});\r\n\r\nasync function getClothes(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT clothes FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getClothes', getClothes);\r\nexports('GetClothes', function(id) {\r\n return getClothes(null, id)\r\n});\r\n\r\nasync function getTattoos(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT tattoos FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response) || [];\r\n}\r\nonClientCallback('bl_appearance:server:getTattoos', getTattoos);\r\nexports('GetTattoos', function(id) {\r\n return getTattoos(null, id)\r\n});\r\n\r\nasync function getAppearance(src: number, frameworkId: string) {\r\n if (!frameworkId && !src) return null;\r\n \r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response: SkinDB = await oxmysql.single(\r\n 'SELECT * FROM appearance WHERE id = ? LIMIT 1',\r\n [frameworkId]\r\n );\r\n\r\n if (!response) return null;\r\n let appearance = {\r\n ...JSON.parse(response.skin),\r\n ...JSON.parse(response.clothes),\r\n tattoos: JSON.parse(response.tattoos),\r\n }\r\n appearance.id = response.id\r\n return appearance;\r\n}\r\nonClientCallback('bl_appearance:server:getAppearance', getAppearance);\r\nexports('GetAppearance', function(id) {\r\n return getAppearance(null, id)\r\n});\r\n"], - "mappings": "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", + "sourcesContent": ["type Query = string | number;\r\ntype Params = Record | unknown[] | Function;\r\ntype Callback = (result: T | null) => void;\r\n\r\ntype Transaction =\r\n | string[]\r\n | [string, Params][]\r\n | { query: string; values: Params }[]\r\n | { query: string; parameters: Params }[];\r\n\r\ninterface Result {\r\n [column: string | number]: any;\r\n affectedRows?: number;\r\n fieldCount?: number;\r\n info?: string;\r\n insertId?: number;\r\n serverStatus?: number;\r\n warningStatus?: number;\r\n changedRows?: number;\r\n}\r\n\r\ninterface Row {\r\n [column: string | number]: unknown;\r\n}\r\n\r\ninterface OxMySQL {\r\n store: (query: string) => void;\r\n ready: (callback: () => void) => void;\r\n query: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n single: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n scalar: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n update: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n insert: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n prepare: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n rawExecute: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n transaction: (query: Transaction, params?: Params | Callback, cb?: Callback) => Promise;\r\n isReady: () => boolean;\r\n awaitConnection: () => Promise;\r\n}\r\n\r\nconst QueryStore: string[] = [];\r\n\r\nfunction assert(condition: boolean, message: string) {\r\n if (!condition) throw new TypeError(message);\r\n}\r\n\r\nconst safeArgs = (query: Query | Transaction, params?: any, cb?: Function, transaction?: true) => {\r\n if (typeof query === 'number') query = QueryStore[query];\r\n\r\n if (transaction) {\r\n assert(typeof query === 'object', `First argument expected object, recieved ${typeof query}`);\r\n } else {\r\n assert(typeof query === 'string', `First argument expected string, received ${typeof query}`);\r\n }\r\n\r\n if (params) {\r\n const paramType = typeof params;\r\n assert(\r\n paramType === 'object' || paramType === 'function',\r\n `Second argument expected object or function, received ${paramType}`\r\n );\r\n\r\n if (!cb && paramType === 'function') {\r\n cb = params;\r\n params = undefined;\r\n }\r\n }\r\n\r\n if (cb !== undefined) assert(typeof cb === 'function', `Third argument expected function, received ${typeof cb}`);\r\n\r\n return [query, params, cb];\r\n};\r\n\r\nconst exp = global.exports.oxmysql;\r\nconst currentResourceName = GetCurrentResourceName();\r\n\r\nfunction execute(method: string, query: Query | Transaction, params?: Params) {\r\n return new Promise((resolve, reject) => {\r\n exp[method](\r\n query,\r\n params,\r\n (result, error) => {\r\n if (error) return reject(error);\r\n resolve(result);\r\n },\r\n currentResourceName,\r\n true\r\n );\r\n }) as any;\r\n}\r\n\r\nexport const oxmysql: OxMySQL = {\r\n store(query) {\r\n assert(typeof query !== 'string', `Query expects a string, received ${typeof query}`);\r\n\r\n return QueryStore.push(query);\r\n },\r\n ready(callback) {\r\n setImmediate(async () => {\r\n while (GetResourceState('oxmysql') !== 'started') await new Promise((resolve) => setTimeout(resolve, 50));\r\n callback();\r\n });\r\n },\r\n async query(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('query', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async single(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('single', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async scalar(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('scalar', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async update(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('update', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async insert(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('insert', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async prepare(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('prepare', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async rawExecute(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('rawExecute', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async transaction(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb, true);\r\n const result = await execute('transaction', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n isReady() {\r\n return exp.isReady();\r\n },\r\n async awaitConnection() {\r\n return await exp.awaitConnection();\r\n },\r\n};\r\n", "//https://github.com/overextended/ox_lib/blob/master/package/server/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\n\r\nconst activeEvents = {};\r\nonNet(`_bl_cb_${resourceName}`, (key, ...args) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerClientCallback(eventName: string, playerId: string, ...args: any[]) {\r\n let key: string;\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args);\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n}\r\n\r\nexport function onClientCallback(eventName: string, cb: (playerId: number, ...args: any[]) => any) {\r\n onNet(`_bl_cb_${eventName}`, async (resource: string, key: string, ...args: any[]) => {\r\n const src = source;\r\n let response: any;\r\n \r\n try {\r\n response = await cb(src, ...args);\r\n } catch (e: any) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n \r\n emitNet(`_bl_cb_${resource}`, src, key, response);\r\n });\r\n}\r\n\r\nconst bl_bridge = exports.bl_bridge\r\n\r\nexport const core = bl_bridge.core()\r\n\r\nexport const getPlayerData = (src: number) => {\r\n return core.GetPlayer(src)\r\n}\r\n\r\nexport const getFrameworkID = (src: number) => {\r\n const player = core.GetPlayer(src)\r\n if (!player) return null\r\n return player.id\r\n}\r\n\r\n\r\nconst bl_config = exports.bl_appearance.config()\r\nexport const config = bl_config", "import { TAppearance, TClothes, TSkin } from '@typings/appearance';\r\nimport { getFrameworkID, onClientCallback, } from '../utils';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nexport async function saveSkin(src: number, skin: TSkin) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET skin = ? WHERE id = ?',\r\n [JSON.stringify(skin), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveSkin', saveSkin);\r\nexports('SaveSkin', saveSkin);\r\n\r\nexport async function saveClothes(src: number, clothes: TClothes) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET clothes = ? WHERE id = ?',\r\n [JSON.stringify(clothes), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveClothes', saveClothes);\r\nexports('SaveClothes', saveClothes);\r\n\r\nexport async function saveTattoos(src: number, tattoos: TTattoo[]) {\r\n const frameworkId = getFrameworkID(src);\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET tattoos = ? WHERE id = ?',\r\n [JSON.stringify(tattoos), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveTattoos', saveTattoos);\r\nexports('SaveTattoos', saveTattoos);\r\n\r\n\r\nexport async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) {\r\n if (src && frameworkId) {\r\n const playerId = getFrameworkID(src);\r\n \r\n if (frameworkId !== playerId) {\r\n console.warn('You are trying to save an appearance for a different player', src, frameworkId);\r\n return;\r\n }\r\n }\r\n\r\n\tif (!frameworkId) {\r\n\t\tframeworkId = getFrameworkID(src);\r\n\t}\r\n\r\n\tconst clothes = {\r\n\t\tdrawables: appearance.drawables,\r\n\t\tprops: appearance.props,\r\n\t\theadOverlay: appearance.headOverlay,\r\n\t};\r\n\r\n\tconst skin = {\r\n\t\theadBlend: appearance.headBlend,\r\n\t\theadStructure: appearance.headStructure,\r\n\t\thairColor: appearance.hairColor,\r\n\t\tmodel: appearance.model,\r\n\t};\r\n\r\n\tconst tattoos = appearance.tattoos || [];\r\n\r\n\tconst result = await oxmysql.prepare(\r\n\t\t'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);',\r\n\t\t[\r\n\t\t\tframeworkId,\r\n\t\t\tJSON.stringify(clothes),\r\n\t\t\tJSON.stringify(skin),\r\n\t\t\tJSON.stringify(tattoos),\r\n\t\t]\r\n\t);\r\n\r\n\treturn result;\r\n}\r\nonClientCallback('bl_appearance:server:saveAppearance', saveAppearance);\r\nexports('SaveAppearance', function(id, appearance) {\r\n return saveAppearance(null, id, appearance)\r\n});\r\n", "", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `players`');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'fivem',\n data: JSON.parse(element.skin)\n }) as TAppearance\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'illenium',\n data: JSON.parse(element.skin)\n })\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin);\n await delay(200);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { config, core, getFrameworkID, getPlayerData, onClientCallback } from \"../utils\";\r\nimport { Outfit } from \"@typings/outfits\";\r\n\r\nasync function getOutfits(src: number, frameworkId: string) {\r\n const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } }\r\n\tlet response = await oxmysql.prepare(\r\n\t\t'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)',\r\n\t\t[frameworkId, job.name, job.grade.name]\r\n\t);\r\n\tif (!response) return [];\r\n\r\n if (!Array.isArray(response)) {\r\n response = [response];\r\n }\r\n\r\n const outfits = response.map(\r\n (outfit: { id: number; label: string; outfit: string; jobname?: string }) => {\r\n return {\r\n id: outfit.id,\r\n label: outfit.label,\r\n outfit: JSON.parse(outfit.outfit),\r\n jobname: outfit.jobname,\r\n };\r\n }\r\n );\r\n\r\n return outfits;\r\n}\r\nonClientCallback('bl_appearance:server:getOutfits', getOutfits);\r\nexports('GetOutfits', getOutfits);\r\n\r\nasync function renameOutfit(src: number, data: { id: number; label: string }) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?',\r\n [data.label, frameworkId, data.id]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:renameOutfit', renameOutfit);\r\nexports('RenameOutfit', renameOutfit);\r\n\r\nasync function deleteOutfit(src: number, id: number) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'DELETE FROM outfits WHERE player_id = ? AND id = ?',\r\n [frameworkId, id]\r\n );\r\n return result > 0;\r\n}\r\nonClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit);\r\nexports('DeleteOutfit', deleteOutfit);\r\n\r\nasync function saveOutfit(src: number, data: Outfit) {\r\n const frameworkId = getFrameworkID(src);\r\n let jobname = null;\r\n let jobrank = 0;\r\n if (data.job) {\r\n jobname = data.job.name;\r\n jobrank = data.job.rank;\r\n }\r\n const id = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)',\r\n [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank]\r\n );\r\n return id;\r\n}\r\nonClientCallback('bl_appearance:server:saveOutfit', saveOutfit);\r\nexports('SaveOutfit', saveOutfit);\r\n\r\n\r\nasync function fetchOutfit(_: number, id: number) {\r\n const response = await oxmysql.prepare(\r\n 'SELECT outfit FROM outfits WHERE id = ?',\r\n [id]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit);\r\nexports('FetchOutfit', fetchOutfit);\r\n\r\nasync function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) {\r\n const result = await oxmysql.query(\r\n 'SELECT label, outfit FROM outfits WHERE id = ?',\r\n [outfitId]\r\n );\r\n\r\n if (!result || typeof result !== 'object' || Object.keys(result).length === 0) {\r\n return { success: false, message: 'Outfit not found' };\r\n }\r\n\r\n const newId = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)',\r\n [frameworkId, outfitName, result.outfit]\r\n );\r\n\r\n return { success: true, newId: newId };\r\n}\r\nonClientCallback('bl_appearance:server:importOutfit', importOutfit);\r\nexports('ImportOutfit', importOutfit);\r\n\r\nconst outfitItem = config.outfitItem\r\n\r\nif (!outfitItem) {\r\n console.warn('bl_appearance: No outfit item configured, please set it in config.lua')\r\n}\r\n\r\nonClientCallback('bl_appearance:server:itemOutfit', async (src, data) => {\r\n\tconst player = core.GetPlayer(src)\r\n\tplayer.addItem(outfitItem, 1, data)\r\n});\r\n\r\ncore.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => {\r\n\tconst player = getPlayerData(source)\r\n\tif (player?.removeItem(outfitItem, 1, slot)) \r\n\t\temitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit)\r\n})", "import './appearance/outfits';\r\nimport './appearance/setters';\r\nimport './appearance/getters';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\n\r\noxmysql.ready(async () => {\r\n // see if there is a table called appearance\r\n try {\r\n await oxmysql.query('SELECT 1 FROM appearance LIMIT 1');\r\n } catch (error) {\r\n console.error('Error checking appearance table. Most likely the table does not exist: ', error);\r\n // You can add additional error handling or recovery logic here if needed\r\n }\r\n});\r\n\r\nonNet('bl_appearance:server:setroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), source)\r\n});\r\n\r\nonNet('bl_appearance:server:resetroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), 0)\r\n});\r\n\r\nRegisterCommand('migrate', async (source: number) => {\r\n\tsource = source !== 0 ? source : parseInt(getPlayers()[0])\r\n\tconst bl_appearance = exports.bl_appearance;\r\n\tconst config = bl_appearance.config();\r\n\tconst importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`)\r\n\timportedModule.default(source)\r\n}, false);\r\n", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { getFrameworkID, onClientCallback } from \"../utils\";\r\nimport { SkinDB } from \"@typings/appearance\";\r\n\r\nasync function getSkin(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT skin FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getSkin', getSkin);\r\nexports('GetSkin', function(id) {\r\n return getSkin(null, id)\r\n});\r\n\r\nasync function getClothes(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT clothes FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getClothes', getClothes);\r\nexports('GetClothes', function(id) {\r\n return getClothes(null, id)\r\n});\r\n\r\nasync function getTattoos(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT tattoos FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response) || [];\r\n}\r\nonClientCallback('bl_appearance:server:getTattoos', getTattoos);\r\nexports('GetTattoos', function(id) {\r\n return getTattoos(null, id)\r\n});\r\n\r\nasync function getAppearance(src: number, frameworkId: string) {\r\n if (!frameworkId && !src) return null;\r\n \r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response: SkinDB = await oxmysql.single(\r\n 'SELECT * FROM appearance WHERE id = ? LIMIT 1',\r\n [frameworkId]\r\n );\r\n\r\n if (!response) return null;\r\n let appearance = {\r\n ...JSON.parse(response.skin),\r\n ...JSON.parse(response.clothes),\r\n tattoos: JSON.parse(response.tattoos),\r\n }\r\n appearance.id = response.id\r\n return appearance;\r\n}\r\nonClientCallback('bl_appearance:server:getAppearance', getAppearance);\r\nexports('GetPlayerAppearance', function(id) {\r\n return getAppearance(null, id)\r\n});\r\n"], + "mappings": "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", "names": ["exports", "import_oxmysql", "import_oxmysql", "response", "import_oxmysql", "delay", "migrate", "response", "import_oxmysql", "delay", "migrate", "response", "source", "import_oxmysql", "import_oxmysql", "source", "config"] } diff --git a/src/client/appearance/getters.ts b/src/client/appearance/getters.ts index 89a4906..8432a3e 100644 --- a/src/client/appearance/getters.ts +++ b/src/client/appearance/getters.ts @@ -13,13 +13,13 @@ export function findModelIndex(target: number) { return models.findIndex((model: string) => GetHashKey(model) === target) } -export function getHair(pedHandle: number): THairData { +export function getHairColor(pedHandle: number): THairData { return { color: GetPedHairColor(pedHandle), highlight: GetPedHairHighlightColor(pedHandle) } } -exports('GetHair', getHair); +exports('GetPedHairColor', getHairColor); export function getHeadBlendData(pedHandle: number) { // https://github.com/pedr0fontoura/fivem-appearance/blob/main/game/src/client/index.ts#L67 @@ -55,7 +55,7 @@ export function getHeadBlendData(pedHandle: number) { hasParent: Boolean(hasParent), }; } -exports('GetHeadBlend', getHeadBlendData); +exports('GetPedHeadBlend', getHeadBlendData); export function getHeadOverlay(pedHandle: number) { let totals: THeadOverlayTotal = {}; @@ -87,7 +87,7 @@ export function getHeadOverlay(pedHandle: number) { return [headData, totals]; } -exports('GetHeadOverlay', getHeadOverlay); +exports('GetPedHeadOverlay', getHeadOverlay); export function getHeadStructure(pedHandle: number) { const pedModel = GetEntityModel(pedHandle) @@ -106,7 +106,7 @@ export function getHeadStructure(pedHandle: number) { return faceStruct } -exports('GetHeadStructure', getHeadStructure); +exports('GetPedHeadStructure', getHeadStructure); export function getDrawables(pedHandle: number) { let drawables = {} @@ -132,7 +132,7 @@ export function getDrawables(pedHandle: number) { return [drawables, totalDrawables] } -exports('GetDrawables', getDrawables); +exports('GetPedDrawables', getDrawables); export function getProps(pedHandle: number) { let props = {} @@ -159,8 +159,7 @@ export function getProps(pedHandle: number) { return [props, totalProps] } -exports('GetProps', getProps); - +exports('GetPedProps', getProps); export async function getAppearance(pedHandle: number): Promise { const [headData, totals] = getHeadOverlay(pedHandle) @@ -172,7 +171,7 @@ export async function getAppearance(pedHandle: number): Promise { return { modelIndex: findModelIndex(model), model: model, - hairColor: getHair(pedHandle), + hairColor: getHairColor(pedHandle), headBlend: getHeadBlendData(pedHandle), headOverlay: headData as THeadOverlay, headOverlayTotal: totals as THeadOverlayTotal, @@ -184,7 +183,7 @@ export async function getAppearance(pedHandle: number): Promise { tattoos: tattoos } } -exports("GetAppearance", getAppearance) +exports("GetPedAppearance", getAppearance) onServerCallback('bl_appearance:client:getAppearance', () => { updatePed(PlayerPedId()) return getAppearance(ped) @@ -207,7 +206,7 @@ export function getPedSkin(pedHandle: number): TSkin { return { headBlend: getHeadBlendData(pedHandle), headStructure: getHeadStructure(pedHandle), - hairColor: getHair(pedHandle), + hairColor: getHairColor(pedHandle), model: GetEntityModel(pedHandle) } } @@ -284,7 +283,7 @@ export function getTattooData() { export async function getTattoos(): Promise { return await triggerServerCallback('bl_appearance:server:getTattoos') || [] } -exports('GetTattoos', getTattoos); +exports('GetPlayerTattoos', getTattoos); //migration onServerCallback('bl_appearance:client:migration:setAppearance', (data: {type: string, data: any}) => { diff --git a/src/client/appearance/setters.ts b/src/client/appearance/setters.ts index 32d6e68..f7819e9 100644 --- a/src/client/appearance/setters.ts +++ b/src/client/appearance/setters.ts @@ -9,7 +9,7 @@ export function setDrawable(pedHandle: number, data: TValue) { SetPedComponentVariation(pedHandle, data.index, data.value, data.texture, 0) return GetNumberOfPedTextureVariations(pedHandle, data.index, data.value) } -exports('SetDrawable', setDrawable); +exports('SetPedDrawable', setDrawable); export function setProp(pedHandle: number, data: TValue) { if (!data) return console.warn('No data provided for setProp') @@ -22,7 +22,7 @@ export function setProp(pedHandle: number, data: TValue) { SetPedPropIndex(pedHandle, data.index, data.value, data.texture, false) return GetNumberOfPedPropTextureVariations(pedHandle, data.index, data.value) } -exports('SetProp', setProp); +exports('SetPedProp', setProp); const defMaleHash = GetHashKey("mp_m_freemode_01") @@ -75,14 +75,14 @@ export const setModel = async (pedHandle: number, data: TAppearance | TSkin | nu return pedHandle; }; -exports('SetModel', setModel); +exports('SetPedModel', setModel); export function setFaceFeature(pedHandle: number, data: TValue) { if (!data) return console.warn('No data provided for setFaceFeature') SetPedFaceFeature(pedHandle, data.index, data.value + 0.0) } -exports('SetFaceFeature', setFaceFeature); +exports('SetPedFaceFeature', setFaceFeature); export function setFaceFeatures(pedHandle: number, data: THeadStructure) { if (!data) return console.warn('No data provided for setFaceFeatures') @@ -93,7 +93,7 @@ export function setFaceFeatures(pedHandle: number, data: THeadStructure) { setFaceFeature(pedHandle, value) } } -exports('SetFaceFeatures', setFaceFeatures); +exports('SetPedFaceFeatures', setFaceFeatures); const isPositive = (val: number) => val >= 0 ? val : 0 @@ -117,7 +117,7 @@ export function setHeadBlend(pedHandle: number, data) { SetPedHeadBlendData(pedHandle, shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix, hasParent) } -exports('SetHeadBlend', setHeadBlend); +exports('SetPedHeadBlend', setHeadBlend); export function setHeadOverlay(pedHandle: number, data) { if (!data) return console.warn('No data provided for setHeadOverlay') @@ -140,7 +140,7 @@ export function setHeadOverlay(pedHandle: number, data) { SetPedHeadOverlay(pedHandle, index, value, data.overlayOpacity + 0.0) SetPedHeadOverlayColor(pedHandle, index, 1, data.firstColor, data.secondColor) } -exports('SetHeadOverlay', setHeadOverlay); +exports('SetPedHeadOverlay', setHeadOverlay); export function resetToggles(data) { diff --git a/src/server/appearance/getters.ts b/src/server/appearance/getters.ts index cbdb2d8..b6d6675 100644 --- a/src/server/appearance/getters.ts +++ b/src/server/appearance/getters.ts @@ -72,6 +72,6 @@ async function getAppearance(src: number, frameworkId: string) { return appearance; } onClientCallback('bl_appearance:server:getAppearance', getAppearance); -exports('GetAppearance', function(id) { +exports('GetPlayerAppearance', function(id) { return getAppearance(null, id) }); From 9d7fc1d8c13f430dd9f5ce9908e9d1f4a14109fb Mon Sep 17 00:00:00 2001 From: Xirvin Date: Mon, 12 Aug 2024 16:36:03 +1000 Subject: [PATCH 30/30] ref!(exports) --- .yarn.installed | 0 dist/server/init.js | 40 ++- dist/server/init.js.map | 4 +- src/server/appearance/getters.ts | 6 +- src/server/appearance/setters.ts | 34 +- yarn.lock | 561 +++++++++++++++++++++++++++++++ 6 files changed, 615 insertions(+), 30 deletions(-) create mode 100644 .yarn.installed create mode 100644 yarn.lock diff --git a/.yarn.installed b/.yarn.installed new file mode 100644 index 0000000..e69de29 diff --git a/dist/server/init.js b/dist/server/init.js index 297ac61..b8adbdc 100644 --- a/dist/server/init.js +++ b/dist/server/init.js @@ -196,24 +196,30 @@ var init_utils = __esm({ }); // src/server/appearance/setters.ts -async function saveSkin(src, skin) { - const frameworkId = getFrameworkID(src); +async function saveSkin(src, frameworkId, skin) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } const result = await import_oxmysql2.oxmysql.update( "UPDATE appearance SET skin = ? WHERE id = ?", [JSON.stringify(skin), frameworkId] ); return result; } -async function saveClothes(src, clothes) { - const frameworkId = getFrameworkID(src); +async function saveClothes(src, frameworkId, clothes) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } const result = await import_oxmysql2.oxmysql.update( "UPDATE appearance SET clothes = ? WHERE id = ?", [JSON.stringify(clothes), frameworkId] ); return result; } -async function saveTattoos(src, tattoos) { - const frameworkId = getFrameworkID(src); +async function saveTattoos(src, frameworkId, tattoos) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } const result = await import_oxmysql2.oxmysql.update( "UPDATE appearance SET tattoos = ? WHERE id = ?", [JSON.stringify(tattoos), frameworkId] @@ -261,16 +267,22 @@ var init_setters = __esm({ import_oxmysql2 = __toESM(require_MySQL(), 1); __name(saveSkin, "saveSkin"); onClientCallback("bl_appearance:server:saveSkin", saveSkin); - exports("SaveSkin", saveSkin); + exports("SavePlayerSkin", function(id, skin) { + return saveSkin(null, id, skin); + }); __name(saveClothes, "saveClothes"); onClientCallback("bl_appearance:server:saveClothes", saveClothes); - exports("SaveClothes", saveClothes); + exports("SavePlayerClothes", function(id, clothes) { + return saveClothes(null, id, clothes); + }); __name(saveTattoos, "saveTattoos"); onClientCallback("bl_appearance:server:saveTattoos", saveTattoos); - exports("SaveTattoos", saveTattoos); + exports("SavePlayerTattoos", function(id, tattoos) { + return saveTattoos(null, id, tattoos); + }); __name(saveAppearance, "saveAppearance"); onClientCallback("bl_appearance:server:saveAppearance", saveAppearance); - exports("SaveAppearance", function(id, appearance) { + exports("SavePlayerAppearance", function(id, appearance) { return saveAppearance(null, id, appearance); }); } @@ -507,7 +519,7 @@ async function getSkin(src, frameworkId) { } __name(getSkin, "getSkin"); onClientCallback("bl_appearance:server:getSkin", getSkin); -exports("GetSkin", function(id) { +exports("GetPlayerSkin", function(id) { return getSkin(null, id); }); async function getClothes(src, frameworkId) { @@ -522,7 +534,7 @@ async function getClothes(src, frameworkId) { } __name(getClothes, "getClothes"); onClientCallback("bl_appearance:server:getClothes", getClothes); -exports("GetClothes", function(id) { +exports("GetPlayerClothes", function(id) { return getClothes(null, id); }); async function getTattoos(src, frameworkId) { @@ -537,7 +549,7 @@ async function getTattoos(src, frameworkId) { } __name(getTattoos, "getTattoos"); onClientCallback("bl_appearance:server:getTattoos", getTattoos); -exports("GetTattoos", function(id) { +exports("GetPlayerTattoos", function(id) { return getTattoos(null, id); }); async function getAppearance(src, frameworkId) { @@ -598,4 +610,4 @@ RegisterCommand("migrate", async (source2) => { const importedModule = await globImport_migrate_ts(`./migrate/${config2.previousClothing === "fivem-appearance" ? "fivem" : config2.previousClothing}.ts`); importedModule.default(source2); }, false); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0BvdmVyZXh0ZW5kZWQvb3hteXNxbC9NeVNRTC50cyIsICIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9zZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9lc3gudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9taWdyYXRlL2ZpdmVtLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9pbGxlbml1bS50cyIsICIuLi8uLi9zcmMvc2VydmVyL21pZ3JhdGUvcWIudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9hcHBlYXJhbmNlL291dGZpdHMudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9pbml0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ0eXBlIFF1ZXJ5ID0gc3RyaW5nIHwgbnVtYmVyO1xyXG50eXBlIFBhcmFtcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdIHwgRnVuY3Rpb247XHJcbnR5cGUgQ2FsbGJhY2s8VD4gPSAocmVzdWx0OiBUIHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgVHJhbnNhY3Rpb24gPVxyXG4gIHwgc3RyaW5nW11cclxuICB8IFtzdHJpbmcsIFBhcmFtc11bXVxyXG4gIHwgeyBxdWVyeTogc3RyaW5nOyB2YWx1ZXM6IFBhcmFtcyB9W11cclxuICB8IHsgcXVlcnk6IHN0cmluZzsgcGFyYW1ldGVyczogUGFyYW1zIH1bXTtcclxuXHJcbmludGVyZmFjZSBSZXN1bHQge1xyXG4gIFtjb2x1bW46IHN0cmluZyB8IG51bWJlcl06IGFueTtcclxuICBhZmZlY3RlZFJvd3M/OiBudW1iZXI7XHJcbiAgZmllbGRDb3VudD86IG51bWJlcjtcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGluc2VydElkPzogbnVtYmVyO1xyXG4gIHNlcnZlclN0YXR1cz86IG51bWJlcjtcclxuICB3YXJuaW5nU3RhdHVzPzogbnVtYmVyO1xyXG4gIGNoYW5nZWRSb3dzPzogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm93IHtcclxuICBbY29sdW1uOiBzdHJpbmcgfCBudW1iZXJdOiB1bmtub3duO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT3hNeVNRTCB7XHJcbiAgc3RvcmU6IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgcXVlcnk6IDxUID0gUmVzdWx0IHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBzaW5nbGU6IDxUID0gUm93IHwgbnVsbD4oXHJcbiAgICBxdWVyeTogUXVlcnksXHJcbiAgICBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxFeGNsdWRlPFQsIFtdPj4sXHJcbiAgICBjYj86IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PlxyXG4gICkgPT4gUHJvbWlzZTxFeGNsdWRlPFQsIFtdPj47XHJcbiAgc2NhbGFyOiA8VCA9IHVua25vd24gfCBudWxsPihcclxuICAgIHF1ZXJ5OiBRdWVyeSxcclxuICAgIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PixcclxuICAgIGNiPzogQ2FsbGJhY2s8RXhjbHVkZTxULCBbXT4+XHJcbiAgKSA9PiBQcm9taXNlPEV4Y2x1ZGU8VCwgW10+PjtcclxuICB1cGRhdGU6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBpbnNlcnQ6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBwcmVwYXJlOiA8VCA9IGFueT4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICByYXdFeGVjdXRlOiA8VCA9IFJlc3VsdCB8IG51bGw+KHF1ZXJ5OiBRdWVyeSwgcGFyYW1zPzogUGFyYW1zIHwgQ2FsbGJhY2s8VD4sIGNiPzogQ2FsbGJhY2s8VD4pID0+IFByb21pc2U8VD47XHJcbiAgdHJhbnNhY3Rpb246IChxdWVyeTogVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPGJvb2xlYW4+LCBjYj86IENhbGxiYWNrPGJvb2xlYW4+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIGlzUmVhZHk6ICgpID0+IGJvb2xlYW47XHJcbiAgYXdhaXRDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPHRydWU+O1xyXG59XHJcblxyXG5jb25zdCBRdWVyeVN0b3JlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XHJcbn1cclxuXHJcbmNvbnN0IHNhZmVBcmdzID0gKHF1ZXJ5OiBRdWVyeSB8IFRyYW5zYWN0aW9uLCBwYXJhbXM/OiBhbnksIGNiPzogRnVuY3Rpb24sIHRyYW5zYWN0aW9uPzogdHJ1ZSkgPT4ge1xyXG4gIGlmICh0eXBlb2YgcXVlcnkgPT09ICdudW1iZXInKSBxdWVyeSA9IFF1ZXJ5U3RvcmVbcXVlcnldO1xyXG5cclxuICBpZiAodHJhbnNhY3Rpb24pIHtcclxuICAgIGFzc2VydCh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnLCBgRmlyc3QgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0LCByZWNpZXZlZCAke3R5cGVvZiBxdWVyeX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXNzZXJ0KHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycsIGBGaXJzdCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1UeXBlID0gdHlwZW9mIHBhcmFtcztcclxuICAgIGFzc2VydChcclxuICAgICAgcGFyYW1UeXBlID09PSAnb2JqZWN0JyB8fCBwYXJhbVR5cGUgPT09ICdmdW5jdGlvbicsXHJcbiAgICAgIGBTZWNvbmQgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0IG9yIGZ1bmN0aW9uLCByZWNlaXZlZCAke3BhcmFtVHlwZX1gXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY2IgJiYgcGFyYW1UeXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNiID0gcGFyYW1zO1xyXG4gICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2IgIT09IHVuZGVmaW5lZCkgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJywgYFRoaXJkIGFyZ3VtZW50IGV4cGVjdGVkIGZ1bmN0aW9uLCByZWNlaXZlZCAke3R5cGVvZiBjYn1gKTtcclxuXHJcbiAgcmV0dXJuIFtxdWVyeSwgcGFyYW1zLCBjYl07XHJcbn07XHJcblxyXG5jb25zdCBleHAgPSBnbG9iYWwuZXhwb3J0cy5veG15c3FsO1xyXG5jb25zdCBjdXJyZW50UmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpO1xyXG5cclxuZnVuY3Rpb24gZXhlY3V0ZShtZXRob2Q6IHN0cmluZywgcXVlcnk6IFF1ZXJ5IHwgVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleHBbbWV0aG9kXShcclxuICAgICAgcXVlcnksXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgKHJlc3VsdCwgZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSxcclxuICAgICAgY3VycmVudFJlc291cmNlTmFtZSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KSBhcyBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBveG15c3FsOiBPeE15U1FMID0ge1xyXG4gIHN0b3JlKHF1ZXJ5KSB7XHJcbiAgICBhc3NlcnQodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJywgYFF1ZXJ5IGV4cGVjdHMgYSBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG5cclxuICAgIHJldHVybiBRdWVyeVN0b3JlLnB1c2gocXVlcnkpO1xyXG4gIH0sXHJcbiAgcmVhZHkoY2FsbGJhY2spIHtcclxuICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgIHdoaWxlIChHZXRSZXNvdXJjZVN0YXRlKCdveG15c3FsJykgIT09ICdzdGFydGVkJykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgYXN5bmMgcXVlcnkocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdxdWVyeScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNpbmdsZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NpbmdsZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNjYWxhcihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NjYWxhcicsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHVwZGF0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3VwZGF0ZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIGluc2VydChxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ2luc2VydCcsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHByZXBhcmUocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdwcmVwYXJlJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgYXN5bmMgcmF3RXhlY3V0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3Jhd0V4ZWN1dGUnLCBxdWVyeSwgcGFyYW1zKTtcclxuICAgIHJldHVybiBjYiA/IGNiKHJlc3VsdCkgOiByZXN1bHQ7XHJcbiAgfSxcclxuICBhc3luYyB0cmFuc2FjdGlvbihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiLCB0cnVlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3RyYW5zYWN0aW9uJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgaXNSZWFkeSgpIHtcclxuICAgIHJldHVybiBleHAuaXNSZWFkeSgpO1xyXG4gIH0sXHJcbiAgYXN5bmMgYXdhaXRDb25uZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGV4cC5hd2FpdENvbm5lY3Rpb24oKTtcclxuICB9LFxyXG59O1xyXG4iLCAiLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL3NlcnZlci9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcblxyXG5jb25zdCBhY3RpdmVFdmVudHMgPSB7fTtcclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5LCAuLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zdCByZXNvbHZlID0gYWN0aXZlRXZlbnRzW2tleV07XHJcbiAgICByZXR1cm4gcmVzb2x2ZSAmJiByZXNvbHZlKC4uLmFyZ3MpO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHBsYXllcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQga2V5OiBzdHJpbmc7XHJcbiAgICBkbyB7XHJcbiAgICAgICAga2V5ID0gYCR7ZXZlbnROYW1lfToke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgxMDAwMDAgKyAxKSl9OiR7cGxheWVySWR9YDtcclxuICAgIH0gd2hpbGUgKGFjdGl2ZUV2ZW50c1trZXldKTtcclxuICAgIGVtaXROZXQoYF9ibF9jYl8ke2V2ZW50TmFtZX1gLCBwbGF5ZXJJZCwgcmVzb3VyY2VOYW1lLCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgYWN0aXZlRXZlbnRzW2tleV0gPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkNsaWVudENhbGxiYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBjYjogKHBsYXllcklkOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IHNvdXJjZTtcclxuICAgICAgICBsZXQgcmVzcG9uc2U6IGFueTtcclxuICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNiKHNyYywgLi4uYXJncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyBjYWxsYmFjayBldmVudCAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGVtaXROZXQoYF9ibF9jYl8ke3Jlc291cmNlfWAsIHNyYywga2V5LCByZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBibF9icmlkZ2UgPSBleHBvcnRzLmJsX2JyaWRnZVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcmUgPSBibF9icmlkZ2UuY29yZSgpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyRGF0YSA9IChzcmM6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIGNvcmUuR2V0UGxheWVyKHNyYylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZyYW1ld29ya0lEID0gKHNyYzogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBwbGF5ZXIuaWRcclxufVxyXG5cclxuXHJcbmNvbnN0IGJsX2NvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5jb25maWcoKVxyXG5leHBvcnQgY29uc3QgY29uZmlnID0gYmxfY29uZmlnIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQ2xvdGhlcywgVFNraW4gfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2ssIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTa2luKHNyYzogbnVtYmVyLCBza2luOiBUU2tpbikge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgc2tpbiA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoc2tpbiksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZVNraW4nLCBzYXZlU2tpbik7XHJcbmV4cG9ydHMoJ1NhdmVTa2luJywgc2F2ZVNraW4pO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDbG90aGVzKHNyYzogbnVtYmVyLCBjbG90aGVzOiBUQ2xvdGhlcykge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdVUERBVEUgYXBwZWFyYW5jZSBTRVQgY2xvdGhlcyA9ID8gV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkoY2xvdGhlcyksIGZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUNsb3RoZXMnLCBzYXZlQ2xvdGhlcyk7XHJcbmV4cG9ydHMoJ1NhdmVDbG90aGVzJywgc2F2ZUNsb3RoZXMpO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUYXR0b29zKHNyYzogbnVtYmVyLCB0YXR0b29zOiBUVGF0dG9vW10pIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBhcHBlYXJhbmNlIFNFVCB0YXR0b29zID0gPyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeSh0YXR0b29zKSwgZnJhbWV3b3JrSWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlVGF0dG9vcycsIHNhdmVUYXR0b29zKTtcclxuZXhwb3J0cygnU2F2ZVRhdHRvb3MnLCBzYXZlVGF0dG9vcyk7XHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVBcHBlYXJhbmNlKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBhcHBlYXJhbmNlOiBUQXBwZWFyYW5jZSkge1xyXG4gICAgaWYgKHNyYyAmJiBmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXllcklkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZnJhbWV3b3JrSWQgIT09IHBsYXllcklkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignWW91IGFyZSB0cnlpbmcgdG8gc2F2ZSBhbiBhcHBlYXJhbmNlIGZvciBhIGRpZmZlcmVudCBwbGF5ZXInLCBzcmMsIGZyYW1ld29ya0lkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblx0aWYgKCFmcmFtZXdvcmtJZCkge1xyXG5cdFx0ZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgY2xvdGhlcyA9IHtcclxuXHRcdGRyYXdhYmxlczogYXBwZWFyYW5jZS5kcmF3YWJsZXMsXHJcblx0XHRwcm9wczogYXBwZWFyYW5jZS5wcm9wcyxcclxuXHRcdGhlYWRPdmVybGF5OiBhcHBlYXJhbmNlLmhlYWRPdmVybGF5LFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHNraW4gPSB7XHJcblx0XHRoZWFkQmxlbmQ6IGFwcGVhcmFuY2UuaGVhZEJsZW5kLFxyXG5cdFx0aGVhZFN0cnVjdHVyZTogYXBwZWFyYW5jZS5oZWFkU3RydWN0dXJlLFxyXG5cdFx0aGFpckNvbG9yOiBhcHBlYXJhbmNlLmhhaXJDb2xvcixcclxuXHRcdG1vZGVsOiBhcHBlYXJhbmNlLm1vZGVsLFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IHRhdHRvb3MgPSBhcHBlYXJhbmNlLnRhdHRvb3MgfHwgW107XHJcblxyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuXHRcdCdJTlNFUlQgSU5UTyBhcHBlYXJhbmNlIChpZCwgY2xvdGhlcywgc2tpbiwgdGF0dG9vcykgVkFMVUVTICg/LCA/LCA/LCA/KSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBjbG90aGVzID0gVkFMVUVTKGNsb3RoZXMpLCBza2luID0gVkFMVUVTKHNraW4pLCB0YXR0b29zID0gVkFMVUVTKHRhdHRvb3MpOycsXHJcblx0XHRbXHJcblx0XHRcdGZyYW1ld29ya0lkLFxyXG5cdFx0XHRKU09OLnN0cmluZ2lmeShjbG90aGVzKSxcclxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoc2tpbiksXHJcblx0XHRcdEpTT04uc3RyaW5naWZ5KHRhdHRvb3MpLFxyXG5cdFx0XVxyXG5cdCk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2F2ZUFwcGVhcmFuY2UnLCBzYXZlQXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ1NhdmVBcHBlYXJhbmNlJywgZnVuY3Rpb24oaWQsIGFwcGVhcmFuY2UpIHtcclxuICAgIHJldHVybiBzYXZlQXBwZWFyYW5jZShudWxsLCBpZCwgYXBwZWFyYW5jZSlcclxufSk7XHJcbiIsICIiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2AnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmaXZlbScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2tpbikge1xuICAgICAgICAgICAgYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDptaWdyYXRpb246c2V0QXBwZWFyYW5jZScsIHNyYywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbGxlbml1bScsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShlbGVtZW50LnNraW4pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICAgICAgY29uc3QgcGxheWVyU3JjID0gcGFyc2VJbnQoc3JjKVxuICAgICAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NvbnZlcnRlZCAnKyByZXNwb25zZS5sZW5ndGggKyAnIGFwcGVhcmFuY2VzJylcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdGUiLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XG5pbXBvcnQgeyB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBUQXBwZWFyYW5jZSB9IGZyb20gJ0B0eXBpbmdzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgc2F2ZUFwcGVhcmFuY2UgfSBmcm9tICcuLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xuXG5jb25zdCBkZWxheSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG5cbmNvbnN0IG1pZ3JhdGUgPSBhc3luYyAoc3JjOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUICogRlJPTSBgcGxheWVyc2tpbnNgIFdIRVJFIGFjdGl2ZSA9IDEnKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgZW1pdE5ldCgncWItY2xvdGhlczpsb2FkU2tpbicsIHNyYywgMCwgZWxlbWVudC5tb2RlbCwgZWxlbWVudC5za2luKTtcbiAgICAgICAgYXdhaXQgZGVsYXkoMjAwKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6Y2xpZW50OmdldEFwcGVhcmFuY2UnLCBzcmMpIGFzIFRBcHBlYXJhbmNlXG4gICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgYXdhaXQgc2F2ZUFwcGVhcmFuY2UocGxheWVyU3JjLCBlbGVtZW50LmNpdGl6ZW5pZCwgcmVzcG9uc2UgYXMgVEFwcGVhcmFuY2UpXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tIFwiQG92ZXJleHRlbmRlZC9veG15c3FsXCI7XHJcbmltcG9ydCB7IGNvbmZpZywgY29yZSwgZ2V0RnJhbWV3b3JrSUQsIGdldFBsYXllckRhdGEsIG9uQ2xpZW50Q2FsbGJhY2sgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgT3V0Zml0IH0gZnJvbSBcIkB0eXBpbmdzL291dGZpdHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE91dGZpdHMoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGpvYiA9IGNvcmUuR2V0UGxheWVyKHNyYykuam9iIHx8IHsgbmFtZTogJ3Vua25vd24nLCBncmFkZTogeyBuYW1lOiAndW5rbm93bicgfSB9XHJcblx0bGV0IHJlc3BvbnNlID0gYXdhaXQgb3hteXNxbC5wcmVwYXJlKFxyXG5cdFx0J1NFTEVDVCAqIEZST00gb3V0Zml0cyBXSEVSRSBwbGF5ZXJfaWQgPSA/IE9SIChqb2JuYW1lID0gPyBBTkQgam9icmFuayA8PSA/KScsXHJcblx0XHRbZnJhbWV3b3JrSWQsIGpvYi5uYW1lLCBqb2IuZ3JhZGUubmFtZV1cclxuXHQpO1xyXG5cdGlmICghcmVzcG9uc2UpIHJldHVybiBbXTtcclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcmVzcG9uc2UgPSBbcmVzcG9uc2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG91dGZpdHMgPSByZXNwb25zZS5tYXAoXHJcbiAgICAgICAgKG91dGZpdDogeyBpZDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBvdXRmaXQ6IHN0cmluZzsgam9ibmFtZT86IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogb3V0Zml0LmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IG91dGZpdC5sYWJlbCxcclxuICAgICAgICAgICAgICAgIG91dGZpdDogSlNPTi5wYXJzZShvdXRmaXQub3V0Zml0KSxcclxuICAgICAgICAgICAgICAgIGpvYm5hbWU6IG91dGZpdC5qb2JuYW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG91dGZpdHM7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0T3V0Zml0cycsIGdldE91dGZpdHMpO1xyXG5leHBvcnRzKCdHZXRPdXRmaXRzJywgZ2V0T3V0Zml0cyk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZW5hbWVPdXRmaXQoc3JjOiBudW1iZXIsIGRhdGE6IHsgaWQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIG91dGZpdHMgU0VUIGxhYmVsID0gPyBXSEVSRSBwbGF5ZXJfaWQgPSA/IEFORCBpZCA9ID8nLFxyXG4gICAgICAgIFtkYXRhLmxhYmVsLCBmcmFtZXdvcmtJZCwgZGF0YS5pZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcbmV4cG9ydHMoJ1JlbmFtZU91dGZpdCcsIHJlbmFtZU91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPdXRmaXQoc3JjOiBudW1iZXIsIGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwudXBkYXRlKFxyXG4gICAgICAgICdERUxFVEUgRlJPTSBvdXRmaXRzIFdIRVJFIHBsYXllcl9pZCA9ID8gQU5EIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBpZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0ID4gMDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpkZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5leHBvcnRzKCdEZWxldGVPdXRmaXQnLCBkZWxldGVPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2F2ZU91dGZpdChzcmM6IG51bWJlciwgZGF0YTogT3V0Zml0KSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBsZXQgam9ibmFtZSA9IG51bGw7XHJcbiAgICBsZXQgam9icmFuayA9IDA7XHJcbiAgICBpZiAoZGF0YS5qb2IpIHtcclxuICAgICAgICBqb2JuYW1lID0gZGF0YS5qb2IubmFtZTtcclxuICAgICAgICBqb2JyYW5rID0gZGF0YS5qb2IucmFuaztcclxuICAgIH1cclxuICAgIGNvbnN0IGlkID0gYXdhaXQgb3hteXNxbC5pbnNlcnQoXHJcbiAgICAgICAgJ0lOU0VSVCBJTlRPIG91dGZpdHMgKHBsYXllcl9pZCwgbGFiZWwsIG91dGZpdCwgam9ibmFtZSwgam9icmFuaykgVkFMVUVTICg/LCA/LCA/LCA/LCA/KScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBkYXRhLmxhYmVsLCBKU09OLnN0cmluZ2lmeShkYXRhLm91dGZpdCksIGpvYm5hbWUsIGpvYnJhbmtdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGlkO1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVPdXRmaXQnLCBzYXZlT3V0Zml0KTtcclxuZXhwb3J0cygnU2F2ZU91dGZpdCcsIHNhdmVPdXRmaXQpO1xyXG5cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoT3V0Zml0KF86IG51bWJlciwgaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBvdXRmaXQgRlJPTSBvdXRmaXRzIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpmZXRjaE91dGZpdCcsIGZldGNoT3V0Zml0KTtcclxuZXhwb3J0cygnRmV0Y2hPdXRmaXQnLCBmZXRjaE91dGZpdCk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRPdXRmaXQoXzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBvdXRmaXRJZDogbnVtYmVyLCBvdXRmaXROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG94bXlzcWwucXVlcnkoXHJcbiAgICAgICAgJ1NFTEVDVCBsYWJlbCwgb3V0Zml0IEZST00gb3V0Zml0cyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtvdXRmaXRJZF1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ091dGZpdCBub3QgZm91bmQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SWQgPSBhd2FpdCBveG15c3FsLmluc2VydChcclxuICAgICAgICAnSU5TRVJUIElOVE8gb3V0Zml0cyAocGxheWVyX2lkLCBsYWJlbCwgb3V0Zml0KSBWQUxVRVMgKD8sID8sID8pJyxcclxuICAgICAgICBbZnJhbWV3b3JrSWQsIG91dGZpdE5hbWUsIHJlc3VsdC5vdXRmaXRdXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG5ld0lkOiBuZXdJZCB9O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcbmV4cG9ydHMoJ0ltcG9ydE91dGZpdCcsIGltcG9ydE91dGZpdCk7XHJcblxyXG5jb25zdCBvdXRmaXRJdGVtID0gY29uZmlnLm91dGZpdEl0ZW1cclxuXHJcbmlmICghb3V0Zml0SXRlbSkge1xyXG4gICAgY29uc29sZS53YXJuKCdibF9hcHBlYXJhbmNlOiBObyBvdXRmaXQgaXRlbSBjb25maWd1cmVkLCBwbGVhc2Ugc2V0IGl0IGluIGNvbmZpZy5sdWEnKVxyXG59XHJcblxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppdGVtT3V0Zml0JywgYXN5bmMgKHNyYywgZGF0YSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGNvcmUuR2V0UGxheWVyKHNyYylcclxuXHRwbGF5ZXIuYWRkSXRlbShvdXRmaXRJdGVtLCAxLCBkYXRhKVxyXG59KTtcclxuXHJcbmNvcmUuUmVnaXN0ZXJVc2FibGVJdGVtKG91dGZpdEl0ZW0sIGFzeW5jIChzb3VyY2U6IG51bWJlciwgc2xvdDogbnVtYmVyLCBtZXRhZGF0YToge291dGZpdDogT3V0Zml0LCBsYWJlbDogc3RyaW5nfSkgPT4ge1xyXG5cdGNvbnN0IHBsYXllciA9IGdldFBsYXllckRhdGEoc291cmNlKVxyXG5cdGlmIChwbGF5ZXI/LnJlbW92ZUl0ZW0ob3V0Zml0SXRlbSwgMSwgc2xvdCkpIFxyXG5cdFx0ZW1pdE5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6dXNlT3V0Zml0SXRlbScsIHNvdXJjZSwgbWV0YWRhdGEub3V0Zml0KVxyXG59KSIsICJpbXBvcnQgJy4vYXBwZWFyYW5jZS9vdXRmaXRzJztcclxuaW1wb3J0ICcuL2FwcGVhcmFuY2Uvc2V0dGVycyc7XHJcbmltcG9ydCAnLi9hcHBlYXJhbmNlL2dldHRlcnMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuXHJcbm94bXlzcWwucmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgdGFibGUgY2FsbGVkIGFwcGVhcmFuY2VcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgb3hteXNxbC5xdWVyeSgnU0VMRUNUIDEgRlJPTSBhcHBlYXJhbmNlIExJTUlUIDEnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgYXBwZWFyYW5jZSB0YWJsZS4gTW9zdCBsaWtlbHkgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0OiAnLCBlcnJvcik7XHJcbiAgICAgICAgLy8gWW91IGNhbiBhZGQgYWRkaXRpb25hbCBlcnJvciBoYW5kbGluZyBvciByZWNvdmVyeSBsb2dpYyBoZXJlIGlmIG5lZWRlZFxyXG4gICAgfVxyXG59KTtcclxuXHJcbm9uTmV0KCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIHNvdXJjZSlcclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6cmVzZXRyb3V0aW5nYnVja2V0JywgKCkgPT4ge1xyXG5cdFNldFBsYXllclJvdXRpbmdCdWNrZXQoc291cmNlLnRvU3RyaW5nKCksIDApXHJcbn0pO1xyXG5cclxuUmVnaXN0ZXJDb21tYW5kKCdtaWdyYXRlJywgYXN5bmMgKHNvdXJjZTogbnVtYmVyKSA9PiB7XHJcblx0c291cmNlID0gc291cmNlICE9PSAwID8gc291cmNlIDogcGFyc2VJbnQoZ2V0UGxheWVycygpWzBdKVxyXG5cdGNvbnN0IGJsX2FwcGVhcmFuY2UgPSBleHBvcnRzLmJsX2FwcGVhcmFuY2U7XHJcblx0Y29uc3QgY29uZmlnID0gYmxfYXBwZWFyYW5jZS5jb25maWcoKTtcclxuXHRjb25zdCBpbXBvcnRlZE1vZHVsZSA9IGF3YWl0IGltcG9ydChgLi9taWdyYXRlLyR7Y29uZmlnLnByZXZpb3VzQ2xvdGhpbmcgPT09ICdmaXZlbS1hcHBlYXJhbmNlJyA/ICdmaXZlbScgOiBjb25maWcucHJldmlvdXNDbG90aGluZ30udHNgKVxyXG5cdGltcG9ydGVkTW9kdWxlLmRlZmF1bHQoc291cmNlKVxyXG59LCBmYWxzZSk7XHJcbiIsICJpbXBvcnQgeyBveG15c3FsIH0gZnJvbSBcIkBvdmVyZXh0ZW5kZWQvb3hteXNxbFwiO1xyXG5pbXBvcnQgeyBnZXRGcmFtZXdvcmtJRCwgb25DbGllbnRDYWxsYmFjayB9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBTa2luREIgfSBmcm9tIFwiQHR5cGluZ3MvYXBwZWFyYW5jZVwiO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0U2tpbihzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHNraW4gRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRTa2luJywgZ2V0U2tpbik7XHJcbmV4cG9ydHMoJ0dldFNraW4nLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFNraW4obnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2xvdGhlcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIGNsb3RoZXMgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRDbG90aGVzJywgZ2V0Q2xvdGhlcyk7XHJcbmV4cG9ydHMoJ0dldENsb3RoZXMnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldENsb3RoZXMobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0VGF0dG9vcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuICAgICAgICAnU0VMRUNUIHRhdHRvb3MgRlJPTSBhcHBlYXJhbmNlIFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKSB8fCBbXTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRUYXR0b29zJywgZ2V0VGF0dG9vcyk7XHJcbmV4cG9ydHMoJ0dldFRhdHRvb3MnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldFRhdHRvb3MobnVsbCwgaWQpXHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwZWFyYW5jZShzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCAmJiAhc3JjKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZTogU2tpbkRCID0gYXdhaXQgb3hteXNxbC5zaW5nbGUoXHJcbiAgICAgICAgJ1NFTEVDVCAqIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8gTElNSVQgMScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkXVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBhcHBlYXJhbmNlID0ge1xyXG4gICAgICAgIC4uLkpTT04ucGFyc2UocmVzcG9uc2Uuc2tpbiksXHJcbiAgICAgICAgLi4uSlNPTi5wYXJzZShyZXNwb25zZS5jbG90aGVzKSxcclxuICAgICAgICB0YXR0b29zOiBKU09OLnBhcnNlKHJlc3BvbnNlLnRhdHRvb3MpLFxyXG4gICAgfVxyXG4gICAgYXBwZWFyYW5jZS5pZCA9IHJlc3BvbnNlLmlkXHJcbiAgICByZXR1cm4gYXBwZWFyYW5jZTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpnZXRBcHBlYXJhbmNlJywgZ2V0QXBwZWFyYW5jZSk7XHJcbmV4cG9ydHMoJ0dldFBsYXllckFwcGVhcmFuY2UnLCBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIGdldEFwcGVhcmFuY2UobnVsbCwgaWQpXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFFBQU0sYUFBdUIsQ0FBQTtBQUU3QixhQUFTLE9BQU8sV0FBb0IsU0FBZTtBQUNqRCxVQUFJLENBQUM7QUFBVyxjQUFNLElBQUksVUFBVSxPQUFPO0lBQzdDO0FBRlM7QUFJVCxRQUFNLFdBQVcsd0JBQUMsT0FBNEIsUUFBYyxJQUFlLGdCQUFzQjtBQUMvRixVQUFJLE9BQU8sVUFBVTtBQUFVLGdCQUFRLFdBQVcsS0FBSztBQUV2RCxVQUFJLGFBQWE7QUFDZixlQUFPLE9BQU8sVUFBVSxVQUFVLDRDQUE0QyxPQUFPLEtBQUssRUFBRTthQUN2RjtBQUNMLGVBQU8sT0FBTyxVQUFVLFVBQVUsNENBQTRDLE9BQU8sS0FBSyxFQUFFOztBQUc5RixVQUFJLFFBQVE7QUFDVixjQUFNLFlBQVksT0FBTztBQUN6QixlQUNFLGNBQWMsWUFBWSxjQUFjLFlBQ3hDLHlEQUF5RCxTQUFTLEVBQUU7QUFHdEUsWUFBSSxDQUFDLE1BQU0sY0FBYyxZQUFZO0FBQ25DLGVBQUs7QUFDTCxtQkFBUzs7O0FBSWIsVUFBSSxPQUFPO0FBQVcsZUFBTyxPQUFPLE9BQU8sWUFBWSw4Q0FBOEMsT0FBTyxFQUFFLEVBQUU7QUFFaEgsYUFBTyxDQUFDLE9BQU8sUUFBUSxFQUFFO0lBQzNCLEdBekJpQjtBQTJCakIsUUFBTSxNQUFNLE9BQU8sUUFBUTtBQUMzQixRQUFNLHNCQUFzQix1QkFBc0I7QUFFbEQsYUFBUyxRQUFRLFFBQWdCLE9BQTRCLFFBQWU7QUFDMUUsYUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVU7QUFDckMsWUFBSSxNQUFNLEVBQ1IsT0FDQSxRQUNBLENBQUMsUUFBUSxVQUFTO0FBQ2hCLGNBQUk7QUFBTyxtQkFBTyxPQUFPLEtBQUs7QUFDOUIsa0JBQVEsTUFBTTtRQUNoQixHQUNBLHFCQUNBLElBQUk7TUFFUixDQUFDO0lBQ0g7QUFiUztBQWVJLElBQUFBLFNBQUEsVUFBbUI7TUFDOUIsTUFBTSxPQUFLO0FBQ1QsZUFBTyxPQUFPLFVBQVUsVUFBVSxvQ0FBb0MsT0FBTyxLQUFLLEVBQUU7QUFFcEYsZUFBTyxXQUFXLEtBQUssS0FBSztNQUM5QjtNQUNBLE1BQU0sVUFBUTtBQUNaLHFCQUFhLFlBQVc7QUFDdEIsaUJBQU8saUJBQWlCLFNBQVMsTUFBTTtBQUFXLGtCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUN4RyxtQkFBUTtRQUNWLENBQUM7TUFDSDtNQUNBLE1BQU0sTUFBTSxPQUFPLFFBQVEsSUFBRTtBQUMzQixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFNBQVMsT0FBTyxNQUFNO0FBQ25ELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBRTtBQUM1QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFVBQVUsT0FBTyxNQUFNO0FBQ3BELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBRTtBQUM3QixTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLFdBQVcsT0FBTyxNQUFNO0FBQ3JELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFBSTtNQUMzQjtNQUNBLE1BQU0sV0FBVyxPQUFPLFFBQVEsSUFBRTtBQUNoQyxTQUFDLE9BQU8sUUFBUSxFQUFFLElBQUksU0FBUyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxjQUFNLFNBQVMsTUFBTSxRQUFRLGNBQWMsT0FBTyxNQUFNO0FBQ3hELGVBQU8sS0FBSyxHQUFHLE1BQU0sSUFB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QU0sRUFBRTtBQUNqQyxDQUFDOzs7QUR6RUQsSUFBQUMsa0JBQXdCOzs7Ozs7Ozs7OztBQUV4Qix3QkFBUSxNQUFNLFlBQVk7QUFFdEIsTUFBSTtBQUNBLFVBQU0sd0JBQVEsTUFBTSxrQ0FBa0M7QUFBQSxFQUMxRCxTQUFTLE9BQU87QUFDWixZQUFRLE1BQU0sMkVBQTJFLEtBQUs7QUFBQSxFQUVsRztBQUNKLENBQUM7QUFFRCxNQUFNLHlDQUF5QyxNQUFNO0FBQ3BELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxNQUFNO0FBQ2pELENBQUM7QUFFRCxNQUFNLDJDQUEyQyxNQUFNO0FBQ3RELHlCQUF1QixPQUFPLFNBQVMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxnQkFBZ0IsV0FBVyxPQUFPQyxZQUFtQjtBQUNwRCxFQUFBQSxVQUFTQSxZQUFXLElBQUlBLFVBQVMsU0FBUyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsUUFBTUMsVUFBUyxjQUFjLE9BQU87QUFDcEMsUUFBTSxpQkFBaUIsTUFBYSxtQ0FBYUEsUUFBTyxxQkFBcUIscUJBQXFCLFVBQVVBLFFBQU8sZ0JBQWdCO0FBQ25JLGlCQUFlLFFBQVFELE9BQU07QUFDOUIsR0FBRyxLQUFLOyIsCiAgIm5hbWVzIjogWyJleHBvcnRzIiwgImltcG9ydF9veG15c3FsIiwgImltcG9ydF9veG15c3FsIiwgInJlc3BvbnNlIiwgImltcG9ydF9veG15c3FsIiwgImRlbGF5IiwgIm1pZ3JhdGUiLCAicmVzcG9uc2UiLCAiaW1wb3J0X294bXlzcWwiLCAiZGVsYXkiLCAibWlncmF0ZSIsICJyZXNwb25zZSIsICJzb3VyY2UiLCAiaW1wb3J0X294bXlzcWwiLCAiaW1wb3J0X294bXlzcWwiLCAic291cmNlIiwgImNvbmZpZyJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0BvdmVyZXh0ZW5kZWQvb3hteXNxbC9NeVNRTC50cyIsICIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9zZXR0ZXJzLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9lc3gudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9taWdyYXRlL2ZpdmVtLnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvbWlncmF0ZS9pbGxlbml1bS50cyIsICIuLi8uLi9zcmMvc2VydmVyL21pZ3JhdGUvcWIudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9hcHBlYXJhbmNlL291dGZpdHMudHMiLCAiLi4vLi4vc3JjL3NlcnZlci9pbml0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwZWFyYW5jZS9nZXR0ZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ0eXBlIFF1ZXJ5ID0gc3RyaW5nIHwgbnVtYmVyO1xyXG50eXBlIFBhcmFtcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdIHwgRnVuY3Rpb247XHJcbnR5cGUgQ2FsbGJhY2s8VD4gPSAocmVzdWx0OiBUIHwgbnVsbCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgVHJhbnNhY3Rpb24gPVxyXG4gIHwgc3RyaW5nW11cclxuICB8IFtzdHJpbmcsIFBhcmFtc11bXVxyXG4gIHwgeyBxdWVyeTogc3RyaW5nOyB2YWx1ZXM6IFBhcmFtcyB9W11cclxuICB8IHsgcXVlcnk6IHN0cmluZzsgcGFyYW1ldGVyczogUGFyYW1zIH1bXTtcclxuXHJcbmludGVyZmFjZSBSZXN1bHQge1xyXG4gIFtjb2x1bW46IHN0cmluZyB8IG51bWJlcl06IGFueTtcclxuICBhZmZlY3RlZFJvd3M/OiBudW1iZXI7XHJcbiAgZmllbGRDb3VudD86IG51bWJlcjtcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGluc2VydElkPzogbnVtYmVyO1xyXG4gIHNlcnZlclN0YXR1cz86IG51bWJlcjtcclxuICB3YXJuaW5nU3RhdHVzPzogbnVtYmVyO1xyXG4gIGNoYW5nZWRSb3dzPzogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm93IHtcclxuICBbY29sdW1uOiBzdHJpbmcgfCBudW1iZXJdOiB1bmtub3duO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT3hNeVNRTCB7XHJcbiAgc3RvcmU6IChxdWVyeTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgcXVlcnk6IDxUID0gUmVzdWx0IHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBzaW5nbGU6IDxUID0gUm93IHwgbnVsbD4oXHJcbiAgICBxdWVyeTogUXVlcnksXHJcbiAgICBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxFeGNsdWRlPFQsIFtdPj4sXHJcbiAgICBjYj86IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PlxyXG4gICkgPT4gUHJvbWlzZTxFeGNsdWRlPFQsIFtdPj47XHJcbiAgc2NhbGFyOiA8VCA9IHVua25vd24gfCBudWxsPihcclxuICAgIHF1ZXJ5OiBRdWVyeSxcclxuICAgIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPEV4Y2x1ZGU8VCwgW10+PixcclxuICAgIGNiPzogQ2FsbGJhY2s8RXhjbHVkZTxULCBbXT4+XHJcbiAgKSA9PiBQcm9taXNlPEV4Y2x1ZGU8VCwgW10+PjtcclxuICB1cGRhdGU6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBpbnNlcnQ6IDxUID0gbnVtYmVyIHwgbnVsbD4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICBwcmVwYXJlOiA8VCA9IGFueT4ocXVlcnk6IFF1ZXJ5LCBwYXJhbXM/OiBQYXJhbXMgfCBDYWxsYmFjazxUPiwgY2I/OiBDYWxsYmFjazxUPikgPT4gUHJvbWlzZTxUPjtcclxuICByYXdFeGVjdXRlOiA8VCA9IFJlc3VsdCB8IG51bGw+KHF1ZXJ5OiBRdWVyeSwgcGFyYW1zPzogUGFyYW1zIHwgQ2FsbGJhY2s8VD4sIGNiPzogQ2FsbGJhY2s8VD4pID0+IFByb21pc2U8VD47XHJcbiAgdHJhbnNhY3Rpb246IChxdWVyeTogVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcyB8IENhbGxiYWNrPGJvb2xlYW4+LCBjYj86IENhbGxiYWNrPGJvb2xlYW4+KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIGlzUmVhZHk6ICgpID0+IGJvb2xlYW47XHJcbiAgYXdhaXRDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPHRydWU+O1xyXG59XHJcblxyXG5jb25zdCBRdWVyeVN0b3JlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XHJcbn1cclxuXHJcbmNvbnN0IHNhZmVBcmdzID0gKHF1ZXJ5OiBRdWVyeSB8IFRyYW5zYWN0aW9uLCBwYXJhbXM/OiBhbnksIGNiPzogRnVuY3Rpb24sIHRyYW5zYWN0aW9uPzogdHJ1ZSkgPT4ge1xyXG4gIGlmICh0eXBlb2YgcXVlcnkgPT09ICdudW1iZXInKSBxdWVyeSA9IFF1ZXJ5U3RvcmVbcXVlcnldO1xyXG5cclxuICBpZiAodHJhbnNhY3Rpb24pIHtcclxuICAgIGFzc2VydCh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnLCBgRmlyc3QgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0LCByZWNpZXZlZCAke3R5cGVvZiBxdWVyeX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXNzZXJ0KHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycsIGBGaXJzdCBhcmd1bWVudCBleHBlY3RlZCBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1UeXBlID0gdHlwZW9mIHBhcmFtcztcclxuICAgIGFzc2VydChcclxuICAgICAgcGFyYW1UeXBlID09PSAnb2JqZWN0JyB8fCBwYXJhbVR5cGUgPT09ICdmdW5jdGlvbicsXHJcbiAgICAgIGBTZWNvbmQgYXJndW1lbnQgZXhwZWN0ZWQgb2JqZWN0IG9yIGZ1bmN0aW9uLCByZWNlaXZlZCAke3BhcmFtVHlwZX1gXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY2IgJiYgcGFyYW1UeXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNiID0gcGFyYW1zO1xyXG4gICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2IgIT09IHVuZGVmaW5lZCkgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJywgYFRoaXJkIGFyZ3VtZW50IGV4cGVjdGVkIGZ1bmN0aW9uLCByZWNlaXZlZCAke3R5cGVvZiBjYn1gKTtcclxuXHJcbiAgcmV0dXJuIFtxdWVyeSwgcGFyYW1zLCBjYl07XHJcbn07XHJcblxyXG5jb25zdCBleHAgPSBnbG9iYWwuZXhwb3J0cy5veG15c3FsO1xyXG5jb25zdCBjdXJyZW50UmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpO1xyXG5cclxuZnVuY3Rpb24gZXhlY3V0ZShtZXRob2Q6IHN0cmluZywgcXVlcnk6IFF1ZXJ5IHwgVHJhbnNhY3Rpb24sIHBhcmFtcz86IFBhcmFtcykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleHBbbWV0aG9kXShcclxuICAgICAgcXVlcnksXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgKHJlc3VsdCwgZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSxcclxuICAgICAgY3VycmVudFJlc291cmNlTmFtZSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KSBhcyBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBveG15c3FsOiBPeE15U1FMID0ge1xyXG4gIHN0b3JlKHF1ZXJ5KSB7XHJcbiAgICBhc3NlcnQodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJywgYFF1ZXJ5IGV4cGVjdHMgYSBzdHJpbmcsIHJlY2VpdmVkICR7dHlwZW9mIHF1ZXJ5fWApO1xyXG5cclxuICAgIHJldHVybiBRdWVyeVN0b3JlLnB1c2gocXVlcnkpO1xyXG4gIH0sXHJcbiAgcmVhZHkoY2FsbGJhY2spIHtcclxuICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgIHdoaWxlIChHZXRSZXNvdXJjZVN0YXRlKCdveG15c3FsJykgIT09ICdzdGFydGVkJykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgYXN5bmMgcXVlcnkocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdxdWVyeScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNpbmdsZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NpbmdsZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHNjYWxhcihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3NjYWxhcicsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHVwZGF0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3VwZGF0ZScsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIGluc2VydChxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ2luc2VydCcsIHF1ZXJ5LCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNiID8gY2IocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9LFxyXG4gIGFzeW5jIHByZXBhcmUocXVlcnksIHBhcmFtcywgY2IpIHtcclxuICAgIFtxdWVyeSwgcGFyYW1zLCBjYl0gPSBzYWZlQXJncyhxdWVyeSwgcGFyYW1zLCBjYik7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCdwcmVwYXJlJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgYXN5bmMgcmF3RXhlY3V0ZShxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3Jhd0V4ZWN1dGUnLCBxdWVyeSwgcGFyYW1zKTtcclxuICAgIHJldHVybiBjYiA/IGNiKHJlc3VsdCkgOiByZXN1bHQ7XHJcbiAgfSxcclxuICBhc3luYyB0cmFuc2FjdGlvbihxdWVyeSwgcGFyYW1zLCBjYikge1xyXG4gICAgW3F1ZXJ5LCBwYXJhbXMsIGNiXSA9IHNhZmVBcmdzKHF1ZXJ5LCBwYXJhbXMsIGNiLCB0cnVlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoJ3RyYW5zYWN0aW9uJywgcXVlcnksIHBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2IgPyBjYihyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH0sXHJcbiAgaXNSZWFkeSgpIHtcclxuICAgIHJldHVybiBleHAuaXNSZWFkeSgpO1xyXG4gIH0sXHJcbiAgYXN5bmMgYXdhaXRDb25uZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGV4cC5hd2FpdENvbm5lY3Rpb24oKTtcclxuICB9LFxyXG59O1xyXG4iLCAiLy9odHRwczovL2dpdGh1Yi5jb20vb3ZlcmV4dGVuZGVkL294X2xpYi9ibG9iL21hc3Rlci9wYWNrYWdlL3NlcnZlci9yZXNvdXJjZS9jYWxsYmFjay9pbmRleC50c1xyXG5cclxuY29uc3QgcmVzb3VyY2VOYW1lID0gR2V0Q3VycmVudFJlc291cmNlTmFtZSgpXHJcblxyXG5jb25zdCBhY3RpdmVFdmVudHMgPSB7fTtcclxub25OZXQoYF9ibF9jYl8ke3Jlc291cmNlTmFtZX1gLCAoa2V5LCAuLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zdCByZXNvbHZlID0gYWN0aXZlRXZlbnRzW2tleV07XHJcbiAgICByZXR1cm4gcmVzb2x2ZSAmJiByZXNvbHZlKC4uLmFyZ3MpO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQ2xpZW50Q2FsbGJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHBsYXllcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQga2V5OiBzdHJpbmc7XHJcbiAgICBkbyB7XHJcbiAgICAgICAga2V5ID0gYCR7ZXZlbnROYW1lfToke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgxMDAwMDAgKyAxKSl9OiR7cGxheWVySWR9YDtcclxuICAgIH0gd2hpbGUgKGFjdGl2ZUV2ZW50c1trZXldKTtcclxuICAgIGVtaXROZXQoYF9ibF9jYl8ke2V2ZW50TmFtZX1gLCBwbGF5ZXJJZCwgcmVzb3VyY2VOYW1lLCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgYWN0aXZlRXZlbnRzW2tleV0gPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkNsaWVudENhbGxiYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBjYjogKHBsYXllcklkOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcclxuICAgIG9uTmV0KGBfYmxfY2JfJHtldmVudE5hbWV9YCwgYXN5bmMgKHJlc291cmNlOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IHNvdXJjZTtcclxuICAgICAgICBsZXQgcmVzcG9uc2U6IGFueTtcclxuICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNiKHNyYywgLi4uYXJncyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyBjYWxsYmFjayBldmVudCAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBeMyR7ZS5zdGFja31eMGApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGVtaXROZXQoYF9ibF9jYl8ke3Jlc291cmNlfWAsIHNyYywga2V5LCByZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBibF9icmlkZ2UgPSBleHBvcnRzLmJsX2JyaWRnZVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcmUgPSBibF9icmlkZ2UuY29yZSgpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyRGF0YSA9IChzcmM6IG51bWJlcikgPT4ge1xyXG4gICAgcmV0dXJuIGNvcmUuR2V0UGxheWVyKHNyYylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZyYW1ld29ya0lEID0gKHNyYzogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBwbGF5ZXIuaWRcclxufVxyXG5cclxuXHJcbmNvbnN0IGJsX2NvbmZpZyA9IGV4cG9ydHMuYmxfYXBwZWFyYW5jZS5jb25maWcoKVxyXG5leHBvcnQgY29uc3QgY29uZmlnID0gYmxfY29uZmlnIiwgImltcG9ydCB7IFRBcHBlYXJhbmNlLCBUQ2xvdGhlcywgVFNraW4gfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2ssIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBveG15c3FsIH0gZnJvbSAnQG92ZXJleHRlbmRlZC9veG15c3FsJztcclxuaW1wb3J0IHsgVFRhdHRvbyB9IGZyb20gJ0B0eXBpbmdzL3RhdHRvb3MnO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTa2luKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBza2luOiBUU2tpbikge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIGFwcGVhcmFuY2UgU0VUIHNraW4gPSA/IFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHNraW4pLCBmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVTa2luJywgc2F2ZVNraW4pO1xyXG5leHBvcnRzKCdTYXZlUGxheWVyU2tpbicsIGZ1bmN0aW9uKGlkLCBza2luKSB7XHJcbiAgICByZXR1cm4gc2F2ZVNraW4obnVsbCwgaWQsIHNraW4pXHJcbn0pO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDbG90aGVzKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nLCBjbG90aGVzOiBUQ2xvdGhlcykge1xyXG4gICAgaWYgKCFmcmFtZXdvcmtJZCkge1xyXG4gICAgICAgIGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBhcHBlYXJhbmNlIFNFVCBjbG90aGVzID0gPyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtKU09OLnN0cmluZ2lmeShjbG90aGVzKSwgZnJhbWV3b3JrSWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlQ2xvdGhlcycsIHNhdmVDbG90aGVzKTtcclxuZXhwb3J0cygnU2F2ZVBsYXllckNsb3RoZXMnLCBmdW5jdGlvbihpZCwgY2xvdGhlcykge1xyXG4gICAgcmV0dXJuIHNhdmVDbG90aGVzKG51bGwsIGlkLCBjbG90aGVzKVxyXG59KTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVGF0dG9vcyhzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZywgdGF0dG9vczogVFRhdHRvb1tdKSB7XHJcbiAgICBpZiAoIWZyYW1ld29ya0lkKSB7XHJcbiAgICAgICAgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnVVBEQVRFIGFwcGVhcmFuY2UgU0VUIHRhdHRvb3MgPSA/IFdIRVJFIGlkID0gPycsXHJcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHRhdHRvb3MpLCBmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVUYXR0b29zJywgc2F2ZVRhdHRvb3MpO1xyXG5leHBvcnRzKCdTYXZlUGxheWVyVGF0dG9vcycsIGZ1bmN0aW9uKGlkLCB0YXR0b29zKSB7XHJcbiAgICByZXR1cm4gc2F2ZVRhdHRvb3MobnVsbCwgaWQsIHRhdHRvb3MpXHJcbn0pO1xyXG5cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlQXBwZWFyYW5jZShzcmM6IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZywgYXBwZWFyYW5jZTogVEFwcGVhcmFuY2UpIHtcclxuICAgIGlmIChzcmMgJiYgZnJhbWV3b3JrSWQpIHtcclxuICAgICAgICBjb25zdCBwbGF5ZXJJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGZyYW1ld29ya0lkICE9PSBwbGF5ZXJJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1lvdSBhcmUgdHJ5aW5nIHRvIHNhdmUgYW4gYXBwZWFyYW5jZSBmb3IgYSBkaWZmZXJlbnQgcGxheWVyJywgc3JjLCBmcmFtZXdvcmtJZCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdGlmICghZnJhbWV3b3JrSWQpIHtcclxuXHRcdGZyYW1ld29ya0lkID0gZ2V0RnJhbWV3b3JrSUQoc3JjKTtcclxuXHR9XHJcblxyXG5cdGNvbnN0IGNsb3RoZXMgPSB7XHJcblx0XHRkcmF3YWJsZXM6IGFwcGVhcmFuY2UuZHJhd2FibGVzLFxyXG5cdFx0cHJvcHM6IGFwcGVhcmFuY2UucHJvcHMsXHJcblx0XHRoZWFkT3ZlcmxheTogYXBwZWFyYW5jZS5oZWFkT3ZlcmxheSxcclxuXHR9O1xyXG5cclxuXHRjb25zdCBza2luID0ge1xyXG5cdFx0aGVhZEJsZW5kOiBhcHBlYXJhbmNlLmhlYWRCbGVuZCxcclxuXHRcdGhlYWRTdHJ1Y3R1cmU6IGFwcGVhcmFuY2UuaGVhZFN0cnVjdHVyZSxcclxuXHRcdGhhaXJDb2xvcjogYXBwZWFyYW5jZS5oYWlyQ29sb3IsXHJcblx0XHRtb2RlbDogYXBwZWFyYW5jZS5tb2RlbCxcclxuXHR9O1xyXG5cclxuXHRjb25zdCB0YXR0b29zID0gYXBwZWFyYW5jZS50YXR0b29zIHx8IFtdO1xyXG5cclxuXHRjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcblx0XHQnSU5TRVJUIElOVE8gYXBwZWFyYW5jZSAoaWQsIGNsb3RoZXMsIHNraW4sIHRhdHRvb3MpIFZBTFVFUyAoPywgPywgPywgPykgT04gRFVQTElDQVRFIEtFWSBVUERBVEUgY2xvdGhlcyA9IFZBTFVFUyhjbG90aGVzKSwgc2tpbiA9IFZBTFVFUyhza2luKSwgdGF0dG9vcyA9IFZBTFVFUyh0YXR0b29zKTsnLFxyXG5cdFx0W1xyXG5cdFx0XHRmcmFtZXdvcmtJZCxcclxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoY2xvdGhlcyksXHJcblx0XHRcdEpTT04uc3RyaW5naWZ5KHNraW4pLFxyXG5cdFx0XHRKU09OLnN0cmluZ2lmeSh0YXR0b29zKSxcclxuXHRcdF1cclxuXHQpO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnNhdmVBcHBlYXJhbmNlJywgc2F2ZUFwcGVhcmFuY2UpO1xyXG5leHBvcnRzKCdTYXZlUGxheWVyQXBwZWFyYW5jZScsIGZ1bmN0aW9uKGlkLCBhcHBlYXJhbmNlKSB7XHJcbiAgICByZXR1cm4gc2F2ZUFwcGVhcmFuY2UobnVsbCwgaWQsIGFwcGVhcmFuY2UpXHJcbn0pO1xyXG4iLCAiIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tICdAb3ZlcmV4dGVuZGVkL294bXlzcWwnO1xuaW1wb3J0IHsgdHJpZ2dlckNsaWVudENhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHNhdmVBcHBlYXJhbmNlIH0gZnJvbSAnLi4vYXBwZWFyYW5jZS9zZXR0ZXJzJztcblxuY29uc3QgZGVsYXkgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBtcykpO1xuXG5jb25zdCBtaWdyYXRlID0gYXN5bmMgKHNyYzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IG94bXlzcWwucXVlcnkoJ1NFTEVDVCAqIEZST00gYHBsYXllcnNgJyk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlbGVtZW50LnNraW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHRyaWdnZXJDbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCBzcmMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZml2ZW0nLFxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04ucGFyc2UoZWxlbWVudC5za2luKVxuICAgICAgICAgICAgfSkgYXMgVEFwcGVhcmFuY2VcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyaWdnZXJDbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsIHNyYykgYXMgVEFwcGVhcmFuY2VcbiAgICAgICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgICAgIGF3YWl0IHNhdmVBcHBlYXJhbmNlKHBsYXllclNyYywgZWxlbWVudC5jaXRpemVuaWQsIHJlc3BvbnNlIGFzIFRBcHBlYXJhbmNlKVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tICdAb3ZlcmV4dGVuZGVkL294bXlzcWwnO1xuaW1wb3J0IHsgdHJpZ2dlckNsaWVudENhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHNhdmVBcHBlYXJhbmNlIH0gZnJvbSAnLi4vYXBwZWFyYW5jZS9zZXR0ZXJzJztcblxuY29uc3QgZGVsYXkgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBtcykpO1xuXG5jb25zdCBtaWdyYXRlID0gYXN5bmMgKHNyYzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IG94bXlzcWwucXVlcnkoJ1NFTEVDVCAqIEZST00gYHBsYXllcnNraW5zYCBXSEVSRSBhY3RpdmUgPSAxJyk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlbGVtZW50LnNraW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHRyaWdnZXJDbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6bWlncmF0aW9uOnNldEFwcGVhcmFuY2UnLCBzcmMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaWxsZW5pdW0nLFxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04ucGFyc2UoZWxlbWVudC5za2luKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyaWdnZXJDbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpjbGllbnQ6Z2V0QXBwZWFyYW5jZScsIHNyYykgYXMgVEFwcGVhcmFuY2VcbiAgICAgICAgICAgIGNvbnN0IHBsYXllclNyYyA9IHBhcnNlSW50KHNyYylcbiAgICAgICAgICAgIGF3YWl0IHNhdmVBcHBlYXJhbmNlKHBsYXllclNyYywgZWxlbWVudC5jaXRpemVuaWQsIHJlc3BvbnNlIGFzIFRBcHBlYXJhbmNlKVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDb252ZXJ0ZWQgJysgcmVzcG9uc2UubGVuZ3RoICsgJyBhcHBlYXJhbmNlcycpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlIiwgImltcG9ydCB7IG94bXlzcWwgfSBmcm9tICdAb3ZlcmV4dGVuZGVkL294bXlzcWwnO1xuaW1wb3J0IHsgdHJpZ2dlckNsaWVudENhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVEFwcGVhcmFuY2UgfSBmcm9tICdAdHlwaW5ncy9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHNhdmVBcHBlYXJhbmNlIH0gZnJvbSAnLi4vYXBwZWFyYW5jZS9zZXR0ZXJzJztcblxuY29uc3QgZGVsYXkgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBtcykpO1xuXG5jb25zdCBtaWdyYXRlID0gYXN5bmMgKHNyYzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IG94bXlzcWwucXVlcnkoJ1NFTEVDVCAqIEZST00gYHBsYXllcnNraW5zYCBXSEVSRSBhY3RpdmUgPSAxJyk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3BvbnNlKSB7XG4gICAgICAgIGVtaXROZXQoJ3FiLWNsb3RoZXM6bG9hZFNraW4nLCBzcmMsIDAsIGVsZW1lbnQubW9kZWwsIGVsZW1lbnQuc2tpbik7XG4gICAgICAgIGF3YWl0IGRlbGF5KDIwMCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJpZ2dlckNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOmNsaWVudDpnZXRBcHBlYXJhbmNlJywgc3JjKSBhcyBUQXBwZWFyYW5jZVxuICAgICAgICBjb25zdCBwbGF5ZXJTcmMgPSBwYXJzZUludChzcmMpXG4gICAgICAgIGF3YWl0IHNhdmVBcHBlYXJhbmNlKHBsYXllclNyYywgZWxlbWVudC5jaXRpemVuaWQsIHJlc3BvbnNlIGFzIFRBcHBlYXJhbmNlKVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ29udmVydGVkICcrIHJlc3BvbnNlLmxlbmd0aCArICcgYXBwZWFyYW5jZXMnKVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbWlncmF0ZSIsICJpbXBvcnQgeyBveG15c3FsIH0gZnJvbSBcIkBvdmVyZXh0ZW5kZWQvb3hteXNxbFwiO1xyXG5pbXBvcnQgeyBjb25maWcsIGNvcmUsIGdldEZyYW1ld29ya0lELCBnZXRQbGF5ZXJEYXRhLCBvbkNsaWVudENhbGxiYWNrIH0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcbmltcG9ydCB7IE91dGZpdCB9IGZyb20gXCJAdHlwaW5ncy9vdXRmaXRzXCI7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBnZXRPdXRmaXRzKHNyYzogbnVtYmVyLCBmcmFtZXdvcmtJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBqb2IgPSBjb3JlLkdldFBsYXllcihzcmMpLmpvYiB8fCB7IG5hbWU6ICd1bmtub3duJywgZ3JhZGU6IHsgbmFtZTogJ3Vua25vd24nIH0gfVxyXG5cdGxldCByZXNwb25zZSA9IGF3YWl0IG94bXlzcWwucHJlcGFyZShcclxuXHRcdCdTRUxFQ1QgKiBGUk9NIG91dGZpdHMgV0hFUkUgcGxheWVyX2lkID0gPyBPUiAoam9ibmFtZSA9ID8gQU5EIGpvYnJhbmsgPD0gPyknLFxyXG5cdFx0W2ZyYW1ld29ya0lkLCBqb2IubmFtZSwgam9iLmdyYWRlLm5hbWVdXHJcblx0KTtcclxuXHRpZiAoIXJlc3BvbnNlKSByZXR1cm4gW107XHJcblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xyXG4gICAgICAgIHJlc3BvbnNlID0gW3Jlc3BvbnNlXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvdXRmaXRzID0gcmVzcG9uc2UubWFwKFxyXG4gICAgICAgIChvdXRmaXQ6IHsgaWQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZzsgb3V0Zml0OiBzdHJpbmc7IGpvYm5hbWU/OiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaWQ6IG91dGZpdC5pZCxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBvdXRmaXQubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBvdXRmaXQ6IEpTT04ucGFyc2Uob3V0Zml0Lm91dGZpdCksXHJcbiAgICAgICAgICAgICAgICBqb2JuYW1lOiBvdXRmaXQuam9ibmFtZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBvdXRmaXRzO1xyXG59XHJcbm9uQ2xpZW50Q2FsbGJhY2soJ2JsX2FwcGVhcmFuY2U6c2VydmVyOmdldE91dGZpdHMnLCBnZXRPdXRmaXRzKTtcclxuZXhwb3J0cygnR2V0T3V0Zml0cycsIGdldE91dGZpdHMpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVuYW1lT3V0Zml0KHNyYzogbnVtYmVyLCBkYXRhOiB7IGlkOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfSkge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3hteXNxbC51cGRhdGUoXHJcbiAgICAgICAgJ1VQREFURSBvdXRmaXRzIFNFVCBsYWJlbCA9ID8gV0hFUkUgcGxheWVyX2lkID0gPyBBTkQgaWQgPSA/JyxcclxuICAgICAgICBbZGF0YS5sYWJlbCwgZnJhbWV3b3JrSWQsIGRhdGEuaWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpyZW5hbWVPdXRmaXQnLCByZW5hbWVPdXRmaXQpO1xyXG5leHBvcnRzKCdSZW5hbWVPdXRmaXQnLCByZW5hbWVPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlT3V0Zml0KHNyYzogbnVtYmVyLCBpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnVwZGF0ZShcclxuICAgICAgICAnREVMRVRFIEZST00gb3V0Zml0cyBXSEVSRSBwbGF5ZXJfaWQgPSA/IEFORCBpZCA9ID8nLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZCwgaWRdXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJlc3VsdCA+IDA7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZGVsZXRlT3V0Zml0JywgZGVsZXRlT3V0Zml0KTtcclxuZXhwb3J0cygnRGVsZXRlT3V0Zml0JywgZGVsZXRlT3V0Zml0KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHNhdmVPdXRmaXQoc3JjOiBudW1iZXIsIGRhdGE6IE91dGZpdCkge1xyXG4gICAgY29uc3QgZnJhbWV3b3JrSWQgPSBnZXRGcmFtZXdvcmtJRChzcmMpO1xyXG4gICAgbGV0IGpvYm5hbWUgPSBudWxsO1xyXG4gICAgbGV0IGpvYnJhbmsgPSAwO1xyXG4gICAgaWYgKGRhdGEuam9iKSB7XHJcbiAgICAgICAgam9ibmFtZSA9IGRhdGEuam9iLm5hbWU7XHJcbiAgICAgICAgam9icmFuayA9IGRhdGEuam9iLnJhbms7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpZCA9IGF3YWl0IG94bXlzcWwuaW5zZXJ0KFxyXG4gICAgICAgICdJTlNFUlQgSU5UTyBvdXRmaXRzIChwbGF5ZXJfaWQsIGxhYmVsLCBvdXRmaXQsIGpvYm5hbWUsIGpvYnJhbmspIFZBTFVFUyAoPywgPywgPywgPywgPyknLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZCwgZGF0YS5sYWJlbCwgSlNPTi5zdHJpbmdpZnkoZGF0YS5vdXRmaXQpLCBqb2JuYW1lLCBqb2JyYW5rXVxyXG4gICAgKTtcclxuICAgIHJldHVybiBpZDtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjpzYXZlT3V0Zml0Jywgc2F2ZU91dGZpdCk7XHJcbmV4cG9ydHMoJ1NhdmVPdXRmaXQnLCBzYXZlT3V0Zml0KTtcclxuXHJcblxyXG5hc3luYyBmdW5jdGlvbiBmZXRjaE91dGZpdChfOiBudW1iZXIsIGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb3hteXNxbC5wcmVwYXJlKFxyXG4gICAgICAgICdTRUxFQ1Qgb3V0Zml0IEZST00gb3V0Zml0cyBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtpZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6ZmV0Y2hPdXRmaXQnLCBmZXRjaE91dGZpdCk7XHJcbmV4cG9ydHMoJ0ZldGNoT3V0Zml0JywgZmV0Y2hPdXRmaXQpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gaW1wb3J0T3V0Zml0KF86IG51bWJlciwgZnJhbWV3b3JrSWQ6IHN0cmluZywgb3V0Zml0SWQ6IG51bWJlciwgb3V0Zml0TmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBveG15c3FsLnF1ZXJ5KFxyXG4gICAgICAgICdTRUxFQ1QgbGFiZWwsIG91dGZpdCBGUk9NIG91dGZpdHMgV0hFUkUgaWQgPSA/JyxcclxuICAgICAgICBbb3V0Zml0SWRdXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghcmVzdWx0IHx8IHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdPdXRmaXQgbm90IGZvdW5kJyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0lkID0gYXdhaXQgb3hteXNxbC5pbnNlcnQoXHJcbiAgICAgICAgJ0lOU0VSVCBJTlRPIG91dGZpdHMgKHBsYXllcl9pZCwgbGFiZWwsIG91dGZpdCkgVkFMVUVTICg/LCA/LCA/KScsXHJcbiAgICAgICAgW2ZyYW1ld29ya0lkLCBvdXRmaXROYW1lLCByZXN1bHQub3V0Zml0XVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBuZXdJZDogbmV3SWQgfTtcclxufVxyXG5vbkNsaWVudENhbGxiYWNrKCdibF9hcHBlYXJhbmNlOnNlcnZlcjppbXBvcnRPdXRmaXQnLCBpbXBvcnRPdXRmaXQpO1xyXG5leHBvcnRzKCdJbXBvcnRPdXRmaXQnLCBpbXBvcnRPdXRmaXQpO1xyXG5cclxuY29uc3Qgb3V0Zml0SXRlbSA9IGNvbmZpZy5vdXRmaXRJdGVtXHJcblxyXG5pZiAoIW91dGZpdEl0ZW0pIHtcclxuICAgIGNvbnNvbGUud2FybignYmxfYXBwZWFyYW5jZTogTm8gb3V0Zml0IGl0ZW0gY29uZmlndXJlZCwgcGxlYXNlIHNldCBpdCBpbiBjb25maWcubHVhJylcclxufVxyXG5cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6aXRlbU91dGZpdCcsIGFzeW5jIChzcmMsIGRhdGEpID0+IHtcclxuXHRjb25zdCBwbGF5ZXIgPSBjb3JlLkdldFBsYXllcihzcmMpXHJcblx0cGxheWVyLmFkZEl0ZW0ob3V0Zml0SXRlbSwgMSwgZGF0YSlcclxufSk7XHJcblxyXG5jb3JlLlJlZ2lzdGVyVXNhYmxlSXRlbShvdXRmaXRJdGVtLCBhc3luYyAoc291cmNlOiBudW1iZXIsIHNsb3Q6IG51bWJlciwgbWV0YWRhdGE6IHtvdXRmaXQ6IE91dGZpdCwgbGFiZWw6IHN0cmluZ30pID0+IHtcclxuXHRjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXJEYXRhKHNvdXJjZSlcclxuXHRpZiAocGxheWVyPy5yZW1vdmVJdGVtKG91dGZpdEl0ZW0sIDEsIHNsb3QpKSBcclxuXHRcdGVtaXROZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnVzZU91dGZpdEl0ZW0nLCBzb3VyY2UsIG1ldGFkYXRhLm91dGZpdClcclxufSkiLCAiaW1wb3J0ICcuL2FwcGVhcmFuY2Uvb3V0Zml0cyc7XHJcbmltcG9ydCAnLi9hcHBlYXJhbmNlL3NldHRlcnMnO1xyXG5pbXBvcnQgJy4vYXBwZWFyYW5jZS9nZXR0ZXJzJztcclxuaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gJ0BvdmVyZXh0ZW5kZWQvb3hteXNxbCc7XHJcblxyXG5veG15c3FsLnJlYWR5KGFzeW5jICgpID0+IHtcclxuICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhIHRhYmxlIGNhbGxlZCBhcHBlYXJhbmNlXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IG94bXlzcWwucXVlcnkoJ1NFTEVDVCAxIEZST00gYXBwZWFyYW5jZSBMSU1JVCAxJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNoZWNraW5nIGFwcGVhcmFuY2UgdGFibGUuIE1vc3QgbGlrZWx5IHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdDogJywgZXJyb3IpO1xyXG4gICAgICAgIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgZXJyb3IgaGFuZGxpbmcgb3IgcmVjb3ZlcnkgbG9naWMgaGVyZSBpZiBuZWVkZWRcclxuICAgIH1cclxufSk7XHJcblxyXG5vbk5ldCgnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6c2V0cm91dGluZ2J1Y2tldCcsICgpID0+IHtcclxuXHRTZXRQbGF5ZXJSb3V0aW5nQnVja2V0KHNvdXJjZS50b1N0cmluZygpLCBzb3VyY2UpXHJcbn0pO1xyXG5cclxub25OZXQoJ2JsX2FwcGVhcmFuY2U6c2VydmVyOnJlc2V0cm91dGluZ2J1Y2tldCcsICgpID0+IHtcclxuXHRTZXRQbGF5ZXJSb3V0aW5nQnVja2V0KHNvdXJjZS50b1N0cmluZygpLCAwKVxyXG59KTtcclxuXHJcblJlZ2lzdGVyQ29tbWFuZCgnbWlncmF0ZScsIGFzeW5jIChzb3VyY2U6IG51bWJlcikgPT4ge1xyXG5cdHNvdXJjZSA9IHNvdXJjZSAhPT0gMCA/IHNvdXJjZSA6IHBhcnNlSW50KGdldFBsYXllcnMoKVswXSlcclxuXHRjb25zdCBibF9hcHBlYXJhbmNlID0gZXhwb3J0cy5ibF9hcHBlYXJhbmNlO1xyXG5cdGNvbnN0IGNvbmZpZyA9IGJsX2FwcGVhcmFuY2UuY29uZmlnKCk7XHJcblx0Y29uc3QgaW1wb3J0ZWRNb2R1bGUgPSBhd2FpdCBpbXBvcnQoYC4vbWlncmF0ZS8ke2NvbmZpZy5wcmV2aW91c0Nsb3RoaW5nID09PSAnZml2ZW0tYXBwZWFyYW5jZScgPyAnZml2ZW0nIDogY29uZmlnLnByZXZpb3VzQ2xvdGhpbmd9LnRzYClcclxuXHRpbXBvcnRlZE1vZHVsZS5kZWZhdWx0KHNvdXJjZSlcclxufSwgZmFsc2UpO1xyXG4iLCAiaW1wb3J0IHsgb3hteXNxbCB9IGZyb20gXCJAb3ZlcmV4dGVuZGVkL294bXlzcWxcIjtcclxuaW1wb3J0IHsgZ2V0RnJhbWV3b3JrSUQsIG9uQ2xpZW50Q2FsbGJhY2sgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgU2tpbkRCIH0gZnJvbSBcIkB0eXBpbmdzL2FwcGVhcmFuY2VcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFNraW4oc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZnJhbWV3b3JrSWQpIHtcclxuICAgICAgICBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBza2luIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0U2tpbicsIGdldFNraW4pO1xyXG5leHBvcnRzKCdHZXRQbGF5ZXJTa2luJywgZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBnZXRTa2luKG51bGwsIGlkKVxyXG59KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldENsb3RoZXMoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZnJhbWV3b3JrSWQpIHtcclxuICAgICAgICBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCBjbG90aGVzIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0Q2xvdGhlcycsIGdldENsb3RoZXMpO1xyXG5leHBvcnRzKCdHZXRQbGF5ZXJDbG90aGVzJywgZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBnZXRDbG90aGVzKG51bGwsIGlkKVxyXG59KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFRhdHRvb3Moc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZnJhbWV3b3JrSWQpIHtcclxuICAgICAgICBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBveG15c3FsLnByZXBhcmUoXHJcbiAgICAgICAgJ1NFTEVDVCB0YXR0b29zIEZST00gYXBwZWFyYW5jZSBXSEVSRSBpZCA9ID8nLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwb25zZSkgfHwgW107XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0VGF0dG9vcycsIGdldFRhdHRvb3MpO1xyXG5leHBvcnRzKCdHZXRQbGF5ZXJUYXR0b29zJywgZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBnZXRUYXR0b29zKG51bGwsIGlkKVxyXG59KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEFwcGVhcmFuY2Uoc3JjOiBudW1iZXIsIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZnJhbWV3b3JrSWQgJiYgIXNyYykgcmV0dXJuIG51bGw7XHJcbiAgICBcclxuICAgIGlmICghZnJhbWV3b3JrSWQpIHtcclxuICAgICAgICBmcmFtZXdvcmtJZCA9IGdldEZyYW1ld29ya0lEKHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2U6IFNraW5EQiA9IGF3YWl0IG94bXlzcWwuc2luZ2xlKFxyXG4gICAgICAgICdTRUxFQ1QgKiBGUk9NIGFwcGVhcmFuY2UgV0hFUkUgaWQgPSA/IExJTUlUIDEnLFxyXG4gICAgICAgIFtmcmFtZXdvcmtJZF1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgYXBwZWFyYW5jZSA9IHtcclxuICAgICAgICAuLi5KU09OLnBhcnNlKHJlc3BvbnNlLnNraW4pLFxyXG4gICAgICAgIC4uLkpTT04ucGFyc2UocmVzcG9uc2UuY2xvdGhlcyksXHJcbiAgICAgICAgdGF0dG9vczogSlNPTi5wYXJzZShyZXNwb25zZS50YXR0b29zKSxcclxuICAgIH1cclxuICAgIGFwcGVhcmFuY2UuaWQgPSByZXNwb25zZS5pZFxyXG4gICAgcmV0dXJuIGFwcGVhcmFuY2U7XHJcbn1cclxub25DbGllbnRDYWxsYmFjaygnYmxfYXBwZWFyYW5jZTpzZXJ2ZXI6Z2V0QXBwZWFyYW5jZScsIGdldEFwcGVhcmFuY2UpO1xyXG5leHBvcnRzKCdHZXRQbGF5ZXJBcHBlYXJhbmNlJywgZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBnZXRBcHBlYXJhbmNlKG51bGwsIGlkKVxyXG59KTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUcsTUFBTTtBQUNqRCxDQUFDO0FBRUQsTUFBTSwyQ0FBMkMsTUFBTTtBQUN0RCx5QkFBdUIsT0FBTyxTQUFTLEdBQUcsQ0FBQztBQUM1QyxDQUFDO0FBRUQsZ0JBQWdCLFdBQVcsT0FBT0MsWUFBbUI7QUFDcEQsRUFBQUEsVUFBU0EsWUFBVyxJQUFJQSxVQUFTLFNBQVMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN6RCxRQUFNLGdCQUFnQixRQUFRO0FBQzlCLFFBQU1DLFVBQVMsY0FBYyxPQUFPO0FBQ3BDLFFBQU0saUJBQWlCLE1BQWEsbUNBQWFBLFFBQU8scUJBQXFCLHFCQUFxQixVQUFVQSxRQUFPLGdCQUFnQjtBQUNuSSxpQkFBZSxRQUFRRCxPQUFNO0FBQzlCLEdBQUcsS0FBSzsiLAogICJuYW1lcyI6IFsiZXhwb3J0cyIsICJpbXBvcnRfb3hteXNxbCIsICJpbXBvcnRfb3hteXNxbCIsICJyZXNwb25zZSIsICJpbXBvcnRfb3hteXNxbCIsICJkZWxheSIsICJtaWdyYXRlIiwgInJlc3BvbnNlIiwgImltcG9ydF9veG15c3FsIiwgImRlbGF5IiwgIm1pZ3JhdGUiLCAicmVzcG9uc2UiLCAic291cmNlIiwgImltcG9ydF9veG15c3FsIiwgImltcG9ydF9veG15c3FsIiwgInNvdXJjZSIsICJjb25maWciXQp9Cg== diff --git a/dist/server/init.js.map b/dist/server/init.js.map index aa2e692..f983ec6 100644 --- a/dist/server/init.js.map +++ b/dist/server/init.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../node_modules/@overextended/oxmysql/MySQL.ts", "../../src/server/utils/index.ts", "../../src/server/appearance/setters.ts", "../../src/server/migrate/esx.ts", "../../src/server/migrate/fivem.ts", "../../src/server/migrate/illenium.ts", "../../src/server/migrate/qb.ts", "../../src/server/appearance/outfits.ts", "../../src/server/init.ts", "../../src/server/appearance/getters.ts"], - "sourcesContent": ["type Query = string | number;\r\ntype Params = Record | unknown[] | Function;\r\ntype Callback = (result: T | null) => void;\r\n\r\ntype Transaction =\r\n | string[]\r\n | [string, Params][]\r\n | { query: string; values: Params }[]\r\n | { query: string; parameters: Params }[];\r\n\r\ninterface Result {\r\n [column: string | number]: any;\r\n affectedRows?: number;\r\n fieldCount?: number;\r\n info?: string;\r\n insertId?: number;\r\n serverStatus?: number;\r\n warningStatus?: number;\r\n changedRows?: number;\r\n}\r\n\r\ninterface Row {\r\n [column: string | number]: unknown;\r\n}\r\n\r\ninterface OxMySQL {\r\n store: (query: string) => void;\r\n ready: (callback: () => void) => void;\r\n query: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n single: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n scalar: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n update: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n insert: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n prepare: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n rawExecute: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n transaction: (query: Transaction, params?: Params | Callback, cb?: Callback) => Promise;\r\n isReady: () => boolean;\r\n awaitConnection: () => Promise;\r\n}\r\n\r\nconst QueryStore: string[] = [];\r\n\r\nfunction assert(condition: boolean, message: string) {\r\n if (!condition) throw new TypeError(message);\r\n}\r\n\r\nconst safeArgs = (query: Query | Transaction, params?: any, cb?: Function, transaction?: true) => {\r\n if (typeof query === 'number') query = QueryStore[query];\r\n\r\n if (transaction) {\r\n assert(typeof query === 'object', `First argument expected object, recieved ${typeof query}`);\r\n } else {\r\n assert(typeof query === 'string', `First argument expected string, received ${typeof query}`);\r\n }\r\n\r\n if (params) {\r\n const paramType = typeof params;\r\n assert(\r\n paramType === 'object' || paramType === 'function',\r\n `Second argument expected object or function, received ${paramType}`\r\n );\r\n\r\n if (!cb && paramType === 'function') {\r\n cb = params;\r\n params = undefined;\r\n }\r\n }\r\n\r\n if (cb !== undefined) assert(typeof cb === 'function', `Third argument expected function, received ${typeof cb}`);\r\n\r\n return [query, params, cb];\r\n};\r\n\r\nconst exp = global.exports.oxmysql;\r\nconst currentResourceName = GetCurrentResourceName();\r\n\r\nfunction execute(method: string, query: Query | Transaction, params?: Params) {\r\n return new Promise((resolve, reject) => {\r\n exp[method](\r\n query,\r\n params,\r\n (result, error) => {\r\n if (error) return reject(error);\r\n resolve(result);\r\n },\r\n currentResourceName,\r\n true\r\n );\r\n }) as any;\r\n}\r\n\r\nexport const oxmysql: OxMySQL = {\r\n store(query) {\r\n assert(typeof query !== 'string', `Query expects a string, received ${typeof query}`);\r\n\r\n return QueryStore.push(query);\r\n },\r\n ready(callback) {\r\n setImmediate(async () => {\r\n while (GetResourceState('oxmysql') !== 'started') await new Promise((resolve) => setTimeout(resolve, 50));\r\n callback();\r\n });\r\n },\r\n async query(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('query', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async single(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('single', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async scalar(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('scalar', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async update(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('update', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async insert(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('insert', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async prepare(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('prepare', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async rawExecute(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('rawExecute', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async transaction(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb, true);\r\n const result = await execute('transaction', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n isReady() {\r\n return exp.isReady();\r\n },\r\n async awaitConnection() {\r\n return await exp.awaitConnection();\r\n },\r\n};\r\n", "//https://github.com/overextended/ox_lib/blob/master/package/server/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\n\r\nconst activeEvents = {};\r\nonNet(`_bl_cb_${resourceName}`, (key, ...args) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerClientCallback(eventName: string, playerId: string, ...args: any[]) {\r\n let key: string;\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args);\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n}\r\n\r\nexport function onClientCallback(eventName: string, cb: (playerId: number, ...args: any[]) => any) {\r\n onNet(`_bl_cb_${eventName}`, async (resource: string, key: string, ...args: any[]) => {\r\n const src = source;\r\n let response: any;\r\n \r\n try {\r\n response = await cb(src, ...args);\r\n } catch (e: any) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n \r\n emitNet(`_bl_cb_${resource}`, src, key, response);\r\n });\r\n}\r\n\r\nconst bl_bridge = exports.bl_bridge\r\n\r\nexport const core = bl_bridge.core()\r\n\r\nexport const getPlayerData = (src: number) => {\r\n return core.GetPlayer(src)\r\n}\r\n\r\nexport const getFrameworkID = (src: number) => {\r\n const player = core.GetPlayer(src)\r\n if (!player) return null\r\n return player.id\r\n}\r\n\r\n\r\nconst bl_config = exports.bl_appearance.config()\r\nexport const config = bl_config", "import { TAppearance, TClothes, TSkin } from '@typings/appearance';\r\nimport { getFrameworkID, onClientCallback, } from '../utils';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nexport async function saveSkin(src: number, skin: TSkin) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET skin = ? WHERE id = ?',\r\n [JSON.stringify(skin), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveSkin', saveSkin);\r\nexports('SaveSkin', saveSkin);\r\n\r\nexport async function saveClothes(src: number, clothes: TClothes) {\r\n const frameworkId = getFrameworkID(src);\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET clothes = ? WHERE id = ?',\r\n [JSON.stringify(clothes), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveClothes', saveClothes);\r\nexports('SaveClothes', saveClothes);\r\n\r\nexport async function saveTattoos(src: number, tattoos: TTattoo[]) {\r\n const frameworkId = getFrameworkID(src);\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET tattoos = ? WHERE id = ?',\r\n [JSON.stringify(tattoos), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveTattoos', saveTattoos);\r\nexports('SaveTattoos', saveTattoos);\r\n\r\n\r\nexport async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) {\r\n if (src && frameworkId) {\r\n const playerId = getFrameworkID(src);\r\n \r\n if (frameworkId !== playerId) {\r\n console.warn('You are trying to save an appearance for a different player', src, frameworkId);\r\n return;\r\n }\r\n }\r\n\r\n\tif (!frameworkId) {\r\n\t\tframeworkId = getFrameworkID(src);\r\n\t}\r\n\r\n\tconst clothes = {\r\n\t\tdrawables: appearance.drawables,\r\n\t\tprops: appearance.props,\r\n\t\theadOverlay: appearance.headOverlay,\r\n\t};\r\n\r\n\tconst skin = {\r\n\t\theadBlend: appearance.headBlend,\r\n\t\theadStructure: appearance.headStructure,\r\n\t\thairColor: appearance.hairColor,\r\n\t\tmodel: appearance.model,\r\n\t};\r\n\r\n\tconst tattoos = appearance.tattoos || [];\r\n\r\n\tconst result = await oxmysql.prepare(\r\n\t\t'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);',\r\n\t\t[\r\n\t\t\tframeworkId,\r\n\t\t\tJSON.stringify(clothes),\r\n\t\t\tJSON.stringify(skin),\r\n\t\t\tJSON.stringify(tattoos),\r\n\t\t]\r\n\t);\r\n\r\n\treturn result;\r\n}\r\nonClientCallback('bl_appearance:server:saveAppearance', saveAppearance);\r\nexports('SaveAppearance', function(id, appearance) {\r\n return saveAppearance(null, id, appearance)\r\n});\r\n", "", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `players`');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'fivem',\n data: JSON.parse(element.skin)\n }) as TAppearance\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'illenium',\n data: JSON.parse(element.skin)\n })\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin);\n await delay(200);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { config, core, getFrameworkID, getPlayerData, onClientCallback } from \"../utils\";\r\nimport { Outfit } from \"@typings/outfits\";\r\n\r\nasync function getOutfits(src: number, frameworkId: string) {\r\n const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } }\r\n\tlet response = await oxmysql.prepare(\r\n\t\t'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)',\r\n\t\t[frameworkId, job.name, job.grade.name]\r\n\t);\r\n\tif (!response) return [];\r\n\r\n if (!Array.isArray(response)) {\r\n response = [response];\r\n }\r\n\r\n const outfits = response.map(\r\n (outfit: { id: number; label: string; outfit: string; jobname?: string }) => {\r\n return {\r\n id: outfit.id,\r\n label: outfit.label,\r\n outfit: JSON.parse(outfit.outfit),\r\n jobname: outfit.jobname,\r\n };\r\n }\r\n );\r\n\r\n return outfits;\r\n}\r\nonClientCallback('bl_appearance:server:getOutfits', getOutfits);\r\nexports('GetOutfits', getOutfits);\r\n\r\nasync function renameOutfit(src: number, data: { id: number; label: string }) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?',\r\n [data.label, frameworkId, data.id]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:renameOutfit', renameOutfit);\r\nexports('RenameOutfit', renameOutfit);\r\n\r\nasync function deleteOutfit(src: number, id: number) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'DELETE FROM outfits WHERE player_id = ? AND id = ?',\r\n [frameworkId, id]\r\n );\r\n return result > 0;\r\n}\r\nonClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit);\r\nexports('DeleteOutfit', deleteOutfit);\r\n\r\nasync function saveOutfit(src: number, data: Outfit) {\r\n const frameworkId = getFrameworkID(src);\r\n let jobname = null;\r\n let jobrank = 0;\r\n if (data.job) {\r\n jobname = data.job.name;\r\n jobrank = data.job.rank;\r\n }\r\n const id = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)',\r\n [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank]\r\n );\r\n return id;\r\n}\r\nonClientCallback('bl_appearance:server:saveOutfit', saveOutfit);\r\nexports('SaveOutfit', saveOutfit);\r\n\r\n\r\nasync function fetchOutfit(_: number, id: number) {\r\n const response = await oxmysql.prepare(\r\n 'SELECT outfit FROM outfits WHERE id = ?',\r\n [id]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit);\r\nexports('FetchOutfit', fetchOutfit);\r\n\r\nasync function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) {\r\n const result = await oxmysql.query(\r\n 'SELECT label, outfit FROM outfits WHERE id = ?',\r\n [outfitId]\r\n );\r\n\r\n if (!result || typeof result !== 'object' || Object.keys(result).length === 0) {\r\n return { success: false, message: 'Outfit not found' };\r\n }\r\n\r\n const newId = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)',\r\n [frameworkId, outfitName, result.outfit]\r\n );\r\n\r\n return { success: true, newId: newId };\r\n}\r\nonClientCallback('bl_appearance:server:importOutfit', importOutfit);\r\nexports('ImportOutfit', importOutfit);\r\n\r\nconst outfitItem = config.outfitItem\r\n\r\nif (!outfitItem) {\r\n console.warn('bl_appearance: No outfit item configured, please set it in config.lua')\r\n}\r\n\r\nonClientCallback('bl_appearance:server:itemOutfit', async (src, data) => {\r\n\tconst player = core.GetPlayer(src)\r\n\tplayer.addItem(outfitItem, 1, data)\r\n});\r\n\r\ncore.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => {\r\n\tconst player = getPlayerData(source)\r\n\tif (player?.removeItem(outfitItem, 1, slot)) \r\n\t\temitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit)\r\n})", "import './appearance/outfits';\r\nimport './appearance/setters';\r\nimport './appearance/getters';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\n\r\noxmysql.ready(async () => {\r\n // see if there is a table called appearance\r\n try {\r\n await oxmysql.query('SELECT 1 FROM appearance LIMIT 1');\r\n } catch (error) {\r\n console.error('Error checking appearance table. Most likely the table does not exist: ', error);\r\n // You can add additional error handling or recovery logic here if needed\r\n }\r\n});\r\n\r\nonNet('bl_appearance:server:setroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), source)\r\n});\r\n\r\nonNet('bl_appearance:server:resetroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), 0)\r\n});\r\n\r\nRegisterCommand('migrate', async (source: number) => {\r\n\tsource = source !== 0 ? source : parseInt(getPlayers()[0])\r\n\tconst bl_appearance = exports.bl_appearance;\r\n\tconst config = bl_appearance.config();\r\n\tconst importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`)\r\n\timportedModule.default(source)\r\n}, false);\r\n", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { getFrameworkID, onClientCallback } from \"../utils\";\r\nimport { SkinDB } from \"@typings/appearance\";\r\n\r\nasync function getSkin(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT skin FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getSkin', getSkin);\r\nexports('GetSkin', function(id) {\r\n return getSkin(null, id)\r\n});\r\n\r\nasync function getClothes(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT clothes FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getClothes', getClothes);\r\nexports('GetClothes', function(id) {\r\n return getClothes(null, id)\r\n});\r\n\r\nasync function getTattoos(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT tattoos FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response) || [];\r\n}\r\nonClientCallback('bl_appearance:server:getTattoos', getTattoos);\r\nexports('GetTattoos', function(id) {\r\n return getTattoos(null, id)\r\n});\r\n\r\nasync function getAppearance(src: number, frameworkId: string) {\r\n if (!frameworkId && !src) return null;\r\n \r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response: SkinDB = await oxmysql.single(\r\n 'SELECT * FROM appearance WHERE id = ? LIMIT 1',\r\n [frameworkId]\r\n );\r\n\r\n if (!response) return null;\r\n let appearance = {\r\n ...JSON.parse(response.skin),\r\n ...JSON.parse(response.clothes),\r\n tattoos: JSON.parse(response.tattoos),\r\n }\r\n appearance.id = response.id\r\n return appearance;\r\n}\r\nonClientCallback('bl_appearance:server:getAppearance', getAppearance);\r\nexports('GetPlayerAppearance', function(id) {\r\n return getAppearance(null, id)\r\n});\r\n"], - "mappings": "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", + "sourcesContent": ["type Query = string | number;\r\ntype Params = Record | unknown[] | Function;\r\ntype Callback = (result: T | null) => void;\r\n\r\ntype Transaction =\r\n | string[]\r\n | [string, Params][]\r\n | { query: string; values: Params }[]\r\n | { query: string; parameters: Params }[];\r\n\r\ninterface Result {\r\n [column: string | number]: any;\r\n affectedRows?: number;\r\n fieldCount?: number;\r\n info?: string;\r\n insertId?: number;\r\n serverStatus?: number;\r\n warningStatus?: number;\r\n changedRows?: number;\r\n}\r\n\r\ninterface Row {\r\n [column: string | number]: unknown;\r\n}\r\n\r\ninterface OxMySQL {\r\n store: (query: string) => void;\r\n ready: (callback: () => void) => void;\r\n query: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n single: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n scalar: (\r\n query: Query,\r\n params?: Params | Callback>,\r\n cb?: Callback>\r\n ) => Promise>;\r\n update: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n insert: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n prepare: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n rawExecute: (query: Query, params?: Params | Callback, cb?: Callback) => Promise;\r\n transaction: (query: Transaction, params?: Params | Callback, cb?: Callback) => Promise;\r\n isReady: () => boolean;\r\n awaitConnection: () => Promise;\r\n}\r\n\r\nconst QueryStore: string[] = [];\r\n\r\nfunction assert(condition: boolean, message: string) {\r\n if (!condition) throw new TypeError(message);\r\n}\r\n\r\nconst safeArgs = (query: Query | Transaction, params?: any, cb?: Function, transaction?: true) => {\r\n if (typeof query === 'number') query = QueryStore[query];\r\n\r\n if (transaction) {\r\n assert(typeof query === 'object', `First argument expected object, recieved ${typeof query}`);\r\n } else {\r\n assert(typeof query === 'string', `First argument expected string, received ${typeof query}`);\r\n }\r\n\r\n if (params) {\r\n const paramType = typeof params;\r\n assert(\r\n paramType === 'object' || paramType === 'function',\r\n `Second argument expected object or function, received ${paramType}`\r\n );\r\n\r\n if (!cb && paramType === 'function') {\r\n cb = params;\r\n params = undefined;\r\n }\r\n }\r\n\r\n if (cb !== undefined) assert(typeof cb === 'function', `Third argument expected function, received ${typeof cb}`);\r\n\r\n return [query, params, cb];\r\n};\r\n\r\nconst exp = global.exports.oxmysql;\r\nconst currentResourceName = GetCurrentResourceName();\r\n\r\nfunction execute(method: string, query: Query | Transaction, params?: Params) {\r\n return new Promise((resolve, reject) => {\r\n exp[method](\r\n query,\r\n params,\r\n (result, error) => {\r\n if (error) return reject(error);\r\n resolve(result);\r\n },\r\n currentResourceName,\r\n true\r\n );\r\n }) as any;\r\n}\r\n\r\nexport const oxmysql: OxMySQL = {\r\n store(query) {\r\n assert(typeof query !== 'string', `Query expects a string, received ${typeof query}`);\r\n\r\n return QueryStore.push(query);\r\n },\r\n ready(callback) {\r\n setImmediate(async () => {\r\n while (GetResourceState('oxmysql') !== 'started') await new Promise((resolve) => setTimeout(resolve, 50));\r\n callback();\r\n });\r\n },\r\n async query(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('query', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async single(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('single', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async scalar(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('scalar', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async update(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('update', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async insert(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('insert', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async prepare(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('prepare', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async rawExecute(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb);\r\n const result = await execute('rawExecute', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n async transaction(query, params, cb) {\r\n [query, params, cb] = safeArgs(query, params, cb, true);\r\n const result = await execute('transaction', query, params);\r\n return cb ? cb(result) : result;\r\n },\r\n isReady() {\r\n return exp.isReady();\r\n },\r\n async awaitConnection() {\r\n return await exp.awaitConnection();\r\n },\r\n};\r\n", "//https://github.com/overextended/ox_lib/blob/master/package/server/resource/callback/index.ts\r\n\r\nconst resourceName = GetCurrentResourceName()\r\n\r\nconst activeEvents = {};\r\nonNet(`_bl_cb_${resourceName}`, (key, ...args) => {\r\n const resolve = activeEvents[key];\r\n return resolve && resolve(...args);\r\n});\r\n\r\nexport function triggerClientCallback(eventName: string, playerId: string, ...args: any[]) {\r\n let key: string;\r\n do {\r\n key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`;\r\n } while (activeEvents[key]);\r\n emitNet(`_bl_cb_${eventName}`, playerId, resourceName, key, ...args);\r\n return new Promise((resolve) => {\r\n activeEvents[key] = resolve;\r\n });\r\n}\r\n\r\nexport function onClientCallback(eventName: string, cb: (playerId: number, ...args: any[]) => any) {\r\n onNet(`_bl_cb_${eventName}`, async (resource: string, key: string, ...args: any[]) => {\r\n const src = source;\r\n let response: any;\r\n \r\n try {\r\n response = await cb(src, ...args);\r\n } catch (e: any) {\r\n console.error(`an error occurred while handling callback event ${eventName}`);\r\n console.log(`^3${e.stack}^0`);\r\n }\r\n \r\n emitNet(`_bl_cb_${resource}`, src, key, response);\r\n });\r\n}\r\n\r\nconst bl_bridge = exports.bl_bridge\r\n\r\nexport const core = bl_bridge.core()\r\n\r\nexport const getPlayerData = (src: number) => {\r\n return core.GetPlayer(src)\r\n}\r\n\r\nexport const getFrameworkID = (src: number) => {\r\n const player = core.GetPlayer(src)\r\n if (!player) return null\r\n return player.id\r\n}\r\n\r\n\r\nconst bl_config = exports.bl_appearance.config()\r\nexport const config = bl_config", "import { TAppearance, TClothes, TSkin } from '@typings/appearance';\r\nimport { getFrameworkID, onClientCallback, } from '../utils';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\nimport { TTattoo } from '@typings/tattoos';\r\n\r\nexport async function saveSkin(src: number, frameworkId: string, skin: TSkin) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET skin = ? WHERE id = ?',\r\n [JSON.stringify(skin), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveSkin', saveSkin);\r\nexports('SavePlayerSkin', function(id, skin) {\r\n return saveSkin(null, id, skin)\r\n});\r\n\r\nexport async function saveClothes(src: number, frameworkId: string, clothes: TClothes) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET clothes = ? WHERE id = ?',\r\n [JSON.stringify(clothes), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveClothes', saveClothes);\r\nexports('SavePlayerClothes', function(id, clothes) {\r\n return saveClothes(null, id, clothes)\r\n});\r\n\r\nexport async function saveTattoos(src: number, frameworkId: string, tattoos: TTattoo[]) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n \r\n const result = await oxmysql.update(\r\n 'UPDATE appearance SET tattoos = ? WHERE id = ?',\r\n [JSON.stringify(tattoos), frameworkId]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:saveTattoos', saveTattoos);\r\nexports('SavePlayerTattoos', function(id, tattoos) {\r\n return saveTattoos(null, id, tattoos)\r\n});\r\n\r\n\r\nexport async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) {\r\n if (src && frameworkId) {\r\n const playerId = getFrameworkID(src);\r\n \r\n if (frameworkId !== playerId) {\r\n console.warn('You are trying to save an appearance for a different player', src, frameworkId);\r\n return;\r\n }\r\n }\r\n\r\n\tif (!frameworkId) {\r\n\t\tframeworkId = getFrameworkID(src);\r\n\t}\r\n\r\n\tconst clothes = {\r\n\t\tdrawables: appearance.drawables,\r\n\t\tprops: appearance.props,\r\n\t\theadOverlay: appearance.headOverlay,\r\n\t};\r\n\r\n\tconst skin = {\r\n\t\theadBlend: appearance.headBlend,\r\n\t\theadStructure: appearance.headStructure,\r\n\t\thairColor: appearance.hairColor,\r\n\t\tmodel: appearance.model,\r\n\t};\r\n\r\n\tconst tattoos = appearance.tattoos || [];\r\n\r\n\tconst result = await oxmysql.prepare(\r\n\t\t'INSERT INTO appearance (id, clothes, skin, tattoos) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE clothes = VALUES(clothes), skin = VALUES(skin), tattoos = VALUES(tattoos);',\r\n\t\t[\r\n\t\t\tframeworkId,\r\n\t\t\tJSON.stringify(clothes),\r\n\t\t\tJSON.stringify(skin),\r\n\t\t\tJSON.stringify(tattoos),\r\n\t\t]\r\n\t);\r\n\r\n\treturn result;\r\n}\r\nonClientCallback('bl_appearance:server:saveAppearance', saveAppearance);\r\nexports('SavePlayerAppearance', function(id, appearance) {\r\n return saveAppearance(null, id, appearance)\r\n});\r\n", "", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `players`');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'fivem',\n data: JSON.parse(element.skin)\n }) as TAppearance\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n if (element.skin) {\n await triggerClientCallback('bl_appearance:client:migration:setAppearance', src, {\n type: 'illenium',\n data: JSON.parse(element.skin)\n })\n await delay(100);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from '@overextended/oxmysql';\nimport { triggerClientCallback } from '../utils';\nimport { TAppearance } from '@typings/appearance';\nimport { saveAppearance } from '../appearance/setters';\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nconst migrate = async (src: string) => {\n const response: any = await oxmysql.query('SELECT * FROM `playerskins` WHERE active = 1');\n if (!response) return;\n\n for (const element of response) {\n emitNet('qb-clothes:loadSkin', src, 0, element.model, element.skin);\n await delay(200);\n const response = await triggerClientCallback('bl_appearance:client:getAppearance', src) as TAppearance\n const playerSrc = parseInt(src)\n await saveAppearance(playerSrc, element.citizenid, response as TAppearance)\n }\n console.log('Converted '+ response.length + ' appearances')\n};\n\nexport default migrate", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { config, core, getFrameworkID, getPlayerData, onClientCallback } from \"../utils\";\r\nimport { Outfit } from \"@typings/outfits\";\r\n\r\nasync function getOutfits(src: number, frameworkId: string) {\r\n const job = core.GetPlayer(src).job || { name: 'unknown', grade: { name: 'unknown' } }\r\n\tlet response = await oxmysql.prepare(\r\n\t\t'SELECT * FROM outfits WHERE player_id = ? OR (jobname = ? AND jobrank <= ?)',\r\n\t\t[frameworkId, job.name, job.grade.name]\r\n\t);\r\n\tif (!response) return [];\r\n\r\n if (!Array.isArray(response)) {\r\n response = [response];\r\n }\r\n\r\n const outfits = response.map(\r\n (outfit: { id: number; label: string; outfit: string; jobname?: string }) => {\r\n return {\r\n id: outfit.id,\r\n label: outfit.label,\r\n outfit: JSON.parse(outfit.outfit),\r\n jobname: outfit.jobname,\r\n };\r\n }\r\n );\r\n\r\n return outfits;\r\n}\r\nonClientCallback('bl_appearance:server:getOutfits', getOutfits);\r\nexports('GetOutfits', getOutfits);\r\n\r\nasync function renameOutfit(src: number, data: { id: number; label: string }) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'UPDATE outfits SET label = ? WHERE player_id = ? AND id = ?',\r\n [data.label, frameworkId, data.id]\r\n );\r\n return result;\r\n}\r\nonClientCallback('bl_appearance:server:renameOutfit', renameOutfit);\r\nexports('RenameOutfit', renameOutfit);\r\n\r\nasync function deleteOutfit(src: number, id: number) {\r\n const frameworkId = getFrameworkID(src);\r\n const result = await oxmysql.update(\r\n 'DELETE FROM outfits WHERE player_id = ? AND id = ?',\r\n [frameworkId, id]\r\n );\r\n return result > 0;\r\n}\r\nonClientCallback('bl_appearance:server:deleteOutfit', deleteOutfit);\r\nexports('DeleteOutfit', deleteOutfit);\r\n\r\nasync function saveOutfit(src: number, data: Outfit) {\r\n const frameworkId = getFrameworkID(src);\r\n let jobname = null;\r\n let jobrank = 0;\r\n if (data.job) {\r\n jobname = data.job.name;\r\n jobrank = data.job.rank;\r\n }\r\n const id = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit, jobname, jobrank) VALUES (?, ?, ?, ?, ?)',\r\n [frameworkId, data.label, JSON.stringify(data.outfit), jobname, jobrank]\r\n );\r\n return id;\r\n}\r\nonClientCallback('bl_appearance:server:saveOutfit', saveOutfit);\r\nexports('SaveOutfit', saveOutfit);\r\n\r\n\r\nasync function fetchOutfit(_: number, id: number) {\r\n const response = await oxmysql.prepare(\r\n 'SELECT outfit FROM outfits WHERE id = ?',\r\n [id]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:fetchOutfit', fetchOutfit);\r\nexports('FetchOutfit', fetchOutfit);\r\n\r\nasync function importOutfit(_: number, frameworkId: string, outfitId: number, outfitName: string) {\r\n const result = await oxmysql.query(\r\n 'SELECT label, outfit FROM outfits WHERE id = ?',\r\n [outfitId]\r\n );\r\n\r\n if (!result || typeof result !== 'object' || Object.keys(result).length === 0) {\r\n return { success: false, message: 'Outfit not found' };\r\n }\r\n\r\n const newId = await oxmysql.insert(\r\n 'INSERT INTO outfits (player_id, label, outfit) VALUES (?, ?, ?)',\r\n [frameworkId, outfitName, result.outfit]\r\n );\r\n\r\n return { success: true, newId: newId };\r\n}\r\nonClientCallback('bl_appearance:server:importOutfit', importOutfit);\r\nexports('ImportOutfit', importOutfit);\r\n\r\nconst outfitItem = config.outfitItem\r\n\r\nif (!outfitItem) {\r\n console.warn('bl_appearance: No outfit item configured, please set it in config.lua')\r\n}\r\n\r\nonClientCallback('bl_appearance:server:itemOutfit', async (src, data) => {\r\n\tconst player = core.GetPlayer(src)\r\n\tplayer.addItem(outfitItem, 1, data)\r\n});\r\n\r\ncore.RegisterUsableItem(outfitItem, async (source: number, slot: number, metadata: {outfit: Outfit, label: string}) => {\r\n\tconst player = getPlayerData(source)\r\n\tif (player?.removeItem(outfitItem, 1, slot)) \r\n\t\temitNet('bl_appearance:server:useOutfitItem', source, metadata.outfit)\r\n})", "import './appearance/outfits';\r\nimport './appearance/setters';\r\nimport './appearance/getters';\r\nimport { oxmysql } from '@overextended/oxmysql';\r\n\r\noxmysql.ready(async () => {\r\n // see if there is a table called appearance\r\n try {\r\n await oxmysql.query('SELECT 1 FROM appearance LIMIT 1');\r\n } catch (error) {\r\n console.error('Error checking appearance table. Most likely the table does not exist: ', error);\r\n // You can add additional error handling or recovery logic here if needed\r\n }\r\n});\r\n\r\nonNet('bl_appearance:server:setroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), source)\r\n});\r\n\r\nonNet('bl_appearance:server:resetroutingbucket', () => {\r\n\tSetPlayerRoutingBucket(source.toString(), 0)\r\n});\r\n\r\nRegisterCommand('migrate', async (source: number) => {\r\n\tsource = source !== 0 ? source : parseInt(getPlayers()[0])\r\n\tconst bl_appearance = exports.bl_appearance;\r\n\tconst config = bl_appearance.config();\r\n\tconst importedModule = await import(`./migrate/${config.previousClothing === 'fivem-appearance' ? 'fivem' : config.previousClothing}.ts`)\r\n\timportedModule.default(source)\r\n}, false);\r\n", "import { oxmysql } from \"@overextended/oxmysql\";\r\nimport { getFrameworkID, onClientCallback } from \"../utils\";\r\nimport { SkinDB } from \"@typings/appearance\";\r\n\r\nasync function getSkin(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT skin FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getSkin', getSkin);\r\nexports('GetPlayerSkin', function(id) {\r\n return getSkin(null, id)\r\n});\r\n\r\nasync function getClothes(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT clothes FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response);\r\n}\r\nonClientCallback('bl_appearance:server:getClothes', getClothes);\r\nexports('GetPlayerClothes', function(id) {\r\n return getClothes(null, id)\r\n});\r\n\r\nasync function getTattoos(src: number, frameworkId: string) {\r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response = await oxmysql.prepare(\r\n 'SELECT tattoos FROM appearance WHERE id = ?',\r\n [frameworkId]\r\n );\r\n return JSON.parse(response) || [];\r\n}\r\nonClientCallback('bl_appearance:server:getTattoos', getTattoos);\r\nexports('GetPlayerTattoos', function(id) {\r\n return getTattoos(null, id)\r\n});\r\n\r\nasync function getAppearance(src: number, frameworkId: string) {\r\n if (!frameworkId && !src) return null;\r\n \r\n if (!frameworkId) {\r\n frameworkId = getFrameworkID(src);\r\n }\r\n\r\n const response: SkinDB = await oxmysql.single(\r\n 'SELECT * FROM appearance WHERE id = ? LIMIT 1',\r\n [frameworkId]\r\n );\r\n\r\n if (!response) return null;\r\n let appearance = {\r\n ...JSON.parse(response.skin),\r\n ...JSON.parse(response.clothes),\r\n tattoos: JSON.parse(response.tattoos),\r\n }\r\n appearance.id = response.id\r\n return appearance;\r\n}\r\nonClientCallback('bl_appearance:server:getAppearance', getAppearance);\r\nexports('GetPlayerAppearance', function(id) {\r\n return getAppearance(null, id)\r\n});\r\n"], + "mappings": "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", "names": ["exports", "import_oxmysql", "import_oxmysql", "response", "import_oxmysql", "delay", "migrate", "response", "import_oxmysql", "delay", "migrate", "response", "source", "import_oxmysql", "import_oxmysql", "source", "config"] } diff --git a/src/server/appearance/getters.ts b/src/server/appearance/getters.ts index b6d6675..d348d3c 100644 --- a/src/server/appearance/getters.ts +++ b/src/server/appearance/getters.ts @@ -14,7 +14,7 @@ async function getSkin(src: number, frameworkId: string) { return JSON.parse(response); } onClientCallback('bl_appearance:server:getSkin', getSkin); -exports('GetSkin', function(id) { +exports('GetPlayerSkin', function(id) { return getSkin(null, id) }); @@ -30,7 +30,7 @@ async function getClothes(src: number, frameworkId: string) { return JSON.parse(response); } onClientCallback('bl_appearance:server:getClothes', getClothes); -exports('GetClothes', function(id) { +exports('GetPlayerClothes', function(id) { return getClothes(null, id) }); @@ -46,7 +46,7 @@ async function getTattoos(src: number, frameworkId: string) { return JSON.parse(response) || []; } onClientCallback('bl_appearance:server:getTattoos', getTattoos); -exports('GetTattoos', function(id) { +exports('GetPlayerTattoos', function(id) { return getTattoos(null, id) }); diff --git a/src/server/appearance/setters.ts b/src/server/appearance/setters.ts index 8fde635..fd87c90 100644 --- a/src/server/appearance/setters.ts +++ b/src/server/appearance/setters.ts @@ -3,8 +3,10 @@ import { getFrameworkID, onClientCallback, } from '../utils'; import { oxmysql } from '@overextended/oxmysql'; import { TTattoo } from '@typings/tattoos'; -export async function saveSkin(src: number, skin: TSkin) { - const frameworkId = getFrameworkID(src); +export async function saveSkin(src: number, frameworkId: string, skin: TSkin) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } const result = await oxmysql.update( 'UPDATE appearance SET skin = ? WHERE id = ?', @@ -13,11 +15,15 @@ export async function saveSkin(src: number, skin: TSkin) { return result; } onClientCallback('bl_appearance:server:saveSkin', saveSkin); -exports('SaveSkin', saveSkin); - -export async function saveClothes(src: number, clothes: TClothes) { - const frameworkId = getFrameworkID(src); +exports('SavePlayerSkin', function(id, skin) { + return saveSkin(null, id, skin) +}); +export async function saveClothes(src: number, frameworkId: string, clothes: TClothes) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } + const result = await oxmysql.update( 'UPDATE appearance SET clothes = ? WHERE id = ?', [JSON.stringify(clothes), frameworkId] @@ -25,10 +31,14 @@ export async function saveClothes(src: number, clothes: TClothes) { return result; } onClientCallback('bl_appearance:server:saveClothes', saveClothes); -exports('SaveClothes', saveClothes); +exports('SavePlayerClothes', function(id, clothes) { + return saveClothes(null, id, clothes) +}); -export async function saveTattoos(src: number, tattoos: TTattoo[]) { - const frameworkId = getFrameworkID(src); +export async function saveTattoos(src: number, frameworkId: string, tattoos: TTattoo[]) { + if (!frameworkId) { + frameworkId = getFrameworkID(src); + } const result = await oxmysql.update( 'UPDATE appearance SET tattoos = ? WHERE id = ?', @@ -37,7 +47,9 @@ export async function saveTattoos(src: number, tattoos: TTattoo[]) { return result; } onClientCallback('bl_appearance:server:saveTattoos', saveTattoos); -exports('SaveTattoos', saveTattoos); +exports('SavePlayerTattoos', function(id, tattoos) { + return saveTattoos(null, id, tattoos) +}); export async function saveAppearance(src: number, frameworkId: string, appearance: TAppearance) { @@ -82,6 +94,6 @@ export async function saveAppearance(src: number, frameworkId: string, appearanc return result; } onClientCallback('bl_appearance:server:saveAppearance', saveAppearance); -exports('SaveAppearance', function(id, appearance) { +exports('SavePlayerAppearance', function(id, appearance) { return saveAppearance(null, id, appearance) }); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..a614a10 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,561 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.21.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@citizenfx/client@2.0.7827-1": + version "2.0.7827-1" + resolved "https://registry.yarnpkg.com/@citizenfx/client/-/client-2.0.7827-1.tgz#4b898a39256c5ed5e62c9bf4d37e1f808c06ae8a" + integrity sha512-PlFwBf/p+Pw9pENudYs3EPjoHsIAgRL/uOuUiYs09tMSSd+cCQz7tOuEblwWCMdANzjvT+2a3SULJPaFsSNTFg== + +"@citizenfx/server@2.0.7827-1": + version "2.0.7827-1" + resolved "https://registry.yarnpkg.com/@citizenfx/server/-/server-2.0.7827-1.tgz#1d585a1e328cff23416de087e589d2232760d118" + integrity sha512-4M25BsX4hDv6GATk/O8In4a6lNBHp1s1/g7TJ4y/Z/pCHkdidPKxThypxHiFgCLXmvfP4BbrNqKbcYl8GC/g7g== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@overextended/oxmysql@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@overextended/oxmysql/-/oxmysql-1.3.0.tgz#c3661499de26fc057a615696652ada72ee610c9e" + integrity sha512-dpbcAT8HHUQiXyQMb0ei46tUEeCbh9mAgDf4y2vofPp+E3g4QEW8rh0/LuI510VLzJQ7gvTbalQSL84IiCncCw== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@types/node@^20.12.5": + version "20.14.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.15.tgz#e59477ab7bc7db1f80c85540bfd192a0becc588b" + integrity sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw== + dependencies: + undici-types "~5.26.4" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concurrently@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== + dependencies: + chalk "^4.1.2" + date-fns "^2.30.0" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +esbuild@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +tslib@^2.1.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +typescript@^5.4.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1"