// src/useApolloClient.ts import { hasInjectionContext, inject } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; var DefaultApolloClient = Symbol("default-apollo-client"); var ApolloClients = Symbol("apollo-clients"); function resolveDefaultClient(providedApolloClients, providedApolloClient) { const resolvedClient = providedApolloClients ? providedApolloClients.default : providedApolloClient != null ? providedApolloClient : void 0; return resolvedClient; } function resolveClientWithId(providedApolloClients, clientId) { return providedApolloClients == null ? void 0 : providedApolloClients[clientId]; } function useApolloClient(clientId) { let resolveImpl; const savedCurrentClients = currentApolloClients; if (!hasInjectionContext()) { resolveImpl = (id) => { if (id) { return resolveClientWithId(savedCurrentClients, id); } return resolveDefaultClient(savedCurrentClients, savedCurrentClients.default); }; } else { const providedApolloClients = inject(ApolloClients, null); const providedApolloClient = inject(DefaultApolloClient, null); resolveImpl = (id) => { if (id) { const client2 = resolveClientWithId(providedApolloClients, id); if (client2) { return client2; } return resolveClientWithId(savedCurrentClients, id); } const client = resolveDefaultClient(providedApolloClients, providedApolloClient); if (client) { return client; } return resolveDefaultClient(savedCurrentClients, savedCurrentClients.default); }; } function resolveClient(id = clientId) { const client = resolveImpl(id); if (!client) { throw new Error( `Apollo client with id ${id != null ? id : "default"} not found. Use an app.runWithContext() or provideApolloClient() if you are outside of a component setup.` ); } return client; } return { resolveClient, get client() { return resolveClient(); } }; } var currentApolloClients = {}; function provideApolloClient(client) { currentApolloClients = { default: client }; return function(fn) { const result = fn(); currentApolloClients = {}; return result; }; } function provideApolloClients(clients) { currentApolloClients = clients; return function(fn) { const result = fn(); currentApolloClients = {}; return result; }; } // src/useLazyQuery.ts import { isRef as isRef3 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; // src/useQuery.ts import { debounce, throttle } from "/_nuxt/node_modules/throttle-debounce/esm/index.js?v=e4f18c29"; import { computed as computed3, getCurrentInstance, getCurrentScope as getCurrentScope2, nextTick, onScopeDispose as onScopeDispose2, onServerPrefetch, ref as ref3, shallowRef, unref, watch as watch2 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; // src/util/env.ts var isServer = typeof window === "undefined"; // src/util/loadingTracking.ts import { getCurrentScope, onScopeDispose, ref, watch } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; var globalTracking = { queries: ref(0), mutations: ref(0), subscriptions: ref(0), components: /* @__PURE__ */ new Map() }; function getCurrentTracking() { const currentScope = getCurrentScope(); if (!currentScope) { return {}; } let tracking; if (isServer) { tracking = { queries: ref(0), mutations: ref(0), subscriptions: ref(0) }; return { tracking }; } if (!globalTracking.components.has(currentScope)) { globalTracking.components.set(currentScope, tracking = { queries: ref(0), mutations: ref(0), subscriptions: ref(0) }); onScopeDispose(() => { globalTracking.components.delete(currentScope); }); } else { tracking = globalTracking.components.get(currentScope); } return { tracking }; } function track(loading, type) { if (isServer) return; const { tracking } = getCurrentTracking(); watch(loading, (value, oldValue) => { if (oldValue != null && value !== oldValue) { const mod = value ? 1 : -1; if (tracking) tracking[type].value += mod; globalTracking[type].value += mod; } }, { immediate: true }); onScopeDispose(() => { if (loading.value) { if (tracking) tracking[type].value--; globalTracking[type].value--; } }); } function trackQuery(loading) { track(loading, "queries"); } function trackMutation(loading) { track(loading, "mutations"); } function trackSubscription(loading) { track(loading, "subscriptions"); } // src/util/paramToReactive.ts import { computed, isRef, reactive } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function paramToReactive(param) { if (isRef(param)) { return param; } else if (typeof param === "function") { return computed(param); } else if (param) { return reactive(param); } else { return param; } } // src/util/paramToRef.ts import { computed as computed2, isRef as isRef2, ref as ref2 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function paramToRef(param) { if (isRef2(param)) { return param; } else if (typeof param === "function") { return computed2(param); } else { return ref2(param); } } // src/util/toApolloError.ts import { ApolloError, isApolloError } from "/_nuxt/node_modules/@apollo/client/core/index.js?v=e4f18c29"; function toApolloError(error) { if (!(error instanceof Error)) { return new ApolloError({ networkError: Object.assign(new Error(error == null ? void 0 : error.message), { originalError: error }), errorMessage: String(error) }); } if (isApolloError(error)) { return error; } return new ApolloError({ networkError: error, errorMessage: error.message }); } function resultErrorsToApolloError(errors) { return new ApolloError({ graphQLErrors: errors, errorMessage: `GraphQL response contains errors: ${errors.map((e) => e.message).join(" | ")}` }); } // src/util/useEventHook.ts function useEventHook() { const fns = []; function on(fn) { fns.push(fn); return { off: () => off(fn) }; } function off(fn) { const index = fns.indexOf(fn); if (index !== -1) { fns.splice(index, 1); } } function trigger(...params) { for (const fn of fns) { fn(...params); } } function getCount() { return fns.length; } return { on, off, trigger, getCount }; } // src/useQuery.ts function useQuery(document, variables, options) { return useQueryImpl(document, variables, options); } function useQueryImpl(document, variables, options = {}, lazy = false) { var _a; const currentScope = getCurrentScope2(); const currentInstance = getCurrentInstance(); const currentOptions = ref3(); const documentRef = paramToRef(document); const variablesRef = paramToRef(variables); const optionsRef = paramToReactive(options); const result = shallowRef(); const resultEvent = useEventHook(); const error = shallowRef(null); const errorEvent = useEventHook(); const loading = ref3(false); currentScope && trackQuery(loading); const networkStatus = ref3(); let firstResolve; let firstResolveTriggered = false; let firstReject; let firstRejectError; const tryFirstResolve = () => { firstResolveTriggered = true; if (firstResolve) firstResolve(); }; const tryFirstReject = (apolloError) => { firstRejectError = apolloError; if (firstReject) firstReject(apolloError); }; const resetFirstResolveReject = () => { firstResolve = void 0; firstReject = void 0; firstResolveTriggered = false; firstRejectError = void 0; }; currentInstance && ((_a = onServerPrefetch) == null ? void 0 : _a(() => { var _a2; if (!isEnabled.value || isServer && ((_a2 = currentOptions.value) == null ? void 0 : _a2.prefetch) === false) return; return new Promise((resolve, reject) => { firstResolve = () => { resetFirstResolveReject(); resolve(); }; firstReject = (apolloError) => { resetFirstResolveReject(); reject(apolloError); }; if (firstResolveTriggered) { firstResolve(); } else if (firstRejectError) { firstReject(firstRejectError); } }).finally(stop); })); const { resolveClient } = useApolloClient(); function getClient() { var _a2; return resolveClient((_a2 = currentOptions.value) == null ? void 0 : _a2.clientId); } const query = shallowRef(); let observer; let started = false; let ignoreNextResult = false; let firstStart = true; function start() { var _a2, _b, _c, _d, _e; if (started || !isEnabled.value || isServer && ((_a2 = currentOptions.value) == null ? void 0 : _a2.prefetch) === false || !currentDocument) { tryFirstResolve(); return; } if (isServer) { applyDocument(documentRef.value); applyVariables(variablesRef.value); applyOptions(unref(optionsRef)); } started = true; error.value = null; loading.value = true; const client = getClient(); query.value = client.watchQuery({ query: currentDocument, variables: currentVariables != null ? currentVariables : {}, ...currentOptions.value, ...isServer && ((_b = currentOptions.value) == null ? void 0 : _b.fetchPolicy) !== "no-cache" ? { fetchPolicy: "network-only" } : {} }); startQuerySubscription(); if (!isServer && (firstStart || !((_c = currentOptions.value) == null ? void 0 : _c.keepPreviousResult)) && (((_d = currentOptions.value) == null ? void 0 : _d.fetchPolicy) !== "no-cache" || currentOptions.value.notifyOnNetworkStatusChange)) { const currentResult = query.value.getCurrentResult(false); if (!currentResult.loading || currentResult.partial || ((_e = currentOptions.value) == null ? void 0 : _e.notifyOnNetworkStatusChange)) { onNextResult(currentResult); ignoreNextResult = !currentResult.loading; } else if (currentResult.error) { onError(currentResult.error); ignoreNextResult = true; } } if (!isServer) { for (const item of subscribeToMoreItems) { addSubscribeToMore(item); } } firstStart = false; } function startQuerySubscription() { if (observer && !observer.closed) return; if (!query.value) return; ignoreNextResult = false; observer = query.value.subscribe({ next: onNextResult, error: onError }); } function getErrorPolicy() { var _a2, _b, _c, _d; const client = resolveClient((_a2 = currentOptions.value) == null ? void 0 : _a2.clientId); return ((_b = currentOptions.value) == null ? void 0 : _b.errorPolicy) || ((_d = (_c = client.defaultOptions) == null ? void 0 : _c.watchQuery) == null ? void 0 : _d.errorPolicy); } function onNextResult(queryResult) { var _a2; if (ignoreNextResult) { ignoreNextResult = false; return; } error.value = null; processNextResult(queryResult); const errorPolicy = getErrorPolicy(); if (errorPolicy && errorPolicy === "all" && !queryResult.error && ((_a2 = queryResult.errors) == null ? void 0 : _a2.length)) { processError(resultErrorsToApolloError(queryResult.errors)); } tryFirstResolve(); } function processNextResult(queryResult) { var _a2, _b; result.value = queryResult.data && Object.keys(queryResult.data).length === 0 ? queryResult.error && !((_a2 = currentOptions.value) == null ? void 0 : _a2.returnPartialData) && ((_b = currentOptions.value) == null ? void 0 : _b.errorPolicy) === "none" ? void 0 : result.value : queryResult.data; loading.value = queryResult.loading; networkStatus.value = queryResult.networkStatus; nextTick(() => { resultEvent.trigger(queryResult, { client: getClient() }); }); } function onError(queryError) { if (ignoreNextResult) { ignoreNextResult = false; return; } const apolloError = toApolloError(queryError); const errorPolicy = getErrorPolicy(); if (errorPolicy && errorPolicy !== "none") { processNextResult(query.value.getCurrentResult()); } processError(apolloError); tryFirstReject(apolloError); resubscribeToQuery(); } function processError(apolloError) { error.value = apolloError; loading.value = false; networkStatus.value = 8; nextTick(() => { errorEvent.trigger(apolloError, { client: getClient() }); }); } function resubscribeToQuery() { if (!query.value) return; const lastError = query.value.getLastError(); const lastResult = query.value.getLastResult(); query.value.resetLastResults(); startQuerySubscription(); Object.assign(query.value, { lastError, lastResult }); } let onStopHandlers = []; function stop() { tryFirstResolve(); if (!started) return; started = false; loading.value = false; onStopHandlers.forEach((handler) => handler()); onStopHandlers = []; if (query.value) { query.value.stopPolling(); query.value = null; } if (observer) { observer.unsubscribe(); observer = void 0; } } let restarting = false; function baseRestart() { if (!started || restarting) return; restarting = true; nextTick(() => { if (started) { stop(); start(); } restarting = false; }); } let debouncedRestart; let isRestartDebounceSetup = false; function updateRestartFn() { var _a2, _b; if (!currentOptions.value) { debouncedRestart = baseRestart; } else { if ((_a2 = currentOptions.value) == null ? void 0 : _a2.throttle) { debouncedRestart = throttle(currentOptions.value.throttle, baseRestart); } else if ((_b = currentOptions.value) == null ? void 0 : _b.debounce) { debouncedRestart = debounce(currentOptions.value.debounce, baseRestart); } else { debouncedRestart = baseRestart; } isRestartDebounceSetup = true; } } function restart() { if (!started || restarting) return; if (!isRestartDebounceSetup) updateRestartFn(); debouncedRestart(); } let currentDocument = documentRef.value; const forceDisabled = ref3(lazy); const enabledOption = computed3(() => !currentOptions.value || currentOptions.value.enabled == null || currentOptions.value.enabled); const isEnabled = computed3(() => enabledOption.value && !forceDisabled.value && !!documentRef.value); watch2(() => unref(optionsRef), applyOptions, { deep: true, immediate: true }); function applyOptions(value) { if (currentOptions.value && (currentOptions.value.throttle !== value.throttle || currentOptions.value.debounce !== value.debounce)) { updateRestartFn(); } currentOptions.value = value; restart(); } watch2(documentRef, applyDocument); function applyDocument(value) { currentDocument = value; restart(); } let currentVariables; let currentVariablesSerialized; watch2(() => { if (isEnabled.value) { return variablesRef.value; } else { return void 0; } }, applyVariables, { deep: true, immediate: true }); function applyVariables(value) { const serialized = JSON.stringify([value, isEnabled.value]); if (serialized !== currentVariablesSerialized) { currentVariables = value; restart(); } currentVariablesSerialized = serialized; } function refetch(variables2 = void 0) { if (query.value) { if (variables2) { currentVariables = variables2; } error.value = null; loading.value = true; return query.value.refetch(variables2).then((refetchResult) => { var _a2; const currentResult = (_a2 = query.value) == null ? void 0 : _a2.getCurrentResult(); currentResult && processNextResult(currentResult); return refetchResult; }); } } function updateQuery(mapFn) { if (query.value) { query.value.updateQuery(mapFn); } } function fetchMore(options2) { if (query.value) { error.value = null; loading.value = true; return query.value.fetchMore(options2).then((fetchMoreResult) => { var _a2; const currentResult = (_a2 = query.value) == null ? void 0 : _a2.getCurrentResult(); currentResult && processNextResult(currentResult); return fetchMoreResult; }); } } const subscribeToMoreItems = []; function subscribeToMore(options2) { if (isServer) return; const optionsRef2 = paramToRef(options2); watch2(optionsRef2, (value, oldValue, onCleanup) => { const index = subscribeToMoreItems.findIndex((item2) => item2.options === oldValue); if (index !== -1) { subscribeToMoreItems.splice(index, 1); } const item = { options: value, unsubscribeFns: [] }; subscribeToMoreItems.push(item); addSubscribeToMore(item); onCleanup(() => { item.unsubscribeFns.forEach((fn) => fn()); item.unsubscribeFns = []; }); }, { immediate: true }); } function addSubscribeToMore(item) { if (!started) return; if (!query.value) { throw new Error("Query is not defined"); } const unsubscribe = query.value.subscribeToMore(item.options); onStopHandlers.push(unsubscribe); item.unsubscribeFns.push(unsubscribe); } watch2(isEnabled, (value) => { if (value) { nextTick(() => { start(); }); } else { stop(); } }); if (isEnabled.value) { start(); } if (currentScope) { onScopeDispose2(() => { stop(); subscribeToMoreItems.length = 0; }); } else { console.warn("[Vue apollo] useQuery() is called outside of an active effect scope and the query will not be automatically stopped."); } return { result, loading, networkStatus, error, start, stop, restart, forceDisabled, document: documentRef, variables: variablesRef, options: optionsRef, query, refetch, fetchMore, subscribeToMore, updateQuery, onResult: resultEvent.on, onError: errorEvent.on }; } // src/useLazyQuery.ts function useLazyQuery(document, variables, options) { const query = useQueryImpl(document, variables, options, true); function load(document2, variables2, options2) { if (document2) { query.document.value = document2; } if (variables2) { query.variables.value = variables2; } if (options2) { Object.assign(isRef3(query.options) ? query.options.value : query.options, options2); } const isFirstRun = query.forceDisabled.value; if (isFirstRun) { query.forceDisabled.value = false; if (isServer) { query.start(); } return new Promise((resolve, reject) => { const { off: offResult } = query.onResult((result) => { if (!result.loading) { resolve(result.data); offResult(); offError(); } }); const { off: offError } = query.onError((error) => { reject(error); offResult(); offError(); }); }); } else { return false; } } return { ...query, load }; } // src/useLoading.ts import { computed as computed4 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function useQueryLoading() { const { tracking } = getCurrentTracking(); if (!tracking) throw new Error("useQueryLoading must be called inside a setup function."); return computed4(() => tracking.queries.value > 0); } function useMutationLoading() { const { tracking } = getCurrentTracking(); if (!tracking) throw new Error("useMutationLoading must be called inside a setup function."); return computed4(() => tracking.mutations.value > 0); } function useSubscriptionLoading() { const { tracking } = getCurrentTracking(); if (!tracking) throw new Error("useSubscriptionLoading must be called inside a setup function."); return computed4(() => tracking.subscriptions.value > 0); } function useGlobalQueryLoading() { return computed4(() => globalTracking.queries.value > 0); } function useGlobalMutationLoading() { return computed4(() => globalTracking.mutations.value > 0); } function useGlobalSubscriptionLoading() { return computed4(() => globalTracking.subscriptions.value > 0); } // src/useMutation.ts import { getCurrentScope as getCurrentScope3, isRef as isRef4, nextTick as nextTick2, onScopeDispose as onScopeDispose3, ref as ref4, shallowRef as shallowRef2 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function useMutation(document, options = {}) { const currentScope = getCurrentScope3(); const loading = ref4(false); currentScope && trackMutation(loading); const error = shallowRef2(null); const called = ref4(false); const doneEvent = useEventHook(); const errorEvent = useEventHook(); const { resolveClient } = useApolloClient(); async function mutate(variables, overrideOptions = {}) { let currentDocument; if (typeof document === "function") { currentDocument = document(); } else if (isRef4(document)) { currentDocument = document.value; } else { currentDocument = document; } let currentOptions; if (typeof options === "function") { currentOptions = options(); } else if (isRef4(options)) { currentOptions = options.value; } else { currentOptions = options; } const client = resolveClient(currentOptions.clientId); error.value = null; loading.value = true; called.value = true; try { const result = await client.mutate({ mutation: currentDocument, ...currentOptions, ...overrideOptions, variables: (variables != null ? variables : currentOptions.variables) ? { ...currentOptions.variables, ...variables } : void 0 }); loading.value = false; await nextTick2(); doneEvent.trigger(result, { client }); return result; } catch (e) { const apolloError = toApolloError(e); error.value = apolloError; loading.value = false; await nextTick2(); errorEvent.trigger(apolloError, { client }); if (currentOptions.throws === "always" || currentOptions.throws !== "never" && !errorEvent.getCount()) { throw apolloError; } } return null; } currentScope && onScopeDispose3(() => { loading.value = false; }); return { mutate, loading, error, called, onDone: doneEvent.on, onError: errorEvent.on }; } // src/useResult.ts import { computed as computed5 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function useResult(result, defaultValue, pick) { console.warn(`'useResult' is deprecated and will be removed soon. Please use 'computed' instead. Before: const items = useResult(result, [], data => data.someField.myItems) After: const items = computed(() => result.value?.someField.myItems ?? [])`); return computed5(() => { const value = result.value; if (value) { if (pick) { try { return pick(value); } catch (e) { } } else { const keys = Object.keys(value); if (keys.length === 1) { return value[keys[0]]; } else { return value; } } } return defaultValue; }); } // src/useSubscription.ts import { debounce as debounce2, throttle as throttle2 } from "/_nuxt/node_modules/throttle-debounce/esm/index.js?v=e4f18c29"; import { computed as computed6, getCurrentScope as getCurrentScope4, isRef as isRef5, nextTick as nextTick3, onScopeDispose as onScopeDispose4, ref as ref5, shallowRef as shallowRef3, watch as watch3 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29"; function useSubscription(document, variables = void 0, options = {}) { const currentScope = getCurrentScope4(); const documentRef = paramToRef(document); const variablesRef = paramToRef(variables); const optionsRef = paramToReactive(options); const result = shallowRef3(); const resultEvent = useEventHook(); const error = shallowRef3(null); const errorEvent = useEventHook(); const loading = ref5(false); currentScope && trackSubscription(loading); const { resolveClient } = useApolloClient(); const subscription = ref5(null); let observer = null; let started = false; function getClient() { var _a; return resolveClient((_a = currentOptions.value) == null ? void 0 : _a.clientId); } function start() { if (started || !isEnabled.value || isServer) return; started = true; loading.value = true; const client = getClient(); subscription.value = client.subscribe({ query: currentDocument, variables: currentVariables, ...currentOptions.value }); observer = subscription.value.subscribe({ next: onNextResult, error: onError }); } function onNextResult(fetchResult) { result.value = fetchResult.data; loading.value = false; resultEvent.trigger(fetchResult, { client: getClient() }); } function onError(fetchError) { const apolloError = toApolloError(fetchError); error.value = apolloError; loading.value = false; errorEvent.trigger(apolloError, { client: getClient() }); } function stop() { if (!started) return; started = false; loading.value = false; if (subscription.value) { subscription.value = null; } if (observer) { observer.unsubscribe(); observer = null; } } let restarting = false; function baseRestart() { if (!started || restarting) return; restarting = true; nextTick3(() => { if (started) { stop(); start(); } restarting = false; }); } let debouncedRestart; function updateRestartFn() { var _a, _b; if ((_a = currentOptions.value) == null ? void 0 : _a.throttle) { debouncedRestart = throttle2(currentOptions.value.throttle, baseRestart); } else if ((_b = currentOptions.value) == null ? void 0 : _b.debounce) { debouncedRestart = debounce2(currentOptions.value.debounce, baseRestart); } else { debouncedRestart = baseRestart; } } function restart() { if (!debouncedRestart) updateRestartFn(); debouncedRestart(); } const currentOptions = ref5(); watch3(() => isRef5(optionsRef) ? optionsRef.value : optionsRef, (value) => { if (currentOptions.value && (currentOptions.value.throttle !== value.throttle || currentOptions.value.debounce !== value.debounce)) { updateRestartFn(); } currentOptions.value = value; restart(); }, { deep: true, immediate: true }); let currentDocument; watch3(documentRef, (value) => { currentDocument = value; restart(); }, { immediate: true }); let currentVariables; let currentVariablesSerialized; watch3(variablesRef, (value, oldValue) => { const serialized = JSON.stringify(value); if (serialized !== currentVariablesSerialized) { currentVariables = value; restart(); } currentVariablesSerialized = serialized; }, { deep: true, immediate: true }); const enabledOption = computed6(() => !currentOptions.value || currentOptions.value.enabled == null || currentOptions.value.enabled); const isEnabled = enabledOption; watch3(isEnabled, (value) => { if (value) { start(); } else { stop(); } }, { immediate: true }); if (currentScope) { onScopeDispose4(stop); } else { console.warn("[Vue apollo] useSubscription() is called outside of an active effect scope and the subscription will not be automatically stopped."); } return { result, loading, error, // @TODO doesn't fully work yet // enabled, start, stop, restart, document: documentRef, variables: variablesRef, options: optionsRef, subscription, onResult: resultEvent.on, onError: errorEvent.on }; } export { ApolloClients, DefaultApolloClient, provideApolloClient, provideApolloClients, useApolloClient, useGlobalMutationLoading, useGlobalQueryLoading, useGlobalSubscriptionLoading, useLazyQuery, useMutation, useMutationLoading, useQuery, useQueryLoading, useResult, useSubscription, useSubscriptionLoading }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VBcG9sbG9DbGllbnQudHMiLCIuLi9zcmMvdXNlTGF6eVF1ZXJ5LnRzIiwiLi4vc3JjL3VzZVF1ZXJ5LnRzIiwiLi4vc3JjL3V0aWwvZW52LnRzIiwiLi4vc3JjL3V0aWwvbG9hZGluZ1RyYWNraW5nLnRzIiwiLi4vc3JjL3V0aWwvcGFyYW1Ub1JlYWN0aXZlLnRzIiwiLi4vc3JjL3V0aWwvcGFyYW1Ub1JlZi50cyIsIi4uL3NyYy91dGlsL3RvQXBvbGxvRXJyb3IudHMiLCIuLi9zcmMvdXRpbC91c2VFdmVudEhvb2sudHMiLCIuLi9zcmMvdXNlTG9hZGluZy50cyIsIi4uL3NyYy91c2VNdXRhdGlvbi50cyIsIi4uL3NyYy91c2VSZXN1bHQudHMiLCIuLi9zcmMvdXNlU3Vic2NyaXB0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBvbGxvQ2xpZW50IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcbmltcG9ydCB7IGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCB9IGZyb20gJ3Z1ZS1kZW1pJ1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdEFwb2xsb0NsaWVudCA9IFN5bWJvbCgnZGVmYXVsdC1hcG9sbG8tY2xpZW50JylcbmV4cG9ydCBjb25zdCBBcG9sbG9DbGllbnRzID0gU3ltYm9sKCdhcG9sbG8tY2xpZW50cycpXG5cbnR5cGUgQ2xpZW50SWQgPSBzdHJpbmdcbnR5cGUgQ2xpZW50RGljdDxUPiA9IFJlY29yZDxDbGllbnRJZCwgQXBvbGxvQ2xpZW50PFQ+PlxuXG50eXBlIFJlc29sdmVDbGllbnQ8VENhY2hlU2hhcGUsIFRSZXR1cm4gPSBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+PiA9IChjbGllbnRJZD86IENsaWVudElkKSA9PiBUUmV0dXJuXG50eXBlIE51bGxhYmxlQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiA9IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4gfCB1bmRlZmluZWRcblxuZXhwb3J0IGludGVyZmFjZSBVc2VBcG9sbG9DbGllbnRSZXR1cm48VENhY2hlU2hhcGU+IHtcbiAgcmVzb2x2ZUNsaWVudDogUmVzb2x2ZUNsaWVudDxUQ2FjaGVTaGFwZT5cbiAgcmVhZG9ubHkgY2xpZW50OiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0Q2xpZW50PFQ+KHByb3ZpZGVkQXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxUPiB8IG51bGwsIHByb3ZpZGVkQXBvbGxvQ2xpZW50OiBBcG9sbG9DbGllbnQ8VD4gfCBudWxsKTogTnVsbGFibGVBcG9sbG9DbGllbnQ8VD4ge1xuICBjb25zdCByZXNvbHZlZENsaWVudCA9IHByb3ZpZGVkQXBvbGxvQ2xpZW50c1xuICAgID8gcHJvdmlkZWRBcG9sbG9DbGllbnRzLmRlZmF1bHRcbiAgICA6IChwcm92aWRlZEFwb2xsb0NsaWVudCA/PyB1bmRlZmluZWQpXG4gIHJldHVybiByZXNvbHZlZENsaWVudFxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ2xpZW50V2l0aElkPFQ+KHByb3ZpZGVkQXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxUPiB8IG51bGwsIGNsaWVudElkOiBDbGllbnRJZCk6IE51bGxhYmxlQXBvbGxvQ2xpZW50PFQ+IHtcbiAgcmV0dXJuIHByb3ZpZGVkQXBvbGxvQ2xpZW50cz8uW2NsaWVudElkXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlID0gYW55PihjbGllbnRJZD86IENsaWVudElkKTogVXNlQXBvbGxvQ2xpZW50UmV0dXJuPFRDYWNoZVNoYXBlPiB7XG4gIGxldCByZXNvbHZlSW1wbDogUmVzb2x2ZUNsaWVudDxUQ2FjaGVTaGFwZSwgTnVsbGFibGVBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+PlxuXG4gIC8vIFNhdmUgY3VycmVudCBjbGllbnQgaW4gY3VycmVudCBjbG9zdXJlIHNjb3BlXG4gIGNvbnN0IHNhdmVkQ3VycmVudENsaWVudHMgPSBjdXJyZW50QXBvbGxvQ2xpZW50c1xuXG4gIGlmICghaGFzSW5qZWN0aW9uQ29udGV4dCgpKSB7XG4gICAgcmVzb2x2ZUltcGwgPSAoaWQ/OiBDbGllbnRJZCkgPT4ge1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ2xpZW50V2l0aElkKHNhdmVkQ3VycmVudENsaWVudHMsIGlkKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVEZWZhdWx0Q2xpZW50KHNhdmVkQ3VycmVudENsaWVudHMsIHNhdmVkQ3VycmVudENsaWVudHMuZGVmYXVsdClcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgcHJvdmlkZWRBcG9sbG9DbGllbnRzOiBDbGllbnREaWN0PFRDYWNoZVNoYXBlPiB8IG51bGwgPSBpbmplY3QoQXBvbGxvQ2xpZW50cywgbnVsbClcbiAgICBjb25zdCBwcm92aWRlZEFwb2xsb0NsaWVudDogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiB8IG51bGwgPSBpbmplY3QoRGVmYXVsdEFwb2xsb0NsaWVudCwgbnVsbClcblxuICAgIHJlc29sdmVJbXBsID0gKGlkPzogQ2xpZW50SWQpID0+IHtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50V2l0aElkKHByb3ZpZGVkQXBvbGxvQ2xpZW50cywgaWQpXG4gICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVDbGllbnRXaXRoSWQoc2F2ZWRDdXJyZW50Q2xpZW50cywgaWQpXG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlRGVmYXVsdENsaWVudChwcm92aWRlZEFwb2xsb0NsaWVudHMsIHByb3ZpZGVkQXBvbGxvQ2xpZW50KVxuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZURlZmF1bHRDbGllbnQoc2F2ZWRDdXJyZW50Q2xpZW50cywgc2F2ZWRDdXJyZW50Q2xpZW50cy5kZWZhdWx0KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVDbGllbnQoaWQ6IENsaWVudElkIHwgdW5kZWZpbmVkID0gY2xpZW50SWQpIHtcbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlSW1wbChpZClcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXBvbGxvIGNsaWVudCB3aXRoIGlkICR7XG4gICAgICAgICAgaWQgPz8gJ2RlZmF1bHQnXG4gICAgICAgIH0gbm90IGZvdW5kLiBVc2UgYW4gYXBwLnJ1bldpdGhDb250ZXh0KCkgb3IgcHJvdmlkZUFwb2xsb0NsaWVudCgpIGlmIHlvdSBhcmUgb3V0c2lkZSBvZiBhIGNvbXBvbmVudCBzZXR1cC5gLFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gY2xpZW50XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc29sdmVDbGllbnQsXG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlQ2xpZW50KClcbiAgICB9LFxuICB9XG59XG5cbmxldCBjdXJyZW50QXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxhbnk+ID0ge31cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGUgPSBhbnk+KGNsaWVudDogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPikge1xuICBjdXJyZW50QXBvbGxvQ2xpZW50cyA9IHtcbiAgICBkZWZhdWx0OiBjbGllbnQsXG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIDxURm5SZXN1bHQgPSBhbnk+IChmbjogKCkgPT4gVEZuUmVzdWx0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKVxuICAgIGN1cnJlbnRBcG9sbG9DbGllbnRzID0ge31cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBcG9sbG9DbGllbnRzPFRDYWNoZVNoYXBlID0gYW55PihjbGllbnRzOiBDbGllbnREaWN0PFRDYWNoZVNoYXBlPikge1xuICBjdXJyZW50QXBvbGxvQ2xpZW50cyA9IGNsaWVudHNcbiAgcmV0dXJuIGZ1bmN0aW9uIDxURm5SZXN1bHQgPSBhbnk+IChmbjogKCkgPT4gVEZuUmVzdWx0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKVxuICAgIGN1cnJlbnRBcG9sbG9DbGllbnRzID0ge31cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT3BlcmF0aW9uVmFyaWFibGVzIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSdcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnROb2RlIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnRQYXJhbWV0ZXIsIE9wdGlvbnNQYXJhbWV0ZXIsIFVzZVF1ZXJ5T3B0aW9ucywgVXNlUXVlcnlSZXR1cm4sIFZhcmlhYmxlc1BhcmFtZXRlciB9IGZyb20gJy4vdXNlUXVlcnknXG5pbXBvcnQgeyBpc1JlZiB9IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlUXVlcnlJbXBsIH0gZnJvbSAnLi91c2VRdWVyeSdcbmltcG9ydCB7IGlzU2VydmVyIH0gZnJvbSAnLi91dGlsL2Vudi5qcydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VMYXp5UXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcz4gZXh0ZW5kcyBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgcXVlcnkgYW5kIHN0YXJ0cyBsb2FkaW5nLlxuICAgKiBAcGFyYW0gZG9jdW1lbnQgT3ZlcnJpZGUgZG9jdW1lbnRcbiAgICogQHBhcmFtIHZhcmlhYmxlcyBPdmVycmlkZSB2YXJpYWJsZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3ZlcnJpZGUgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVyeSBpcyBhbHJlYWR5IGFjdGl2ZSwgb3RoZXJ3aXNlIHRoZSBuZXh0IHJlc3VsdCBvZiB0aGUgcXVlcnkuXG4gICAqL1xuICBsb2FkOiAoZG9jdW1lbnQ/OiBEb2N1bWVudE5vZGUgfCBudWxsLCB2YXJpYWJsZXM/OiBUVmFyaWFibGVzIHwgbnVsbCwgb3B0aW9ucz86IFVzZVF1ZXJ5T3B0aW9ucyB8IG51bGwpID0+IGZhbHNlIHwgUHJvbWlzZTxUUmVzdWx0PlxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGF6eVF1ZXJ5PFxuICBUUmVzdWx0ID0gYW55LFxuICBUVmFyaWFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBhbnksXG4+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIHZhcmlhYmxlcz86IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9ucz86IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4pOiBVc2VMYXp5UXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICBjb25zdCBxdWVyeSA9IHVzZVF1ZXJ5SW1wbDxUUmVzdWx0LCBUVmFyaWFibGVzPihkb2N1bWVudCwgdmFyaWFibGVzLCBvcHRpb25zLCB0cnVlKVxuXG4gIGZ1bmN0aW9uIGxvYWQoXG4gICAgZG9jdW1lbnQ/OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgIHZhcmlhYmxlcz86IFRWYXJpYWJsZXMgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBVc2VRdWVyeU9wdGlvbnMgfCBudWxsLFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgIHF1ZXJ5LmRvY3VtZW50LnZhbHVlID0gZG9jdW1lbnRcbiAgICB9XG4gICAgaWYgKHZhcmlhYmxlcykge1xuICAgICAgcXVlcnkudmFyaWFibGVzLnZhbHVlID0gdmFyaWFibGVzXG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGlzUmVmKHF1ZXJ5Lm9wdGlvbnMpID8gcXVlcnkub3B0aW9ucy52YWx1ZSA6IHF1ZXJ5Lm9wdGlvbnMsIG9wdGlvbnMpXG4gICAgfVxuICAgIGNvbnN0IGlzRmlyc3RSdW4gPSBxdWVyeS5mb3JjZURpc2FibGVkLnZhbHVlXG4gICAgaWYgKGlzRmlyc3RSdW4pIHtcbiAgICAgIHF1ZXJ5LmZvcmNlRGlzYWJsZWQudmFsdWUgPSBmYWxzZVxuXG4gICAgICAvLyBJZiBTU1IsIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHF1ZXJ5IG1hbnVhbGx5IHNpbmNlIGB3YXRjaGAgb24gYGlzRW5hYmxlZGAgaW4gYHVzZVF1ZXJ5SW1wbGAgd29uJ3QgYmUgY2FsbGVkLlxuICAgICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICAgIHF1ZXJ5LnN0YXJ0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBvZmY6IG9mZlJlc3VsdCB9ID0gcXVlcnkub25SZXN1bHQoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0LmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LmRhdGEpXG4gICAgICAgICAgICBvZmZSZXN1bHQoKVxuICAgICAgICAgICAgb2ZmRXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgeyBvZmY6IG9mZkVycm9yIH0gPSBxdWVyeS5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICBvZmZSZXN1bHQoKVxuICAgICAgICAgIG9mZkVycm9yKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5xdWVyeSxcbiAgICBsb2FkLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvRXJyb3IsXG4gIEFwb2xsb1F1ZXJ5UmVzdWx0LFxuICBGZXRjaE1vcmVRdWVyeU9wdGlvbnMsXG4gIE1heWJlTWFza2VkLFxuICBPYnNlcnZhYmxlUXVlcnksXG4gIE9ic2VydmFibGVTdWJzY3JpcHRpb24sXG4gIE9wZXJhdGlvblZhcmlhYmxlcyxcbiAgU3Vic2NyaWJlVG9Nb3JlT3B0aW9ucyxcbiAgVHlwZWREb2N1bWVudE5vZGUsXG4gIFVubWFza2VkLFxuICBVcGRhdGVRdWVyeU1hcEZuLFxuICBXYXRjaFF1ZXJ5T3B0aW9ucyxcbn0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnROb2RlIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB0eXBlIHtcbiAgUmVmLFxufSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB0eXBlIHsgUmVhY3RpdmVGdW5jdGlvbiB9IGZyb20gJy4vdXRpbC9SZWFjdGl2ZUZ1bmN0aW9uJ1xuaW1wb3J0IHsgZGVib3VuY2UsIHRocm90dGxlIH0gZnJvbSAndGhyb3R0bGUtZGVib3VuY2UnXG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZ2V0Q3VycmVudEluc3RhbmNlLFxuICBnZXRDdXJyZW50U2NvcGUsXG4gIG5leHRUaWNrLFxuICBvblNjb3BlRGlzcG9zZSxcbiAgb25TZXJ2ZXJQcmVmZXRjaCxcbiAgcmVmLFxuICBzaGFsbG93UmVmLFxuICB1bnJlZixcbiAgd2F0Y2gsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50IH0gZnJvbSAnLi91c2VBcG9sbG9DbGllbnQnXG5pbXBvcnQgeyBpc1NlcnZlciB9IGZyb20gJy4vdXRpbC9lbnYnXG5pbXBvcnQgeyB0cmFja1F1ZXJ5IH0gZnJvbSAnLi91dGlsL2xvYWRpbmdUcmFja2luZydcbmltcG9ydCB7IHBhcmFtVG9SZWFjdGl2ZSB9IGZyb20gJy4vdXRpbC9wYXJhbVRvUmVhY3RpdmUnXG5pbXBvcnQgeyBwYXJhbVRvUmVmIH0gZnJvbSAnLi91dGlsL3BhcmFtVG9SZWYnXG5pbXBvcnQgeyByZXN1bHRFcnJvcnNUb0Fwb2xsb0Vycm9yLCB0b0Fwb2xsb0Vycm9yIH0gZnJvbSAnLi91dGlsL3RvQXBvbGxvRXJyb3InXG5pbXBvcnQgeyB1c2VFdmVudEhvb2sgfSBmcm9tICcuL3V0aWwvdXNlRXZlbnRIb29rJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVF1ZXJ5T3B0aW9uczxcbiAgVFJlc3VsdCA9IGFueSxcbiAgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcyxcbj4gZXh0ZW5kcyBPbWl0PFdhdGNoUXVlcnlPcHRpb25zPFRWYXJpYWJsZXM+LCAncXVlcnknIHwgJ3ZhcmlhYmxlcyc+IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgZW5hYmxlZD86IGJvb2xlYW4gfCBSZWY8Ym9vbGVhbj5cbiAgdGhyb3R0bGU/OiBudW1iZXJcbiAgZGVib3VuY2U/OiBudW1iZXJcbiAgcHJlZmV0Y2g/OiBib29sZWFuXG4gIGtlZXBQcmV2aW91c1Jlc3VsdD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFN1YnNjcmliZVRvTW9yZUl0ZW0ge1xuICBvcHRpb25zOiBhbnlcbiAgdW5zdWJzY3JpYmVGbnM6ICgoKSA9PiB2b2lkKVtdXG59XG5cbi8vIFBhcmFtZXRlcnNcbmV4cG9ydCB0eXBlIERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+ID0gRG9jdW1lbnROb2RlIHwgUmVmPERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQ+IHwgUmVhY3RpdmVGdW5jdGlvbjxEb2N1bWVudE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPiA9IFRWYXJpYWJsZXMgfCBSZWY8VFZhcmlhYmxlcz4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFRWYXJpYWJsZXM+XG5leHBvcnQgdHlwZSBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXM+ID0gVXNlUXVlcnlPcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj5cblxuZXhwb3J0IGludGVyZmFjZSBPblJlc3VsdENvbnRleHQge1xuICBjbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FcnJvckNvbnRleHQge1xuICBjbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+XG59XG5cbi8vIFJldHVyblxuZXhwb3J0IGludGVyZmFjZSBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzPiB7XG4gIHJlc3VsdDogUmVmPFRSZXN1bHQgfCB1bmRlZmluZWQ+XG4gIGxvYWRpbmc6IFJlZjxib29sZWFuPlxuICBuZXR3b3JrU3RhdHVzOiBSZWY8bnVtYmVyIHwgdW5kZWZpbmVkPlxuICBlcnJvcjogUmVmPEFwb2xsb0Vycm9yIHwgbnVsbD5cbiAgc3RhcnQ6ICgpID0+IHZvaWRcbiAgc3RvcDogKCkgPT4gdm9pZFxuICByZXN0YXJ0OiAoKSA9PiB2b2lkXG4gIGZvcmNlRGlzYWJsZWQ6IFJlZjxib29sZWFuPlxuICBkb2N1bWVudDogUmVmPERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQ+XG4gIHZhcmlhYmxlczogUmVmPFRWYXJpYWJsZXMgfCB1bmRlZmluZWQ+XG4gIG9wdGlvbnM6IFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPiB8IFJlZjxVc2VRdWVyeU9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG4gIHF1ZXJ5OiBSZWY8T2JzZXJ2YWJsZVF1ZXJ5PFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD5cbiAgcmVmZXRjaDogKHZhcmlhYmxlcz86IFRWYXJpYWJsZXMpID0+IFByb21pc2U8QXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4+IHwgdW5kZWZpbmVkXG4gIGZldGNoTW9yZTogPFRGZXRjaERhdGEgPSBUUmVzdWx0LCBURmV0Y2hWYXJzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gVFZhcmlhYmxlcz4gKG9wdGlvbnM6IEZldGNoTW9yZVF1ZXJ5T3B0aW9uczxURmV0Y2hWYXJzLCBURmV0Y2hEYXRhPiAmIHtcbiAgICB1cGRhdGVRdWVyeT86IChwcmV2aW91c1F1ZXJ5UmVzdWx0OiBVbm1hc2tlZDxUUmVzdWx0Piwgb3B0aW9uczoge1xuICAgICAgZmV0Y2hNb3JlUmVzdWx0OiBVbm1hc2tlZDxURmV0Y2hEYXRhPlxuICAgICAgdmFyaWFibGVzOiBURmV0Y2hWYXJzXG4gICAgfSkgPT4gVW5tYXNrZWQ8VFJlc3VsdD5cbiAgfSkgPT4gUHJvbWlzZTxBcG9sbG9RdWVyeVJlc3VsdDxNYXliZU1hc2tlZDxURmV0Y2hEYXRhPj4+IHwgdW5kZWZpbmVkXG4gIHVwZGF0ZVF1ZXJ5OiAobWFwRm46IFVwZGF0ZVF1ZXJ5TWFwRm48VFJlc3VsdCwgVFZhcmlhYmxlcz4pID0+IHZvaWRcbiAgc3Vic2NyaWJlVG9Nb3JlOiA8VFN1YnNjcmlwdGlvblZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGEgPSBUUmVzdWx0PihvcHRpb25zOiBTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPiB8IFJlZjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFN1YnNjcmliZVRvTW9yZU9wdGlvbnM8VFJlc3VsdCwgVFN1YnNjcmlwdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGE+PikgPT4gdm9pZFxuICBvblJlc3VsdDogKGZuOiAocGFyYW06IEFwb2xsb1F1ZXJ5UmVzdWx0PFRSZXN1bHQ+LCBjb250ZXh0OiBPblJlc3VsdENvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxuICBvbkVycm9yOiAoZm46IChwYXJhbTogQXBvbGxvRXJyb3IsIGNvbnRleHQ6IE9uRXJyb3JDb250ZXh0KSA9PiB2b2lkKSA9PiB7XG4gICAgb2ZmOiAoKSA9PiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgYSBxdWVyeSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdmFyaWFibGVzIG9yIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55PihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIHVuZGVmaW5lZD5cbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIG5ldmVyPj5cblxuLyoqXG4gKiBVc2UgYSBxdWVyeSB0aGF0IGhhcyBvcHRpb25hbCB2YXJpYWJsZXMgYnV0IG5vdCBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHF1ZXJ5IHRoYXQgaGFzIHJlcXVpcmVkIHZhcmlhYmxlcyBidXQgbm90IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5PFRSZXN1bHQgPSBhbnksIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXM+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIHZhcmlhYmxlczogVmFyaWFibGVzUGFyYW1ldGVyPFRWYXJpYWJsZXM+XG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgb3B0aW9ucyBidXQgbm90IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5PFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPixcbiAgdmFyaWFibGVzOiB1bmRlZmluZWQgfCBudWxsLFxuICBvcHRpb25zOiBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIG5ldmVyPj4sXG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4+XG5cbi8qKlxuICogVXNlIGEgcXVlcnkgdGhhdCByZXF1aXJlcyB2YXJpYWJsZXMgYW5kIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM6IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9uczogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxcbiAgVFJlc3VsdCxcbiAgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyxcbj4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzPzogVmFyaWFibGVzUGFyYW1ldGVyPFRWYXJpYWJsZXM+LFxuICBvcHRpb25zPzogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5SW1wbDxUUmVzdWx0LCBUVmFyaWFibGVzPihkb2N1bWVudCwgdmFyaWFibGVzLCBvcHRpb25zKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVlcnlJbXBsPFxuICBUUmVzdWx0LFxuICBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzLFxuPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM/OiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz4sXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbiAgbGF6eSA9IGZhbHNlLFxuKTogVXNlUXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICBjb25zdCBjdXJyZW50U2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKVxuICBjb25zdCBjdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKVxuXG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gcmVmPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4oKVxuXG4gIGNvbnN0IGRvY3VtZW50UmVmID0gcGFyYW1Ub1JlZihkb2N1bWVudClcbiAgY29uc3QgdmFyaWFibGVzUmVmID0gcGFyYW1Ub1JlZih2YXJpYWJsZXMpXG4gIGNvbnN0IG9wdGlvbnNSZWYgPSBwYXJhbVRvUmVhY3RpdmUob3B0aW9ucylcblxuICAvLyBSZXN1bHRcbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBxdWVyeVxuICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZjxUUmVzdWx0IHwgdW5kZWZpbmVkPigpXG4gIGNvbnN0IHJlc3VsdEV2ZW50ID0gdXNlRXZlbnRIb29rPFtBcG9sbG9RdWVyeVJlc3VsdDxUUmVzdWx0PiwgT25SZXN1bHRDb250ZXh0XT4oKVxuICBjb25zdCBlcnJvciA9IHNoYWxsb3dSZWY8QXBvbGxvRXJyb3IgfCBudWxsPihudWxsKVxuICBjb25zdCBlcnJvckV2ZW50ID0gdXNlRXZlbnRIb29rPFtBcG9sbG9FcnJvciwgT25FcnJvckNvbnRleHRdPigpXG5cbiAgLy8gTG9hZGluZ1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBuZXR3b3JrIHJlcXVlc3QgaXMgcGVuZGluZ1xuICAgKi9cbiAgY29uc3QgbG9hZGluZyA9IHJlZihmYWxzZSlcbiAgY3VycmVudFNjb3BlICYmIHRyYWNrUXVlcnkobG9hZGluZylcbiAgY29uc3QgbmV0d29ya1N0YXR1cyA9IHJlZjxudW1iZXI+KClcblxuICAvLyBTU1JcbiAgbGV0IGZpcnN0UmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gIGxldCBmaXJzdFJlc29sdmVUcmlnZ2VyZWQgPSBmYWxzZVxuICBsZXQgZmlyc3RSZWplY3Q6ICgoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICBsZXQgZmlyc3RSZWplY3RFcnJvcjogdW5kZWZpbmVkIHwgQXBvbGxvRXJyb3JcblxuICBjb25zdCB0cnlGaXJzdFJlc29sdmUgPSAoKSA9PiB7XG4gICAgZmlyc3RSZXNvbHZlVHJpZ2dlcmVkID0gdHJ1ZVxuICAgIGlmIChmaXJzdFJlc29sdmUpXG4gICAgICBmaXJzdFJlc29sdmUoKVxuICB9XG5cbiAgY29uc3QgdHJ5Rmlyc3RSZWplY3QgPSAoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB7XG4gICAgZmlyc3RSZWplY3RFcnJvciA9IGFwb2xsb0Vycm9yXG4gICAgaWYgKGZpcnN0UmVqZWN0KVxuICAgICAgZmlyc3RSZWplY3QoYXBvbGxvRXJyb3IpXG4gIH1cblxuICBjb25zdCByZXNldEZpcnN0UmVzb2x2ZVJlamVjdCA9ICgpID0+IHtcbiAgICBmaXJzdFJlc29sdmUgPSB1bmRlZmluZWRcbiAgICBmaXJzdFJlamVjdCA9IHVuZGVmaW5lZFxuICAgIGZpcnN0UmVzb2x2ZVRyaWdnZXJlZCA9IGZhbHNlXG4gICAgZmlyc3RSZWplY3RFcnJvciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgY3VycmVudEluc3RhbmNlICYmIG9uU2VydmVyUHJlZmV0Y2g/LigoKSA9PiB7XG4gICAgaWYgKCFpc0VuYWJsZWQudmFsdWUgfHwgKGlzU2VydmVyICYmIGN1cnJlbnRPcHRpb25zLnZhbHVlPy5wcmVmZXRjaCA9PT0gZmFsc2UpKVxuICAgICAgcmV0dXJuXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZmlyc3RSZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICByZXNldEZpcnN0UmVzb2x2ZVJlamVjdCgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgICAgZmlyc3RSZWplY3QgPSAoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB7XG4gICAgICAgIHJlc2V0Rmlyc3RSZXNvbHZlUmVqZWN0KClcbiAgICAgICAgcmVqZWN0KGFwb2xsb0Vycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RSZXNvbHZlVHJpZ2dlcmVkKSB7XG4gICAgICAgIGZpcnN0UmVzb2x2ZSgpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmaXJzdFJlamVjdEVycm9yKSB7XG4gICAgICAgIGZpcnN0UmVqZWN0KGZpcnN0UmVqZWN0RXJyb3IpXG4gICAgICB9XG4gICAgfSkuZmluYWxseShzdG9wKVxuICB9KVxuXG4gIC8vIEFwb2xsbyBDbGllbnRcbiAgY29uc3QgeyByZXNvbHZlQ2xpZW50IH0gPSB1c2VBcG9sbG9DbGllbnQoKVxuXG4gIGZ1bmN0aW9uIGdldENsaWVudCgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNsaWVudChjdXJyZW50T3B0aW9ucy52YWx1ZT8uY2xpZW50SWQpXG4gIH1cblxuICAvLyBRdWVyeVxuXG4gIGNvbnN0IHF1ZXJ5OiBSZWY8T2JzZXJ2YWJsZVF1ZXJ5PFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBzaGFsbG93UmVmKClcbiAgbGV0IG9ic2VydmVyOiBPYnNlcnZhYmxlU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkXG4gIGxldCBzdGFydGVkID0gZmFsc2VcbiAgbGV0IGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICBsZXQgZmlyc3RTdGFydCA9IHRydWVcblxuICAvKipcbiAgICogU3RhcnRzIHdhdGNoaW5nIHRoZSBxdWVyeVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgaWYgKFxuICAgICAgc3RhcnRlZCB8fCAhaXNFbmFibGVkLnZhbHVlXG4gICAgICB8fCAoaXNTZXJ2ZXIgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LnByZWZldGNoID09PSBmYWxzZSlcbiAgICAgIHx8ICFjdXJyZW50RG9jdW1lbnRcbiAgICApIHtcbiAgICAgIHRyeUZpcnN0UmVzb2x2ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBPbiBzZXJ2ZXIgdGhlIHdhdGNoZXJzIG9uIGRvY3VtZW50LCB2YXJpYWJsZXMgYW5kIG9wdGlvbnMgYXJlIG5vdCB0cmlnZ2VyZWRcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIGFwcGx5RG9jdW1lbnQoZG9jdW1lbnRSZWYudmFsdWUpXG4gICAgICBhcHBseVZhcmlhYmxlcyh2YXJpYWJsZXNSZWYudmFsdWUpXG4gICAgICBhcHBseU9wdGlvbnModW5yZWYob3B0aW9uc1JlZikpXG4gICAgfVxuXG4gICAgc3RhcnRlZCA9IHRydWVcbiAgICBlcnJvci52YWx1ZSA9IG51bGxcbiAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuXG4gICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KClcblxuICAgIHF1ZXJ5LnZhbHVlID0gY2xpZW50LndhdGNoUXVlcnk8VFJlc3VsdCwgVFZhcmlhYmxlcz4oe1xuICAgICAgcXVlcnk6IGN1cnJlbnREb2N1bWVudCxcbiAgICAgIHZhcmlhYmxlczogY3VycmVudFZhcmlhYmxlcyA/PyB7fSBhcyBUVmFyaWFibGVzLFxuICAgICAgLi4uY3VycmVudE9wdGlvbnMudmFsdWUsXG4gICAgICAuLi4oaXNTZXJ2ZXIgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LmZldGNoUG9saWN5ICE9PSAnbm8tY2FjaGUnKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30sXG4gICAgfSlcblxuICAgIHN0YXJ0UXVlcnlTdWJzY3JpcHRpb24oKVxuXG4gICAgLy8gTWFrZSB0aGUgY2FjaGUgZGF0YSBhdmFpbGFibGUgdG8gdGhlIGNvbXBvbmVudCBpbW1lZGlhdGVseVxuICAgIC8vIFRoaXMgcHJldmVudHMgU1NSIGh5ZHJhdGlvbiBtaXNtYXRjaGVzXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoZmlyc3RTdGFydCB8fCAhY3VycmVudE9wdGlvbnMudmFsdWU/LmtlZXBQcmV2aW91c1Jlc3VsdCkgJiYgKGN1cnJlbnRPcHRpb25zLnZhbHVlPy5mZXRjaFBvbGljeSAhPT0gJ25vLWNhY2hlJyB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5ub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2UpKSB7XG4gICAgICBjb25zdCBjdXJyZW50UmVzdWx0ID0gcXVlcnkudmFsdWUuZ2V0Q3VycmVudFJlc3VsdChmYWxzZSlcblxuICAgICAgaWYgKCFjdXJyZW50UmVzdWx0LmxvYWRpbmcgfHwgY3VycmVudFJlc3VsdC5wYXJ0aWFsIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlPy5ub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2UpIHtcbiAgICAgICAgb25OZXh0UmVzdWx0KGN1cnJlbnRSZXN1bHQpXG4gICAgICAgIGlnbm9yZU5leHRSZXN1bHQgPSAhY3VycmVudFJlc3VsdC5sb2FkaW5nXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJyZW50UmVzdWx0LmVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoY3VycmVudFJlc3VsdC5lcnJvcilcbiAgICAgICAgaWdub3JlTmV4dFJlc3VsdCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3Vic2NyaWJlVG9Nb3JlSXRlbXMpIHtcbiAgICAgICAgYWRkU3Vic2NyaWJlVG9Nb3JlKGl0ZW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlyc3RTdGFydCA9IGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFF1ZXJ5U3Vic2NyaXB0aW9uKCkge1xuICAgIGlmIChvYnNlcnZlciAmJiAhb2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgcmV0dXJuXG4gICAgaWYgKCFxdWVyeS52YWx1ZSlcbiAgICAgIHJldHVyblxuXG4gICAgLy8gQ3JlYXRlIHN1YnNjcmlwdGlvblxuICAgIGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICAgIG9ic2VydmVyID0gcXVlcnkudmFsdWUuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IG9uTmV4dFJlc3VsdCxcbiAgICAgIGVycm9yOiBvbkVycm9yLFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBnZXRFcnJvclBvbGljeSgpIHtcbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50KGN1cnJlbnRPcHRpb25zLnZhbHVlPy5jbGllbnRJZClcbiAgICByZXR1cm4gY3VycmVudE9wdGlvbnMudmFsdWU/LmVycm9yUG9saWN5IHx8IGNsaWVudC5kZWZhdWx0T3B0aW9ucz8ud2F0Y2hRdWVyeT8uZXJyb3JQb2xpY3lcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTmV4dFJlc3VsdChxdWVyeVJlc3VsdDogQXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4pIHtcbiAgICBpZiAoaWdub3JlTmV4dFJlc3VsdCkge1xuICAgICAgaWdub3JlTmV4dFJlc3VsdCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzIGVycm9yIHRoYXQgbWF5IHN0aWxsIGJlIHByZXNlbnQgZnJvbSB0aGUgbGFzdCBmZXRjaCAoc28gcmVzdWx0IGhhbmRsZXJzXG4gICAgLy8gZG9uJ3QgcmVjZWl2ZSBvbGQgZXJyb3JzIHRoYXQgbWF5IG5vdCBldmVuIGJlIGFwcGxpY2FibGUgYW55bW9yZSkuXG4gICAgZXJyb3IudmFsdWUgPSBudWxsXG5cbiAgICBwcm9jZXNzTmV4dFJlc3VsdChxdWVyeVJlc3VsdClcblxuICAgIC8vIFdoZW4gYGVycm9yUG9saWN5YCBpcyBgYWxsYCwgYG9uRXJyb3JgIHdpbGwgbm90IGdldCBjYWxsZWQgYW5kXG4gICAgLy8gQXBvbGxvUXVlcnlSZXN1bHQuZXJyb3JzIG1heSBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyB3ZSBnZXQgYSByZXN1bHQuXG4gICAgLy8gVGhlIGNvZGUgaXMgb25seSByZWxldmFudCB3aGVuIGBlcnJvclBvbGljeWAgaXMgYGFsbGAsIGJlY2F1c2UgZm9yIG90aGVyIHNpdHVhdGlvbnMgaXRcbiAgICAvLyBjb3VsZCBoYXBlbiB0aGF0IG5leHQgYW5kIGVycm9yIGFyZSBjYWxsZWQgYXQgdGhlIHNhbWUgdGltZSBhbmQgdGhlbiBpdCB3aWxsIGxlYWQgdG8gbXVsdGlwbGVcbiAgICAvLyBvbkVycm9yIGNhbGxzLlxuICAgIGNvbnN0IGVycm9yUG9saWN5ID0gZ2V0RXJyb3JQb2xpY3koKVxuICAgIGlmIChlcnJvclBvbGljeSAmJiBlcnJvclBvbGljeSA9PT0gJ2FsbCcgJiYgIXF1ZXJ5UmVzdWx0LmVycm9yICYmIHF1ZXJ5UmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICBwcm9jZXNzRXJyb3IocmVzdWx0RXJyb3JzVG9BcG9sbG9FcnJvcihxdWVyeVJlc3VsdC5lcnJvcnMpKVxuICAgIH1cblxuICAgIHRyeUZpcnN0UmVzb2x2ZSgpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzTmV4dFJlc3VsdChxdWVyeVJlc3VsdDogQXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4pIHtcbiAgICByZXN1bHQudmFsdWUgPSBxdWVyeVJlc3VsdC5kYXRhICYmIE9iamVjdC5rZXlzKHF1ZXJ5UmVzdWx0LmRhdGEpLmxlbmd0aCA9PT0gMFxuICAgICAgPyBxdWVyeVJlc3VsdC5lcnJvclxuICAgICAgJiYgIWN1cnJlbnRPcHRpb25zLnZhbHVlPy5yZXR1cm5QYXJ0aWFsRGF0YVxuICAgICAgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LmVycm9yUG9saWN5ID09PSAnbm9uZSdcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiByZXN1bHQudmFsdWVcbiAgICAgIDogcXVlcnlSZXN1bHQuZGF0YVxuICAgIGxvYWRpbmcudmFsdWUgPSBxdWVyeVJlc3VsdC5sb2FkaW5nXG4gICAgbmV0d29ya1N0YXR1cy52YWx1ZSA9IHF1ZXJ5UmVzdWx0Lm5ldHdvcmtTdGF0dXNcbiAgICAvLyBXYWl0IGZvciBoYW5kbGVycyB0byBiZSByZWdpc3RlcmVkXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgcmVzdWx0RXZlbnQudHJpZ2dlcihxdWVyeVJlc3VsdCwge1xuICAgICAgICBjbGllbnQ6IGdldENsaWVudCgpLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gb25FcnJvcihxdWVyeUVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGlnbm9yZU5leHRSZXN1bHQpIHtcbiAgICAgIGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYW55IGVycm9yIHNob3VsZCBhbHJlYWR5IGJlIGFuIEFwb2xsb0Vycm9yLCBidXQgd2UgbWFrZSBzdXJlXG4gICAgY29uc3QgYXBvbGxvRXJyb3IgPSB0b0Fwb2xsb0Vycm9yKHF1ZXJ5RXJyb3IpXG4gICAgY29uc3QgZXJyb3JQb2xpY3kgPSBnZXRFcnJvclBvbGljeSgpXG5cbiAgICBpZiAoZXJyb3JQb2xpY3kgJiYgZXJyb3JQb2xpY3kgIT09ICdub25lJykge1xuICAgICAgcHJvY2Vzc05leHRSZXN1bHQoKHF1ZXJ5LnZhbHVlIGFzIE9ic2VydmFibGVRdWVyeTxUUmVzdWx0LCBUVmFyaWFibGVzPikuZ2V0Q3VycmVudFJlc3VsdCgpKVxuICAgIH1cbiAgICBwcm9jZXNzRXJyb3IoYXBvbGxvRXJyb3IpXG4gICAgdHJ5Rmlyc3RSZWplY3QoYXBvbGxvRXJyb3IpXG4gICAgLy8gVGhlIG9ic2VydmFibGUgY2xvc2VzIHRoZSBzdWIgaWYgYW4gZXJyb3Igb2NjdXJzXG4gICAgcmVzdWJzY3JpYmVUb1F1ZXJ5KClcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NFcnJvcihhcG9sbG9FcnJvcjogQXBvbGxvRXJyb3IpIHtcbiAgICBlcnJvci52YWx1ZSA9IGFwb2xsb0Vycm9yXG4gICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgbmV0d29ya1N0YXR1cy52YWx1ZSA9IDhcbiAgICAvLyBXYWl0IGZvciBoYW5kbGVycyB0byBiZSByZWdpc3RlcmVkXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgZXJyb3JFdmVudC50cmlnZ2VyKGFwb2xsb0Vycm9yLCB7XG4gICAgICAgIGNsaWVudDogZ2V0Q2xpZW50KCksXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZXN1YnNjcmliZVRvUXVlcnkoKSB7XG4gICAgaWYgKCFxdWVyeS52YWx1ZSlcbiAgICAgIHJldHVyblxuICAgIGNvbnN0IGxhc3RFcnJvciA9IHF1ZXJ5LnZhbHVlLmdldExhc3RFcnJvcigpXG4gICAgY29uc3QgbGFzdFJlc3VsdCA9IHF1ZXJ5LnZhbHVlLmdldExhc3RSZXN1bHQoKVxuICAgIHF1ZXJ5LnZhbHVlLnJlc2V0TGFzdFJlc3VsdHMoKVxuICAgIHN0YXJ0UXVlcnlTdWJzY3JpcHRpb24oKVxuICAgIE9iamVjdC5hc3NpZ24ocXVlcnkudmFsdWUsIHsgbGFzdEVycm9yLCBsYXN0UmVzdWx0IH0pXG4gIH1cblxuICBsZXQgb25TdG9wSGFuZGxlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW11cblxuICAvKipcbiAgICogU3RvcCB3YXRjaGluZyB0aGUgcXVlcnlcbiAgICovXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgdHJ5Rmlyc3RSZXNvbHZlKClcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBzdGFydGVkID0gZmFsc2VcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcblxuICAgIG9uU3RvcEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKCkpXG4gICAgb25TdG9wSGFuZGxlcnMgPSBbXVxuXG4gICAgaWYgKHF1ZXJ5LnZhbHVlKSB7XG4gICAgICBxdWVyeS52YWx1ZS5zdG9wUG9sbGluZygpXG4gICAgICBxdWVyeS52YWx1ZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLnVuc3Vic2NyaWJlKClcbiAgICAgIG9ic2VydmVyID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdGFydFxuICBsZXQgcmVzdGFydGluZyA9IGZhbHNlXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHJlc3RhcnQgb2YgdGhlIHF1ZXJ5IChvbiBuZXh0IHRpY2spIGlmIGl0IGlzIGFscmVhZHkgYWN0aXZlXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUmVzdGFydCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQgfHwgcmVzdGFydGluZylcbiAgICAgIHJldHVyblxuICAgIHJlc3RhcnRpbmcgPSB0cnVlXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgc3RvcCgpXG4gICAgICAgIHN0YXJ0KClcbiAgICAgIH1cbiAgICAgIHJlc3RhcnRpbmcgPSBmYWxzZVxuICAgIH0pXG4gIH1cblxuICBsZXQgZGVib3VuY2VkUmVzdGFydDogdHlwZW9mIGJhc2VSZXN0YXJ0XG4gIGxldCBpc1Jlc3RhcnREZWJvdW5jZVNldHVwID0gZmFsc2VcbiAgZnVuY3Rpb24gdXBkYXRlUmVzdGFydEZuKCkge1xuICAgIC8vIE9uIHNlcnZlciwgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGN1cnJlbnRPcHRpb25zIGlzIGluaXRpYWxpemVkXG4gICAgLy8gQFRPRE8gaW52ZXN0aWdhdGVcbiAgICBpZiAoIWN1cnJlbnRPcHRpb25zLnZhbHVlKSB7XG4gICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gYmFzZVJlc3RhcnRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoY3VycmVudE9wdGlvbnMudmFsdWU/LnRocm90dGxlKSB7XG4gICAgICAgIGRlYm91bmNlZFJlc3RhcnQgPSB0aHJvdHRsZShjdXJyZW50T3B0aW9ucy52YWx1ZS50aHJvdHRsZSwgYmFzZVJlc3RhcnQpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJyZW50T3B0aW9ucy52YWx1ZT8uZGVib3VuY2UpIHtcbiAgICAgICAgZGVib3VuY2VkUmVzdGFydCA9IGRlYm91bmNlKGN1cnJlbnRPcHRpb25zLnZhbHVlLmRlYm91bmNlLCBiYXNlUmVzdGFydClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gYmFzZVJlc3RhcnRcbiAgICAgIH1cbiAgICAgIGlzUmVzdGFydERlYm91bmNlU2V0dXAgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdGFydCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQgfHwgcmVzdGFydGluZylcbiAgICAgIHJldHVyblxuICAgIGlmICghaXNSZXN0YXJ0RGVib3VuY2VTZXR1cClcbiAgICAgIHVwZGF0ZVJlc3RhcnRGbigpXG4gICAgZGVib3VuY2VkUmVzdGFydCgpXG4gIH1cblxuICAvLyBBcHBseWluZyBkb2N1bWVudFxuICBsZXQgY3VycmVudERvY3VtZW50OiBEb2N1bWVudE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkID0gZG9jdW1lbnRSZWYudmFsdWVcblxuICAvLyBFbmFibGVkIHN0YXRlXG5cbiAgY29uc3QgZm9yY2VEaXNhYmxlZCA9IHJlZihsYXp5KVxuICBjb25zdCBlbmFibGVkT3B0aW9uID0gY29tcHV0ZWQoKCkgPT4gIWN1cnJlbnRPcHRpb25zLnZhbHVlIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlLmVuYWJsZWQgPT0gbnVsbCB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5lbmFibGVkKVxuICBjb25zdCBpc0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiBlbmFibGVkT3B0aW9uLnZhbHVlICYmICFmb3JjZURpc2FibGVkLnZhbHVlICYmICEhZG9jdW1lbnRSZWYudmFsdWUpXG5cbiAgLy8gQXBwbHlpbmcgb3B0aW9ucyBmaXJzdCAoaW4gY2FzZSBpdCBkaXNhYmxlcyB0aGUgcXVlcnkpXG4gIHdhdGNoKCgpID0+IHVucmVmKG9wdGlvbnNSZWYpLCBhcHBseU9wdGlvbnMsIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBmdW5jdGlvbiBhcHBseU9wdGlvbnModmFsdWU6IFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPikge1xuICAgIGlmIChjdXJyZW50T3B0aW9ucy52YWx1ZSAmJiAoXG4gICAgICBjdXJyZW50T3B0aW9ucy52YWx1ZS50aHJvdHRsZSAhPT0gdmFsdWUudGhyb3R0bGVcbiAgICAgIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlLmRlYm91bmNlICE9PSB2YWx1ZS5kZWJvdW5jZVxuICAgICkpIHtcbiAgICAgIHVwZGF0ZVJlc3RhcnRGbigpXG4gICAgfVxuICAgIGN1cnJlbnRPcHRpb25zLnZhbHVlID0gdmFsdWVcbiAgICByZXN0YXJ0KClcbiAgfVxuXG4gIC8vIEFwcGx5aW5nIGRvY3VtZW50XG4gIHdhdGNoKGRvY3VtZW50UmVmLCBhcHBseURvY3VtZW50KVxuXG4gIGZ1bmN0aW9uIGFwcGx5RG9jdW1lbnQodmFsdWU6IERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjdXJyZW50RG9jdW1lbnQgPSB2YWx1ZVxuICAgIHJlc3RhcnQoKVxuICB9XG5cbiAgLy8gQXBwbHlpbmcgdmFyaWFibGVzXG4gIGxldCBjdXJyZW50VmFyaWFibGVzOiBUVmFyaWFibGVzIHwgdW5kZWZpbmVkXG4gIGxldCBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZDogc3RyaW5nXG4gIHdhdGNoKCgpID0+IHtcbiAgICBpZiAoaXNFbmFibGVkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFyaWFibGVzUmVmLnZhbHVlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfSwgYXBwbHlWYXJpYWJsZXMsIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBmdW5jdGlvbiBhcHBseVZhcmlhYmxlcyh2YWx1ZT86IFRWYXJpYWJsZXMpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoW3ZhbHVlLCBpc0VuYWJsZWQudmFsdWVdKVxuICAgIGlmIChzZXJpYWxpemVkICE9PSBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZCkge1xuICAgICAgY3VycmVudFZhcmlhYmxlcyA9IHZhbHVlXG4gICAgICByZXN0YXJ0KClcbiAgICB9XG4gICAgY3VycmVudFZhcmlhYmxlc1NlcmlhbGl6ZWQgPSBzZXJpYWxpemVkXG4gIH1cblxuICAvLyBSZWZldGNoXG5cbiAgZnVuY3Rpb24gcmVmZXRjaCh2YXJpYWJsZXM6IFRWYXJpYWJsZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAocXVlcnkudmFsdWUpIHtcbiAgICAgIGlmICh2YXJpYWJsZXMpIHtcbiAgICAgICAgY3VycmVudFZhcmlhYmxlcyA9IHZhcmlhYmxlc1xuICAgICAgfVxuICAgICAgZXJyb3IudmFsdWUgPSBudWxsXG4gICAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuICAgICAgcmV0dXJuIHF1ZXJ5LnZhbHVlLnJlZmV0Y2godmFyaWFibGVzKVxuICAgICAgICAudGhlbigocmVmZXRjaFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBxdWVyeS52YWx1ZT8uZ2V0Q3VycmVudFJlc3VsdCgpXG4gICAgICAgICAgY3VycmVudFJlc3VsdCAmJiBwcm9jZXNzTmV4dFJlc3VsdChjdXJyZW50UmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZWZldGNoUmVzdWx0XG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIFF1ZXJ5XG5cbiAgZnVuY3Rpb24gdXBkYXRlUXVlcnkobWFwRm46IFVwZGF0ZVF1ZXJ5TWFwRm48VFJlc3VsdCwgVFZhcmlhYmxlcz4pIHtcbiAgICBpZiAocXVlcnkudmFsdWUpIHtcbiAgICAgIHF1ZXJ5LnZhbHVlLnVwZGF0ZVF1ZXJ5KG1hcEZuKVxuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIG1vcmVcblxuICBmdW5jdGlvbiBmZXRjaE1vcmU8VEZldGNoRGF0YSA9IFRSZXN1bHQsIFRGZXRjaFZhcnMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBUVmFyaWFibGVzPihvcHRpb25zOiBGZXRjaE1vcmVRdWVyeU9wdGlvbnM8VEZldGNoVmFycywgVEZldGNoRGF0YT4gJiB7XG4gICAgdXBkYXRlUXVlcnk/OiAocHJldmlvdXNRdWVyeVJlc3VsdDogVW5tYXNrZWQ8VFJlc3VsdD4sIG9wdGlvbnM6IHtcbiAgICAgIGZldGNoTW9yZVJlc3VsdDogVW5tYXNrZWQ8VEZldGNoRGF0YT5cbiAgICAgIHZhcmlhYmxlczogVEZldGNoVmFyc1xuICAgIH0pID0+IFVubWFza2VkPFRSZXN1bHQ+XG4gIH0pOiBQcm9taXNlPEFwb2xsb1F1ZXJ5UmVzdWx0PE1heWJlTWFza2VkPFRGZXRjaERhdGE+Pj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChxdWVyeS52YWx1ZSkge1xuICAgICAgZXJyb3IudmFsdWUgPSBudWxsXG4gICAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuICAgICAgcmV0dXJuIHF1ZXJ5LnZhbHVlLmZldGNoTW9yZShvcHRpb25zKVxuICAgICAgICAudGhlbigoZmV0Y2hNb3JlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJlc3VsdCA9IHF1ZXJ5LnZhbHVlPy5nZXRDdXJyZW50UmVzdWx0KClcbiAgICAgICAgICBjdXJyZW50UmVzdWx0ICYmIHByb2Nlc3NOZXh0UmVzdWx0KGN1cnJlbnRSZXN1bHQpXG4gICAgICAgICAgcmV0dXJuIGZldGNoTW9yZVJlc3VsdFxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFN1YnNjcmliZSB0byBtb3JlXG5cbiAgY29uc3Qgc3Vic2NyaWJlVG9Nb3JlSXRlbXM6IFN1YnNjcmliZVRvTW9yZUl0ZW1bXSA9IFtdXG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlVG9Nb3JlPFxuICAgIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4gICAgVFN1YnNjcmlwdGlvbkRhdGEgPSBUUmVzdWx0LFxuICA+KFxuICAgIG9wdGlvbnM6IFN1YnNjcmliZVRvTW9yZU9wdGlvbnM8VFJlc3VsdCwgVFN1YnNjcmlwdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGE+IHxcbiAgICAgIFJlZjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4gfFxuICAgICAgUmVhY3RpdmVGdW5jdGlvbjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4sXG4gICkge1xuICAgIGlmIChpc1NlcnZlcilcbiAgICAgIHJldHVyblxuICAgIGNvbnN0IG9wdGlvbnNSZWYgPSBwYXJhbVRvUmVmKG9wdGlvbnMpXG4gICAgd2F0Y2gob3B0aW9uc1JlZiwgKHZhbHVlLCBvbGRWYWx1ZSwgb25DbGVhbnVwKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHN1YnNjcmliZVRvTW9yZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ub3B0aW9ucyA9PT0gb2xkVmFsdWUpXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHN1YnNjcmliZVRvTW9yZUl0ZW1zLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW06IFN1YnNjcmliZVRvTW9yZUl0ZW0gPSB7XG4gICAgICAgIG9wdGlvbnM6IHZhbHVlLFxuICAgICAgICB1bnN1YnNjcmliZUZuczogW10sXG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVUb01vcmVJdGVtcy5wdXNoKGl0ZW0pXG5cbiAgICAgIGFkZFN1YnNjcmliZVRvTW9yZShpdGVtKVxuXG4gICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICBpdGVtLnVuc3Vic2NyaWJlRm5zLmZvckVhY2goZm4gPT4gZm4oKSlcbiAgICAgICAgaXRlbS51bnN1YnNjcmliZUZucyA9IFtdXG4gICAgICB9KVxuICAgIH0sIHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkU3Vic2NyaWJlVG9Nb3JlKGl0ZW06IFN1YnNjcmliZVRvTW9yZUl0ZW0pIHtcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBpZiAoIXF1ZXJ5LnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IGlzIG5vdCBkZWZpbmVkJylcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBxdWVyeS52YWx1ZS5zdWJzY3JpYmVUb01vcmUoaXRlbS5vcHRpb25zKVxuICAgIG9uU3RvcEhhbmRsZXJzLnB1c2godW5zdWJzY3JpYmUpXG4gICAgaXRlbS51bnN1YnNjcmliZUZucy5wdXNoKHVuc3Vic2NyaWJlKVxuICB9XG5cbiAgLy8gQXV0byBzdGFydCAmIHN0b3BcblxuICB3YXRjaChpc0VuYWJsZWQsICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzdGFydCgpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0b3AoKVxuICAgIH1cbiAgfSlcblxuICBpZiAoaXNFbmFibGVkLnZhbHVlKSB7XG4gICAgc3RhcnQoKVxuICB9XG5cbiAgLy8gVGVhcmRvd25cbiAgaWYgKGN1cnJlbnRTY29wZSkge1xuICAgIG9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICAgIHN0b3AoKVxuICAgICAgc3Vic2NyaWJlVG9Nb3JlSXRlbXMubGVuZ3RoID0gMFxuICAgIH0pXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdbVnVlIGFwb2xsb10gdXNlUXVlcnkoKSBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhbiBhY3RpdmUgZWZmZWN0IHNjb3BlIGFuZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBzdG9wcGVkLicpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3VsdCxcbiAgICBsb2FkaW5nLFxuICAgIG5ldHdvcmtTdGF0dXMsXG4gICAgZXJyb3IsXG4gICAgc3RhcnQsXG4gICAgc3RvcCxcbiAgICByZXN0YXJ0LFxuICAgIGZvcmNlRGlzYWJsZWQsXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50UmVmLFxuICAgIHZhcmlhYmxlczogdmFyaWFibGVzUmVmLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNSZWYsXG4gICAgcXVlcnksXG4gICAgcmVmZXRjaCxcbiAgICBmZXRjaE1vcmUsXG4gICAgc3Vic2NyaWJlVG9Nb3JlLFxuICAgIHVwZGF0ZVF1ZXJ5LFxuICAgIG9uUmVzdWx0OiByZXN1bHRFdmVudC5vbixcbiAgICBvbkVycm9yOiBlcnJvckV2ZW50Lm9uLFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgaXNTZXJ2ZXIgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuIiwiaW1wb3J0IHR5cGUgeyBFZmZlY3RTY29wZSwgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgeyBnZXRDdXJyZW50U2NvcGUsIG9uU2NvcGVEaXNwb3NlLCByZWYsIHdhdGNoIH0gZnJvbSAndnVlLWRlbWknXG5cbmltcG9ydCB7IGlzU2VydmVyIH0gZnJvbSAnLi9lbnYuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGluZ1RyYWNraW5nIHtcbiAgcXVlcmllczogUmVmPG51bWJlcj5cbiAgbXV0YXRpb25zOiBSZWY8bnVtYmVyPlxuICBzdWJzY3JpcHRpb25zOiBSZWY8bnVtYmVyPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcExvYWRpbmdUcmFja2luZyBleHRlbmRzIExvYWRpbmdUcmFja2luZyB7XG4gIGNvbXBvbmVudHM6IE1hcDxFZmZlY3RTY29wZSwgTG9hZGluZ1RyYWNraW5nPlxufVxuXG5leHBvcnQgY29uc3QgZ2xvYmFsVHJhY2tpbmc6IEFwcExvYWRpbmdUcmFja2luZyA9IHtcbiAgcXVlcmllczogcmVmKDApLFxuICBtdXRhdGlvbnM6IHJlZigwKSxcbiAgc3Vic2NyaXB0aW9uczogcmVmKDApLFxuICBjb21wb25lbnRzOiBuZXcgTWFwKCksXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGN1cnJlbnRTY29wZSA9IGdldEN1cnJlbnRTY29wZSgpXG4gIGlmICghY3VycmVudFNjb3BlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBsZXQgdHJhY2tpbmc6IExvYWRpbmdUcmFja2luZ1xuICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAvLyBTU1IgZG9lcyBub3Qgc3VwcG9ydCBvblNjb3BlRGlzcG9zZSwgc28gaWYgd2UgZG9uJ3Qgc2tpcCB0aGlzLCBpdCB3aWxsIGxlYWsgbWVtb3J5XG4gICAgdHJhY2tpbmcgPSB7XG4gICAgICBxdWVyaWVzOiByZWYoMCksXG4gICAgICBtdXRhdGlvbnM6IHJlZigwKSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IHJlZigwKSxcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2tpbmcgfVxuICB9XG5cbiAgaWYgKCFnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLmhhcyhjdXJyZW50U2NvcGUpKSB7XG4gICAgLy8gQWRkIHBlci1jb21wb25lbnQgdHJhY2tpbmdcbiAgICBnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLnNldChjdXJyZW50U2NvcGUsIHRyYWNraW5nID0ge1xuICAgICAgcXVlcmllczogcmVmKDApLFxuICAgICAgbXV0YXRpb25zOiByZWYoMCksXG4gICAgICBzdWJzY3JpcHRpb25zOiByZWYoMCksXG4gICAgfSlcbiAgICAvLyBDbGVhbnVwXG4gICAgb25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgICAgZ2xvYmFsVHJhY2tpbmcuY29tcG9uZW50cy5kZWxldGUoY3VycmVudFNjb3BlKVxuICAgIH0pXG4gIH1cbiAgZWxzZSB7XG4gICAgdHJhY2tpbmcgPSBnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLmdldChjdXJyZW50U2NvcGUpIGFzIExvYWRpbmdUcmFja2luZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja2luZyxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFjayhsb2FkaW5nOiBSZWY8Ym9vbGVhbj4sIHR5cGU6IGtleW9mIExvYWRpbmdUcmFja2luZykge1xuICBpZiAoaXNTZXJ2ZXIpXG4gICAgcmV0dXJuXG5cbiAgY29uc3QgeyB0cmFja2luZyB9ID0gZ2V0Q3VycmVudFRyYWNraW5nKClcblxuICB3YXRjaChsb2FkaW5nLCAodmFsdWUsIG9sZFZhbHVlKSA9PiB7XG4gICAgaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICBjb25zdCBtb2QgPSB2YWx1ZSA/IDEgOiAtMVxuICAgICAgaWYgKHRyYWNraW5nKVxuICAgICAgICB0cmFja2luZ1t0eXBlXS52YWx1ZSArPSBtb2RcbiAgICAgIGdsb2JhbFRyYWNraW5nW3R5cGVdLnZhbHVlICs9IG1vZFxuICAgIH1cbiAgfSwge1xuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBvblNjb3BlRGlzcG9zZSgoKSA9PiB7XG4gICAgaWYgKGxvYWRpbmcudmFsdWUpIHtcbiAgICAgIGlmICh0cmFja2luZylcbiAgICAgICAgdHJhY2tpbmdbdHlwZV0udmFsdWUtLVxuICAgICAgZ2xvYmFsVHJhY2tpbmdbdHlwZV0udmFsdWUtLVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrUXVlcnkobG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdxdWVyaWVzJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrTXV0YXRpb24obG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdtdXRhdGlvbnMnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhY2tTdWJzY3JpcHRpb24obG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdzdWJzY3JpcHRpb25zJylcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlRnVuY3Rpb24gfSBmcm9tICcuL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBjb21wdXRlZCwgaXNSZWYsIHJlYWN0aXZlIH0gZnJvbSAndnVlLWRlbWknXG5cbnR5cGUgVE9iamVjdCA9IG9iamVjdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1Ub1JlYWN0aXZlPFQgZXh0ZW5kcyBUT2JqZWN0PihwYXJhbTogVCB8IFJlZjxUPiB8IFJlYWN0aXZlRnVuY3Rpb248VD4pOiBUIHwgUmVmPFQ+IHtcbiAgaWYgKGlzUmVmKHBhcmFtKSkge1xuICAgIHJldHVybiBwYXJhbVxuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjb21wdXRlZChwYXJhbSBhcyBSZWFjdGl2ZUZ1bmN0aW9uPFQ+KVxuICB9XG4gIGVsc2UgaWYgKHBhcmFtKSB7XG4gICAgcmV0dXJuIHJlYWN0aXZlKHBhcmFtKSBhcyBUXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIHBhcmFtXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlRnVuY3Rpb24gfSBmcm9tICcuL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBjb21wdXRlZCwgaXNSZWYsIHJlZiB9IGZyb20gJ3Z1ZS1kZW1pJ1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1Ub1JlZjxUPihwYXJhbTogVCB8IFJlZjxUPiB8IFJlYWN0aXZlRnVuY3Rpb248VD4pOiBSZWY8VD4ge1xuICBpZiAoaXNSZWYocGFyYW0pKSB7XG4gICAgcmV0dXJuIHBhcmFtXG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKHBhcmFtIGFzIFJlYWN0aXZlRnVuY3Rpb248VD4pXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIHJlZihwYXJhbSkgYXMgUmVmPFQ+XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgR3JhcGhRTEZvcm1hdHRlZEVycm9yIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB7IEFwb2xsb0Vycm9yLCBpc0Fwb2xsb0Vycm9yIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXBvbGxvRXJyb3IoZXJyb3I6IHVua25vd24pOiBBcG9sbG9FcnJvciB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIG5ldyBBcG9sbG9FcnJvcih7XG4gICAgICBuZXR3b3JrRXJyb3I6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKChlcnJvciBhcyBhbnkpPy5tZXNzYWdlKSwgeyBvcmlnaW5hbEVycm9yOiBlcnJvciB9KSxcbiAgICAgIGVycm9yTWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB9KVxuICB9XG5cbiAgaWYgKGlzQXBvbGxvRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yXG4gIH1cblxuICByZXR1cm4gbmV3IEFwb2xsb0Vycm9yKHsgbmV0d29ya0Vycm9yOiBlcnJvciwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN1bHRFcnJvcnNUb0Fwb2xsb0Vycm9yKGVycm9yczogUmVhZG9ubHlBcnJheTxHcmFwaFFMRm9ybWF0dGVkRXJyb3I+KTogQXBvbGxvRXJyb3Ige1xuICByZXR1cm4gbmV3IEFwb2xsb0Vycm9yKHtcbiAgICBncmFwaFFMRXJyb3JzOiBlcnJvcnMsXG4gICAgZXJyb3JNZXNzYWdlOiBgR3JhcGhRTCByZXNwb25zZSBjb250YWlucyBlcnJvcnM6ICR7ZXJyb3JzLm1hcCgoZTogYW55KSA9PiBlLm1lc3NhZ2UpLmpvaW4oJyB8ICcpfWAsXG4gIH0pXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gdXNlRXZlbnRIb29rPFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSA9IGFueVtdPigpIHtcbiAgY29uc3QgZm5zOiBBcnJheTwoLi4ucGFyYW1zOiBUUGFyYW1zKSA9PiB2b2lkPiA9IFtdXG5cbiAgZnVuY3Rpb24gb24oZm46ICguLi5wYXJhbXM6IFRQYXJhbXMpID0+IHZvaWQpIHtcbiAgICBmbnMucHVzaChmbilcbiAgICByZXR1cm4ge1xuICAgICAgb2ZmOiAoKSA9PiBvZmYoZm4pLFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9mZihmbjogKC4uLnBhcmFtczogVFBhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGluZGV4ID0gZm5zLmluZGV4T2YoZm4pXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgZm5zLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmlnZ2VyKC4uLnBhcmFtczogVFBhcmFtcykge1xuICAgIGZvciAoY29uc3QgZm4gb2YgZm5zKSB7XG4gICAgICBmbiguLi5wYXJhbXMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q291bnQoKSB7XG4gICAgcmV0dXJuIGZucy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb24sXG4gICAgb2ZmLFxuICAgIHRyaWdnZXIsXG4gICAgZ2V0Q291bnQsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgeyBnZXRDdXJyZW50VHJhY2tpbmcsIGdsb2JhbFRyYWNraW5nIH0gZnJvbSAnLi91dGlsL2xvYWRpbmdUcmFja2luZydcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5TG9hZGluZygpIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gZ2V0Q3VycmVudFRyYWNraW5nKClcbiAgaWYgKCF0cmFja2luZylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVF1ZXJ5TG9hZGluZyBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBzZXR1cCBmdW5jdGlvbi4nKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhY2tpbmcucXVlcmllcy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNdXRhdGlvbkxvYWRpbmcoKSB7XG4gIGNvbnN0IHsgdHJhY2tpbmcgfSA9IGdldEN1cnJlbnRUcmFja2luZygpXG4gIGlmICghdHJhY2tpbmcpXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VNdXRhdGlvbkxvYWRpbmcgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgc2V0dXAgZnVuY3Rpb24uJylcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRyYWNraW5nLm11dGF0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb25Mb2FkaW5nKCkge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBnZXRDdXJyZW50VHJhY2tpbmcoKVxuICBpZiAoIXRyYWNraW5nKVxuICAgIHRocm93IG5ldyBFcnJvcigndXNlU3Vic2NyaXB0aW9uTG9hZGluZyBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBzZXR1cCBmdW5jdGlvbi4nKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhY2tpbmcuc3Vic2NyaXB0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VHbG9iYWxRdWVyeUxvYWRpbmcoKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiBnbG9iYWxUcmFja2luZy5xdWVyaWVzLnZhbHVlID4gMClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUdsb2JhbE11dGF0aW9uTG9hZGluZygpIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGdsb2JhbFRyYWNraW5nLm11dGF0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VHbG9iYWxTdWJzY3JpcHRpb25Mb2FkaW5nKCkge1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZ2xvYmFsVHJhY2tpbmcuc3Vic2NyaXB0aW9ucy52YWx1ZSA+IDApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFwb2xsb0NsaWVudCwgQXBvbGxvRXJyb3IsIEZldGNoUmVzdWx0LCBNdXRhdGlvbk9wdGlvbnMsIE9wZXJhdGlvblZhcmlhYmxlcywgVHlwZWREb2N1bWVudE5vZGUgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudE5vZGUgfSBmcm9tICdncmFwaHFsJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB0eXBlIHsgUmVhY3RpdmVGdW5jdGlvbiB9IGZyb20gJy4vdXRpbC9SZWFjdGl2ZUZ1bmN0aW9uJ1xuaW1wb3J0IHsgZ2V0Q3VycmVudFNjb3BlLCBpc1JlZiwgbmV4dFRpY2ssIG9uU2NvcGVEaXNwb3NlLCByZWYsIHNoYWxsb3dSZWYgfSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB7IHVzZUFwb2xsb0NsaWVudCB9IGZyb20gJy4vdXNlQXBvbGxvQ2xpZW50J1xuaW1wb3J0IHsgdHJhY2tNdXRhdGlvbiB9IGZyb20gJy4vdXRpbC9sb2FkaW5nVHJhY2tpbmcnXG5pbXBvcnQgeyB0b0Fwb2xsb0Vycm9yIH0gZnJvbSAnLi91dGlsL3RvQXBvbGxvRXJyb3InXG5pbXBvcnQgeyB1c2VFdmVudEhvb2sgfSBmcm9tICcuL3V0aWwvdXNlRXZlbnRIb29rJ1xuXG4vKipcbiAqIGB1c2VNdXRhdGlvbmAgb3B0aW9ucyBmb3IgbXV0YXRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZSBgdmFyaWFibGVzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VNdXRhdGlvbk9wdGlvbnM8XG4gIFRSZXN1bHQgPSBhbnksXG4gIFRWYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4+IGV4dGVuZHMgT21pdDxNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4sICdtdXRhdGlvbic+IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgdGhyb3dzPzogJ2F1dG8nIHwgJ2Fsd2F5cycgfCAnbmV2ZXInXG59XG5cbnR5cGUgRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBEb2N1bWVudE5vZGUgfCBSZWY8RG9jdW1lbnROb2RlPiB8IFJlYWN0aXZlRnVuY3Rpb248RG9jdW1lbnROb2RlPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VHlwZWREb2N1bWVudE5vZGU8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG50eXBlIE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBVc2VNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4gfCBSZWY8VXNlTXV0YXRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VXNlTXV0YXRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PlxuXG5leHBvcnQgdHlwZSBNdXRhdGVPdmVycmlkZU9wdGlvbnM8VFJlc3VsdD4gPSBQaWNrPFVzZU11dGF0aW9uT3B0aW9uczxUUmVzdWx0LCBPcGVyYXRpb25WYXJpYWJsZXM+LCAndXBkYXRlJyB8ICdvcHRpbWlzdGljUmVzcG9uc2UnIHwgJ2NvbnRleHQnIHwgJ3VwZGF0ZVF1ZXJpZXMnIHwgJ3JlZmV0Y2hRdWVyaWVzJyB8ICdhd2FpdFJlZmV0Y2hRdWVyaWVzJyB8ICdlcnJvclBvbGljeScgfCAnZmV0Y2hQb2xpY3knIHwgJ2NsaWVudElkJz5cbmV4cG9ydCB0eXBlIE11dGF0ZVJlc3VsdDxUUmVzdWx0PiA9IFByb21pc2U8RmV0Y2hSZXN1bHQ8VFJlc3VsdCwgUmVjb3JkPHN0cmluZywgYW55PiwgUmVjb3JkPHN0cmluZywgYW55Pj4gfCBudWxsPlxuZXhwb3J0IHR5cGUgTXV0YXRlRnVuY3Rpb248VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSAodmFyaWFibGVzPzogVFZhcmlhYmxlcyB8IG51bGwsIG92ZXJyaWRlT3B0aW9ucz86IE11dGF0ZU92ZXJyaWRlT3B0aW9uczxUUmVzdWx0PikgPT4gTXV0YXRlUmVzdWx0PFRSZXN1bHQ+XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25Eb25lQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPbkVycm9yQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VNdXRhdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIG11dGF0ZTogTXV0YXRlRnVuY3Rpb248VFJlc3VsdCwgVFZhcmlhYmxlcz5cbiAgbG9hZGluZzogUmVmPGJvb2xlYW4+XG4gIGVycm9yOiBSZWY8QXBvbGxvRXJyb3IgfCBudWxsPlxuICBjYWxsZWQ6IFJlZjxib29sZWFuPlxuICBvbkRvbmU6IChmbjogKHBhcmFtOiBGZXRjaFJlc3VsdDxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiwgY29udGV4dDogT25Eb25lQ29udGV4dCkgPT4gdm9pZCkgPT4ge1xuICAgIG9mZjogKCkgPT4gdm9pZFxuICB9XG4gIG9uRXJyb3I6IChmbjogKHBhcmFtOiBBcG9sbG9FcnJvciwgY29udGV4dDogT25FcnJvckNvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTXV0YXRpb248XG4gIFRSZXN1bHQgPSBhbnksXG4gIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbik6IFVzZU11dGF0aW9uUmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHtcbiAgY29uc3QgY3VycmVudFNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKClcbiAgY29uc3QgbG9hZGluZyA9IHJlZjxib29sZWFuPihmYWxzZSlcbiAgY3VycmVudFNjb3BlICYmIHRyYWNrTXV0YXRpb24obG9hZGluZylcbiAgY29uc3QgZXJyb3IgPSBzaGFsbG93UmVmPEFwb2xsb0Vycm9yIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY2FsbGVkID0gcmVmPGJvb2xlYW4+KGZhbHNlKVxuXG4gIGNvbnN0IGRvbmVFdmVudCA9IHVzZUV2ZW50SG9vazxbRmV0Y2hSZXN1bHQ8VFJlc3VsdCwgUmVjb3JkPHN0cmluZywgYW55PiwgUmVjb3JkPHN0cmluZywgYW55Pj4sIE9uRG9uZUNvbnRleHRdPigpXG4gIGNvbnN0IGVycm9yRXZlbnQgPSB1c2VFdmVudEhvb2s8W0Fwb2xsb0Vycm9yLCBPbkVycm9yQ29udGV4dF0+KClcblxuICAvLyBBcG9sbG8gQ2xpZW50XG4gIGNvbnN0IHsgcmVzb2x2ZUNsaWVudCB9ID0gdXNlQXBvbGxvQ2xpZW50KClcblxuICBhc3luYyBmdW5jdGlvbiBtdXRhdGUodmFyaWFibGVzPzogVFZhcmlhYmxlcyB8IG51bGwsIG92ZXJyaWRlT3B0aW9uczogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4sICd2YXJpYWJsZXMnPiA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREb2N1bWVudDogRG9jdW1lbnROb2RlXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnQoKVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1JlZihkb2N1bWVudCkpIHtcbiAgICAgIGN1cnJlbnREb2N1bWVudCA9IGRvY3VtZW50LnZhbHVlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnRcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudE9wdGlvbnM6IFVzZU11dGF0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudE9wdGlvbnMgPSBvcHRpb25zKClcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNSZWYob3B0aW9ucykpIHtcbiAgICAgIGN1cnJlbnRPcHRpb25zID0gb3B0aW9ucy52YWx1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGN1cnJlbnRPcHRpb25zID0gb3B0aW9uc1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50KGN1cnJlbnRPcHRpb25zLmNsaWVudElkKVxuICAgIGVycm9yLnZhbHVlID0gbnVsbFxuICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlXG4gICAgY2FsbGVkLnZhbHVlID0gdHJ1ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQubXV0YXRlPFRSZXN1bHQsIFRWYXJpYWJsZXM+KHtcbiAgICAgICAgbXV0YXRpb246IGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgLi4uY3VycmVudE9wdGlvbnMsXG4gICAgICAgIC4uLm92ZXJyaWRlT3B0aW9ucyxcbiAgICAgICAgdmFyaWFibGVzOiAodmFyaWFibGVzID8/IGN1cnJlbnRPcHRpb25zLnZhcmlhYmxlcylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uKGN1cnJlbnRPcHRpb25zLnZhcmlhYmxlcyBhcyBUVmFyaWFibGVzKSxcbiAgICAgICAgICAgICAgLi4uKHZhcmlhYmxlcyBhcyBUVmFyaWFibGVzKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgIGF3YWl0IG5leHRUaWNrKClcbiAgICAgIGRvbmVFdmVudC50cmlnZ2VyKHJlc3VsdCwge1xuICAgICAgICBjbGllbnQsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgYXBvbGxvRXJyb3IgPSB0b0Fwb2xsb0Vycm9yKGUpXG4gICAgICBlcnJvci52YWx1ZSA9IGFwb2xsb0Vycm9yXG4gICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgIGF3YWl0IG5leHRUaWNrKClcbiAgICAgIGVycm9yRXZlbnQudHJpZ2dlcihhcG9sbG9FcnJvciwge1xuICAgICAgICBjbGllbnQsXG4gICAgICB9KVxuICAgICAgaWYgKGN1cnJlbnRPcHRpb25zLnRocm93cyA9PT0gJ2Fsd2F5cycgfHwgKGN1cnJlbnRPcHRpb25zLnRocm93cyAhPT0gJ25ldmVyJyAmJiAhZXJyb3JFdmVudC5nZXRDb3VudCgpKSkge1xuICAgICAgICB0aHJvdyBhcG9sbG9FcnJvclxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY3VycmVudFNjb3BlICYmIG9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIG11dGF0ZSxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGNhbGxlZCxcbiAgICBvbkRvbmU6IGRvbmVFdmVudC5vbixcbiAgICBvbkVycm9yOiBlcnJvckV2ZW50Lm9uLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IERlZXBOb25OdWxsYWJsZSwgRGVlcFJlcXVpcmVkIH0gZnJvbSAndHMtZXNzZW50aWFscydcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IEV4dHJhY3RTaW5nbGVLZXkgfSBmcm9tICcuL3V0aWwvRXh0cmFjdFNpbmdsZUtleSdcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlLWRlbWknXG5cbmV4cG9ydCB0eXBlIFVzZVJlc3VsdFJldHVybjxUPiA9IFJlYWRvbmx5PFJlZjxSZWFkb25seTxUPj4+XG5cbi8qKlxuICogUmVzb2x2ZSBhIGByZXN1bHRgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSBmaXJzdCBrZXkgb2YgdGhlIGByZXN1bHRgIGlmIHRoZXJlXG4gKiBpcyBvbmx5IG9uZSwgb3IgdGhlIGByZXN1bHRgIGl0c2VsZi4gVGhlIGB2YWx1ZWAgb2YgdGhlIHJlZiB3aWxsIGJlXG4gKiBgdW5kZWZpbmVkYCB1bnRpbCBpdCBpcyByZXNvbHZlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyByZXN1bHQgfSA9IHVzZVF1ZXJ5KHt9KVxuICogY29uc3QgdXNlciA9IHVzZVJlc3VsdChyZXN1bHQpXG4gKiAvLyB1c2VyIGlzIGB1bmRlZmluZWRgIHVudGlsIHRoZSBxdWVyeSByZXNvbHZlc1xuICpcbiAqIEBwYXJhbSAge1JlZjxUUmVzdWx0Pn0gcmVzdWx0IEEgYHJlc3VsdGAgcmV0dXJuZWQgZnJvbSBgdXNlUXVlcnlgIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJucyBSZWFkb25seSByZWYgd2l0aCBgdW5kZWZpbmVkYCBvciB0aGUgcmVzb2x2ZWQgYHJlc3VsdGAuXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGNvbXB1dGVkYCBpbnN0ZWFkLiBCZWZvcmU6IGBjb25zdCBpdGVtcyA9IHVzZVJlc3VsdChyZXN1bHQsIFtdLCBkYXRhID0+IGRhdGEuc29tZUZpZWxkLm15SXRlbXMpYCBBZnRlcjogYGNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlPy5zb21lRmllbGQubXlJdGVtcyA/PyBbXSlgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZXN1bHQ8VFJlc3VsdCwgVFJlc3VsdEtleSBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPFRSZXN1bHQ+ID0ga2V5b2YgTm9uTnVsbGFibGU8VFJlc3VsdD4+KFxuICByZXN1bHQ6IFJlZjxUUmVzdWx0PlxuKTogVXNlUmVzdWx0UmV0dXJuPHVuZGVmaW5lZCB8IEV4dHJhY3RTaW5nbGVLZXk8Tm9uTnVsbGFibGU8VFJlc3VsdD4sIFRSZXN1bHRLZXk+PlxuXG4vKipcbiAqIFJlc29sdmUgYSBgcmVzdWx0YCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgZmlyc3Qga2V5IG9mIHRoZSBgcmVzdWx0YCBpZiB0aGVyZVxuICogaXMgb25seSBvbmUsIG9yIHRoZSBgcmVzdWx0YCBpdHNlbGYuIFRoZSBgdmFsdWVgIG9mIHRoZSByZWYgd2lsbCBiZVxuICogYGRlZmF1bHRWYWx1ZWAgdW50aWwgaXQgaXMgcmVzb2x2ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHsgcmVzdWx0IH0gPSB1c2VRdWVyeSh7fSlcbiAqIGNvbnN0IHByb2ZpbGUgPSB1c2VSZXN1bHQocmVzdWx0LCB7fSlcbiAqIC8vIHByb2ZpbGUgaXMgYHt9YCB1bnRpbCB0aGUgcXVlcnkgcmVzb2x2ZXNcbiAqXG4gKiBAcGFyYW0gIHtSZWY8VFJlc3VsdD59IHJlc3VsdCBBIGByZXN1bHRgIHJldHVybmVkIGZyb20gYHVzZVF1ZXJ5YCB0byByZXNvbHZlLlxuICogQHBhcmFtICB7VERlZmF1bHRWYWx1ZX0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBiZWZvcmUgYHJlc3VsdGAgaXMgcmVzb2x2ZWQuXG4gKiBAcmV0dXJucyBSZWFkb25seSByZWYgd2l0aCB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgdGhlIHJlc29sdmVkIGByZXN1bHRgLlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb21wdXRlZGAgaW5zdGVhZC4gQmVmb3JlOiBgY29uc3QgaXRlbXMgPSB1c2VSZXN1bHQocmVzdWx0LCBbXSwgZGF0YSA9PiBkYXRhLnNvbWVGaWVsZC5teUl0ZW1zKWAgQWZ0ZXI6IGBjb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZT8uc29tZUZpZWxkLm15SXRlbXMgPz8gW10pYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVzdWx0PFRSZXN1bHQsIFREZWZhdWx0VmFsdWUsIFRSZXN1bHRLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxUUmVzdWx0PiA9IGtleW9mIE5vbk51bGxhYmxlPFRSZXN1bHQ+PihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZTogVERlZmF1bHRWYWx1ZVxuKTogVXNlUmVzdWx0UmV0dXJuPFREZWZhdWx0VmFsdWUgfCBFeHRyYWN0U2luZ2xlS2V5PE5vbk51bGxhYmxlPFRSZXN1bHQ+LCBUUmVzdWx0S2V5Pj5cblxuLyoqXG4gKiBSZXNvbHZlIGEgYHJlc3VsdGAsIHJldHVybmluZyB0aGUgYHJlc3VsdGAgbWFwcGVkIHdpdGggdGhlIGBwaWNrYCBmdW5jdGlvbi5cbiAqIFRoZSBgdmFsdWVgIG9mIHRoZSByZWYgd2lsbCBiZSBgZGVmYXVsdFZhbHVlYCB1bnRpbCBpdCBpcyByZXNvbHZlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyByZXN1bHQgfSA9IHVzZVF1ZXJ5KHt9KVxuICogY29uc3QgY29tbWVudHMgPSB1c2VSZXN1bHQocmVzdWx0LCB1bmRlZmluZWQsIChkYXRhKSA9PiBkYXRhLmNvbW1lbnRzKVxuICogLy8gdXNlciBpcyBgdW5kZWZpbmVkYCwgdGhlbiByZXNvbHZlcyB0byB0aGUgcmVzdWx0J3MgYGNvbW1lbnRzYFxuICpcbiAqIEBwYXJhbSAge1JlZjxUUmVzdWx0Pn0gcmVzdWx0IEEgYHJlc3VsdGAgcmV0dXJuZWQgZnJvbSBgdXNlUXVlcnlgIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0gIHtURGVmYXVsdFZhbHVlfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGJlZm9yZSBgcmVzdWx0YCBpcyByZXNvbHZlZC5cbiAqIEBwYXJhbSAgeyhkYXRhOlRSZXN1bHQpPT5UUmV0dXJuVmFsdWV9IHBpY2sgVGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYHJlc3VsdGAgYW5kIG1hcHMgYSByZXR1cm4gdmFsdWUgZnJvbSBpdC5cbiAqIEByZXR1cm5zIFJlYWRvbmx5IHJlZiB3aXRoIHRoZSBgZGVmYXVsdFZhbHVlYCBvciB0aGUgcmVzb2x2ZWQgYW5kIGBwaWNrYC1tYXBwZWQgYHJlc3VsdGBcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29tcHV0ZWRgIGluc3RlYWQuIEJlZm9yZTogYGNvbnN0IGl0ZW1zID0gdXNlUmVzdWx0KHJlc3VsdCwgW10sIGRhdGEgPT4gZGF0YS5zb21lRmllbGQubXlJdGVtcylgIEFmdGVyOiBgY29uc3QgaXRlbXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LnNvbWVGaWVsZC5teUl0ZW1zID8/IFtdKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3VsdDxcbiAgVFJlc3VsdCxcbiAgVERlZmF1bHRWYWx1ZSxcbiAgVFJldHVyblZhbHVlLFxuPihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZTogVERlZmF1bHRWYWx1ZSB8IHVuZGVmaW5lZCxcbiAgcGljazogKGRhdGE6IERlZXBSZXF1aXJlZDxEZWVwTm9uTnVsbGFibGU8VFJlc3VsdD4+KSA9PiBUUmV0dXJuVmFsdWVcbik6IFVzZVJlc3VsdFJldHVybjxURGVmYXVsdFZhbHVlIHwgVFJldHVyblZhbHVlPlxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29tcHV0ZWRgIGluc3RlYWQuIEJlZm9yZTogYGNvbnN0IGl0ZW1zID0gdXNlUmVzdWx0KHJlc3VsdCwgW10sIGRhdGEgPT4gZGF0YS5zb21lRmllbGQubXlJdGVtcylgIEFmdGVyOiBgY29uc3QgaXRlbXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LnNvbWVGaWVsZC5teUl0ZW1zID8/IFtdKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3VsdDxcbiAgVFJlc3VsdCxcbiAgVERlZmF1bHRWYWx1ZSxcbiAgVFJldHVyblZhbHVlLFxuPihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZT86IFREZWZhdWx0VmFsdWUsXG4gIHBpY2s/OiAoZGF0YTogRGVlcFJlcXVpcmVkPERlZXBOb25OdWxsYWJsZTxUUmVzdWx0Pj4pID0+IFRSZXR1cm5WYWx1ZSxcbik6IFVzZVJlc3VsdFJldHVybjxUUmVzdWx0IHwgVFJlc3VsdFtrZXlvZiBUUmVzdWx0XSB8IFREZWZhdWx0VmFsdWUgfCBUUmV0dXJuVmFsdWUgfCB1bmRlZmluZWQ+IHtcbiAgY29uc29sZS53YXJuKGAndXNlUmVzdWx0JyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gUGxlYXNlIHVzZSAnY29tcHV0ZWQnIGluc3RlYWQuXG5CZWZvcmU6XG5jb25zdCBpdGVtcyA9IHVzZVJlc3VsdChyZXN1bHQsIFtdLCBkYXRhID0+IGRhdGEuc29tZUZpZWxkLm15SXRlbXMpXG5BZnRlcjpcbmNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlPy5zb21lRmllbGQubXlJdGVtcyA/PyBbXSlgKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0LnZhbHVlXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAocGljaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwaWNrKHZhbHVlIGFzIERlZXBSZXF1aXJlZDxEZWVwTm9uTnVsbGFibGU8VFJlc3VsdD4+KVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gU2lsZW50IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgdGFrZSB0aGUgb25seSBrZXkgaW4gcmVzdWx0IGRhdGFcbiAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1swXSBhcyBrZXlvZiBUUmVzdWx0XVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiBlbnRpcmUgcmVzdWx0IGRhdGFcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvRXJyb3IsXG4gIEZldGNoUmVzdWx0LFxuICBPYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlU3Vic2NyaXB0aW9uLFxuICBPcGVyYXRpb25WYXJpYWJsZXMsXG4gIFN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gIFR5cGVkRG9jdW1lbnROb2RlLFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudE5vZGUgfSBmcm9tICdncmFwaHFsJ1xuaW1wb3J0IHR5cGUge1xuICBSZWYsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHR5cGUgeyBSZWFjdGl2ZUZ1bmN0aW9uIH0gZnJvbSAnLi91dGlsL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBkZWJvdW5jZSwgdGhyb3R0bGUgfSBmcm9tICd0aHJvdHRsZS1kZWJvdW5jZSdcbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBnZXRDdXJyZW50U2NvcGUsXG4gIGlzUmVmLFxuICBuZXh0VGljayxcbiAgb25TY29wZURpc3Bvc2UsXG4gIHJlZixcbiAgc2hhbGxvd1JlZixcbiAgd2F0Y2gsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50IH0gZnJvbSAnLi91c2VBcG9sbG9DbGllbnQnXG5pbXBvcnQgeyBpc1NlcnZlciB9IGZyb20gJy4vdXRpbC9lbnYnXG5pbXBvcnQgeyB0cmFja1N1YnNjcmlwdGlvbiB9IGZyb20gJy4vdXRpbC9sb2FkaW5nVHJhY2tpbmcnXG5pbXBvcnQgeyBwYXJhbVRvUmVhY3RpdmUgfSBmcm9tICcuL3V0aWwvcGFyYW1Ub1JlYWN0aXZlJ1xuaW1wb3J0IHsgcGFyYW1Ub1JlZiB9IGZyb20gJy4vdXRpbC9wYXJhbVRvUmVmJ1xuaW1wb3J0IHsgdG9BcG9sbG9FcnJvciB9IGZyb20gJy4vdXRpbC90b0Fwb2xsb0Vycm9yJ1xuaW1wb3J0IHsgdXNlRXZlbnRIb29rIH0gZnJvbSAnLi91dGlsL3VzZUV2ZW50SG9vaydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdWJzY3JpcHRpb25PcHRpb25zPFxuICBUUmVzdWx0ID0gYW55LFxuICBUVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzLFxuPiBleHRlbmRzIE9taXQ8U3Vic2NyaXB0aW9uT3B0aW9uczxUVmFyaWFibGVzPiwgJ3F1ZXJ5JyB8ICd2YXJpYWJsZXMnPiB7XG4gIGNsaWVudElkPzogc3RyaW5nXG4gIGVuYWJsZWQ/OiBib29sZWFuIHwgUmVmPGJvb2xlYW4+XG4gIHRocm90dGxlPzogbnVtYmVyXG4gIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbnR5cGUgRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBEb2N1bWVudE5vZGUgfCBSZWY8RG9jdW1lbnROb2RlPiB8IFJlYWN0aXZlRnVuY3Rpb248RG9jdW1lbnROb2RlPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VHlwZWREb2N1bWVudE5vZGU8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG50eXBlIFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPiA9IFRWYXJpYWJsZXMgfCBSZWY8VFZhcmlhYmxlcz4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFRWYXJpYWJsZXM+XG50eXBlIE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBVc2VTdWJzY3JpcHRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFVzZVN1YnNjcmlwdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4+IHwgUmVhY3RpdmVGdW5jdGlvbjxVc2VTdWJzY3JpcHRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PlxuXG5leHBvcnQgaW50ZXJmYWNlIE9uUmVzdWx0Q29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPbkVycm9yQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdWJzY3JpcHRpb25SZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICByZXN1bHQ6IFJlZjxUUmVzdWx0IHwgbnVsbCB8IHVuZGVmaW5lZD5cbiAgbG9hZGluZzogUmVmPGJvb2xlYW4+XG4gIGVycm9yOiBSZWY8QXBvbGxvRXJyb3IgfCBudWxsPlxuICBzdGFydDogKCkgPT4gdm9pZFxuICBzdG9wOiAoKSA9PiB2b2lkXG4gIHJlc3RhcnQ6ICgpID0+IHZvaWRcbiAgZG9jdW1lbnQ6IFJlZjxEb2N1bWVudE5vZGU+XG4gIHZhcmlhYmxlczogUmVmPFRWYXJpYWJsZXMgfCB1bmRlZmluZWQ+XG4gIG9wdGlvbnM6IFVzZVN1YnNjcmlwdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4gfCBSZWY8VXNlU3Vic2NyaXB0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj5cbiAgc3Vic2NyaXB0aW9uOiBSZWY8T2JzZXJ2YWJsZTxGZXRjaFJlc3VsdDxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+Pj4gfCBudWxsPlxuICBvblJlc3VsdDogKGZuOiAocGFyYW06IEZldGNoUmVzdWx0PFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIGFueT4sIFJlY29yZDxzdHJpbmcsIGFueT4+LCBjb250ZXh0OiBPblJlc3VsdENvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxuICBvbkVycm9yOiAoZm46IChwYXJhbTogQXBvbGxvRXJyb3IsIGNvbnRleHQ6IE9uRXJyb3JDb250ZXh0KSA9PiB2b2lkKSA9PiB7XG4gICAgb2ZmOiAoKSA9PiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHZhcmlhYmxlcyBvciBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3Vic2NyaXB0aW9uPFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPlxuKTogVXNlU3Vic2NyaXB0aW9uUmV0dXJuPFRSZXN1bHQsIHVuZGVmaW5lZD5cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCByZXF1aXJlcyBvcHRpb25zIGJ1dCBub3QgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3Vic2NyaXB0aW9uPFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPixcbiAgdmFyaWFibGVzOiB1bmRlZmluZWQgfCBudWxsLFxuICBvcHRpb25zOiBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIG51bGw+XG4pOiBVc2VTdWJzY3JpcHRpb25SZXR1cm48VFJlc3VsdCwgbnVsbD5cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCByZXF1aXJlcyB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248VFJlc3VsdCA9IGFueSwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcz4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzOiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz5cbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHN1YnNjcmlwdGlvbiB0aGF0IGhhcyBvcHRpb25hbCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248VFJlc3VsdCA9IGFueSwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcz4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHN1YnNjcmlwdGlvbiB0aGF0IHJlcXVpcmVzIHZhcmlhYmxlcyBhbmQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN1YnNjcmlwdGlvbjxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM6IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9uczogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuKTogVXNlU3Vic2NyaXB0aW9uUmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248XG4gIFRSZXN1bHQsXG4gIFRWYXJpYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzOiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIGNvbnN0IGN1cnJlbnRTY29wZSA9IGdldEN1cnJlbnRTY29wZSgpXG5cbiAgY29uc3QgZG9jdW1lbnRSZWYgPSBwYXJhbVRvUmVmKGRvY3VtZW50KVxuICBjb25zdCB2YXJpYWJsZXNSZWYgPSBwYXJhbVRvUmVmKHZhcmlhYmxlcylcbiAgY29uc3Qgb3B0aW9uc1JlZiA9IHBhcmFtVG9SZWFjdGl2ZShvcHRpb25zKVxuXG4gIGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWY8VFJlc3VsdCB8IG51bGwgfCB1bmRlZmluZWQ+KClcbiAgY29uc3QgcmVzdWx0RXZlbnQgPSB1c2VFdmVudEhvb2s8W0ZldGNoUmVzdWx0PFRSZXN1bHQ+LCBPblJlc3VsdENvbnRleHRdPigpXG4gIGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZjxBcG9sbG9FcnJvciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGVycm9yRXZlbnQgPSB1c2VFdmVudEhvb2s8W0Fwb2xsb0Vycm9yLCBPbkVycm9yQ29udGV4dF0+KClcblxuICBjb25zdCBsb2FkaW5nID0gcmVmKGZhbHNlKVxuICBjdXJyZW50U2NvcGUgJiYgdHJhY2tTdWJzY3JpcHRpb24obG9hZGluZylcblxuICAvLyBBcG9sbG8gQ2xpZW50XG4gIGNvbnN0IHsgcmVzb2x2ZUNsaWVudCB9ID0gdXNlQXBvbGxvQ2xpZW50KClcblxuICBjb25zdCBzdWJzY3JpcHRpb246IFJlZjxPYnNlcnZhYmxlPEZldGNoUmVzdWx0PFRSZXN1bHQ+PiB8IG51bGw+ID0gcmVmKG51bGwpXG4gIGxldCBvYnNlcnZlcjogT2JzZXJ2YWJsZVN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGxldCBzdGFydGVkID0gZmFsc2VcblxuICBmdW5jdGlvbiBnZXRDbGllbnQoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVDbGllbnQoY3VycmVudE9wdGlvbnMudmFsdWU/LmNsaWVudElkKVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgaWYgKHN0YXJ0ZWQgfHwgIWlzRW5hYmxlZC52YWx1ZSB8fCBpc1NlcnZlcilcbiAgICAgIHJldHVyblxuICAgIHN0YXJ0ZWQgPSB0cnVlXG4gICAgbG9hZGluZy52YWx1ZSA9IHRydWVcblxuICAgIGNvbnN0IGNsaWVudCA9IGdldENsaWVudCgpXG5cbiAgICBzdWJzY3JpcHRpb24udmFsdWUgPSBjbGllbnQuc3Vic2NyaWJlPFRSZXN1bHQsIFRWYXJpYWJsZXM+KHtcbiAgICAgIHF1ZXJ5OiBjdXJyZW50RG9jdW1lbnQsXG4gICAgICB2YXJpYWJsZXM6IGN1cnJlbnRWYXJpYWJsZXMsXG4gICAgICAuLi5jdXJyZW50T3B0aW9ucy52YWx1ZSxcbiAgICB9KVxuXG4gICAgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24udmFsdWUuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IG9uTmV4dFJlc3VsdCxcbiAgICAgIGVycm9yOiBvbkVycm9yLFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbk5leHRSZXN1bHQoZmV0Y2hSZXN1bHQ6IEZldGNoUmVzdWx0PFRSZXN1bHQ+KSB7XG4gICAgcmVzdWx0LnZhbHVlID0gZmV0Y2hSZXN1bHQuZGF0YVxuICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIHJlc3VsdEV2ZW50LnRyaWdnZXIoZmV0Y2hSZXN1bHQsIHtcbiAgICAgIGNsaWVudDogZ2V0Q2xpZW50KCksXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRXJyb3IoZmV0Y2hFcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IGFwb2xsb0Vycm9yID0gdG9BcG9sbG9FcnJvcihmZXRjaEVycm9yKVxuXG4gICAgZXJyb3IudmFsdWUgPSBhcG9sbG9FcnJvclxuICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIGVycm9yRXZlbnQudHJpZ2dlcihhcG9sbG9FcnJvciwge1xuICAgICAgY2xpZW50OiBnZXRDbGllbnQoKSxcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBzdGFydGVkID0gZmFsc2VcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcblxuICAgIGlmIChzdWJzY3JpcHRpb24udmFsdWUpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi52YWx1ZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLnVuc3Vic2NyaWJlKClcbiAgICAgIG9ic2VydmVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc3RhcnRcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuICAvKipcbiAgICogUXVldWUgYSByZXN0YXJ0IG9mIHRoZSBxdWVyeSAob24gbmV4dCB0aWNrKSBpZiBpdCBpcyBhbHJlYWR5IGFjdGl2ZVxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlc3RhcnQoKSB7XG4gICAgaWYgKCFzdGFydGVkIHx8IHJlc3RhcnRpbmcpXG4gICAgICByZXR1cm5cbiAgICByZXN0YXJ0aW5nID0gdHJ1ZVxuICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgIGlmIChzdGFydGVkKSB7XG4gICAgICAgIHN0b3AoKVxuICAgICAgICBzdGFydCgpXG4gICAgICB9XG4gICAgICByZXN0YXJ0aW5nID0gZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgbGV0IGRlYm91bmNlZFJlc3RhcnQ6IHR5cGVvZiBiYXNlUmVzdGFydFxuICBmdW5jdGlvbiB1cGRhdGVSZXN0YXJ0Rm4oKSB7XG4gICAgaWYgKGN1cnJlbnRPcHRpb25zLnZhbHVlPy50aHJvdHRsZSkge1xuICAgICAgZGVib3VuY2VkUmVzdGFydCA9IHRocm90dGxlKGN1cnJlbnRPcHRpb25zLnZhbHVlLnRocm90dGxlLCBiYXNlUmVzdGFydClcbiAgICB9XG4gICAgZWxzZSBpZiAoY3VycmVudE9wdGlvbnMudmFsdWU/LmRlYm91bmNlKSB7XG4gICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gZGVib3VuY2UoY3VycmVudE9wdGlvbnMudmFsdWUuZGVib3VuY2UsIGJhc2VSZXN0YXJ0KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRlYm91bmNlZFJlc3RhcnQgPSBiYXNlUmVzdGFydFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RhcnQoKSB7XG4gICAgaWYgKCFkZWJvdW5jZWRSZXN0YXJ0KVxuICAgICAgdXBkYXRlUmVzdGFydEZuKClcbiAgICBkZWJvdW5jZWRSZXN0YXJ0KClcbiAgfVxuXG4gIC8vIEFwcGx5aW5nIG9wdGlvbnNcbiAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZWY8VXNlU3Vic2NyaXB0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4oKVxuICB3YXRjaCgoKSA9PiBpc1JlZihvcHRpb25zUmVmKSA/IG9wdGlvbnNSZWYudmFsdWUgOiBvcHRpb25zUmVmLCAodmFsdWUpID0+IHtcbiAgICBpZiAoY3VycmVudE9wdGlvbnMudmFsdWUgJiYgKFxuICAgICAgY3VycmVudE9wdGlvbnMudmFsdWUudGhyb3R0bGUgIT09IHZhbHVlLnRocm90dGxlXG4gICAgICB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5kZWJvdW5jZSAhPT0gdmFsdWUuZGVib3VuY2VcbiAgICApKSB7XG4gICAgICB1cGRhdGVSZXN0YXJ0Rm4oKVxuICAgIH1cbiAgICBjdXJyZW50T3B0aW9ucy52YWx1ZSA9IHZhbHVlXG4gICAgcmVzdGFydCgpXG4gIH0sIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICAvLyBBcHBseWluZyBkb2N1bWVudFxuICBsZXQgY3VycmVudERvY3VtZW50OiBEb2N1bWVudE5vZGVcbiAgd2F0Y2goZG9jdW1lbnRSZWYsICh2YWx1ZSkgPT4ge1xuICAgIGN1cnJlbnREb2N1bWVudCA9IHZhbHVlXG4gICAgcmVzdGFydCgpXG4gIH0sIHtcbiAgICBpbW1lZGlhdGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gQXBwbHlpbmcgdmFyaWFibGVzXG4gIGxldCBjdXJyZW50VmFyaWFibGVzOiBUVmFyaWFibGVzIHwgdW5kZWZpbmVkXG4gIGxldCBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZDogc3RyaW5nXG4gIHdhdGNoKHZhcmlhYmxlc1JlZiwgKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICBpZiAoc2VyaWFsaXplZCAhPT0gY3VycmVudFZhcmlhYmxlc1NlcmlhbGl6ZWQpIHtcbiAgICAgIGN1cnJlbnRWYXJpYWJsZXMgPSB2YWx1ZVxuICAgICAgcmVzdGFydCgpXG4gICAgfVxuICAgIGN1cnJlbnRWYXJpYWJsZXNTZXJpYWxpemVkID0gc2VyaWFsaXplZFxuICB9LCB7XG4gICAgZGVlcDogdHJ1ZSxcbiAgICBpbW1lZGlhdGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gSW50ZXJuYWwgZW5hYmxlZCByZXR1cm5lZCB0byB1c2VyXG4gIC8vIEBUT0RPIERvZXNuJ3QgZnVsbHkgd29yayB5ZXQsIG5lZWQgdG8gaW5pdGlhbGl6ZSB3aXRoIG9wdGlvblxuICAvLyBjb25zdCBlbmFibGVkID0gcmVmPGJvb2xlYW4+KClcbiAgY29uc3QgZW5hYmxlZE9wdGlvbiA9IGNvbXB1dGVkKCgpID0+ICFjdXJyZW50T3B0aW9ucy52YWx1ZSB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5lbmFibGVkID09IG51bGwgfHwgY3VycmVudE9wdGlvbnMudmFsdWUuZW5hYmxlZClcbiAgLy8gY29uc3QgaXNFbmFibGVkID0gY29tcHV0ZWQoKCkgPT4gISEoKHR5cGVvZiBlbmFibGVkLnZhbHVlID09PSAnYm9vbGVhbicgJiYgZW5hYmxlZC52YWx1ZSkgJiYgZW5hYmxlZE9wdGlvbi52YWx1ZSkpXG4gIGNvbnN0IGlzRW5hYmxlZCA9IGVuYWJsZWRPcHRpb25cblxuICAvLyB3YXRjaChlbmFibGVkLCB2YWx1ZSA9PiB7XG4gIC8vICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgLy8gICAgIGVuYWJsZWQudmFsdWUgPSBlbmFibGVkT3B0aW9uLnZhbHVlXG4gIC8vICAgfVxuICAvLyB9KVxuXG4gIC8vIEF1dG8gc3RhcnQgJiBzdG9wXG4gIHdhdGNoKGlzRW5hYmxlZCwgKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzdGFydCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RvcCgpXG4gICAgfVxuICB9LCB7XG4gICAgaW1tZWRpYXRlOiB0cnVlLFxuICB9KVxuXG4gIC8vIFRlYXJkb3duXG4gIGlmIChjdXJyZW50U2NvcGUpIHtcbiAgICBvblNjb3BlRGlzcG9zZShzdG9wKVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUud2FybignW1Z1ZSBhcG9sbG9dIHVzZVN1YnNjcmlwdGlvbigpIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGFuIGFjdGl2ZSBlZmZlY3Qgc2NvcGUgYW5kIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBzdG9wcGVkLicpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3VsdCxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIC8vIEBUT0RPIGRvZXNuJ3QgZnVsbHkgd29yayB5ZXRcbiAgICAvLyBlbmFibGVkLFxuICAgIHN0YXJ0LFxuICAgIHN0b3AsXG4gICAgcmVzdGFydCxcbiAgICBkb2N1bWVudDogZG9jdW1lbnRSZWYsXG4gICAgdmFyaWFibGVzOiB2YXJpYWJsZXNSZWYsXG4gICAgb3B0aW9uczogb3B0aW9uc1JlZixcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgb25SZXN1bHQ6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Y2xpZW50IiwiaXNSZWYiLCJjb21wdXRlZCIsImdldEN1cnJlbnRTY29wZSIsIm9uU2NvcGVEaXNwb3NlIiwicmVmIiwid2F0Y2giLCJjb21wdXRlZCIsImlzUmVmIiwicmVmIiwiZ2V0Q3VycmVudFNjb3BlIiwicmVmIiwiX2EiLCJjb21wdXRlZCIsIndhdGNoIiwidmFyaWFibGVzIiwib3B0aW9ucyIsIm9wdGlvbnNSZWYiLCJpdGVtIiwib25TY29wZURpc3Bvc2UiLCJkb2N1bWVudCIsInZhcmlhYmxlcyIsIm9wdGlvbnMiLCJpc1JlZiIsImNvbXB1dGVkIiwiY29tcHV0ZWQiLCJnZXRDdXJyZW50U2NvcGUiLCJpc1JlZiIsIm5leHRUaWNrIiwib25TY29wZURpc3Bvc2UiLCJyZWYiLCJzaGFsbG93UmVmIiwiZ2V0Q3VycmVudFNjb3BlIiwicmVmIiwic2hhbGxvd1JlZiIsImlzUmVmIiwibmV4dFRpY2siLCJvblNjb3BlRGlzcG9zZSIsImNvbXB1dGVkIiwiZGVib3VuY2UiLCJ0aHJvdHRsZSIsImNvbXB1dGVkIiwiZ2V0Q3VycmVudFNjb3BlIiwiaXNSZWYiLCJuZXh0VGljayIsIm9uU2NvcGVEaXNwb3NlIiwicmVmIiwic2hhbGxvd1JlZiIsIndhdGNoIiwiZ2V0Q3VycmVudFNjb3BlIiwic2hhbGxvd1JlZiIsInJlZiIsIm5leHRUaWNrIiwidGhyb3R0bGUiLCJkZWJvdW5jZSIsIndhdGNoIiwiaXNSZWYiLCJjb21wdXRlZCIsIm9uU2NvcGVEaXNwb3NlIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyXX0=