@monerium/sdk-react-provider 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -20
- package/dist/index.d.ts +317 -172
- package/dist/index.js +22 -15
- package/dist/index.mjs +4 -4
- package/package.json +3 -4
package/dist/index.js
CHANGED
|
@@ -5,20 +5,27 @@ var reactQuery = require('@tanstack/react-query');
|
|
|
5
5
|
var sdk = require('@monerium/sdk');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var b=react.createContext(null);var H=({children:e,clientId:r,redirectUri:n,environment:o="sandbox",refreshToken:i,onRefreshTokenUpdate:a,debug:u=!1})=>{let t=reactQuery.useQueryClient(),[s]=react.useState(()=>new sdk.MoneriumClient({environment:o,clientId:r,redirectUri:n,debug:u})),[f,w]=react.useState(!1),[v,E]=react.useState(null),[k,q]=react.useState(!0);react.useEffect(()=>((async()=>{if(s)try{w(await s.getAccess());}catch(h){console.error("Failed to get access:",h);}finally{q(!1),s?.bearerProfile&&a?.(s.bearerProfile.refresh_token);}})(),()=>{s&&s.disconnect();}),[]),react.useEffect(()=>{i&&!f&&!k&&(async()=>{if(s)try{w(await s.getAccess(i));}catch(h){console.error("Failed to get access:",h);}finally{s?.bearerProfile&&a?.(s.bearerProfile.refresh_token);}})();},[i]);let I=react.useCallback(async m=>{try{s&&await s.authorize(m);}catch(h){console.error("Error during authorization:",h),E(h);}},[s]),z=async()=>{try{s&&await s.revokeAccess();}catch(m){console.error("Error during revoking access:",m),E(m);}finally{t.clear(),w(!1);}};return jsxRuntime.jsx(b.Provider,{value:{sdk:s,authorize:I,isAuthorized:f,isLoading:k,error:v,disconnect:async()=>s?.disconnect(),revokeAccess:async()=>z()},children:e})};var d={getAll:["monerium"],getProfile:e=>["monerium","profile",...e?[e]:[]],getProfiles:["monerium","profiles"],getAddress:e=>["monerium","address",[e]],getAddresses:e=>["monerium","addresses",...e?[e]:[]],getBalances:(e,r,n)=>["monerium","balances",e,r,...n?[...n]:[]],getIban:e=>["monerium","iban",e],getIbans:e=>["monerium","ibans",...e?[e]:[]],getTokens:["monerium","tokens"],getOrder:e=>["monerium","order",e],getOrders:e=>["monerium","orders",...e?[e]:[]],submitProfileDetails:["monerium","submit-profile-details"],moveIban:["monerium","move-iban"],requestIban:["monerium","request-iban"],placeOrder:["monerium","place-order"],linkAddress:["monerium","link-address"]};function c(){let e=react.useContext(b);if(e===null)throw new Error("useSdk must be used within a MoneriumProvider");return e?.sdk}function l(){let e=react.useContext(b);if(e===null)throw new Error("useAuth must be used within a MoneriumProvider");return {isAuthorized:e.isAuthorized,authorize:e.authorize,isLoading:e.isLoading,error:e.error,disconnect:e.disconnect,revokeAccess:e.revokeAccess}}function Ee({profile:e,query:r}={}){let{isAuthorized:n}=l(),o=c(),{data:i}=D(),a=e||i?.profiles?.[0]?.id;return reactQuery.useQuery({...r,queryKey:d.getProfile(a),queryFn:async()=>{if(!o)throw new Error("No SDK instance available");if(!n)throw new Error("User not authorized");if(!a)throw new Error("Profile Id is required");return o.getProfile(a)},enabled:!!(o&&n&&a&&(r?.enabled??!0))})}function D({query:e}={}){let{isAuthorized:r}=l(),n=c();return reactQuery.useQuery({...e,queryKey:d.getProfiles,queryFn:async()=>{if(!n)throw new Error("No SDK instance available");if(!r)throw new Error("User not authorized");return n.getProfiles()},enabled:!!(n&&r&&(e?.enabled??!0))})}function ke({query:e}={}){let r=c(),{isAuthorized:n}=l();return reactQuery.useQuery({...e,queryKey:d.getTokens,queryFn:async()=>{if(!r)throw new Error("No SDK instance available");if(!n)throw new Error("User not authorized");return r.getTokens()},enabled:!!(r&&n&&(e?.enabled??!0))})}function Pe({address:e,query:r={}}){let n=c(),{isAuthorized:o}=l();return reactQuery.useQuery({...r,queryKey:d.getAddress(e),queryFn:async()=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");if(!e)throw new Error("Address is required");return n.getAddress(e)},enabled:!!(n&&o&&e&&(r?.enabled??!0))})}function Oe({profile:e,chain:r,query:n={}}={}){let o=c(),{isAuthorized:i}=l();return reactQuery.useQuery({...n,queryKey:d.getAddresses({profile:e,chain:r?sdk.parseChain(r):void 0}),queryFn:async()=>{if(!o)throw new Error("No SDK instance available");if(!i)throw new Error("User not authorized");return o.getAddresses({profile:e,chain:r})},enabled:!!(o&&i&&(n?.enabled??!0))})}function Se({address:e,chain:r,currencies:n,query:o}){let i=c(),{isAuthorized:a}=l();return reactQuery.useQuery({...o,queryKey:d.getBalances(e,sdk.parseChain(r),n),staleTime:1e3*60*5,queryFn:async()=>{if(!i)throw new Error("No SDK instance available");if(!a)throw new Error("User not authorized");return i.getBalances(e,r,n)},enabled:!!(i&&a&&(o?.enabled??!0))})}function ve({iban:e,query:r}){let n=c(),{isAuthorized:o}=l();return reactQuery.useQuery({...r,queryKey:d.getIban(e),queryFn:async()=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");return n.getIban(e)},enabled:!!(n&&o&&e&&(r?.enabled??!0))})}function qe({profile:e,chain:r,query:n={}}={}){let o=c(),{isAuthorized:i}=l();return reactQuery.useQuery({...n,queryKey:d.getIbans({profile:e,chain:r}),queryFn:async()=>{if(!o)throw new Error("No SDK instance available");if(!i)throw new Error("User not authorized");return o.getIbans({profile:e,chain:r})},enabled:!!(o&&i&&(n?.enabled??!0))})}function Ie({orderId:e,query:r={}}){let n=c(),{isAuthorized:o}=l();return reactQuery.useQuery({...r,queryKey:d.getOrder(e),queryFn:async()=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");if(!e)throw new Error("Order id is required");return n.getOrder(e)},enabled:!!(n&&o&&e&&(r.enabled??!0))})}function ze({query:e={},...r}={}){let n=c(),{isAuthorized:o}=l();return reactQuery.useQuery({...e,queryKey:d.getOrders(r),queryFn:async()=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");return n.getOrders(r)},enabled:!!(n&&o&&(e.enabled??!0))})}function Ke({profile:e,mutation:r={}}){let n=c(),{isAuthorized:o}=l(),i=reactQuery.useQueryClient(),{mutateAsync:a,...u}=reactQuery.useMutation({...r,mutationKey:d.submitProfileDetails,mutationFn:async t=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");return n.submitProfileDetails(e,t)},onSuccess(t,s,f){i.invalidateQueries({queryKey:d.getProfile(e)}),r?.onSuccess?.(t,s,f);},onError(t,s,f){throw r?.onError?.(t,s,f),t}});return {submitProfileDetails:a,...u}}function Ce({mutation:e={}}={}){let r=c(),{isAuthorized:n}=l(),{mutateAsync:o,...i}=reactQuery.useMutation({...e,mutationKey:d.requestIban,mutationFn:async({address:a,chain:u,emailNotifications:t})=>{if(!r)throw new Error("No SDK instance available");if(!n)throw new Error("User not authorized");return r.requestIban({address:a,chain:u,emailNotifications:t})},onSuccess(a,u,t){e?.onSuccess?.(a,u,t);},onError(a,u,t){throw e?.onError?.(a,u,t),a}});return {requestIban:o,...i}}function xe({mutation:e={}}={}){let r=c(),{isAuthorized:n}=l(),o=reactQuery.useQueryClient(),{mutateAsync:i,...a}=reactQuery.useMutation({...e,mutationKey:d.moveIban,mutationFn:async({iban:u,address:t,chain:s})=>{if(!r)throw new Error("No SDK instance available");if(!n)throw new Error("User not authorized");return r.moveIban(u,{address:t,chain:s})},onSuccess(u,t,s){o.invalidateQueries({queryKey:d.getIban(t.iban)}),o.invalidateQueries({queryKey:d.getIbans()}),o.invalidateQueries({queryKey:d.getAddress(t.address)}),e?.onSuccess?.(u,t,s);},onError(u,t,s){throw e?.onError?.(u,t,s),u}});return {moveIban:i,...a}}function Ne({supportingDocument:e,mutation:r}={}){let n=c(),{isAuthorized:o}=l(),i=reactQuery.useQueryClient(),{mutateAsync:a,...u}=reactQuery.useMutation({...r,mutationKey:d.placeOrder,mutationFn:async t=>{if(!n)throw new Error("No SDK instance available");if(!o)throw new Error("User not authorized");let s;if(parseInt(t.amount)>15e3){if(!e)throw new Error("Supporting document is required for orders above 15000");s=(await n.uploadSupportingDocument(e)).id;}let f={...t,documentId:s};return n.placeOrder(f)},onSuccess(t,s,f){i.invalidateQueries({queryKey:d.getOrders()}),i.invalidateQueries({queryKey:d.getBalances(t.address,t.chain)}),r?.onSuccess?.(t,s,f);},onError(t,s,f){throw r?.onError?.(t,s,f),t}});return {placeOrder:a,...u}}function Re({mutation:e}={}){let r=c(),{isAuthorized:n}=l(),o=reactQuery.useQueryClient(),{mutateAsync:i,...a}=reactQuery.useMutation({...e,mutationKey:d.linkAddress,mutationFn:async u=>{if(!r)throw new Error("No SDK instance available");if(!n)throw new Error("User not authorized");return r.linkAddress(u)},onSuccess(u,t,s){o.invalidateQueries({queryKey:d.getAddresses()}),t.profile&&o.invalidateQueries({queryKey:d.getProfile(t.profile)}),e?.onSuccess?.(u,t,s);},onError(u,t,s){throw e?.onError?.(u,t,s),u}});return {linkAddress:i,...a}}var Me=({state:e,profile:r,onMessage:n,onError:o})=>{let i=c();return react.useEffect(()=>(i&&i.subscribeOrderNotifications({filter:{state:e,profile:r},onMessage:n,onError:o}),()=>{i&&i?.unsubscribeOrderNotifications({state:e,profile:r});}),[i,r,e]),()=>i?.unsubscribeOrderNotifications({state:e,profile:r})};
|
|
9
9
|
|
|
10
|
-
exports.MoneriumContext =
|
|
11
|
-
exports.MoneriumProvider =
|
|
12
|
-
exports.keys =
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
15
|
-
exports.
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
18
|
-
exports.
|
|
19
|
-
exports.
|
|
20
|
-
exports.
|
|
21
|
-
exports.
|
|
22
|
-
exports.
|
|
10
|
+
exports.MoneriumContext = b;
|
|
11
|
+
exports.MoneriumProvider = H;
|
|
12
|
+
exports.keys = d;
|
|
13
|
+
exports.useAddress = Pe;
|
|
14
|
+
exports.useAddresses = Oe;
|
|
15
|
+
exports.useAuth = l;
|
|
16
|
+
exports.useBalances = Se;
|
|
17
|
+
exports.useIBAN = ve;
|
|
18
|
+
exports.useIBANs = qe;
|
|
19
|
+
exports.useLinkAddress = Re;
|
|
20
|
+
exports.useMoveIban = xe;
|
|
21
|
+
exports.useOrder = Ie;
|
|
22
|
+
exports.useOrders = ze;
|
|
23
|
+
exports.usePlaceOrder = Ne;
|
|
24
|
+
exports.useProfile = Ee;
|
|
25
|
+
exports.useProfiles = D;
|
|
26
|
+
exports.useRequestIban = Ce;
|
|
27
|
+
exports.useSubmitProfileDetails = Ke;
|
|
28
|
+
exports.useSubscribeOrderNotification = Me;
|
|
29
|
+
exports.useTokens = ke;
|
|
23
30
|
//# sourceMappingURL=index.js.map
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9saWIvY29udGV4dC50c3giLCIuLi9zcmMvbGliL3Byb3ZpZGVyLnRzeCIsIi4uL3NyYy9saWIvaG9va3MudHN4Il0sIm5hbWVzIjpbIk1vbmVyaXVtQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJNb25lcml1bVByb3ZpZGVyIiwiY2hpbGRyZW4iLCJjbGllbnRJZCIsInJlZGlyZWN0VXJsIiwicmVkaXJlY3RVcmkiLCJlbnZpcm9ubWVudCIsInF1ZXJ5Q2xpZW50IiwidXNlUXVlcnlDbGllbnQiLCJzZGsiLCJzZXRTZGsiLCJ1c2VTdGF0ZSIsImlzQXV0aG9yaXplZCIsInNldElzQXV0aG9yaXplZCIsImVycm9yIiwic2V0RXJyb3IiLCJsb2FkaW5nQXV0aCIsInNldExvYWRpbmdBdXRoIiwidXNlRWZmZWN0Iiwic2RrSW5zdGFuY2UiLCJNb25lcml1bUNsaWVudCIsImF1dGhvcml6ZSIsInVzZUNhbGxiYWNrIiwicGFyYW1zIiwiZXJyIiwicmV2b2tlQWNjZXNzIiwianN4Iiwia2V5cyIsInByb2ZpbGVJZCIsIm9yZGVySWQiLCJmaWx0ZXIiLCJ1c2VTZGsiLCJjb250ZXh0IiwidXNlQ29udGV4dCIsInVzZUF1dGgiLCJ1c2VBdXRoQ29udGV4dCIsInF1ZXJ5IiwiZGF0YSIsInJlc3QiLCJ1c2VRdWVyeSIsInVzZVByb2ZpbGUiLCJhdXRoQ29udGV4dCIsInByb2ZpbGVJZFRvVXNlIiwidXNlUHJvZmlsZXMiLCJ1c2VUb2tlbnMiLCJ1c2VCYWxhbmNlcyIsInVzZU9yZGVyIiwidXNlT3JkZXJzIiwiZmlsdGVycyIsInVzZVBsYWNlT3JkZXIiLCJzdXBwb3J0aW5nRG9jdW1lbnQiLCJtdXRhdGlvbiIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJib2R5IiwiZG9jdW1lbnRJZCIsIm5ld0JvZHkiLCJ2YXJpYWJsZXMiLCJ2YXJzIiwidXNlTGlua0FkZHJlc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJTyxJQUFNQSxDQUFrQkMsQ0FB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QixFQUFZLGlCQUFrQixDQUFBLENBQzVCLFFBQVVvQixDQUFBQSxDQUFBQSxDQUFLLFVBQVdDLENBQUFBLENBQVMsQ0FDckMsQ0FBQyxFQUVEdUIsQ0FBVSxFQUFBLFNBQUEsR0FBWWQsQ0FBTW9CLENBQUFBLENBQUFBLENBQVd6QixDQUFPLEVBQ2hELENBQUEsQ0FDQSxPQUFRbEIsQ0FBQUEsQ0FBQUEsQ0FBTzRDLEVBQU0xQixDQUFTLENBQUEsQ0FFNUIsTUFBQW1CLENBQUFBLEVBQVUsT0FBVXJDLEdBQUFBLENBQUFBLENBQU80QyxDQUFNMUIsQ0FBQUEsQ0FBTyxFQUNsQ2xCLENBQ1IsQ0FDRixDQUFDLENBQUEsQ0FDRCxPQUFPLENBQ0wsV0FBQSxDQUFhc0MsQ0FDYixDQUFBLEdBQUdkLENBQ0wsQ0FDRiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IFNka0luc3RhbmNlLCBVc2VBdXRoUmV0dXJuIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBNb25lcml1bUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFxuICAoVXNlQXV0aFJldHVybiAmIFNka0luc3RhbmNlKSB8IG51bGxcbj4obnVsbCk7XG4iLCJpbXBvcnQgeyBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUXVlcnlDbGllbnQgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuXG5pbXBvcnQgeyBNb25lcml1bUNsaWVudCB9IGZyb20gJ0Btb25lcml1bS9zZGsnO1xuXG5pbXBvcnQgeyBNb25lcml1bUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgQXV0aG9yaXplUGFyYW1zIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUGxhY2UgdGhpcyBwcm92aWRlciBhdCB0aGUgcm9vdCBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICogQGdyb3VwIFByb3ZpZGVyXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLmNoaWxkcmVuIC0gUmVzdCBvZiB0aGUgYXBwbGljYXRpb24uXG4gKiBAcGFyYW0gcGFyYW1zLmNsaWVudElkIC0gTW9uZXJpdW0gYXV0aCBmbG93IGNsaWVudCBpZC5cbiAqIEBwYXJhbSBwYXJhbXMucmVkaXJlY3RVcmkgLSBNb25lcml1bSBhdXRoIGZsb3cgcmVkaXJlY3QgdXJsLlxuICogQHBhcmFtIHBhcmFtcy5lbnZpcm9ubWVudCAtIE1vbmVyaXVtIGVudmlyb25tZW50LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IE1vbmVyaXVtUHJvdmlkZXIgPSAoe1xuICBjaGlsZHJlbixcbiAgY2xpZW50SWQsXG4gIHJlZGlyZWN0VXJsLFxuICByZWRpcmVjdFVyaSxcbiAgZW52aXJvbm1lbnQgPSAnc2FuZGJveCcsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgcmVkaXJlY3RVcmkgKi9cbiAgcmVkaXJlY3RVcmw/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50PzogJ3NhbmRib3gnIHwgJ3Byb2R1Y3Rpb24nO1xufSkgPT4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgY29uc3QgW3Nkaywgc2V0U2RrXSA9IHVzZVN0YXRlPE1vbmVyaXVtQ2xpZW50PigpO1xuICBjb25zdCBbaXNBdXRob3JpemVkLCBzZXRJc0F1dGhvcml6ZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPEVycm9yIHwgdW5rbm93biB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbbG9hZGluZ0F1dGgsIHNldExvYWRpbmdBdXRoXSA9IHVzZVN0YXRlKHRydWUpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIFNES1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNka0luc3RhbmNlID0gbmV3IE1vbmVyaXVtQ2xpZW50KHtcbiAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCxcbiAgICAgIGNsaWVudElkLFxuICAgICAgcmVkaXJlY3RVcmk6IHJlZGlyZWN0VXJpIHx8IHJlZGlyZWN0VXJsLFxuICAgIH0pO1xuICAgIHNldFNkayhzZGtJbnN0YW5jZSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoc2RrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0SXNBdXRob3JpemVkKGF3YWl0IHNkay5nZXRBY2Nlc3MoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBhY2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldExvYWRpbmdBdXRoKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25uZWN0KCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHNkaykge1xuICAgICAgICBzZGsuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtzZGtdKTtcblxuICBjb25zdCBhdXRob3JpemUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocGFyYW1zPzogQXV0aG9yaXplUGFyYW1zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc2RrKSB7XG4gICAgICAgICAgYXdhaXQgc2RrLmF1dGhvcml6ZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGF1dGhvcml6YXRpb246JywgZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZGtdXG4gICk7XG5cbiAgY29uc3QgcmV2b2tlQWNjZXNzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc2RrKSB7XG4gICAgICAgIGF3YWl0IHNkay5yZXZva2VBY2Nlc3MoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyByZXZva2luZyBhY2Nlc3M6JywgZXJyKTtcbiAgICAgIHNldEVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmNsZWFyKCk7XG4gICAgICBzZXRJc0F1dGhvcml6ZWQoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxNb25lcml1bUNvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIHNkayxcbiAgICAgICAgYXV0aG9yaXplLFxuICAgICAgICBpc0F1dGhvcml6ZWQsXG4gICAgICAgIGlzTG9hZGluZzogbG9hZGluZ0F1dGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBkaXNjb25uZWN0OiBhc3luYyAoKSA9PiBzZGs/LmRpc2Nvbm5lY3QoKSxcbiAgICAgICAgcmV2b2tlQWNjZXNzOiBhc3luYyAoKSA9PiByZXZva2VBY2Nlc3MoKSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvTW9uZXJpdW1Db250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcbiIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiwgdXNlUXVlcnksIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcblxuaW1wb3J0IE1vbmVyaXVtQ2xpZW50LCB7XG4gIEF1dGhDb250ZXh0LFxuICBCYWxhbmNlcyxcbiAgTGlua0FkZHJlc3MsXG4gIExpbmtlZEFkZHJlc3MsXG4gIE5ld09yZGVyLFxuICBPcmRlcixcbiAgT3JkZXJTdGF0ZSxcbiAgUHJvZmlsZSxcbiAgVG9rZW4sXG59IGZyb20gJ0Btb25lcml1bS9zZGsnO1xuXG5pbXBvcnQgeyBNb25lcml1bUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHtcbiAgTXV0YXRpb25PcHRpb25zLFxuICBNdXRhdGlvblJlc3VsdCxcbiAgUXVlcnlPcHRpb25zLFxuICBRdWVyeVJlc3VsdCxcbiAgVXNlQXV0aFJldHVybixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBRdWVyeSBrZXlzXG4gKiAqL1xuZXhwb3J0IGNvbnN0IGtleXMgPSB7XG4gIGdldEFsbDogWydtb25lcml1bSddLFxuICBnZXRBdXRoQ29udGV4dDogWydtb25lcml1bScsICdhdXRoLWNvbnRleHQnXSxcbiAgZ2V0UHJvZmlsZTogKHByb2ZpbGVJZDogc3RyaW5nKSA9PiBbXG4gICAgJ21vbmVyaXVtJyxcbiAgICAncHJvZmlsZScsXG4gICAgLi4uKHByb2ZpbGVJZCA/IFtwcm9maWxlSWRdIDogW10pLFxuICBdLFxuICBnZXRQcm9maWxlczogWydtb25lcml1bScsICdwcm9maWxlcyddLFxuICBnZXRCYWxhbmNlczogKHByb2ZpbGVJZD86IHN0cmluZykgPT4gW1xuICAgICdtb25lcml1bScsXG4gICAgJ2JhbGFuY2VzJyxcbiAgICAuLi4ocHJvZmlsZUlkID8gW3Byb2ZpbGVJZF0gOiBbXSksXG4gIF0sXG4gIGdldFRva2VuczogWydtb25lcml1bScsICd0b2tlbnMnXSxcbiAgZ2V0T3JkZXI6IChvcmRlcklkOiBzdHJpbmcpID0+IFsnbW9uZXJpdW0nLCAnb3JkZXInLCBvcmRlcklkXSxcbiAgZ2V0T3JkZXJzOiAoZmlsdGVyPzogdW5rbm93bikgPT4gW1xuICAgICdtb25lcml1bScsXG4gICAgJ29yZGVycycsXG4gICAgLi4uKGZpbHRlciA/IFtmaWx0ZXJdIDogW10pLFxuICBdLFxuICBwbGFjZU9yZGVyOiBbJ21vbmVyaXVtJywgJ3BsYWNlLW9yZGVyJ10sXG4gIGxpbmtBZGRyZXNzOiBbJ21vbmVyaXVtJywgJ2xpbmstYWRkcmVzcyddLFxufTtcblxuLyoqIEludGVybmFsIGhvb2sgdG8gdXNlIFNESyAqL1xuZnVuY3Rpb24gdXNlU2RrKCk6IE1vbmVyaXVtQ2xpZW50IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoTW9uZXJpdW1Db250ZXh0KTtcblxuICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlU2RrIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBNb25lcml1bVByb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ/LnNkaztcbn1cblxuLyoqXG4gKiAjIFJlZGlyZWN0IHRvIHRoZSBNb25lcml1bSBhdXRoIGZsb3cuXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgeyBhdXRob3JpemUsIGlzQXV0aG9yaXplZCwgaXNMb2FkaW5nLCBlcnJvciB9ID0gdXNlQXV0aCgpO1xuICpcbiAqIGF1dGhvcml6ZSgpOyAvLyBSZWRpcmVjdHMgdG8gdGhlIE1vbmVyaXVtIGF1dGggZmxvdy5cbiAqXG4gKiAvLyBUbyBvcHQtaW4gdG8gYXV0b21hdGVkIHdhbGxldCBsaW5raW5nLCBwYXNzIHRoZSBhZGRyZXNzLCBzaWduYXR1cmUgYW5kIGNoYWluLlxuICogYXV0aG9yaXplKHsgYWRkcmVzcywgc2lnbmF0dXJlLCBjaGFpbiB9KS5cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtVc2VBdXRoUmV0dXJufVxuICogLSBgYXV0aG9yaXplYCAgLSBSZWRpcmVjdHMgdG8gdGhlIE1vbmVyaXVtIGF1dGggZmxvdy5cbiAqIC0gYGlzQXV0aG9yaXplZGAgLSBXaGV0aGVyIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQuXG4gKiAtIGBpc0xvYWRpbmdgIC0gV2hldGhlciB0aGUgYXV0aCBmbG93IGlzIGxvYWRpbmcuXG4gKiAtIGBlcnJvcmAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZSBhdXRoIGZsb3cgZmFpbHMuXG4gKiAtIGBkaXNjb25uZWN0YCAtIERpc2Nvbm5lY3QgdGhlIHVzZXIuXG4gKiAtIGByZXZva2VBY2Nlc3NgIC0gUmV2b2tlIHRoZSB1c2VyJ3MgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQXV0aCgpOiBVc2VBdXRoUmV0dXJuIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoTW9uZXJpdW1Db250ZXh0KTtcblxuICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQXV0aCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgTW9uZXJpdW1Qcm92aWRlcicpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaXNBdXRob3JpemVkOiBjb250ZXh0LmlzQXV0aG9yaXplZCxcbiAgICBhdXRob3JpemU6IGNvbnRleHQuYXV0aG9yaXplLFxuICAgIGlzTG9hZGluZzogY29udGV4dC5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGNvbnRleHQuZXJyb3IsXG4gICAgZGlzY29ubmVjdDogY29udGV4dC5kaXNjb25uZWN0LFxuICAgIHJldm9rZUFjY2VzczogY29udGV4dC5yZXZva2VBY2Nlc3MsXG4gIH07XG59XG5cbi8qKlxuICogIyBHZXQgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQuXG4gKiBAZ3JvdXAgSG9va3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gTm8gcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7UXVlcnlPcHRpb25zPEF1dGhDb250ZXh0Pn0gW3BhcmFtcy5xdWVyeV0ge0Bpbmhlcml0RG9jIFF1ZXJ5T3B0aW9uc31cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGF1dGhDb250ZXh0LCAvLyB1c2VRdWVyeSdzIGBkYXRhYCBwcm9wZXJ0eVxuICogICAgaXNMb2FkaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgcmVmZXRjaCxcbiAqICAgIC4uLm1vcmVVc2VRdWVyeVJlc3VsdHNcbiAqIH0gPSB1c2VBdXRoQ29udGV4dCgpO1xuICogYGBgXG4gKlxuICogQHNlZVxuICogW0FQSSBEb2N1bWVudGF0aW9uXShodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vYXV0aC1jb250ZXh0KVxuICpcbiAqIFtBdXRoQ29udGV4dCBpbnRlcmZhY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb25lcml1bS9qcy1tb25vcmVwby9ibG9iL21haW4vcGFja2FnZXMvc2RrL2RvY3MvZ2VuZXJhdGVkL2ludGVyZmFjZXMvQXV0aENvbnRleHQubWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoQ29udGV4dCh7XG4gIHF1ZXJ5LFxufToge1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxBdXRoQ29udGV4dD47XG59ID0ge30pOiBRdWVyeVJlc3VsdDwnYXV0aENvbnRleHQnLCBBdXRoQ29udGV4dD4ge1xuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcblxuICBjb25zdCB7IGRhdGEsIC4uLnJlc3QgfSA9IHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRBdXRoQ29udGV4dCxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNkay5nZXRBdXRoQ29udGV4dCgpO1xuICAgIH0sXG4gICAgZW5hYmxlZDogQm9vbGVhbihzZGsgJiYgaXNBdXRob3JpemVkICYmIChxdWVyeT8uZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGF1dGhDb250ZXh0OiBkYXRhLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogIyBHZXQgc2luZ2xlIHByb2ZpbGVcbiAqIElmIG5vIGBwcm9maWxlSWRgIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBwcm9maWxlIGlzIHVzZWQuXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnByb2ZpbGVJZF0gVGhlIGlkIG9mIHRoZSBwcm9maWxlLlxuICogQHBhcmFtIHtRdWVyeU9wdGlvbnM8UHJvZmlsZT59IFtwYXJhbXMucXVlcnldIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBwcm9maWxlLCAvLyB1c2VRdWVyeSdzIGBkYXRhYCBwcm9wZXJ0eVxuICogICAgaXNMb2FkaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgcmVmZXRjaCxcbiAqICAgIC4uLm1vcmVVc2VRdWVyeVJlc3VsdHNcbiAqIH0gPSB1c2VQcm9maWxlKCk7XG4gKiBgYGBcblxuICogQHNlZVxuICogW0FQSSBEb2N1bWVudGF0aW9uXShodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vcHJvZmlsZSlcbiAqXG4gKiBbUHJvZmlsZSBpbnRlcmZhY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb25lcml1bS9qcy1tb25vcmVwby9ibG9iL21haW4vcGFja2FnZXMvc2RrL2RvY3MvZ2VuZXJhdGVkL2ludGVyZmFjZXMvUHJvZmlsZS5tZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2ZpbGUoe1xuICBwcm9maWxlSWQsXG4gIHF1ZXJ5LFxufToge1xuICBwcm9maWxlSWQ/OiBzdHJpbmc7XG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPFByb2ZpbGU+O1xufSA9IHt9KTogUXVlcnlSZXN1bHQ8J3Byb2ZpbGUnLCBQcm9maWxlPiB7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuICBjb25zdCB7IGF1dGhDb250ZXh0IH0gPSB1c2VBdXRoQ29udGV4dCgpO1xuXG4gIGNvbnN0IHByb2ZpbGVJZFRvVXNlID0gcHJvZmlsZUlkIHx8IChhdXRoQ29udGV4dD8uZGVmYXVsdFByb2ZpbGUgYXMgc3RyaW5nKTtcblxuICBjb25zdCB7IGRhdGEsIC4uLnJlc3QgfSA9IHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRQcm9maWxlKHByb2ZpbGVJZFRvVXNlKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9maWxlSWRUb1VzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2ZpbGUgSWQgaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNkay5nZXRQcm9maWxlKHByb2ZpbGVJZFRvVXNlKTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IEJvb2xlYW4oXG4gICAgICBzZGsgJiYgaXNBdXRob3JpemVkICYmIHByb2ZpbGVJZFRvVXNlICYmIChxdWVyeT8uZW5hYmxlZCA/PyB0cnVlKVxuICAgICksXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHByb2ZpbGU6IGRhdGEsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cbi8qKlxuICogIyBHZXQgcHJvZmlsZXNcbiAqIEBncm91cCBIb29rc1xuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIE5vIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxQcm9maWxlW10+fSBbcGFyYW1zLnF1ZXJ5XSB7QGluaGVyaXREb2MgUXVlcnlPcHRpb25zfVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgcHJvZmlsZXMsIC8vIHVzZVF1ZXJ5J3MgYGRhdGFgIHByb3BlcnR5XG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZVByb2ZpbGVzKCk7XG4gKiBgYGBcblxuICogQHNlZVxuICogW0FQSSBEb2N1bWVudGF0aW9uXShodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vcHJvZmlsZXMpXG4gKlxuICogW1Byb2ZpbGUgaW50ZXJmYWNlXShodHRwczovL2dpdGh1Yi5jb20vbW9uZXJpdW0vanMtbW9ub3JlcG8vYmxvYi9tYWluL3BhY2thZ2VzL3Nkay9kb2NzL2dlbmVyYXRlZC9pbnRlcmZhY2VzL1Byb2ZpbGUubWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlcyh7XG4gIHF1ZXJ5LFxufToge1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxQcm9maWxlW10+O1xufSA9IHt9KTogUXVlcnlSZXN1bHQ8J3Byb2ZpbGVzJywgUHJvZmlsZVtdPiB7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuXG4gIGNvbnN0IHsgZGF0YSwgLi4ucmVzdCB9ID0gdXNlUXVlcnkoe1xuICAgIC4uLnF1ZXJ5LFxuICAgIHF1ZXJ5S2V5OiBrZXlzLmdldFByb2ZpbGVzLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2RrLmdldFByb2ZpbGVzKCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvZmlsZXM6IGRhdGEsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cbi8qKlxuICogIyBHZXQgdG9rZW5zXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtRdWVyeU9wdGlvbnM8VG9rZW5bXT59IFtwYXJhbXMucXVlcnldIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICB0b2tlbnMsIC8vIHVzZVF1ZXJ5J3MgYGRhdGFgIHByb3BlcnR5XG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZVRva2VucygpO1xuICogYGBgXG5cbiAqIEBzZWVcbiAqIFtBUEkgRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL3Rva2VucylcbiAqXG4gKiBbVG9rZW4gaW50ZXJmYWNlXShodHRwczovL2dpdGh1Yi5jb20vbW9uZXJpdW0vanMtbW9ub3JlcG8vYmxvYi9tYWluL3BhY2thZ2VzL3Nkay9kb2NzL2dlbmVyYXRlZC9pbnRlcmZhY2VzL1Rva2VuLm1kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5zKHtcbiAgcXVlcnksXG59OiB7IHF1ZXJ5PzogUXVlcnlPcHRpb25zPFRva2VuW10+IH0gPSB7fSk6IFF1ZXJ5UmVzdWx0PCd0b2tlbnMnLCBUb2tlbltdPiB7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuICBjb25zdCB7IGRhdGEsIC4uLnJlc3QgfSA9IHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRUb2tlbnMsXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZGsuZ2V0VG9rZW5zKCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW5zOiBkYXRhLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogIyBHZXQgYmFsYW5jZXNcbiAqIEBncm91cCBIb29rc1xuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIE5vIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxCYWxhbmNlc1tdPn0gW3BhcmFtcy5wcm9maWxlSWRdIEZldGNoIGJhbGFuY2VzIGZvciBhIHNwZWNpZmljIHByb2ZpbGUuXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxCYWxhbmNlc1tdPn0gW3BhcmFtcy5xdWVyeV0ge0Bpbmhlcml0RG9jIFF1ZXJ5T3B0aW9uc31cblxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBiYWxhbmNlcywgLy8gdXNlUXVlcnkncyBgZGF0YWAgcHJvcGVydHlcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlQmFsYW5jZXMoKTtcbiAqIGBgYFxuICogQHNlZVxuICogW0FQSSBEb2N1bWVudGF0aW9uXShodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vcHJvZmlsZS1iYWxhbmNlcylcbiAqXG4gKiBbQmFsYW5jZXMgaW50ZXJmYWNlXShodHRwczovL2dpdGh1Yi5jb20vbW9uZXJpdW0vanMtbW9ub3JlcG8vYmxvYi9tYWluL3BhY2thZ2VzL3Nkay9kb2NzL2dlbmVyYXRlZC9pbnRlcmZhY2VzL0JhbGFuY2VzLm1kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQmFsYW5jZXMoe1xuICBwcm9maWxlSWQsXG4gIHF1ZXJ5LFxufToge1xuICBwcm9maWxlSWQ/OiBzdHJpbmc7XG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPEJhbGFuY2VzW10+O1xufSA9IHt9KTogUXVlcnlSZXN1bHQ8J2JhbGFuY2VzJywgQmFsYW5jZXNbXT4ge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcblxuICBjb25zdCB7IGRhdGEsIC4uLnJlc3QgfSA9IHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRCYWxhbmNlcyhwcm9maWxlSWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2RrLmdldEJhbGFuY2VzKHByb2ZpbGVJZCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgYmFsYW5jZXM6IGRhdGEsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiAjIEdldCBzaW5nbGUgb3JkZXJcbiAqIEBncm91cCBIb29rc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5vcmRlcklkIFRoZSBpZCBvZiB0aGUgb3JkZXIuXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxPcmRlcj59IFtwYXJhbXMucXVlcnldIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9XG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIG9yZGVyLCAvLyB1c2VRdWVyeSdzIGBkYXRhYCBwcm9wZXJ0eVxuICogICAgaXNMb2FkaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgcmVmZXRjaCxcbiAqICAgIC4uLm1vcmVVc2VRdWVyeVJlc3VsdHNcbiAqIH0gPSB1c2VPcmRlcigpO1xuICogYGBgXG4gKiBAc2VlXG4gKiBbQVBJIERvY3VtZW50YXRpb25dKGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzI29wZXJhdGlvbi9vcmRlcilcbiAqXG4gKiBbT3JkZXIgaW50ZXJmYWNlXShodHRwczovL2dpdGh1Yi5jb20vbW9uZXJpdW0vanMtbW9ub3JlcG8vYmxvYi9tYWluL3BhY2thZ2VzL3Nkay9kb2NzL2dlbmVyYXRlZC9pbnRlcmZhY2VzL09yZGVyLm1kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3JkZXIoe1xuICBvcmRlcklkLFxuICBxdWVyeSA9IHt9LFxufToge1xuICBvcmRlcklkOiBzdHJpbmc7XG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPE9yZGVyPjtcbn0pOiBRdWVyeVJlc3VsdDwnb3JkZXInLCBPcmRlcj4ge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgY29uc3QgeyBkYXRhLCAuLi5yZXN0IH0gPSB1c2VRdWVyeSh7XG4gICAgLi4ucXVlcnksXG4gICAgcXVlcnlLZXk6IGtleXMuZ2V0T3JkZXIob3JkZXJJZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3JkZXJJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09yZGVyIGlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZGsuZ2V0T3JkZXIob3JkZXJJZCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgb3JkZXJJZCAmJiAocXVlcnkuZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIG9yZGVyOiBkYXRhLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogIyBHZXQgb3JkZXJzXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuYWRkcmVzc10gRmlsdGVyIGJhc2VkIG9uIHRoZSBibG9ja2NoYWluIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLm1lbW9dIEZpbHRlciBieSB0aGUgcGF5bWVudCBtZW1vL3JlZmVyZW5jZS4uXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5wcm9maWxlXSBGaWx0ZXIgYmFzZWQgb24gdGhlIHByb2ZpbGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLnN0YXRlXSBGaWx0ZXIgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBvcmRlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLnR4SGFzaF0gRmlsdGVyIGJhc2VkIG9uIHRoZSBibG9ja2NoYWluIHRyYW5zYWN0aW9uIGhhc2guXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxPcmRlcltdPn0gW3BhcmFtcy5xdWVyeV0ge0Bpbmhlcml0RG9jIFF1ZXJ5T3B0aW9uc31cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIG9yZGVycywgLy8gdXNlUXVlcnkncyBgZGF0YWAgcHJvcGVydHlcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlT3JkZXJzKCk7XG4gKiBgYGBcbiAqIEBzZWVcbiAqIFtBUEkgRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL29yZGVycylcbiAqXG4gKiBbT3JkZXIgaW50ZXJmYWNlXShodHRwczovL2dpdGh1Yi5jb20vbW9uZXJpdW0vanMtbW9ub3JlcG8vYmxvYi9tYWluL3BhY2thZ2VzL3Nkay9kb2NzL2dlbmVyYXRlZC9pbnRlcmZhY2VzL09yZGVyLm1kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3JkZXJzKHtcbiAgcXVlcnkgPSB7fSxcbiAgLi4uZmlsdGVyc1xufToge1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxPcmRlcltdPjtcbiAgYWRkcmVzcz86IHN0cmluZztcbiAgdHhIYXNoPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xuICBtZW1vPzogc3RyaW5nO1xuICBzdGF0ZT86IE9yZGVyU3RhdGU7XG59ID0ge30pOiBRdWVyeVJlc3VsdDwnb3JkZXJzJywgT3JkZXJbXT4ge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgY29uc3QgeyBkYXRhLCAuLi5yZXN0IH0gPSB1c2VRdWVyeSh7XG4gICAgLi4ucXVlcnksXG4gICAgcXVlcnlLZXk6IGtleXMuZ2V0T3JkZXJzKGZpbHRlcnMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZGsuZ2V0T3JkZXJzKGZpbHRlcnMpO1xuICAgIH0sXG4gICAgZW5hYmxlZDogQm9vbGVhbihzZGsgJiYgaXNBdXRob3JpemVkICYmIChxdWVyeS5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgb3JkZXJzOiBkYXRhLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogIyBQbGFjZSBhbiBvcmRlci5cbiAqIFdoZW4gdGhlIG9yZGVyIGhhcyBiZWVuIHBsYWNlZCwgdGhlIG9yZGVycyBxdWVyeSB3aWxsIGJlIGludmFsaWRhdGVkIGFuZCByZS1mZXRjaGVkLlxuICpcbiAqIElmIHRoZSBvcmRlciBhbW91bnQgaXMgYWJvdmUgMTUwMDAsIGEgc3VwcG9ydGluZyBkb2N1bWVudCBpcyByZXF1aXJlZC5cbiAqIEBncm91cCBIb29rc1xuICogQHBhcmFtIHBhcmFtXG4gKiBAcGFyYW0ge0ZpbGV9IHBhcmFtLnN1cHBvcnRpbmdEb2N1bWVudCBTdXBwb3J0aW5nIGRvY3VtZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW0ubXV0YXRpb24ge0Bpbmhlcml0RG9jIE11dGF0aW9uT3B0aW9uc31cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIHBsYWNlT3JkZXIsIC8vIHVzZU11dGF0aW9uJ3MgYG11dGF0ZUFzeW5jYCBwcm9wZXJ0eVxuICogICAgaXNQZW5kaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgc3RhdHVzLFxuICogICAgLi4ubW9yZVVzZU11dGF0aW9uUmVzdWx0c1xuICogfSA9IHVzZVBsYWNlT3JkZXIoKTtcbiAqIGBgYFxuICogQHNlZVxuICogW0FQSSBEb2N1bWVudGF0aW9uXShodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vcG9zdC1vcmRlcnMpXG4gKlxuICogW05ld09yZGVyIHR5cGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb25lcml1bS9qcy1tb25vcmVwby9ibG9iL21haW4vcGFja2FnZXMvc2RrL2RvY3MvZ2VuZXJhdGVkL3R5cGUtYWxpYXNlcy9OZXdPcmRlci5tZClcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxhY2VPcmRlcih7XG4gIHN1cHBvcnRpbmdEb2N1bWVudCxcbiAgbXV0YXRpb24sXG59OiB7XG4gIHN1cHBvcnRpbmdEb2N1bWVudD86IEZpbGU7XG4gIG11dGF0aW9uPzogTXV0YXRpb25PcHRpb25zPE9yZGVyLCBFcnJvciwgTmV3T3JkZXI+O1xufSA9IHt9KTogTXV0YXRpb25SZXN1bHQ8J3BsYWNlT3JkZXInLCBPcmRlciwgRXJyb3IsIE5ld09yZGVyPiB7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgY29uc3QgeyBtdXRhdGVBc3luYywgLi4ucmVzdCB9ID0gdXNlTXV0YXRpb24oe1xuICAgIC4uLm11dGF0aW9uLFxuICAgIG11dGF0aW9uS2V5OiBrZXlzLnBsYWNlT3JkZXIsXG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGJvZHk6IE5ld09yZGVyKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGRvY3VtZW50SWQ7XG4gICAgICBpZiAocGFyc2VJbnQoYm9keS5hbW91bnQpID4gMTUwMDApIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0aW5nRG9jdW1lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnU3VwcG9ydGluZyBkb2N1bWVudCBpcyByZXF1aXJlZCBmb3Igb3JkZXJzIGFib3ZlIDE1MDAwJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBsb2FkZWREb2N1bWVudCA9XG4gICAgICAgICAgYXdhaXQgc2RrLnVwbG9hZFN1cHBvcnRpbmdEb2N1bWVudChzdXBwb3J0aW5nRG9jdW1lbnQpO1xuICAgICAgICBkb2N1bWVudElkID0gdXBsb2FkZWREb2N1bWVudC5pZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3Qm9keSA9IHtcbiAgICAgICAgLi4uYm9keSxcbiAgICAgICAgZG9jdW1lbnRJZDogZG9jdW1lbnRJZCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZGsucGxhY2VPcmRlcihuZXdCb2R5KTtcbiAgICB9LFxuICAgIG9uU3VjY2VzcyhkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpIHtcbiAgICAgIC8vIFJlZmV0Y2ggYWxsIG9yZGVycyBvbiBzdWNjZXNzLlxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICBxdWVyeUtleToga2V5cy5nZXRPcmRlcnMoKSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBhZGQgY3VzdG9tIGxvZ2ljIG9uIHN1Y2Nlc3MuXG4gICAgICBtdXRhdGlvbj8ub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KTtcbiAgICB9LFxuICAgIG9uRXJyb3IoZXJyb3IsIHZhcnMsIGNvbnRleHQpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBjYWxsZXIgdG8gYWRkIGN1c3RvbSBsb2dpYyBvbiBlcnJvci5cbiAgICAgIG11dGF0aW9uPy5vbkVycm9yPy4oZXJyb3IsIHZhcnMsIGNvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcGxhY2VPcmRlcjogbXV0YXRlQXN5bmMsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cbi8qKlxuICogIyBBZGQgYWRkcmVzcyB0byBwcm9maWxlLlxuICogV2hlbiB0aGUgYWRkcmVzcyBoYXMgYmVlbiBsaW5rZWQsIHRoZSByZWxldmFudCBwcm9maWxlIHF1ZXJ5IHdpbGwgYmUgaW52YWxpZGF0ZWQgYW5kIHJlLWZldGNoZWQuXG4gKlxuICogQGdyb3VwIEhvb2tzXG4gKiBAcGFyYW0gcGFyYW1cbiAqIEBwYXJhbSB7RmlsZX0gcGFyYW0ucHJvZmlsZUlkIFdoaWNoIHByb2ZpbGUgdG8gbGluayB0aGUgYWRkcmVzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbS5tdXRhdGlvbiB7QGluaGVyaXREb2MgTXV0YXRpb25PcHRpb25zfVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgbGlua0FkZHJlc3MsIC8vIHVzZU11dGF0aW9uJ3MgYG11dGF0ZUFzeW5jYCBwcm9wZXJ0eVxuICogICAgaXNQZW5kaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgc3RhdHVzLFxuICogICAgLi4ubW9yZVVzZU11dGF0aW9uUmVzdWx0c1xuICogfSA9IHVzZUxpbmtBZGRyZXNzKCk7XG4gKiBgYGBcbiAqIEBzZWVcbiAqIFtBUEkgRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL3Byb2ZpbGUtYWRkcmVzc2VzKVxuICpcbiAqIFtMaW5rQWRkcmVzcyBpbnRlcmZhY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb25lcml1bS9qcy1tb25vcmVwby9ibG9iL21haW4vcGFja2FnZXMvc2RrL2RvY3MvZ2VuZXJhdGVkL2ludGVyZmFjZXMvTGlua0FkZHJlc3MubWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMaW5rQWRkcmVzcyh7XG4gIHByb2ZpbGVJZCxcbiAgbXV0YXRpb24sXG59OiB7XG4gIHByb2ZpbGVJZDogc3RyaW5nO1xuICBtdXRhdGlvbj86IE11dGF0aW9uT3B0aW9uczxMaW5rZWRBZGRyZXNzLCBFcnJvciwgTGlua0FkZHJlc3M+O1xufSk6IE11dGF0aW9uUmVzdWx0PCdsaW5rQWRkcmVzcycsIExpbmtlZEFkZHJlc3MsIEVycm9yLCBMaW5rQWRkcmVzcz4ge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIGNvbnN0IHsgbXV0YXRlQXN5bmMsIC4uLnJlc3QgfSA9IHVzZU11dGF0aW9uKHtcbiAgICAuLi5tdXRhdGlvbixcbiAgICBtdXRhdGlvbktleToga2V5cy5saW5rQWRkcmVzcyxcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoYm9keTogTGlua0FkZHJlc3MpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2RrLmxpbmtBZGRyZXNzKHByb2ZpbGVJZCwgYm9keSk7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3MoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSB7XG4gICAgICAvLyBSZWZldGNoIGFsbCBvcmRlcnMgb24gc3VjY2Vzcy5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgcXVlcnlLZXk6IGtleXMuZ2V0UHJvZmlsZShwcm9maWxlSWQpLFxuICAgICAgfSk7XG4gICAgICAvLyBBbGxvdyB0aGUgY2FsbGVyIHRvIGFkZCBjdXN0b20gbG9naWMgb24gc3VjY2Vzcy5cbiAgICAgIG11dGF0aW9uPy5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpO1xuICAgIH0sXG4gICAgb25FcnJvcihlcnJvciwgdmFycywgY29udGV4dCkge1xuICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBhZGQgY3VzdG9tIGxvZ2ljIG9uIGVycm9yLlxuICAgICAgbXV0YXRpb24/Lm9uRXJyb3I/LihlcnJvciwgdmFycywgY29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rQWRkcmVzczogbXV0YXRlQXN5bmMsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cbiJdfQ==
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9saWIvY29udGV4dC50c3giLCIuLi9zcmMvbGliL3Byb3ZpZGVyLnRzeCIsIi4uL3NyYy9saWIvaG9va3MudHN4Il0sIm5hbWVzIjpbIk1vbmVyaXVtQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJNb25lcml1bVByb3ZpZGVyIiwiY2hpbGRyZW4iLCJjbGllbnRJZCIsInJlZGlyZWN0VXJpIiwiZW52aXJvbm1lbnQiLCJyZWZyZXNoVG9rZW4iLCJvblJlZnJlc2hUb2tlblVwZGF0ZSIsImRlYnVnIiwicXVlcnlDbGllbnQiLCJ1c2VRdWVyeUNsaWVudCIsInNkayIsInVzZVN0YXRlIiwiTW9uZXJpdW1DbGllbnQiLCJpc0F1dGhvcml6ZWQiLCJzZXRJc0F1dGhvcml6ZWQiLCJlcnJvciIsInNldEVycm9yIiwibG9hZGluZ0F1dGgiLCJzZXRMb2FkaW5nQXV0aCIsInVzZUVmZmVjdCIsImF1dGhvcml6ZSIsInVzZUNhbGxiYWNrIiwicGFyYW1zIiwiZXJyIiwicmV2b2tlQWNjZXNzIiwianN4Iiwia2V5cyIsInByb2ZpbGUiLCJhZGRyZXNzIiwiZmlsdGVyIiwiY2hhaW4iLCJjdXJyZW5jaWVzIiwiaWJhbiIsIm9yZGVySWQiLCJ1c2VTZGsiLCJjb250ZXh0IiwidXNlQ29udGV4dCIsInVzZUF1dGgiLCJ1c2VQcm9maWxlIiwicXVlcnkiLCJkYXRhIiwidXNlUHJvZmlsZXMiLCJwcm9maWxlVG9Vc2UiLCJ1c2VRdWVyeSIsInVzZVRva2VucyIsInVzZUFkZHJlc3MiLCJ1c2VBZGRyZXNzZXMiLCJwYXJzZUNoYWluIiwidXNlQmFsYW5jZXMiLCJ1c2VJQkFOIiwidXNlSUJBTnMiLCJ1c2VPcmRlciIsInVzZU9yZGVycyIsImZpbHRlcnMiLCJ1c2VTdWJtaXRQcm9maWxlRGV0YWlscyIsIm11dGF0aW9uIiwibXV0YXRlQXN5bmMiLCJyZXN0IiwidXNlTXV0YXRpb24iLCJib2R5IiwidmFyaWFibGVzIiwidmFycyIsInVzZVJlcXVlc3RJYmFuIiwiZW1haWxOb3RpZmljYXRpb25zIiwidXNlTW92ZUliYW4iLCJ1c2VQbGFjZU9yZGVyIiwic3VwcG9ydGluZ0RvY3VtZW50IiwiZG9jdW1lbnRJZCIsIm5ld0JvZHkiLCJ1c2VMaW5rQWRkcmVzcyIsInVzZVN1YnNjcmliZU9yZGVyTm90aWZpY2F0aW9uIiwic3RhdGUiLCJvbk1lc3NhZ2UiLCJvbkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSU8sSUFBTUEsQ0FBa0JDLENBQUFBLG1CQUFBQSxDQUU3QixJQUFJLEVDWUMsSUFBTUMsRUFBbUIsQ0FBQyxDQUMvQixRQUFBQyxDQUFBQSxDQUFBQSxDQUNBLFFBQUFDLENBQUFBLENBQUFBLENBQ0EsV0FBQUMsQ0FBQUEsQ0FBQUEsQ0FDQSxXQUFBQyxDQUFBQSxDQUFBQSxDQUFjLFNBQ2QsQ0FBQSxZQUFBLENBQUFDLENBQ0EsQ0FBQSxvQkFBQSxDQUFBQyxFQUNBLEtBQUFDLENBQUFBLENBQUFBLENBQVEsQ0FDVixDQUFBLENBQUEsR0FVTSxDQUNKLElBQU1DLENBQWNDLENBQUFBLHlCQUFBQSxFQUVkLENBQUEsQ0FBQ0MsQ0FBRyxDQUFBLENBQUlDLGNBQVMsQ0FBQSxJQUVkLElBQUlDLGtCQUFlLENBQUEsQ0FDeEIsV0FBQVIsQ0FBQUEsQ0FBQUEsQ0FDQSxRQUFBRixDQUFBQSxDQUFBQSxDQUNBLFdBQUFDLENBQUFBLENBQUFBLENBQ0EsS0FBT0ksQ0FBQUEsQ0FDVCxDQUFDLENBQ0YsQ0FFSyxDQUFBLENBQUNNLEVBQWNDLENBQWUsQ0FBQSxDQUFJSCxjQUFrQixDQUFBLENBQUEsQ0FBSyxDQUN6RCxDQUFBLENBQUNJLENBQU9DLENBQUFBLENBQVEsQ0FBSUwsQ0FBQUEsY0FBQUEsQ0FBaUMsSUFBSSxDQUFBLENBQ3pELENBQUNNLENBQUFBLENBQWFDLENBQWMsQ0FBSVAsQ0FBQUEsY0FBQUEsQ0FBUyxDQUFJLENBQUEsQ0FBQSxDQUVuRFEsZUFBVSxDQUFBLEtBQUEsQ0FDUSxTQUFZLENBQzFCLEdBQUlULENBQUFBLENBQ0YsR0FBSSxDQUNG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OlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgU2RrSW5zdGFuY2UsIFVzZUF1dGhSZXR1cm4gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IE1vbmVyaXVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gIChVc2VBdXRoUmV0dXJuICYgU2RrSW5zdGFuY2UpIHwgbnVsbFxuPihudWxsKTtcbiIsImltcG9ydCB7IFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5cbmltcG9ydCB7IE1vbmVyaXVtQ2xpZW50IH0gZnJvbSAnQG1vbmVyaXVtL3Nkayc7XG5cbmltcG9ydCB7IE1vbmVyaXVtQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgeyBBdXRob3JpemVQYXJhbXMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBXcmFwIHlvdXIgYXBwbGljYXRpb24gd2l0aCB0aGUgTW9uZXJpdW0gcHJvdmlkZXIuXG4gKiBAZ3JvdXAgUHJvdmlkZXJcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMuY2hpbGRyZW4gLSBSZXN0IG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBwYXJhbSBwYXJhbXMuY2xpZW50SWQgLSBNb25lcml1bSBhdXRoIGZsb3cgY2xpZW50IGlkLlxuICogQHBhcmFtIHBhcmFtcy5yZWRpcmVjdFVyaSAtIE1vbmVyaXVtIGF1dGggZmxvdyByZWRpcmVjdCB1cmwuXG4gKiBAcGFyYW0gcGFyYW1zLmVudmlyb25tZW50IC0gTW9uZXJpdW0gZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgTW9uZXJpdW1Qcm92aWRlciA9ICh7XG4gIGNoaWxkcmVuLFxuICBjbGllbnRJZCxcbiAgcmVkaXJlY3RVcmksXG4gIGVudmlyb25tZW50ID0gJ3NhbmRib3gnLFxuICByZWZyZXNoVG9rZW4sXG4gIG9uUmVmcmVzaFRva2VuVXBkYXRlLFxuICBkZWJ1ZyA9IGZhbHNlLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjbGllbnRJZDogc3RyaW5nO1xuICByZWRpcmVjdFVyaTogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHJlZGlyZWN0VXJpICovXG4gIHJlZGlyZWN0VXJsPzogc3RyaW5nO1xuICBlbnZpcm9ubWVudD86ICdzYW5kYm94JyB8ICdwcm9kdWN0aW9uJztcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICBvblJlZnJlc2hUb2tlblVwZGF0ZT86ICh0b2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICBjb25zdCBbc2RrXSA9IHVzZVN0YXRlKCgpID0+IHtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBTREtcbiAgICByZXR1cm4gbmV3IE1vbmVyaXVtQ2xpZW50KHtcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgY2xpZW50SWQsXG4gICAgICByZWRpcmVjdFVyaSxcbiAgICAgIGRlYnVnOiBkZWJ1ZyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgW2lzQXV0aG9yaXplZCwgc2V0SXNBdXRob3JpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxFcnJvciB8IHVua25vd24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2xvYWRpbmdBdXRoLCBzZXRMb2FkaW5nQXV0aF0gPSB1c2VTdGF0ZSh0cnVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoc2RrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0SXNBdXRob3JpemVkKGF3YWl0IHNkay5nZXRBY2Nlc3MoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBhY2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldExvYWRpbmdBdXRoKGZhbHNlKTtcbiAgICAgICAgICBpZiAoc2RrPy5iZWFyZXJQcm9maWxlKSB7XG4gICAgICAgICAgICBvblJlZnJlc2hUb2tlblVwZGF0ZT8uKHNkay5iZWFyZXJQcm9maWxlLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25uZWN0KCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHNkaykge1xuICAgICAgICBzZGsuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHJlY29ubmVjdCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChzZGspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRJc0F1dGhvcml6ZWQoYXdhaXQgc2RrLmdldEFjY2VzcyhyZWZyZXNoVG9rZW4pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IGFjY2VzczonLCBlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKHNkaz8uYmVhcmVyUHJvZmlsZSkge1xuICAgICAgICAgICAgb25SZWZyZXNoVG9rZW5VcGRhdGU/LihzZGsuYmVhcmVyUHJvZmlsZS5yZWZyZXNoX3Rva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChyZWZyZXNoVG9rZW4gJiYgIWlzQXV0aG9yaXplZCAmJiAhbG9hZGluZ0F1dGgpIHtcbiAgICAgIHJlY29ubmVjdCgpO1xuICAgIH1cbiAgfSwgW3JlZnJlc2hUb2tlbl0pO1xuXG4gIGNvbnN0IGF1dGhvcml6ZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChwYXJhbXM/OiBBdXRob3JpemVQYXJhbXMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzZGspIHtcbiAgICAgICAgICBhd2FpdCBzZGsuYXV0aG9yaXplKHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgYXV0aG9yaXphdGlvbjonLCBlcnIpO1xuICAgICAgICBzZXRFcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Nka11cbiAgKTtcblxuICBjb25zdCByZXZva2VBY2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzZGspIHtcbiAgICAgICAgYXdhaXQgc2RrLnJldm9rZUFjY2VzcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHJldm9raW5nIGFjY2VzczonLCBlcnIpO1xuICAgICAgc2V0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcXVlcnlDbGllbnQuY2xlYXIoKTtcbiAgICAgIHNldElzQXV0aG9yaXplZChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPE1vbmVyaXVtQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgc2RrLFxuICAgICAgICBhdXRob3JpemUsXG4gICAgICAgIGlzQXV0aG9yaXplZCxcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nQXV0aCxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGRpc2Nvbm5lY3Q6IGFzeW5jICgpID0+IHNkaz8uZGlzY29ubmVjdCgpLFxuICAgICAgICByZXZva2VBY2Nlc3M6IGFzeW5jICgpID0+IHJldm9rZUFjY2VzcygpLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Nb25lcml1bUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuIiwiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5LCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5cbmltcG9ydCBNb25lcml1bUNsaWVudCwge1xuICBBZGRyZXNzLFxuICBBZGRyZXNzZXNSZXNwb25zZSxcbiAgQmFsYW5jZXMsXG4gIENoYWluLFxuICBDaGFpbklkLFxuICBDdXJyZW5jeSxcbiAgQ3VycmVuY3lDb2RlLFxuICBJQkFOLFxuICBJQkFOc1Jlc3BvbnNlLFxuICBMaW5rQWRkcmVzcyxcbiAgTGlua2VkQWRkcmVzcyxcbiAgTW92ZUliYW5QYXlsb2FkLFxuICBOZXdPcmRlcixcbiAgT3JkZXIsXG4gIE9yZGVyc1Jlc3BvbnNlLFxuICBPcmRlclN0YXRlLFxuICBwYXJzZUNoYWluLFxuICBQcm9maWxlLFxuICBQcm9maWxlUGVybWlzc2lvbnMsXG4gIFByb2ZpbGVzUmVzcG9uc2UsXG4gIFJlcXVlc3RJYmFuUGF5bG9hZCxcbiAgUmVzcG9uc2VTdGF0dXMsXG4gIFN1Ym1pdFByb2ZpbGVEZXRhaWxzUGF5bG9hZCxcbiAgVG9rZW4sXG59IGZyb20gJ0Btb25lcml1bS9zZGsnO1xuXG5pbXBvcnQgeyBNb25lcml1bUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHtcbiAgTXV0YXRpb25PcHRpb25zLFxuICBNdXRhdGlvblJlc3VsdCxcbiAgUXVlcnlPcHRpb25zLFxuICBVc2VBdXRoUmV0dXJuLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFF1ZXJ5IGtleXMgZm9yIFJlYWN0IHF1ZXJ5XG4gKiAqL1xuZXhwb3J0IGNvbnN0IGtleXMgPSB7XG4gIGdldEFsbDogWydtb25lcml1bSddLFxuICBnZXRQcm9maWxlOiAocHJvZmlsZTogc3RyaW5nKSA9PiBbXG4gICAgJ21vbmVyaXVtJyxcbiAgICAncHJvZmlsZScsXG4gICAgLi4uKHByb2ZpbGUgPyBbcHJvZmlsZV0gOiBbXSksXG4gIF0sXG4gIGdldFByb2ZpbGVzOiBbJ21vbmVyaXVtJywgJ3Byb2ZpbGVzJ10sXG4gIGdldEFkZHJlc3M6IChhZGRyZXNzOiBzdHJpbmcpID0+IFsnbW9uZXJpdW0nLCAnYWRkcmVzcycsIFthZGRyZXNzXV0sXG4gIGdldEFkZHJlc3NlczogKGZpbHRlcj86IHVua25vd24pID0+IFtcbiAgICAnbW9uZXJpdW0nLFxuICAgICdhZGRyZXNzZXMnLFxuICAgIC4uLihmaWx0ZXIgPyBbZmlsdGVyXSA6IFtdKSxcbiAgXSxcbiAgZ2V0QmFsYW5jZXM6IChcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgY2hhaW46IENoYWluLFxuICAgIGN1cnJlbmNpZXM/OiBDdXJyZW5jeUNvZGUgfCBDdXJyZW5jeUNvZGVbXVxuICApID0+IFtcbiAgICAnbW9uZXJpdW0nLFxuICAgICdiYWxhbmNlcycsXG4gICAgYWRkcmVzcyxcbiAgICBjaGFpbixcbiAgICAuLi4oY3VycmVuY2llcyA/IFsuLi5jdXJyZW5jaWVzXSA6IFtdKSxcbiAgXSxcbiAgZ2V0SWJhbjogKGliYW46IHN0cmluZykgPT4gWydtb25lcml1bScsICdpYmFuJywgaWJhbl0sXG4gIGdldEliYW5zOiAoZmlsdGVyPzogdW5rbm93bikgPT4gW1xuICAgICdtb25lcml1bScsXG4gICAgJ2liYW5zJyxcbiAgICAuLi4oZmlsdGVyID8gW2ZpbHRlcl0gOiBbXSksXG4gIF0sXG4gIGdldFRva2VuczogWydtb25lcml1bScsICd0b2tlbnMnXSxcbiAgZ2V0T3JkZXI6IChvcmRlcklkOiBzdHJpbmcpID0+IFsnbW9uZXJpdW0nLCAnb3JkZXInLCBvcmRlcklkXSxcbiAgZ2V0T3JkZXJzOiAoZmlsdGVyPzogdW5rbm93bikgPT4gW1xuICAgICdtb25lcml1bScsXG4gICAgJ29yZGVycycsXG4gICAgLi4uKGZpbHRlciA/IFtmaWx0ZXJdIDogW10pLFxuICBdLFxuICBzdWJtaXRQcm9maWxlRGV0YWlsczogWydtb25lcml1bScsICdzdWJtaXQtcHJvZmlsZS1kZXRhaWxzJ10sXG4gIG1vdmVJYmFuOiBbJ21vbmVyaXVtJywgJ21vdmUtaWJhbiddLFxuICByZXF1ZXN0SWJhbjogWydtb25lcml1bScsICdyZXF1ZXN0LWliYW4nXSxcbiAgcGxhY2VPcmRlcjogWydtb25lcml1bScsICdwbGFjZS1vcmRlciddLFxuICBsaW5rQWRkcmVzczogWydtb25lcml1bScsICdsaW5rLWFkZHJlc3MnXSxcbn07XG5cbi8qKiBJbnRlcm5hbCBob29rIHRvIHVzZSBTREsgKi9cbmZ1bmN0aW9uIHVzZVNkaygpOiBNb25lcml1bUNsaWVudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1vbmVyaXVtQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVNkayBtdXN0IGJlIHVzZWQgd2l0aGluIGEgTW9uZXJpdW1Qcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0Py5zZGs7XG59XG5cbi8qKlxuICogIyBSZWRpcmVjdCB0byB0aGUgTW9uZXJpdW0gYXV0aCBmbG93LlxuICogQGdyb3VwIEhvb2tzXG4gKiBAY2F0ZWdvcnkgQXV0aGVudGljYXRpb25cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgeyBhdXRob3JpemUsIGlzQXV0aG9yaXplZCwgaXNMb2FkaW5nLCBlcnJvciB9ID0gdXNlQXV0aCgpO1xuICpcbiAqIGF1dGhvcml6ZSgpOyAvLyBSZWRpcmVjdHMgdG8gdGhlIE1vbmVyaXVtIGF1dGggZmxvdy5cbiAqXG4gKiAvLyBPcHQtaW4gdG8gYXV0b21hdGVkIHdhbGxldCBsaW5raW5nIHdpdGggdGhlc2UgcGFyYW1ldGVycy5cbiAqIGF1dGhvcml6ZSh7IGFkZHJlc3MsIHNpZ25hdHVyZSwgY2hhaW4gfSkuXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7VXNlQXV0aFJldHVybn1cbiAqIC0gYGF1dGhvcml6ZWAgIC0gUmVkaXJlY3RzIHRvIHRoZSBNb25lcml1bSBhdXRoIGZsb3cuXG4gKiAtIGBpc0F1dGhvcml6ZWRgIC0gV2hldGhlciB0aGUgdXNlciBpcyBhdXRob3JpemVkLlxuICogLSBgaXNMb2FkaW5nYCAtIFdoZXRoZXIgdGhlIGF1dGggZmxvdyBpcyBsb2FkaW5nLlxuICogLSBgZXJyb3JgIC0gRXJyb3IgbWVzc2FnZSBpZiB0aGUgYXV0aCBmbG93IGZhaWxzLlxuICogLSBgZGlzY29ubmVjdGAgLSBEaXNjb25uZWN0IHRoZSB1c2VyLlxuICogLSBgcmV2b2tlQWNjZXNzYCAtIFJldm9rZSB0aGUgdXNlcidzIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dGgoKTogVXNlQXV0aFJldHVybiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1vbmVyaXVtQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGggbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE1vbmVyaXVtUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlzQXV0aG9yaXplZDogY29udGV4dC5pc0F1dGhvcml6ZWQsXG4gICAgYXV0aG9yaXplOiBjb250ZXh0LmF1dGhvcml6ZSxcbiAgICBpc0xvYWRpbmc6IGNvbnRleHQuaXNMb2FkaW5nLFxuICAgIGVycm9yOiBjb250ZXh0LmVycm9yLFxuICAgIGRpc2Nvbm5lY3Q6IGNvbnRleHQuZGlzY29ubmVjdCxcbiAgICByZXZva2VBY2Nlc3M6IGNvbnRleHQucmV2b2tlQWNjZXNzLFxuICB9O1xufVxuXG4vKipcbiAqIElmIG5vIGBwcm9maWxlYCBpZCBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgcHJvZmlsZSBpcyB1c2VkLlxuICogQGdyb3VwIEhvb2tzXG4gKiBAY2F0ZWdvcnkgUHJvZmlsZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGRhdGFcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlUHJvZmlsZSgpO1xuICogYGBgXG5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzI29wZXJhdGlvbi9wcm9maWxlIHwgQVBJIERvY3VtZW50YXRpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlKHtcbiAgcHJvZmlsZSxcbiAgcXVlcnksXG59OiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHByb2ZpbGUgKi9cbiAgcHJvZmlsZT86IHN0cmluZztcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPFByb2ZpbGU+O1xufSA9IHt9KSB7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuXG4gIGNvbnN0IHsgZGF0YSB9ID0gdXNlUHJvZmlsZXMoKTtcblxuICBjb25zdCBwcm9maWxlVG9Vc2UgPSBwcm9maWxlIHx8IChkYXRhPy5wcm9maWxlcz8uWzBdPy5pZCBhcyBzdHJpbmcpO1xuXG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgLi4ucXVlcnksXG4gICAgcXVlcnlLZXk6IGtleXMuZ2V0UHJvZmlsZShwcm9maWxlVG9Vc2UpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXByb2ZpbGVUb1VzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2ZpbGUgSWQgaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNkay5nZXRQcm9maWxlKHByb2ZpbGVUb1VzZSk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKFxuICAgICAgc2RrICYmIGlzQXV0aG9yaXplZCAmJiBwcm9maWxlVG9Vc2UgJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpXG4gICAgKSxcbiAgfSk7XG59XG4vKipcbiAqICMgR2V0IHByb2ZpbGVzXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBjYXRlZ29yeSBQcm9maWxlc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgZGF0YSxcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlUHJvZmlsZXMoKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL3Byb2ZpbGVzIHwgQVBJIERvY3VtZW50YXRpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlcyh7XG4gIHF1ZXJ5LFxufToge1xuICAvKioge0Bpbmhlcml0RG9jIFF1ZXJ5T3B0aW9uc30gKi9cbiAgcXVlcnk/OiBRdWVyeU9wdGlvbnM8UHJvZmlsZXNSZXNwb25zZT47XG59ID0ge30pIHtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRQcm9maWxlcyxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNkay5nZXRQcm9maWxlcygpO1xuICAgIH0sXG4gICAgZW5hYmxlZDogQm9vbGVhbihzZGsgJiYgaXNBdXRob3JpemVkICYmIChxdWVyeT8uZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xufVxuLyoqXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgZGF0YSxcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlVG9rZW5zKCk7XG4gKiBgYGBcblxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL3Rva2VucyB8IEFQSSBEb2N1bWVudGF0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5zKHtcbiAgcXVlcnksXG59OiB7XG4gIC8qKiB7QGluaGVyaXREb2MgUXVlcnlPcHRpb25zfSAqL1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxUb2tlbltdPjtcbn0gPSB7fSkge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRUb2tlbnMsXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZGsuZ2V0VG9rZW5zKCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG59XG5cbi8qKlxuICogQGdyb3VwIEhvb2tzXG4gKiBAY2F0ZWdvcnkgQWRkcmVzc2VzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFxuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGRhdGEsXG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZUFkZHJlc3MoKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3MtdjIjdGFnL2FkZHJlc3Nlcy9vcGVyYXRpb24vYWRkcmVzcyB8IEFQSSBEb2N1bWVudGF0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWRkcmVzcyh7XG4gIGFkZHJlc3MsXG4gIHF1ZXJ5ID0ge30sXG59OiB7XG4gIC8qKiBGZXRjaCBhIHNwZWNpZmljIGFkZHJlc3MuICovXG4gIGFkZHJlc3M6IHN0cmluZztcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPEFkZHJlc3M+O1xufSkge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIC4uLnF1ZXJ5LFxuICAgIHF1ZXJ5S2V5OiBrZXlzLmdldEFkZHJlc3MoYWRkcmVzcyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWRkcmVzcyBpcyByZXF1aXJlZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2RrLmdldEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKFxuICAgICAgc2RrICYmIGlzQXV0aG9yaXplZCAmJiBhZGRyZXNzICYmIChxdWVyeT8uZW5hYmxlZCA/PyB0cnVlKVxuICAgICksXG4gIH0pO1xufVxuLyoqXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBjYXRlZ29yeSBBZGRyZXNzZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMucHJvZmlsZV0gRmlsdGVyIGJhc2VkIG9uIHByb2ZpbGUgaWQuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5jaGFpbl0gRmlsdGVyIGJhc2VkIG9uIGNoYWluIC0gQ1VSUkVOVExZIFJFVFVSTlMgQU4gRVJST1IuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGRhdGEsXG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZUFkZHJlc3NlcygpO1xuICogYGBgXG4gKiBAc2VlIHtAbGluayBodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcy12MiN0YWcvYWRkcmVzc2VzL29wZXJhdGlvbi9hZGRyZXNzZXMgfCBBUEkgRG9jdW1lbnRhdGlvbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkZHJlc3Nlcyh7XG4gIHByb2ZpbGUsXG4gIGNoYWluLFxuICBxdWVyeSA9IHt9LFxufToge1xuICBwcm9maWxlPzogc3RyaW5nO1xuICBjaGFpbj86IENoYWluIHwgQ2hhaW5JZDtcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPEFkZHJlc3Nlc1Jlc3BvbnNlPjtcbn0gPSB7fSkge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcblxuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuXG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgLi4ucXVlcnksXG4gICAgcXVlcnlLZXk6IGtleXMuZ2V0QWRkcmVzc2VzKHtcbiAgICAgIHByb2ZpbGUsXG4gICAgICBjaGFpbjogY2hhaW4gPyBwYXJzZUNoYWluKGNoYWluKSA6IHVuZGVmaW5lZCxcbiAgICB9KSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNkay5nZXRBZGRyZXNzZXMoeyBwcm9maWxlLCBjaGFpbiB9KTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IEJvb2xlYW4oc2RrICYmIGlzQXV0aG9yaXplZCAmJiAocXVlcnk/LmVuYWJsZWQgPz8gdHJ1ZSkpLFxuICB9KTtcbn1cbi8qKlxuICogIyBHZXQgYmFsYW5jZSBmb3IgYSBhbiBhZGRyZXNzIG9uIGEgZ2l2ZSBjaGFpblxuICogQGdyb3VwIEhvb2tzXG4gKiBAY2F0ZWdvcnkgQWRkcmVzc2VzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxCYWxhbmNlcz59IHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGZldGNoIHRoZSBiYWxhbmNlIGZvci5cbiAqIEBwYXJhbSB7UXVlcnlPcHRpb25zPEJhbGFuY2VzPn0gcGFyYW1zLmNoYWluIFRoZSBjaGFpbiB0byBmZXRjaCB0aGUgYmFsYW5jZSBmb3IuXG4gKiBAcGFyYW0ge1F1ZXJ5T3B0aW9uczxCYWxhbmNlcz59IFtwYXJhbXMuY3VycmVuY2llc10gT25lIG9yIG1hbnk6IGBldXJgLCBgdXNkYCwgYGdicGAsIGBpc2tgXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGRhdGEsXG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZUJhbGFuY2VzKCk7XG4gKiBgYGBcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzL3YyI3RhZy9hZGRyZXNzZXMvb3BlcmF0aW9uL2JhbGFuY2VzIHwgQVBJIERvY3VtZW50YXRpb259XG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQmFsYW5jZXMoe1xuICBhZGRyZXNzLFxuICBjaGFpbixcbiAgY3VycmVuY2llcyxcbiAgcXVlcnksXG59OiB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY2hhaW46IENoYWluIHwgQ2hhaW5JZDtcbiAgY3VycmVuY2llcz86IEN1cnJlbmN5IHwgQ3VycmVuY3lbXTtcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPEJhbGFuY2VzPjtcbn0pIHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICAuLi5xdWVyeSxcbiAgICBxdWVyeUtleToga2V5cy5nZXRCYWxhbmNlcyhhZGRyZXNzLCBwYXJzZUNoYWluKGNoYWluKSwgY3VycmVuY2llcyksXG4gICAgc3RhbGVUaW1lOiAxMDAwICogNjAgKiA1LFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2RrLmdldEJhbGFuY2VzKGFkZHJlc3MsIGNoYWluLCBjdXJyZW5jaWVzKTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IEJvb2xlYW4oc2RrICYmIGlzQXV0aG9yaXplZCAmJiAocXVlcnk/LmVuYWJsZWQgPz8gdHJ1ZSkpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBjYXRlZ29yeSBJQkFOc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBkYXRhLFxuICogICAgaXNMb2FkaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgcmVmZXRjaCxcbiAqICAgIC4uLm1vcmVVc2VRdWVyeVJlc3VsdHNcbiAqIH0gPSB1c2VJQkFOKCk7XG4gKiBgYGBcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzLXYyI3RhZy9pYmFucy9vcGVyYXRpb24vaWJhbiB8IEFQSSBEb2N1bWVudGF0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSUJBTih7XG4gIGliYW4sXG4gIHF1ZXJ5LFxufToge1xuICAvKiogRmV0Y2ggYSBzcGVjaWZpYyBJQkFOICovXG4gIGliYW46IHN0cmluZztcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPElCQU4+O1xufSkge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIC4uLnF1ZXJ5LFxuICAgIHF1ZXJ5S2V5OiBrZXlzLmdldEliYW4oaWJhbiksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNkay5nZXRJYmFuKGliYW4pO1xuICAgIH0sXG4gICAgZW5hYmxlZDogQm9vbGVhbihzZGsgJiYgaXNBdXRob3JpemVkICYmIGliYW4gJiYgKHF1ZXJ5Py5lbmFibGVkID8/IHRydWUpKSxcbiAgfSk7XG59XG4vKipcbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IElCQU5zXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gTm8gcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgZGF0YSxcbiAqICAgIGlzTG9hZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHJlZmV0Y2gsXG4gKiAgICAuLi5tb3JlVXNlUXVlcnlSZXN1bHRzXG4gKiB9ID0gdXNlSUJBTnMoKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3MtdjIjdGFnL2liYW5zL29wZXJhdGlvbi9pYmFucyB8IEFQSSBEb2N1bWVudGF0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSUJBTnMoe1xuICBwcm9maWxlLFxuICBjaGFpbixcbiAgcXVlcnkgPSB7fSxcbn06IHtcbiAgLyoqIEZldGNoIElCQU5zIGZvciBhIHNwZWNpZmljIHByb2ZpbGUuICovXG4gIHByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKiBGZXRjaCBJQkFOcyBmb3IgYSBzcGVjaWZpYyBjaGFpbi4gKi9cbiAgY2hhaW4/OiBDaGFpbiB8IENoYWluSWQ7XG4gIC8qKiB7QGluaGVyaXREb2MgUXVlcnlPcHRpb25zfSAqL1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxJQkFOc1Jlc3BvbnNlPjtcbn0gPSB7fSkge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIC4uLnF1ZXJ5LFxuICAgIHF1ZXJ5S2V5OiBrZXlzLmdldEliYW5zKHsgcHJvZmlsZSwgY2hhaW4gfSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNkay5nZXRJYmFucyh7IHByb2ZpbGUsIGNoYWluIH0pO1xuICAgIH0sXG4gICAgZW5hYmxlZDogQm9vbGVhbihzZGsgJiYgaXNBdXRob3JpemVkICYmIChxdWVyeT8uZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xufVxuXG4vKipcbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IE9yZGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBkYXRhLFxuICogICAgaXNMb2FkaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgcmVmZXRjaCxcbiAqICAgIC4uLm1vcmVVc2VRdWVyeVJlc3VsdHNcbiAqIH0gPSB1c2VPcmRlcigpO1xuICogYGBgXG4gKiBAc2VlIHtAbGluayBodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vb3JkZXJ8IEFQSSBEb2N1bWVudGF0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3JkZXIoe1xuICBvcmRlcklkLFxuICBxdWVyeSA9IHt9LFxufToge1xuICAvKiogIFRoZSBpZCBvZiB0aGUgb3JkZXIuICovXG4gIG9yZGVySWQ6IHN0cmluZztcbiAgLyoqIHtAaW5oZXJpdERvYyBRdWVyeU9wdGlvbnN9ICovXG4gIHF1ZXJ5PzogUXVlcnlPcHRpb25zPE9yZGVyPjtcbn0pIHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgLi4ucXVlcnksXG4gICAgcXVlcnlLZXk6IGtleXMuZ2V0T3JkZXIob3JkZXJJZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3JkZXJJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09yZGVyIGlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZGsuZ2V0T3JkZXIob3JkZXJJZCk7XG4gICAgfSxcbiAgICBlbmFibGVkOiBCb29sZWFuKHNkayAmJiBpc0F1dGhvcml6ZWQgJiYgb3JkZXJJZCAmJiAocXVlcnkuZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xufVxuXG4vKipcbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IE9yZGVyc1xuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIE5vIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5hZGRyZXNzXSBGaWx0ZXIgYmFzZWQgb24gdGhlIGJsb2NrY2hhaW4gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9yZGVyLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMubWVtb10gRmlsdGVyIGJ5IHRoZSBwYXltZW50IG1lbW8vcmVmZXJlbmNlLi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLnByb2ZpbGVdIEZpbHRlciBiYXNlZCBvbiB0aGUgcHJvZmlsZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yZGVyLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuc3RhdGVdIEZpbHRlciBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIG9yZGVyLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMudHhIYXNoXSBGaWx0ZXIgYmFzZWQgb24gdGhlIGJsb2NrY2hhaW4gdHJhbnNhY3Rpb24gaGFzaC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIGRhdGEsXG4gKiAgICBpc0xvYWRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICByZWZldGNoLFxuICogICAgLi4ubW9yZVVzZVF1ZXJ5UmVzdWx0c1xuICogfSA9IHVzZU9yZGVycygpO1xuICogYGBgXG4gKiBAc2VlIHtAbGluayBodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcyNvcGVyYXRpb24vb3JkZXJzIHwgQVBJIERvY3VtZW50YXRpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcmRlcnMoe1xuICBxdWVyeSA9IHt9LFxuICAuLi5maWx0ZXJzXG59OiB7XG4gIC8qKiB7QGluaGVyaXREb2MgUXVlcnlPcHRpb25zfSAqL1xuICBxdWVyeT86IFF1ZXJ5T3B0aW9uczxPcmRlcnNSZXNwb25zZT47XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHR4SGFzaD86IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgc3RhdGU/OiBPcmRlclN0YXRlO1xufSA9IHt9KSB7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIC4uLnF1ZXJ5LFxuICAgIHF1ZXJ5S2V5OiBrZXlzLmdldE9yZGVycyhmaWx0ZXJzKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2RrLmdldE9yZGVycyhmaWx0ZXJzKTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IEJvb2xlYW4oc2RrICYmIGlzQXV0aG9yaXplZCAmJiAocXVlcnkuZW5hYmxlZCA/PyB0cnVlKSksXG4gIH0pO1xufVxuXG4vKipcbiAqIFN1Ym1pdCB0aGUgcmVxdWlyZWQgY29tcGxpYW5jZSBpbmZvcm1hdGlvbiB0byBvbmJvYXJkIHRoZSBjdXN0b21lci5cbiAqXG4gKiBOb3RlIHRoYXQgeW91IHdvbid0IGJlIGFibGUgdG8gY2hhbmdlIHRoZSBwcm9maWxlIFwia2luZFwiIGZyb20gcGVyc29uYWwgdG8gY29ycG9yYXRlIG9yIHZpY2UgdmVyc2Egb25jZSB0aGUgcHJvZmlsZSBoYXMgYmVlbiBhcHByb3ZlZC5cbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IFByb2ZpbGVzXG4gKiBAcGFyYW0gcGFyYW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbS5wcm9maWxlIFRoZSBpZCBvZiB0aGUgcHJvZmlsZSB0byBzdWJtaXQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBzdWJtaXRQcm9maWxlRGV0YWlscywgLy8gdXNlTXV0YXRpb24ncyBgbXV0YXRlQXN5bmNgIHByb3BlcnR5XG4gKiAgICBpc1BlbmRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICBzdGF0dXMsXG4gKiAgICAuLi5tb3JlVXNlTXV0YXRpb25SZXN1bHRzXG4gKiB9ID0gdXNlU3VibWl0UHJvZmlsZURldGFpbHMoKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3MtdjIjdGFnL3Byb2ZpbGVzL29wZXJhdGlvbi9wcm9maWxlLWRldGFpbHMgfCBBUEkgRG9jdW1lbnRhdGlvbn19XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN1Ym1pdFByb2ZpbGVEZXRhaWxzKHtcbiAgcHJvZmlsZSxcbiAgbXV0YXRpb24gPSB7fSxcbn06IHtcbiAgcHJvZmlsZTogc3RyaW5nO1xuICAvKioge0Bpbmhlcml0RG9jIE11dGF0aW9uT3B0aW9uc30gKi9cbiAgbXV0YXRpb24/OiBNdXRhdGlvbk9wdGlvbnM8XG4gICAgUmVzcG9uc2VTdGF0dXMsXG4gICAgRXJyb3IsXG4gICAgU3VibWl0UHJvZmlsZURldGFpbHNQYXlsb2FkXG4gID47XG59KTogTXV0YXRpb25SZXN1bHQ8XG4gICdzdWJtaXRQcm9maWxlRGV0YWlscycsXG4gIFJlc3BvbnNlU3RhdHVzLFxuICBFcnJvcixcbiAgU3VibWl0UHJvZmlsZURldGFpbHNQYXlsb2FkXG4+IHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICBjb25zdCB7IG11dGF0ZUFzeW5jLCAuLi5yZXN0IH0gPSB1c2VNdXRhdGlvbih7XG4gICAgLi4ubXV0YXRpb24sXG4gICAgbXV0YXRpb25LZXk6IGtleXMuc3VibWl0UHJvZmlsZURldGFpbHMsXG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGJvZHk6IFN1Ym1pdFByb2ZpbGVEZXRhaWxzUGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNkay5zdWJtaXRQcm9maWxlRGV0YWlscyhwcm9maWxlLCBib2R5KTtcbiAgICB9LFxuICAgIG9uU3VjY2VzcyhkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpIHtcbiAgICAgIC8vIFJlZmV0Y2ggYWxsIG9yZGVycyBvbiBzdWNjZXNzLlxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICBxdWVyeUtleToga2V5cy5nZXRQcm9maWxlKHByb2ZpbGUpLFxuICAgICAgfSk7XG4gICAgICAvLyBBbGxvdyB0aGUgY2FsbGVyIHRvIGFkZCBjdXN0b20gbG9naWMgb24gc3VjY2Vzcy5cbiAgICAgIG11dGF0aW9uPy5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpO1xuICAgIH0sXG4gICAgb25FcnJvcihlcnJvciwgdmFycywgY29udGV4dCkge1xuICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBhZGQgY3VzdG9tIGxvZ2ljIG9uIGVycm9yLlxuICAgICAgbXV0YXRpb24/Lm9uRXJyb3I/LihlcnJvciwgdmFycywgY29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBzdWJtaXRQcm9maWxlRGV0YWlsczogbXV0YXRlQXN5bmMsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuIElCQU4gZm9yIGEgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIGNoYWluLlxuICogQWxsIGluY29taW5nIEVVUiBwYXltZW50cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcm91dGVkIHRvIHRoZSBsaW5rZWQgYWRkcmVzcyBvbiB0aGF0IGNoYWluLlxuICogQW55IGxpbmtlZCBhZGRyZXNzIGNhbiB1c2UgdGhpcyBJQkFOIGZvciBvdXRnb2luZyBwYXltZW50cy5cbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IElCQU5zXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gTm8gcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHtcbiAqICAgIHJlcXVlc3RJYmFuLCAvLyB1c2VNdXRhdGlvbidzIGBtdXRhdGVBc3luY2AgcHJvcGVydHlcbiAqICAgIGlzUGVuZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHN0YXR1cyxcbiAqICAgIC4uLm1vcmVVc2VNdXRhdGlvblJlc3VsdHNcbiAqIH0gPSB1c2VSZXF1ZXN0SWJhbigpO1xuICogYGBgXG4gKiBAc2VlIHtAbGluayBodHRwczovL21vbmVyaXVtLmRldi9hcGktZG9jcy12MiN0YWcvaWJhbnMvb3BlcmF0aW9uL3JlcXVlc3QtaWJhbiB8IEFQSSBEb2N1bWVudGF0aW9ufX1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVxdWVzdEliYW4oe1xuICBtdXRhdGlvbiA9IHt9LFxufToge1xuICAvKioge0Bpbmhlcml0RG9jIE11dGF0aW9uT3B0aW9uc30gKi9cbiAgbXV0YXRpb24/OiBNdXRhdGlvbk9wdGlvbnM8UmVzcG9uc2VTdGF0dXMsIEVycm9yLCBSZXF1ZXN0SWJhblBheWxvYWQ+O1xufSA9IHt9KTogTXV0YXRpb25SZXN1bHQ8XG4gICdyZXF1ZXN0SWJhbicsXG4gIFJlc3BvbnNlU3RhdHVzLFxuICBFcnJvcixcbiAgUmVxdWVzdEliYW5QYXlsb2FkXG4+IHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG5cbiAgY29uc3QgeyBtdXRhdGVBc3luYywgLi4ucmVzdCB9ID0gdXNlTXV0YXRpb24oe1xuICAgIC4uLm11dGF0aW9uLFxuICAgIG11dGF0aW9uS2V5OiBrZXlzLnJlcXVlc3RJYmFuLFxuICAgIG11dGF0aW9uRm46IGFzeW5jICh7XG4gICAgICBhZGRyZXNzLFxuICAgICAgY2hhaW4sXG4gICAgICBlbWFpbE5vdGlmaWNhdGlvbnMsXG4gICAgfTogUmVxdWVzdEliYW5QYXlsb2FkKSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2RrLnJlcXVlc3RJYmFuKHsgYWRkcmVzcywgY2hhaW4sIGVtYWlsTm90aWZpY2F0aW9ucyB9KTtcbiAgICB9LFxuICAgIG9uU3VjY2VzcyhkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBjYWxsZXIgdG8gYWRkIGN1c3RvbSBsb2dpYyBvbiBzdWNjZXNzLlxuICAgICAgbXV0YXRpb24/Lm9uU3VjY2Vzcz8uKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCk7XG4gICAgfSxcbiAgICBvbkVycm9yKGVycm9yLCB2YXJzLCBjb250ZXh0KSB7XG4gICAgICAvLyBBbGxvdyB0aGUgY2FsbGVyIHRvIGFkZCBjdXN0b20gbG9naWMgb24gZXJyb3IuXG4gICAgICBtdXRhdGlvbj8ub25FcnJvcj8uKGVycm9yLCB2YXJzLCBjb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RJYmFuOiBtdXRhdGVBc3luYyxcbiAgICAuLi5yZXN0LFxuICB9O1xufVxuLyoqXG4gKiBNb3ZlIGFuIGV4aXN0aW5nIElCQU4gdG8gYSBzcGVjaWZpZWQgYWRkcmVzcyBhbiBjaGFpbi5cbiAqIEFsbCBpbmNvbWluZyBFVVIgcGF5bWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJvdXRlZCB0byB0aGUgYWRkcmVzcyBvbiB0aGF0IGNoYWluLlxuICogQGdyb3VwIEhvb2tzXG4gKiBAY2F0ZWdvcnkgSUJBTnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBObyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qge1xuICogICAgbW92ZUliYW4sIC8vIHVzZU11dGF0aW9uJ3MgYG11dGF0ZUFzeW5jYCBwcm9wZXJ0eVxuICogICAgaXNQZW5kaW5nLFxuICogICAgaXNFcnJvcixcbiAqICAgIGVycm9yLFxuICogICAgc3RhdHVzLFxuICogICAgLi4ubW9yZVVzZU11dGF0aW9uUmVzdWx0c1xuICogfSA9IHVzZU1vdmVJYmFuKCk7XG4gKiBgYGBcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzL3YyI3RhZy9pYmFucy9vcGVyYXRpb24vbW92ZS1pYmFuIHwgQVBJIERvY3VtZW50YXRpb259XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU1vdmVJYmFuKHtcbiAgbXV0YXRpb24gPSB7fSxcbn06IHtcbiAgLyoqIHtAaW5oZXJpdERvYyBNdXRhdGlvbk9wdGlvbnN9ICovXG4gIG11dGF0aW9uPzogTXV0YXRpb25PcHRpb25zPFxuICAgIFJlc3BvbnNlU3RhdHVzLFxuICAgIEVycm9yLFxuICAgIE1vdmVJYmFuUGF5bG9hZCAmIHsgaWJhbjogc3RyaW5nIH1cbiAgPjtcbn0gPSB7fSk6IE11dGF0aW9uUmVzdWx0PFxuICAnbW92ZUliYW4nLFxuICBSZXNwb25zZVN0YXR1cyxcbiAgRXJyb3IsXG4gIE1vdmVJYmFuUGF5bG9hZCAmIHsgaWJhbjogc3RyaW5nIH1cbj4ge1xuICBjb25zdCBzZGsgPSB1c2VTZGsoKTtcbiAgY29uc3QgeyBpc0F1dGhvcml6ZWQgfSA9IHVzZUF1dGgoKTtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIGNvbnN0IHsgbXV0YXRlQXN5bmMsIC4uLnJlc3QgfSA9IHVzZU11dGF0aW9uKHtcbiAgICAuLi5tdXRhdGlvbixcbiAgICBtdXRhdGlvbktleToga2V5cy5tb3ZlSWJhbixcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoe1xuICAgICAgaWJhbixcbiAgICAgIGFkZHJlc3MsXG4gICAgICBjaGFpbixcbiAgICB9OiBNb3ZlSWJhblBheWxvYWQgJiB7IGliYW46IHN0cmluZyB9KSA9PiB7XG4gICAgICBpZiAoIXNkaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNESyBpbnN0YW5jZSBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdXRob3JpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2RrLm1vdmVJYmFuKGliYW4sIHsgYWRkcmVzcywgY2hhaW4gfSk7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3MoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSB7XG4gICAgICAvLyBSZWZldGNoIGFsbCBvcmRlcnMgb24gc3VjY2Vzcy5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgcXVlcnlLZXk6IGtleXMuZ2V0SWJhbih2YXJpYWJsZXMuaWJhbiksXG4gICAgICB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgcXVlcnlLZXk6IGtleXMuZ2V0SWJhbnMoKSxcbiAgICAgIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICBxdWVyeUtleToga2V5cy5nZXRBZGRyZXNzKHZhcmlhYmxlcy5hZGRyZXNzKSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBhZGQgY3VzdG9tIGxvZ2ljIG9uIHN1Y2Nlc3MuXG4gICAgICBtdXRhdGlvbj8ub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KTtcbiAgICB9LFxuICAgIG9uRXJyb3IoZXJyb3IsIHZhcnMsIGNvbnRleHQpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBjYWxsZXIgdG8gYWRkIGN1c3RvbSBsb2dpYyBvbiBlcnJvci5cbiAgICAgIG11dGF0aW9uPy5vbkVycm9yPy4oZXJyb3IsIHZhcnMsIGNvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbW92ZUliYW46IG11dGF0ZUFzeW5jLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG4vKipcbiAqIFdoZW4gdGhlIG9yZGVyIGhhcyBiZWVuIHBsYWNlZCwgdGhlIG9yZGVycyBxdWVyeSB3aWxsIGJlIGludmFsaWRhdGVkIGFuZCByZS1mZXRjaGVkLlxuICpcbiAqIElmIHRoZSBvcmRlciBhbW91bnQgaXMgYWJvdmUgMTUwMDAsIGEgc3VwcG9ydGluZyBkb2N1bWVudCBpcyByZXF1aXJlZC5cbiAqIEBncm91cCBIb29rc1xuICogQGNhdGVnb3J5IE9yZGVyc1xuICogQHBhcmFtIHBhcmFtXG4gKiBAcGFyYW0ge0ZpbGV9IHBhcmFtLnN1cHBvcnRpbmdEb2N1bWVudCBTdXBwb3J0aW5nIGRvY3VtZW50IGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBwbGFjZU9yZGVyLCAvLyB1c2VNdXRhdGlvbidzIGBtdXRhdGVBc3luY2AgcHJvcGVydHlcbiAqICAgIGlzUGVuZGluZyxcbiAqICAgIGlzRXJyb3IsXG4gKiAgICBlcnJvcixcbiAqICAgIHN0YXR1cyxcbiAqICAgIC4uLm1vcmVVc2VNdXRhdGlvblJlc3VsdHNcbiAqIH0gPSB1c2VQbGFjZU9yZGVyKCk7XG4gKiBgYGBcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uZXJpdW0uZGV2L2FwaS1kb2NzI29wZXJhdGlvbi9wb3N0LW9yZGVyc3wgQVBJIERvY3VtZW50YXRpb259XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYWNlT3JkZXIoe1xuICBzdXBwb3J0aW5nRG9jdW1lbnQsXG4gIG11dGF0aW9uLFxufToge1xuICBzdXBwb3J0aW5nRG9jdW1lbnQ/OiBGaWxlO1xuICAvKioge0Bpbmhlcml0RG9jIE11dGF0aW9uT3B0aW9uc30gKi9cbiAgbXV0YXRpb24/OiBNdXRhdGlvbk9wdGlvbnM8T3JkZXIsIEVycm9yLCBOZXdPcmRlcj47XG59ID0ge30pOiBNdXRhdGlvblJlc3VsdDwncGxhY2VPcmRlcicsIE9yZGVyLCBFcnJvciwgTmV3T3JkZXI+IHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG4gIGNvbnN0IHsgaXNBdXRob3JpemVkIH0gPSB1c2VBdXRoKCk7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICBjb25zdCB7IG11dGF0ZUFzeW5jLCAuLi5yZXN0IH0gPSB1c2VNdXRhdGlvbih7XG4gICAgLi4ubXV0YXRpb24sXG4gICAgbXV0YXRpb25LZXk6IGtleXMucGxhY2VPcmRlcixcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoYm9keTogTmV3T3JkZXIpID0+IHtcbiAgICAgIGlmICghc2RrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU0RLIGluc3RhbmNlIGF2YWlsYWJsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgZG9jdW1lbnRJZDtcbiAgICAgIGlmIChwYXJzZUludChib2R5LmFtb3VudCkgPiAxNTAwMCkge1xuICAgICAgICBpZiAoIXN1cHBvcnRpbmdEb2N1bWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdXBwb3J0aW5nIGRvY3VtZW50IGlzIHJlcXVpcmVkIGZvciBvcmRlcnMgYWJvdmUgMTUwMDAnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGxvYWRlZERvY3VtZW50ID1cbiAgICAgICAgICBhd2FpdCBzZGsudXBsb2FkU3VwcG9ydGluZ0RvY3VtZW50KHN1cHBvcnRpbmdEb2N1bWVudCk7XG4gICAgICAgIGRvY3VtZW50SWQgPSB1cGxvYWRlZERvY3VtZW50LmlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdCb2R5ID0ge1xuICAgICAgICAuLi5ib2R5LFxuICAgICAgICBkb2N1bWVudElkOiBkb2N1bWVudElkLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNkay5wbGFjZU9yZGVyKG5ld0JvZHkpO1xuICAgIH0sXG4gICAgb25TdWNjZXNzKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkge1xuICAgICAgLy8gUmVmZXRjaCBhbGwgb3JkZXJzIG9uIHN1Y2Nlc3MuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgIHF1ZXJ5S2V5OiBrZXlzLmdldE9yZGVycygpLFxuICAgICAgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgIHF1ZXJ5S2V5OiBrZXlzLmdldEJhbGFuY2VzKGRhdGEuYWRkcmVzcywgZGF0YS5jaGFpbiksXG4gICAgICB9KTtcbiAgICAgIC8vIEFsbG93IHRoZSBjYWxsZXIgdG8gYWRkIGN1c3RvbSBsb2dpYyBvbiBzdWNjZXNzLlxuICAgICAgbXV0YXRpb24/Lm9uU3VjY2Vzcz8uKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCk7XG4gICAgfSxcbiAgICBvbkVycm9yKGVycm9yLCB2YXJzLCBjb250ZXh0KSB7XG4gICAgICAvLyBBbGxvdyB0aGUgY2FsbGVyIHRvIGFkZCBjdXN0b20gbG9naWMgb24gZXJyb3IuXG4gICAgICBtdXRhdGlvbj8ub25FcnJvcj8uKGVycm9yLCB2YXJzLCBjb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHBsYWNlT3JkZXI6IG11dGF0ZUFzeW5jLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG4vKipcbiAqICMgQWRkIGFkZHJlc3MgdG8gcHJvZmlsZS5cbiAqXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBjYXRlZ29yeSBQcm9maWxlc1xuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIE5vIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBsaW5rQWRkcmVzcywgLy8gdXNlTXV0YXRpb24ncyBgbXV0YXRlQXN5bmNgIHByb3BlcnR5XG4gKiAgICBpc1BlbmRpbmcsXG4gKiAgICBpc0Vycm9yLFxuICogICAgZXJyb3IsXG4gKiAgICBzdGF0dXMsXG4gKiAgICAuLi5tb3JlVXNlTXV0YXRpb25SZXN1bHRzXG4gKiB9ID0gdXNlTGlua0FkZHJlc3MoKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3Mjb3BlcmF0aW9uL3Byb2ZpbGUtYWRkcmVzc2VzIHwgQVBJIERvY3VtZW50YXRpb259XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUxpbmtBZGRyZXNzKHtcbiAgbXV0YXRpb24sXG59OiB7XG4gIC8qKiB7QGluaGVyaXREb2MgTXV0YXRpb25PcHRpb25zfSAqL1xuICBtdXRhdGlvbj86IE11dGF0aW9uT3B0aW9uczxMaW5rZWRBZGRyZXNzLCBFcnJvciwgTGlua0FkZHJlc3M+O1xufSA9IHt9KTogTXV0YXRpb25SZXN1bHQ8J2xpbmtBZGRyZXNzJywgTGlua2VkQWRkcmVzcywgRXJyb3IsIExpbmtBZGRyZXNzPiB7XG4gIGNvbnN0IHNkayA9IHVzZVNkaygpO1xuICBjb25zdCB7IGlzQXV0aG9yaXplZCB9ID0gdXNlQXV0aCgpO1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgY29uc3QgeyBtdXRhdGVBc3luYywgLi4ucmVzdCB9ID0gdXNlTXV0YXRpb24oe1xuICAgIC4uLm11dGF0aW9uLFxuICAgIG11dGF0aW9uS2V5OiBrZXlzLmxpbmtBZGRyZXNzLFxuICAgIG11dGF0aW9uRm46IGFzeW5jIChib2R5OiBMaW5rQWRkcmVzcykgPT4ge1xuICAgICAgaWYgKCFzZGspIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTREsgaW5zdGFuY2UgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZGsubGlua0FkZHJlc3MoYm9keSk7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3MoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSB7XG4gICAgICAvLyBSZWZldGNoIGFsbCBvcmRlcnMgb24gc3VjY2Vzcy5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgcXVlcnlLZXk6IGtleXMuZ2V0QWRkcmVzc2VzKCksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YXJpYWJsZXMucHJvZmlsZSkge1xuICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgICAgcXVlcnlLZXk6IGtleXMuZ2V0UHJvZmlsZSh2YXJpYWJsZXMucHJvZmlsZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gQWxsb3cgdGhlIGNhbGxlciB0byBhZGQgY3VzdG9tIGxvZ2ljIG9uIHN1Y2Nlc3MuXG4gICAgICBtdXRhdGlvbj8ub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KTtcbiAgICB9LFxuICAgIG9uRXJyb3IoZXJyb3IsIHZhcnMsIGNvbnRleHQpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBjYWxsZXIgdG8gYWRkIGN1c3RvbSBsb2dpYyBvbiBlcnJvci5cbiAgICAgIG11dGF0aW9uPy5vbkVycm9yPy4oZXJyb3IsIHZhcnMsIGNvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbGlua0FkZHJlc3M6IG11dGF0ZUFzeW5jLFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogQVBJIGNvbnN1bWVycyBoYXZlIHRoZSBvcHRpb24gdG8gc3Vic2NyaWJlIHRvIGEgV2ViU29ja2V0IGZvciByZWFsLXRpbWUgb3JkZXIgbm90aWZpY2F0aW9ucy4gVGhpcyBXZWJTb2NrZXQgY29tcGxpZXMgd2l0aCB0aGUgc3RhbmRhcmQgV2ViU29ja2V0IFByb3RvY29sLCBhbGxvd2luZyB0aGUgdXNlIG9mIHN0YW5kYXJkIFdlYlNvY2tldCBsaWJyYXJpZXMgZm9yIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBUaGUgV2ViU29ja2V0IGVtaXRzIGFuIGV2ZW50IHdoZW4gYSBvcmRlciBjaGFuZ2VzIHN0YXRlOlxuICpcbiAqIGBwbGFjZWRgOiBUaGUgb3JkZXIgaGFzIGJlZW4gY3JlYXRlZCBidXQgbm90IHlldCBwcm9jZXNzZWQuXG4gKlxuICogYHBlbmRpbmdgOiBUaGUgb3JkZXIgaXMgYXdhaXRpbmcgZnVsZmlsbG1lbnQgKGUuZy4sIHJldmlldywgbWludGluZy9idXJuaW5nIHRva2Vucywgb3Igc2VuZGluZy9yZWNlaXZpbmcgU0VQQSBwYXltZW50KS5cbiAqXG4gKiBgcHJvY2Vzc2VkYDogVGhlIG9yZGVyIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogYHJlamVjdGVkYDogVGhlIG9yZGVyIHdhcyByZWplY3RlZCwgcG9zc2libHkgZHVlIHRvIGNvbXBsaWFuY2UgcmVhc29ucyBvciBpbnN1ZmZpY2llbnQgZnVuZHMuXG4gKiBAZ3JvdXAgSG9va3NcbiAqIEBjYXRlZ29yeSBPcmRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7T3JkZXJTdGF0ZX0gW3BhcmFtcy5zdGF0ZV0gRmlsdGVyIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgb3JkZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5wcm9maWxlXSBGaWx0ZXIgYmFzZWQgb24gdGhlIHByb2ZpbGUgaWQgb2YgdGhlIG9yZGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLm9uTWVzc2FnZSBDYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG9yZGVyIG5vdGlmaWNhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwYXJhbXMub25FcnJvcl0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBlcnJvciBub3RpZmljYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB7XG4gKiAgICBzdGF0ZSxcbiAqICAgIHByb2ZpbGUsXG4gKiAgICBvbk1lc3NhZ2UsXG4gKiAgICBvbkVycm9yXG4gKiB9ID0gdXNlU3Vic2NyaWJlT3JkZXJOb3RpZmljYXRpb24oKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25lcml1bS5kZXYvYXBpLWRvY3MvdjEjb3BlcmF0aW9uL29yZGVycy1ub3RpZmljYXRpb25zfCBBUEkgRG9jdW1lbnRhdGlvbn1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVW5zdWJzY3JpYmUgZnJvbSBvcmRlciBub3RpZmljYXRpb25zLlxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VTdWJzY3JpYmVPcmRlck5vdGlmaWNhdGlvbiA9ICh7XG4gIHN0YXRlLFxuICBwcm9maWxlLFxuICBvbk1lc3NhZ2UsXG4gIG9uRXJyb3IsXG59OiB7XG4gIHN0YXRlPzogT3JkZXJTdGF0ZTtcbiAgcHJvZmlsZT86IHN0cmluZztcbiAgb25NZXNzYWdlOiAob3JkZXI6IE9yZGVyKSA9PiB2b2lkO1xuICBvbkVycm9yPzogKChlcnI6IEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbn0pID0+IHtcbiAgY29uc3Qgc2RrID0gdXNlU2RrKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2RrKSB7XG4gICAgICBzZGsuc3Vic2NyaWJlT3JkZXJOb3RpZmljYXRpb25zKHtcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgIHByb2ZpbGU6IHByb2ZpbGUsXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogb25NZXNzYWdlLFxuICAgICAgICBvbkVycm9yOiBvbkVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvKipcbiAgICAgICAqIE5vdGUgdGhhdCBpbiBkZXZlbG9wbWVudCBtb2RlLCBSZWFjdCBTdHJpY3QgbW9kZSB3aWxsIGNhdXNlIHRoaXNcbiAgICAgICAqIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHR3aWNlIG9uIGNsaWVudCBzaWRlIHJvdXRlIGNoYW5nZXMuXG4gICAgICAgKiBTbyBhIHNvY2tldCB3aWxsIGJlIGltbWVkaWF0ZWx5IGNsb3NlZCBhbmQgb3BlbmVkIGFnYWluLlxuICAgICAgICogVGhpcyBpcyBub3QgYW4gaXNzdWUgaW4gcHJvZHVjdGlvbiBtb2RlLlxuICAgICAgICovXG4gICAgICBpZiAoc2RrKSB7XG4gICAgICAgIHNkaz8udW5zdWJzY3JpYmVPcmRlck5vdGlmaWNhdGlvbnMoeyBzdGF0ZTogc3RhdGUsIHByb2ZpbGU6IHByb2ZpbGUgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3NkaywgcHJvZmlsZSwgc3RhdGVdKTtcblxuICByZXR1cm4gKCkgPT5cbiAgICBzZGs/LnVuc3Vic2NyaWJlT3JkZXJOb3RpZmljYXRpb25zKHsgc3RhdGU6IHN0YXRlLCBwcm9maWxlOiBwcm9maWxlIH0pO1xufTtcblxuLyoqIEV4cG9ydCB0eXBlcyBmb3IgZG9jdW1lbnRhdGlvbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBZGRyZXNzLFxuICBCYWxhbmNlcyxcbiAgSUJBTixcbiAgTW92ZUliYW5QYXlsb2FkLFxuICBMaW5rQWRkcmVzcyxcbiAgUHJvZmlsZSxcbiAgUHJvZmlsZVBlcm1pc3Npb25zLFxuICBUb2tlbixcbiAgU3VibWl0UHJvZmlsZURldGFpbHNQYXlsb2FkLFxuICBOZXdPcmRlcixcbiAgUmVzcG9uc2VTdGF0dXMsXG4gIE9yZGVyLFxufTtcbiJdfQ==
|