import { ApolloLink, InMemoryCache, split, from } from "/_nuxt/node_modules/.cache/vite/client/deps/@apollo_client_core.js?v=e4f18c29"; import { setContext } from "/_nuxt/node_modules/.cache/vite/client/deps/@apollo_client_link_context.js?v=e4f18c29"; import __vite__cjsImport2_subscriptionsTransportWs from "/_nuxt/node_modules/.cache/vite/client/deps/subscriptions-transport-ws.js?v=e4f18c29"; const SubscriptionClient = __vite__cjsImport2_subscriptionsTransportWs["SubscriptionClient"]; import createUploadLink from "/_nuxt/node_modules/.cache/vite/client/deps/apollo-upload-client_createUploadLink__mjs.js?v=e4f18c29"; import { WebSocketLink } from "/_nuxt/node_modules/.cache/vite/client/deps/@apollo_client_link_ws.js?v=e4f18c29"; import { getMainDefinition, Observable } from "/_nuxt/node_modules/.cache/vite/client/deps/@apollo_client_utilities.js?v=e4f18c29"; import { Kind } from "/_nuxt/node_modules/graphql/index.mjs?v=e4f18c29"; import { errorToString } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useAuthManager } from "/_nuxt/lib/auth/composables/auth.ts"; import { buildAbstractCollectionMergeFunction, buildArrayMergeFunction, incomingOverwritesExistingMergeFunction, mergeAsObjectsFunction } from "/_nuxt/lib/core/helpers/apolloSetup.ts"; import { onError } from "/_nuxt/node_modules/.cache/vite/client/deps/@apollo_client_link_error.js?v=e4f18c29"; import { useAppErrorState } from "/_nuxt/lib/core/composables/error.ts"; import { isInvalidAuth } from "/_nuxt/lib/common/helpers/graphql.ts"; import { intersection, isArray, isBoolean, omit } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { useRequestId } from "/_nuxt/lib/core/composables/server.ts"; import { useRuntimeConfig, useNuxtApp } from "/_nuxt/node_modules/nuxt/dist/app/nuxt.js?v=e4f18c29"; import { useApiOrigin } from "/_nuxt/composables/env.ts"; import { markRaw } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const appName = "frontend-2"; function createCache() { return new InMemoryCache({ /** * This is where you configure how various GQL fields should be read, written to or merged when new data comes in. * If you define a merge function here, you don't need to duplicate the merge logic inside an `update()` callback * of a fetchMore call, for example. * * Feel free to re-use utilities in the `apolloSetup` helper for defining merge functions or even use the ones that come from `@apollo/client/utilities`. * * Read more: https://www.apollographql.com/docs/react/caching/cache-field-behavior */ typePolicies: { Query: { fields: { otherUser: { read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "LimitedUser", id: args.id }); } return original; } }, activeUser: { merge(existing, incoming, { mergeObjects }) { return mergeObjects(existing, incoming); }, read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "User", id: args.id }); } return original; } }, user: { read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "User", id: args.id }); } return original; } }, stream: { read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "Stream", id: args.id }); } return original; } }, userSearch: { keyArgs: ["query", "limit", "archived", "emailOnly"], merge: buildAbstractCollectionMergeFunction("UserSearchResultCollection") }, streams: { keyArgs: ["query"], merge: buildAbstractCollectionMergeFunction("UserStreamCollection", { checkIdentity: true }) }, project: { read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "Project", id: args.id }); } return original; } }, projects: { merge: buildArrayMergeFunction() }, admin: { merge: mergeAsObjectsFunction } } }, AdminQueries: { fields: { inviteList: { keyArgs: ["query"], merge: buildAbstractCollectionMergeFunction("AdminInviteList") }, projectList: { keyArgs: ["query", "visibility"], merge: buildAbstractCollectionMergeFunction("ProjectCollection") }, userList: { keyArgs: ["query", "role"], merge: buildAbstractCollectionMergeFunction("AdminUserList") } } }, LimitedUser: { fields: { commits: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("CommitCollection") } } }, User: { fields: { meta: { merge: mergeAsObjectsFunction }, timeline: { keyArgs: ["after", "before"], merge: buildAbstractCollectionMergeFunction("ActivityCollection") }, commits: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("CommitCollection") }, favoriteStreams: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("StreamCollection") }, projects: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("ProjectCollection") }, versions: { keyArgs: ["authoredOnly", "limit"], merge: buildAbstractCollectionMergeFunction("CountOnlyCollection") }, permissions: { merge: mergeAsObjectsFunction } } }, Project: { fields: { models: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("ModelCollection") }, versions: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("VersionCollection") }, commentThreads: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("CommentCollection") }, modelsTree: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("ModelsTreeItemCollection") }, replyAuthors: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("CommentReplyAuthorCollection") }, invitableCollaborators: { merge: buildAbstractCollectionMergeFunction( "InvitableCollaboratorCollection" ) }, automations: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("AutomationCollection") }, embedTokens: { keyArgs: ["limit"], merge: buildAbstractCollectionMergeFunction("EmbedTokenCollection") }, viewerResources: { merge: (_existing, incoming) => [...incoming] }, viewerResourcesExtended: { merge: true }, model: { read(original, { args, toReference }) { if (args?.id) { return toReference({ __typename: "Model", id: args.id }); } return original; } }, team: { merge: (_existing, incoming) => incoming }, invitedTeam: { merge: (_existing, incoming) => incoming }, pendingImportedModels: { merge: (_existing, incoming) => incoming }, permissions: { merge: mergeAsObjectsFunction }, savedViewGroups: { keyArgs: ["input", ["limit", "search", "onlyAuthored", "resourceIdString"]], merge: buildAbstractCollectionMergeFunction("SavedViewGroupCollection") } } }, SavedViewGroup: { fields: { views: { keyArgs: [ "input", ["limit", "search", "sortBy", "sortDirection", "onlyAuthored"] ], merge: buildAbstractCollectionMergeFunction("SavedViewCollection") }, permissions: { merge: mergeAsObjectsFunction } } }, Model: { fields: { versions: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("VersionCollection") }, pendingImportedVersions: { merge: (_existing, incoming) => incoming }, permissions: { merge: mergeAsObjectsFunction }, uploads: { keyArgs: ["input", ["limit"]], merge: buildAbstractCollectionMergeFunction("FileUploadCollection") } } }, Version: { fields: { permissions: { merge: mergeAsObjectsFunction } } }, Comment: { fields: { replies: { keyArgs: ["limit"] }, permissions: { merge: mergeAsObjectsFunction } } }, Stream: { fields: { activity: { keyArgs: ["after", "before", "actionType"], merge: buildAbstractCollectionMergeFunction("ActivityCollection") }, commits: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("CommitCollection", { checkIdentity: true }) }, pendingCollaborators: { merge: incomingOverwritesExistingMergeFunction }, pendingAccessRequests: { merge: incomingOverwritesExistingMergeFunction } } }, Branch: { fields: { commits: { keyArgs: false, merge: buildAbstractCollectionMergeFunction("CommitCollection", { checkIdentity: true }) } } }, BranchCollection: { merge: true }, ServerStats: { merge: true }, WebhookEventCollection: { merge: true }, ServerInfo: { merge: true }, ServerConfiguration: { merge: true }, WorkspaceSubscription: { merge: true }, CommentThreadActivityMessage: { merge: true }, SavedViewPermissionChecks: { merge: true }, ProjectPermissionChecks: { merge: true }, ExtendedViewerResources: { merge: true }, DashboardPermissionChecks: { merge: true }, AutomateFunction: { fields: { releases: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction( "AutomateFunctionReleaseCollection" ) } } }, Automation: { fields: { runs: { keyArgs: ["limit"], merge: buildAbstractCollectionMergeFunction("AutomateRunCollection") } } }, Workspace: { fields: { invitedTeam: { merge: incomingOverwritesExistingMergeFunction }, team: { keyArgs: ["limit", "filter", ["roles", "search", "seatType"]], merge: buildAbstractCollectionMergeFunction( "WorkspaceCollaboratorCollection" ) }, plan: { merge: mergeAsObjectsFunction }, planPrices: { merge: mergeAsObjectsFunction }, projects: { keyArgs: ["filter", "limit"], merge: buildAbstractCollectionMergeFunction("ProjectCollection") }, subscription: { merge: mergeAsObjectsFunction }, creationState: { merge: mergeAsObjectsFunction }, permissions: { merge: mergeAsObjectsFunction } } } } }); } function createWsClient(params) { const { wsEndpoint, authToken, reqId } = params; return new SubscriptionClient( wsEndpoint, { reconnect: true, connectionParams: () => { const Authorization = authToken.value ? `Bearer ${authToken.value}` : null; return Authorization ? { Authorization, headers: { Authorization, "x-request-id": reqId } } : {}; } } // wsImplementation ); } const coreShouldSkipLoggingErrors = (err) => { const specialAuthFields = ["invitedTeam", "billing", "domains", "subscription"]; const specialAuthFieldErrorCodes = [ "FORBIDDEN", "UNAUTHORIZED", "UNAUTHORIZED_ACCESS_ERROR" ]; return !!(err.graphQLErrors && err.graphQLErrors.every( (e) => intersection(e.path || [], specialAuthFields).length > 0 && specialAuthFieldErrorCodes.includes(e.extensions?.code) )); }; function createLink(params) { const { httpEndpoint, wsClient, authToken, nuxtApp, reqId, logout } = params; const { registerError, preventHttpCalls, preventWebsocketMessaging, isFullRedirectState } = useAppErrorState(); const stopLink = new ApolloLink((operation, forward) => { if (preventHttpCalls.value) { return new Observable(() => { return () => { }; }); } return forward(operation); }); const errorLink = onError((res) => { const logger = nuxtApp.$logger; const isSubTokenMissingError = (res.networkError?.message || "").includes( "need a token to subscribe" ); let shouldSkip = coreShouldSkipLoggingErrors(res); const skipLoggingErrorsResolver = res.operation.getContext().skipLoggingErrors; if (skipLoggingErrorsResolver) { shouldSkip = isBoolean(skipLoggingErrorsResolver) ? skipLoggingErrorsResolver : skipLoggingErrorsResolver?.(res); } if (!isSubTokenMissingError && !shouldSkip) { const gqlErrors = isArray(res.graphQLErrors) ? res.graphQLErrors : []; const errMsg = res.networkError?.message || gqlErrors[0]?.message; const shouldLogAsWarn = gqlErrors.every( (e) => e.extensions && "statusCode" in e.extensions && typeof e.extensions.statusCode === "number" && e.extensions.statusCode < 500 ); const logContext = { ...omit(res, ["forward", "response"]), networkError: res.networkError ? errorToString(res.networkError) : void 0, networkErrorMessage: res.networkError?.message, gqlErrorMessages: gqlErrors.map((e) => e.message), errorMessage: errMsg, graphql: true }; if (shouldLogAsWarn) { logger.warn(logContext, "Apollo Client error: {errorMessage}"); } else { logger.error(logContext, "Apollo Client error: {errorMessage}"); } } const { networkError } = res; if (networkError && isInvalidAuth(networkError) && !isFullRedirectState.value) { void logout({ skipToast: true, forceFullReload: true }); } registerError(); }); const uploadHttpLink = createUploadLink({ uri: httpEndpoint }); const authLink = setContext((_, ctx) => { const { headers } = ctx; const authHeader = authToken.value ? { Authorization: `Bearer ${authToken.value}` } : {}; return { headers: { ...headers, ...authHeader, "x-request-id": reqId, "apollo-require-preflight": "true" } }; }); let link = authLink.concat(uploadHttpLink); if (wsClient) { const wsLink = new WebSocketLink(wsClient); link = split( ({ query }) => { const definition = getMainDefinition(query); const { kind, operation } = definition; return kind === Kind.OPERATION_DEFINITION && operation === "subscription"; }, wsLink, link ); wsClient.use([ { applyMiddleware: (_opt, next) => { if (preventWebsocketMessaging.value) { return; } next(); } } ]); } const loggerLink = new ApolloLink((operation, forward) => { const startTime = Date.now(); const name = operation.operationName; nuxtApp.$logger.debug( { operation: name, graphql: true }, `Apollo operation {operation} started...` ); return forward(operation).map((result) => { const elapsed = (/* @__PURE__ */ new Date()).getTime() - startTime; const success = !!(result.data && !result.errors?.length); nuxtApp.$logger.info( { operation: name, elapsed, success, graphql: true }, `Apollo operation {operation} finished in {elapsed}ms` ); return result; }); }); return from([stopLink, ...false ? [loggerLink] : [], errorLink, link]); } const defaultConfigResolver = () => { const { public: { speckleServerVersion = "unknown" } } = useRuntimeConfig(); const apiOrigin = useApiOrigin(); const nuxtApp = useNuxtApp(); const reqId = useRequestId(); const { effectiveAuthToken, logout } = useAuthManager({ deferredApollo: () => nuxtApp.$apollo?.default }); const httpEndpoint = `${apiOrigin}/graphql`; const wsEndpoint = httpEndpoint.replace("http", "ws"); const wsClient = true ? createWsClient({ wsEndpoint, authToken: effectiveAuthToken, reqId }) : void 0; const link = createLink({ httpEndpoint, wsClient, authToken: effectiveAuthToken, nuxtApp, reqId, logout }); return { // If we don't markRaw the cache, sometimes we get cryptic internal Apollo Client errors that essentially // result from parts of its internals being made reactive, even tho they shouldn't be cache: markRaw(createCache()), link, name: appName, version: speckleServerVersion, defaultOptions: { // We want to retain all data even if there are errors, cause there's often fields with special auth requirements that we don't want // to be able to kill the entire query. Besides - in most cases partial data is better than no data at all. query: { errorPolicy: "all" }, mutate: { errorPolicy: "all" }, watchQuery: { errorPolicy: "all" } } }; }; export default defaultConfigResolver; //# sourceMappingURL=data:application/json;base64,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QUM7QUFFRCxRQUFNLGVBQWUsR0FBRyxTQUFTO0FBQ2pDLFFBQU0sYUFBYSxhQUFhLFFBQVEsUUFBUSxJQUFJO0FBRXBELFFBQU0sV0FBVyxJQUFZLEdBQ3pCLGVBQWUsRUFBRSxZQUFZLFdBQVcsb0JBQW9CLE1BQU0sQ0FBQyxJQUNuRTtBQUNKLFFBQU0sT0FBTyxXQUFXO0FBQUEsSUFDdEI7QUFBQSxJQUNBO0FBQUEsSUFDQSxXQUFXO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUFBO0FBQUE7QUFBQSxJQUdMLE9BQU8sUUFBUSxZQUFZLENBQUM7QUFBQSxJQUM1QjtBQUFBLElBQ0EsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLE1BR2QsT0FBTztBQUFBLFFBQ0wsYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFDQSxZQUFZO0FBQUEsUUFDVixhQUFhO0FBQUEsTUFDZjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxlQUFlIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJhcG9sbG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBvbGxvTGluaywgSW5NZW1vcnlDYWNoZSwgc3BsaXQsIGZyb20gfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJ1xyXG5pbXBvcnQgeyBzZXRDb250ZXh0IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvbGluay9jb250ZXh0J1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb25DbGllbnQgfSBmcm9tICdzdWJzY3JpcHRpb25zLXRyYW5zcG9ydC13cydcclxuaW1wb3J0IHR5cGUgeyBBcG9sbG9Db25maWdSZXNvbHZlciB9IGZyb20gJ35+L2xpYi9jb3JlL251eHQtbW9kdWxlcy9hcG9sbG8vbW9kdWxlJ1xyXG5pbXBvcnQgY3JlYXRlVXBsb2FkTGluayBmcm9tICdhcG9sbG8tdXBsb2FkLWNsaWVudC9jcmVhdGVVcGxvYWRMaW5rLm1qcydcclxuaW1wb3J0IHsgV2ViU29ja2V0TGluayB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2xpbmsvd3MnXHJcbmltcG9ydCB7IGdldE1haW5EZWZpbml0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvdXRpbGl0aWVzJ1xyXG5pbXBvcnQgeyBLaW5kIH0gZnJvbSAnZ3JhcGhxbCdcclxuaW1wb3J0IHR5cGUgeyBHcmFwaFFMRXJyb3IsIE9wZXJhdGlvbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnZ3JhcGhxbCdcclxuaW1wb3J0IHR5cGUgeyBDb29raWVSZWYsIE51eHRBcHAgfSBmcm9tICcjYXBwJ1xyXG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nLCB0eXBlIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VBdXRoTWFuYWdlciB9IGZyb20gJ35+L2xpYi9hdXRoL2NvbXBvc2FibGVzL2F1dGgnXHJcbmltcG9ydCB7XHJcbiAgYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uLFxyXG4gIGJ1aWxkQXJyYXlNZXJnZUZ1bmN0aW9uLFxyXG4gIGluY29taW5nT3ZlcndyaXRlc0V4aXN0aW5nTWVyZ2VGdW5jdGlvbixcclxuICBtZXJnZUFzT2JqZWN0c0Z1bmN0aW9uXHJcbn0gZnJvbSAnfn4vbGliL2NvcmUvaGVscGVycy9hcG9sbG9TZXR1cCdcclxuaW1wb3J0IHsgb25FcnJvciwgdHlwZSBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvbGluay9lcnJvcidcclxuaW1wb3J0IHsgdXNlQXBwRXJyb3JTdGF0ZSB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL2Vycm9yJ1xyXG5pbXBvcnQgeyBpc0ludmFsaWRBdXRoIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL2dyYXBocWwnXHJcbmltcG9ydCB7IGludGVyc2VjdGlvbiwgaXNBcnJheSwgaXNCb29sZWFuLCBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJ1xyXG5pbXBvcnQgeyB1c2VSZXF1ZXN0SWQgfSBmcm9tICd+L2xpYi9jb3JlL2NvbXBvc2FibGVzL3NlcnZlcidcclxuXHJcbmNvbnN0IGFwcE5hbWUgPSAnZnJvbnRlbmQtMidcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCk6IEluTWVtb3J5Q2FjaGUge1xyXG4gIHJldHVybiBuZXcgSW5NZW1vcnlDYWNoZSh7XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgd2hlcmUgeW91IGNvbmZpZ3VyZSBob3cgdmFyaW91cyBHUUwgZmllbGRzIHNob3VsZCBiZSByZWFkLCB3cml0dGVuIHRvIG9yIG1lcmdlZCB3aGVuIG5ldyBkYXRhIGNvbWVzIGluLlxyXG4gICAgICogSWYgeW91IGRlZmluZSBhIG1lcmdlIGZ1bmN0aW9uIGhlcmUsIHlvdSBkb24ndCBuZWVkIHRvIGR1cGxpY2F0ZSB0aGUgbWVyZ2UgbG9naWMgaW5zaWRlIGFuIGB1cGRhdGUoKWAgY2FsbGJhY2tcclxuICAgICAqIG9mIGEgZmV0Y2hNb3JlIGNhbGwsIGZvciBleGFtcGxlLlxyXG4gICAgICpcclxuICAgICAqIEZlZWwgZnJlZSB0byByZS11c2UgdXRpbGl0aWVzIGluIHRoZSBgYXBvbGxvU2V0dXBgIGhlbHBlciBmb3IgZGVmaW5pbmcgbWVyZ2UgZnVuY3Rpb25zIG9yIGV2ZW4gdXNlIHRoZSBvbmVzIHRoYXQgY29tZSBmcm9tIGBAYXBvbGxvL2NsaWVudC91dGlsaXRpZXNgLlxyXG4gICAgICpcclxuICAgICAqIFJlYWQgbW9yZTogaHR0cHM6Ly93d3cuYXBvbGxvZ3JhcGhxbC5jb20vZG9jcy9yZWFjdC9jYWNoaW5nL2NhY2hlLWZpZWxkLWJlaGF2aW9yXHJcbiAgICAgKi9cclxuICAgIHR5cGVQb2xpY2llczoge1xyXG4gICAgICBRdWVyeToge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgb3RoZXJVc2VyOiB7XHJcbiAgICAgICAgICAgIHJlYWQob3JpZ2luYWwsIHsgYXJncywgdG9SZWZlcmVuY2UgfSkge1xyXG4gICAgICAgICAgICAgIGlmIChhcmdzPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvUmVmZXJlbmNlKHsgX190eXBlbmFtZTogJ0xpbWl0ZWRVc2VyJywgaWQ6IGFyZ3MuaWQgfSlcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYWN0aXZlVXNlcjoge1xyXG4gICAgICAgICAgICBtZXJnZShleGlzdGluZywgaW5jb21pbmcsIHsgbWVyZ2VPYmplY3RzIH0pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGV4aXN0aW5nLCBpbmNvbWluZylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVhZChvcmlnaW5hbCwgeyBhcmdzLCB0b1JlZmVyZW5jZSB9KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGFyZ3M/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9SZWZlcmVuY2UoeyBfX3R5cGVuYW1lOiAnVXNlcicsIGlkOiBhcmdzLmlkIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgICAgcmVhZChvcmlnaW5hbCwgeyBhcmdzLCB0b1JlZmVyZW5jZSB9KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGFyZ3M/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9SZWZlcmVuY2UoeyBfX3R5cGVuYW1lOiAnVXNlcicsIGlkOiBhcmdzLmlkIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0cmVhbToge1xyXG4gICAgICAgICAgICByZWFkKG9yaWdpbmFsLCB7IGFyZ3MsIHRvUmVmZXJlbmNlIH0pIHtcclxuICAgICAgICAgICAgICBpZiAoYXJncz8uaWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0b1JlZmVyZW5jZSh7IF9fdHlwZW5hbWU6ICdTdHJlYW0nLCBpZDogYXJncy5pZCB9KVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB1c2VyU2VhcmNoOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsncXVlcnknLCAnbGltaXQnLCAnYXJjaGl2ZWQnLCAnZW1haWxPbmx5J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ1VzZXJTZWFyY2hSZXN1bHRDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdHJlYW1zOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsncXVlcnknXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignVXNlclN0cmVhbUNvbGxlY3Rpb24nLCB7XHJcbiAgICAgICAgICAgICAgY2hlY2tJZGVudGl0eTogdHJ1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByb2plY3Q6IHtcclxuICAgICAgICAgICAgcmVhZChvcmlnaW5hbCwgeyBhcmdzLCB0b1JlZmVyZW5jZSB9KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGFyZ3M/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9SZWZlcmVuY2UoeyBfX3R5cGVuYW1lOiAnUHJvamVjdCcsIGlkOiBhcmdzLmlkIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByb2plY3RzOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFycmF5TWVyZ2VGdW5jdGlvbigpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYWRtaW46IHtcclxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlQXNPYmplY3RzRnVuY3Rpb25cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIEFkbWluUXVlcmllczoge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgaW52aXRlTGlzdDoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ3F1ZXJ5J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ0FkbWluSW52aXRlTGlzdCcpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJvamVjdExpc3Q6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydxdWVyeScsICd2aXNpYmlsaXR5J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ1Byb2plY3RDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB1c2VyTGlzdDoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ3F1ZXJ5JywgJ3JvbGUnXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignQWRtaW5Vc2VyTGlzdCcpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBMaW1pdGVkVXNlcjoge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgY29tbWl0czoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignQ29tbWl0Q29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBVc2VyOiB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZUFzT2JqZWN0c0Z1bmN0aW9uXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGltZWxpbmU6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydhZnRlcicsICdiZWZvcmUnXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignQWN0aXZpdHlDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21taXRzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdDb21taXRDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBmYXZvcml0ZVN0cmVhbXM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ1N0cmVhbUNvbGxlY3Rpb24nKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByb2plY3RzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsnZmlsdGVyJywgJ2xpbWl0J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ1Byb2plY3RDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2ZXJzaW9uczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2F1dGhvcmVkT25seScsICdsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdDb3VudE9ubHlDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwZXJtaXNzaW9uczoge1xyXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2VBc09iamVjdHNGdW5jdGlvblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgUHJvamVjdDoge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgbW9kZWxzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsnZmlsdGVyJywgJ2xpbWl0J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ01vZGVsQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmVyc2lvbnM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydmaWx0ZXInLCAnbGltaXQnXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignVmVyc2lvbkNvbGxlY3Rpb24nKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbW1lbnRUaHJlYWRzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsnZmlsdGVyJywgJ2xpbWl0J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ0NvbW1lbnRDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBtb2RlbHNUcmVlOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IFsnZmlsdGVyJywgJ2xpbWl0J10sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ01vZGVsc1RyZWVJdGVtQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVwbHlBdXRob3JzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdDb21tZW50UmVwbHlBdXRob3JDb2xsZWN0aW9uJylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpbnZpdGFibGVDb2xsYWJvcmF0b3JzOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgJ0ludml0YWJsZUNvbGxhYm9yYXRvckNvbGxlY3Rpb24nXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhdXRvbWF0aW9uczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2ZpbHRlcicsICdsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdBdXRvbWF0aW9uQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZW1iZWRUb2tlbnM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdFbWJlZFRva2VuQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmlld2VyUmVzb3VyY2VzOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiAoX2V4aXN0aW5nLCBpbmNvbWluZykgPT4gWy4uLmluY29taW5nXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZpZXdlclJlc291cmNlc0V4dGVuZGVkOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbW9kZWw6IHtcclxuICAgICAgICAgICAgcmVhZChvcmlnaW5hbCwgeyBhcmdzLCB0b1JlZmVyZW5jZSB9KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGFyZ3M/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9SZWZlcmVuY2UoeyBfX3R5cGVuYW1lOiAnTW9kZWwnLCBpZDogYXJncy5pZCB9KVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0ZWFtOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiAoX2V4aXN0aW5nLCBpbmNvbWluZykgPT4gaW5jb21pbmdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpbnZpdGVkVGVhbToge1xyXG4gICAgICAgICAgICBtZXJnZTogKF9leGlzdGluZywgaW5jb21pbmcpID0+IGluY29taW5nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGVuZGluZ0ltcG9ydGVkTW9kZWxzOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiAoX2V4aXN0aW5nLCBpbmNvbWluZykgPT4gaW5jb21pbmdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwZXJtaXNzaW9uczoge1xyXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2VBc09iamVjdHNGdW5jdGlvblxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHNhdmVkVmlld0dyb3Vwczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2lucHV0JywgWydsaW1pdCcsICdzZWFyY2gnLCAnb25seUF1dGhvcmVkJywgJ3Jlc291cmNlSWRTdHJpbmcnXV0sXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ1NhdmVkVmlld0dyb3VwQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBTYXZlZFZpZXdHcm91cDoge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgdmlld3M6IHtcclxuICAgICAgICAgICAga2V5QXJnczogW1xyXG4gICAgICAgICAgICAgICdpbnB1dCcsXHJcbiAgICAgICAgICAgICAgWydsaW1pdCcsICdzZWFyY2gnLCAnc29ydEJ5JywgJ3NvcnREaXJlY3Rpb24nLCAnb25seUF1dGhvcmVkJ11cclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignU2F2ZWRWaWV3Q29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlQXNPYmplY3RzRnVuY3Rpb25cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIE1vZGVsOiB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICB2ZXJzaW9uczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2ZpbHRlcicsICdsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdWZXJzaW9uQ29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGVuZGluZ0ltcG9ydGVkVmVyc2lvbnM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IChfZXhpc3RpbmcsIGluY29taW5nKSA9PiBpbmNvbWluZ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHBlcm1pc3Npb25zOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZUFzT2JqZWN0c0Z1bmN0aW9uXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdXBsb2Fkczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2lucHV0JywgWydsaW1pdCddXSxcclxuICAgICAgICAgICAgbWVyZ2U6IGJ1aWxkQWJzdHJhY3RDb2xsZWN0aW9uTWVyZ2VGdW5jdGlvbignRmlsZVVwbG9hZENvbGxlY3Rpb24nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgVmVyc2lvbjoge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlQXNPYmplY3RzRnVuY3Rpb25cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIENvbW1lbnQ6IHtcclxuICAgICAgICBmaWVsZHM6IHtcclxuICAgICAgICAgIHJlcGxpZXM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydsaW1pdCddXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlQXNPYmplY3RzRnVuY3Rpb25cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIFN0cmVhbToge1xyXG4gICAgICAgIGZpZWxkczoge1xyXG4gICAgICAgICAgYWN0aXZpdHk6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydhZnRlcicsICdiZWZvcmUnLCAnYWN0aW9uVHlwZSddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdBY3Rpdml0eUNvbGxlY3Rpb24nKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbW1pdHM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogZmFsc2UsXHJcbiAgICAgICAgICAgIG1lcmdlOiBidWlsZEFic3RyYWN0Q29sbGVjdGlvbk1lcmdlRnVuY3Rpb24oJ0NvbW1pdENvbGxlY3Rpb24nLCB7XHJcbiAgICAgICAgICAgICAgY2hlY2tJZGVudGl0eTogdHJ1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHBlbmRpbmdDb2xsYWJvcmF0b3JzOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBpbmNvbWluZ092ZXJ3cml0ZXNFeGlzdGluZ01lcmdlRnVuY3Rpb25cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwZW5kaW5nQWNjZXNzUmVxdWVzdHM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IGluY29taW5nT3ZlcndyaXRlc0V4aXN0aW5nTWVyZ2VGdW5jdGlvblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgQnJhbmNoOiB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICBjb21taXRzOiB7XHJcbiAgICAgICAgICAgIGtleUFyZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdDb21taXRDb2xsZWN0aW9uJywge1xyXG4gICAgICAgICAgICAgIGNoZWNrSWRlbnRpdHk6IHRydWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIEJyYW5jaENvbGxlY3Rpb246IHtcclxuICAgICAgICBtZXJnZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBTZXJ2ZXJTdGF0czoge1xyXG4gICAgICAgIG1lcmdlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIFdlYmhvb2tFdmVudENvbGxlY3Rpb246IHtcclxuICAgICAgICBtZXJnZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBTZXJ2ZXJJbmZvOiB7XHJcbiAgICAgICAgbWVyZ2U6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgU2VydmVyQ29uZmlndXJhdGlvbjoge1xyXG4gICAgICAgIG1lcmdlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIFdvcmtzcGFjZVN1YnNjcmlwdGlvbjoge1xyXG4gICAgICAgIG1lcmdlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIENvbW1lbnRUaHJlYWRBY3Rpdml0eU1lc3NhZ2U6IHtcclxuICAgICAgICBtZXJnZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBTYXZlZFZpZXdQZXJtaXNzaW9uQ2hlY2tzOiB7XHJcbiAgICAgICAgbWVyZ2U6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgUHJvamVjdFBlcm1pc3Npb25DaGVja3M6IHtcclxuICAgICAgICBtZXJnZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBFeHRlbmRlZFZpZXdlclJlc291cmNlczoge1xyXG4gICAgICAgIG1lcmdlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIERhc2hib2FyZFBlcm1pc3Npb25DaGVja3M6IHtcclxuICAgICAgICBtZXJnZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBBdXRvbWF0ZUZ1bmN0aW9uOiB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICByZWxlYXNlczoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2ZpbHRlcicsICdsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKFxyXG4gICAgICAgICAgICAgICdBdXRvbWF0ZUZ1bmN0aW9uUmVsZWFzZUNvbGxlY3Rpb24nXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIEF1dG9tYXRpb246IHtcclxuICAgICAgICBmaWVsZHM6IHtcclxuICAgICAgICAgIHJ1bnM6IHtcclxuICAgICAgICAgICAga2V5QXJnczogWydsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdBdXRvbWF0ZVJ1bkNvbGxlY3Rpb24nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgV29ya3NwYWNlOiB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICBpbnZpdGVkVGVhbToge1xyXG4gICAgICAgICAgICBtZXJnZTogaW5jb21pbmdPdmVyd3JpdGVzRXhpc3RpbmdNZXJnZUZ1bmN0aW9uXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGVhbToge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2xpbWl0JywgJ2ZpbHRlcicsIFsncm9sZXMnLCAnc2VhcmNoJywgJ3NlYXRUeXBlJ11dLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKFxyXG4gICAgICAgICAgICAgICdXb3Jrc3BhY2VDb2xsYWJvcmF0b3JDb2xsZWN0aW9uJ1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGxhbjoge1xyXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2VBc09iamVjdHNGdW5jdGlvblxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHBsYW5QcmljZXM6IHtcclxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlQXNPYmplY3RzRnVuY3Rpb25cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcm9qZWN0czoge1xyXG4gICAgICAgICAgICBrZXlBcmdzOiBbJ2ZpbHRlcicsICdsaW1pdCddLFxyXG4gICAgICAgICAgICBtZXJnZTogYnVpbGRBYnN0cmFjdENvbGxlY3Rpb25NZXJnZUZ1bmN0aW9uKCdQcm9qZWN0Q29sbGVjdGlvbicpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZUFzT2JqZWN0c0Z1bmN0aW9uXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY3JlYXRpb25TdGF0ZToge1xyXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2VBc09iamVjdHNGdW5jdGlvblxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHBlcm1pc3Npb25zOiB7XHJcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZUFzT2JqZWN0c0Z1bmN0aW9uXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlV3NDbGllbnQocGFyYW1zOiB7XHJcbiAgd3NFbmRwb2ludDogc3RyaW5nXHJcbiAgYXV0aFRva2VuOiBDb29raWVSZWY8T3B0aW9uYWw8c3RyaW5nPj5cclxuICByZXFJZDogc3RyaW5nXHJcbn0pOiBTdWJzY3JpcHRpb25DbGllbnQge1xyXG4gIGNvbnN0IHsgd3NFbmRwb2ludCwgYXV0aFRva2VuLCByZXFJZCB9ID0gcGFyYW1zXHJcblxyXG4gIC8vIFdTIElOIFNTUiBET0VTTidUIFdPUksgQ1VSUkVOVExZIENBVVNFIE9GIFNPTUUgTlVYVCBUUkFOU1BJTEFUSU9OIFdFSVJETkVTU1xyXG4gIC8vIFNPIERPTidUIFJVTiBjcmVhdGVXc0NsaWVudCBpbiBTU1JcclxuXHJcbiAgLy8gY29uc3Qgd3NJbXBsZW1lbnRhdGlvbiA9IHByb2Nlc3Muc2VydmVyID8gKGF3YWl0IGltcG9ydCgnd3MnKSkuZGVmYXVsdCA6IHVuZGVmaW5lZFxyXG4gIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uQ2xpZW50KFxyXG4gICAgd3NFbmRwb2ludCxcclxuICAgIHtcclxuICAgICAgcmVjb25uZWN0OiB0cnVlLFxyXG4gICAgICBjb25uZWN0aW9uUGFyYW1zOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgQXV0aG9yaXphdGlvbiA9IGF1dGhUb2tlbi52YWx1ZSA/IGBCZWFyZXIgJHthdXRoVG9rZW4udmFsdWV9YCA6IG51bGxcclxuICAgICAgICByZXR1cm4gQXV0aG9yaXphdGlvblxyXG4gICAgICAgICAgPyB7IEF1dGhvcml6YXRpb24sIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbiwgJ3gtcmVxdWVzdC1pZCc6IHJlcUlkIH0gfVxyXG4gICAgICAgICAgOiB7fVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB3c0ltcGxlbWVudGF0aW9uXHJcbiAgKVxyXG59XHJcblxyXG5jb25zdCBjb3JlU2hvdWxkU2tpcExvZ2dpbmdFcnJvcnMgPSAoZXJyOiBFcnJvclJlc3BvbnNlKTogYm9vbGVhbiA9PiB7XHJcbiAgLy8gVGhlc2UgZmllbGRzIGhhdmUgc3BlY2lhbCBhdXRoIHJlcXVpcmVtZW50cyBhbmQgd2lsbCBvZnRlbiB0aHJvdyBlcnJvcnMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGxvZ1xyXG4gIGNvbnN0IHNwZWNpYWxBdXRoRmllbGRzID0gWydpbnZpdGVkVGVhbScsICdiaWxsaW5nJywgJ2RvbWFpbnMnLCAnc3Vic2NyaXB0aW9uJ11cclxuICBjb25zdCBzcGVjaWFsQXV0aEZpZWxkRXJyb3JDb2RlcyA9IFtcclxuICAgICdGT1JCSURERU4nLFxyXG4gICAgJ1VOQVVUSE9SSVpFRCcsXHJcbiAgICAnVU5BVVRIT1JJWkVEX0FDQ0VTU19FUlJPUidcclxuICBdXHJcblxyXG4gIHJldHVybiAhIShcclxuICAgIGVyci5ncmFwaFFMRXJyb3JzICYmXHJcbiAgICBlcnIuZ3JhcGhRTEVycm9ycy5ldmVyeShcclxuICAgICAgKGUpID0+XHJcbiAgICAgICAgaW50ZXJzZWN0aW9uKGUucGF0aCB8fCBbXSwgc3BlY2lhbEF1dGhGaWVsZHMpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICBzcGVjaWFsQXV0aEZpZWxkRXJyb3JDb2Rlcy5pbmNsdWRlcyhlLmV4dGVuc2lvbnM/LmNvZGUgYXMgc3RyaW5nKVxyXG4gICAgKVxyXG4gIClcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGluayhwYXJhbXM6IHtcclxuICBodHRwRW5kcG9pbnQ6IHN0cmluZ1xyXG4gIHdzQ2xpZW50PzogU3Vic2NyaXB0aW9uQ2xpZW50XHJcbiAgYXV0aFRva2VuOiBDb29raWVSZWY8T3B0aW9uYWw8c3RyaW5nPj5cclxuICBudXh0QXBwOiBOdXh0QXBwXHJcbiAgcmVxSWQ6IHN0cmluZ1xyXG4gIGxvZ291dDogUmV0dXJuVHlwZTx0eXBlb2YgdXNlQXV0aE1hbmFnZXI+Wydsb2dvdXQnXVxyXG59KTogQXBvbGxvTGluayB7XHJcbiAgY29uc3QgeyBodHRwRW5kcG9pbnQsIHdzQ2xpZW50LCBhdXRoVG9rZW4sIG51eHRBcHAsIHJlcUlkLCBsb2dvdXQgfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHtcclxuICAgIHJlZ2lzdGVyRXJyb3IsXHJcbiAgICBwcmV2ZW50SHR0cENhbGxzLFxyXG4gICAgcHJldmVudFdlYnNvY2tldE1lc3NhZ2luZyxcclxuICAgIGlzRnVsbFJlZGlyZWN0U3RhdGVcclxuICB9ID0gdXNlQXBwRXJyb3JTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IHN0b3BMaW5rID0gbmV3IEFwb2xsb0xpbmsoKG9wZXJhdGlvbiwgZm9yd2FyZCkgPT4ge1xyXG4gICAgaWYgKHByZXZlbnRIdHRwQ2FsbHMudmFsdWUpIHtcclxuICAgICAgLy8gc3dhbGxvdyB0aGUgcmVxLCB3ZSdyZSBibG9ja2luZyB0aGVtIGFsbFxyXG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7fVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3J3YXJkKG9wZXJhdGlvbilcclxuICB9KVxyXG5cclxuICBjb25zdCBlcnJvckxpbmsgPSBvbkVycm9yKChyZXMpID0+IHtcclxuICAgIGNvbnN0IGxvZ2dlciA9IG51eHRBcHAuJGxvZ2dlclxyXG4gICAgY29uc3QgaXNTdWJUb2tlbk1pc3NpbmdFcnJvciA9IChyZXMubmV0d29ya0Vycm9yPy5tZXNzYWdlIHx8ICcnKS5pbmNsdWRlcyhcclxuICAgICAgJ25lZWQgYSB0b2tlbiB0byBzdWJzY3JpYmUnXHJcbiAgICApXHJcblxyXG4gICAgbGV0IHNob3VsZFNraXAgPSBjb3JlU2hvdWxkU2tpcExvZ2dpbmdFcnJvcnMocmVzKVxyXG4gICAgY29uc3Qgc2tpcExvZ2dpbmdFcnJvcnNSZXNvbHZlciA9IHJlcy5vcGVyYXRpb24uZ2V0Q29udGV4dCgpLnNraXBMb2dnaW5nRXJyb3JzXHJcbiAgICBpZiAoc2tpcExvZ2dpbmdFcnJvcnNSZXNvbHZlcikge1xyXG4gICAgICBzaG91bGRTa2lwID0gaXNCb29sZWFuKHNraXBMb2dnaW5nRXJyb3JzUmVzb2x2ZXIpXHJcbiAgICAgICAgPyBza2lwTG9nZ2luZ0Vycm9yc1Jlc29sdmVyXHJcbiAgICAgICAgOiBza2lwTG9nZ2luZ0Vycm9yc1Jlc29sdmVyPy4ocmVzKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNTdWJUb2tlbk1pc3NpbmdFcnJvciAmJiAhc2hvdWxkU2tpcCkge1xyXG4gICAgICBjb25zdCBncWxFcnJvcnM6IEFycmF5PEdyYXBoUUxFcnJvcj4gPSBpc0FycmF5KHJlcy5ncmFwaFFMRXJyb3JzKVxyXG4gICAgICAgID8gcmVzLmdyYXBoUUxFcnJvcnNcclxuICAgICAgICA6IFtdXHJcbiAgICAgIGNvbnN0IGVyck1zZyA9IHJlcy5uZXR3b3JrRXJyb3I/Lm1lc3NhZ2UgfHwgZ3FsRXJyb3JzWzBdPy5tZXNzYWdlXHJcblxyXG4gICAgICAvLyBvbmx5IGxvZyBhcyBlcnJvciBpZiBhdCBsZWFzdCBvbmUgZXJyb3IgaGFzIGEgc3RhdHVzIGNvZGUgb2YgNXh4IG9yIGhhcyBubyBzdGF0dXMgY29kZVxyXG4gICAgICBjb25zdCBzaG91bGRMb2dBc1dhcm4gPSBncWxFcnJvcnMuZXZlcnkoXHJcbiAgICAgICAgKGUpID0+XHJcbiAgICAgICAgICBlLmV4dGVuc2lvbnMgJiZcclxuICAgICAgICAgICdzdGF0dXNDb2RlJyBpbiBlLmV4dGVuc2lvbnMgJiZcclxuICAgICAgICAgIHR5cGVvZiBlLmV4dGVuc2lvbnMuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgJiZcclxuICAgICAgICAgIGUuZXh0ZW5zaW9ucy5zdGF0dXNDb2RlIDwgNTAwXHJcbiAgICAgIClcclxuICAgICAgY29uc3QgbG9nQ29udGV4dCA9IHtcclxuICAgICAgICAuLi5vbWl0KHJlcywgWydmb3J3YXJkJywgJ3Jlc3BvbnNlJ10pLFxyXG4gICAgICAgIG5ldHdvcmtFcnJvcjogcmVzLm5ldHdvcmtFcnJvciA/IGVycm9yVG9TdHJpbmcocmVzLm5ldHdvcmtFcnJvcikgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbmV0d29ya0Vycm9yTWVzc2FnZTogcmVzLm5ldHdvcmtFcnJvcj8ubWVzc2FnZSxcclxuICAgICAgICBncWxFcnJvck1lc3NhZ2VzOiBncWxFcnJvcnMubWFwKChlKSA9PiBlLm1lc3NhZ2UpLFxyXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyTXNnLFxyXG4gICAgICAgIGdyYXBocWw6IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNob3VsZExvZ0FzV2Fybikge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGxvZ0NvbnRleHQsICdBcG9sbG8gQ2xpZW50IGVycm9yOiB7ZXJyb3JNZXNzYWdlfScpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nZ2VyLmVycm9yKGxvZ0NvbnRleHQsICdBcG9sbG8gQ2xpZW50IGVycm9yOiB7ZXJyb3JNZXNzYWdlfScpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IG5ldHdvcmtFcnJvciB9ID0gcmVzXHJcbiAgICBpZiAobmV0d29ya0Vycm9yICYmIGlzSW52YWxpZEF1dGgobmV0d29ya0Vycm9yKSAmJiAhaXNGdWxsUmVkaXJlY3RTdGF0ZS52YWx1ZSkge1xyXG4gICAgICAvLyBSZXNldCBhdXRoXHJcbiAgICAgIC8vIHNpbmNlIHRoaXMgbWF5IGhhcHBlbiBtaWQtcm91dGluZywgYSBzdGFuZGFyZCByb3V0ZXIucHVzaCBjYWxsIG1heSBub3Qgd29yayAtIGRvIGZ1bGwgcmVsb2FkXHJcbiAgICAgIHZvaWQgbG9nb3V0KHsgc2tpcFRvYXN0OiB0cnVlLCBmb3JjZUZ1bGxSZWxvYWQ6IHRydWUgfSlcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckVycm9yKClcclxuICB9KVxyXG5cclxuICAvLyBUT0RPOiBEbyB3ZSBldmVuIG5lZWQgdXBsb2FkIGNsaWVudD9cclxuICAvLyBQcmVwYXJlIGxpbmtzXHJcbiAgLy8gRGVjaWRlIGJldHdlZW4gdXBsb2FkIGxpbmsgYW5kIGJhdGNoIGxpbmsgYmFzZWQgb24gd2hldGhlciB2YXJpYWJsZXMgY29udGFpbiBGaWxlL0Jsb2IvRmlsZUxpc3RcclxuICAvLyBjb25zdCBoYXNVcGxvYWQgPSAodmFsOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XHJcbiAgLy8gICBpZiAoIXZhbCkgcmV0dXJuIGZhbHNlXHJcbiAgLy8gICAvLyBHdWFyZCBmb3IgU1NSIHdoZXJlIEZpbGUvQmxvYi9GaWxlTGlzdCBtYXkgYmUgdW5kZWZpbmVkXHJcbiAgLy8gICBjb25zdCBpc0ZpbGUgPVxyXG4gIC8vICAgICB0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsIGluc3RhbmNlb2YgRmlsZVxyXG4gIC8vICAgY29uc3QgaXNCbG9iID1cclxuICAvLyAgICAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCBpbnN0YW5jZW9mIEJsb2JcclxuICAvLyAgIGNvbnN0IGlzRmlsZUxpc3QgPVxyXG4gIC8vICAgICB0eXBlb2YgRmlsZUxpc3QgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgLy8gICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXHJcbiAgLy8gICAgIHZhbCBpbnN0YW5jZW9mIEZpbGVMaXN0XHJcbiAgLy8gICBpZiAoaXNGaWxlIHx8IGlzQmxvYikgcmV0dXJuIHRydWVcclxuICAvLyAgIGlmIChpc0ZpbGVMaXN0KSByZXR1cm4gQXJyYXkuZnJvbSh2YWwgYXMgRmlsZUxpc3QpLnNvbWUoKHYpID0+IGhhc1VwbG9hZCh2KSlcclxuICAvLyAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB2YWwuc29tZSgodikgPT4gaGFzVXBsb2FkKHYpKVxyXG4gIC8vICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XHJcbiAgLy8gICAgIGZvciAoY29uc3QgayBpbiB2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcclxuICAvLyAgICAgICBpZiAoaGFzVXBsb2FkKCh2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdKSkgcmV0dXJuIHRydWVcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGZhbHNlXHJcbiAgLy8gfVxyXG5cclxuICBjb25zdCB1cGxvYWRIdHRwTGluayA9IGNyZWF0ZVVwbG9hZExpbmsoeyB1cmk6IGh0dHBFbmRwb2ludCB9KVxyXG4gIC8vIGNvbnN0IGJhdGNoSHR0cExpbmsgPSBuZXcgQmF0Y2hIdHRwTGluayh7XHJcbiAgLy8gICB1cmk6IGh0dHBFbmRwb2ludCxcclxuICAvLyAgIGJhdGNoTWF4OiAxMCxcclxuICAvLyAgIGJhdGNoSW50ZXJ2YWw6IDIwLFxyXG4gIC8vICAgLy8gS2VlcCBiYXRjaGVzIOKAnGNvbXBhdGlibGXigJ0gKGF2b2lkIG1peGluZyBvcHMgd2l0aCBkaWZmZXJlbnQgYXV0aC9oZWFkZXJzKVxyXG4gIC8vICAgYmF0Y2hLZXk6IChvcCkgPT5cclxuICAvLyAgICAgSlNPTi5zdHJpbmdpZnkoe1xyXG4gIC8vICAgICAgIHVyaTogb3AuZ2V0Q29udGV4dCgpLnVyaSxcclxuICAvLyAgICAgICBoZWFkZXJzOiBvcC5nZXRDb250ZXh0KCkuaGVhZGVycyxcclxuICAvLyAgICAgICBjcmVkZW50aWFsczogb3AuZ2V0Q29udGV4dCgpLmNyZWRlbnRpYWxzXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gfSlcclxuICAvLyBjb25zdCBodHRwTGluayA9IHNwbGl0KFxyXG4gIC8vICAgKG9wZXJhdGlvbikgPT4gaGFzVXBsb2FkKG9wZXJhdGlvbi52YXJpYWJsZXMpLFxyXG4gIC8vICAgLy8gSWYgdGhlcmUncyBhbiB1cGxvYWQgaW4gdmFyaWFibGVzIC0+IHVzZSB1cGxvYWQgbGluaywgZWxzZSBiYXRjaFxyXG4gIC8vICAgdXBsb2FkSHR0cExpbmssXHJcbiAgLy8gICBiYXRjaEh0dHBMaW5rXHJcbiAgLy8gKVxyXG5cclxuICBjb25zdCBhdXRoTGluayA9IHNldENvbnRleHQoKF8sIGN0eCkgPT4ge1xyXG4gICAgY29uc3QgeyBoZWFkZXJzIH0gPSBjdHhcclxuICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBhdXRoVG9rZW4udmFsdWVcclxuICAgICAgPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW4udmFsdWV9YCB9XHJcbiAgICAgIDoge31cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAuLi5oZWFkZXJzLFxyXG4gICAgICAgIC4uLmF1dGhIZWFkZXIsXHJcbiAgICAgICAgJ3gtcmVxdWVzdC1pZCc6IHJlcUlkLFxyXG4gICAgICAgICdhcG9sbG8tcmVxdWlyZS1wcmVmbGlnaHQnOiAndHJ1ZSdcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGxldCBsaW5rID0gYXV0aExpbmsuY29uY2F0KHVwbG9hZEh0dHBMaW5rKVxyXG5cclxuICBpZiAod3NDbGllbnQpIHtcclxuICAgIGNvbnN0IHdzTGluayA9IG5ldyBXZWJTb2NrZXRMaW5rKHdzQ2xpZW50KVxyXG4gICAgbGluayA9IHNwbGl0KFxyXG4gICAgICAoeyBxdWVyeSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IGdldE1haW5EZWZpbml0aW9uKHF1ZXJ5KSBhcyBPcGVyYXRpb25EZWZpbml0aW9uTm9kZVxyXG4gICAgICAgIGNvbnN0IHsga2luZCwgb3BlcmF0aW9uIH0gPSBkZWZpbml0aW9uXHJcblxyXG4gICAgICAgIHJldHVybiBraW5kID09PSBLaW5kLk9QRVJBVElPTl9ERUZJTklUSU9OICYmIG9wZXJhdGlvbiA9PT0gJ3N1YnNjcmlwdGlvbidcclxuICAgICAgfSxcclxuICAgICAgd3NMaW5rLFxyXG4gICAgICBsaW5rXHJcbiAgICApXHJcblxyXG4gICAgLy8gU3RvcHBpbmcgV1Mgd2hlbiBpbiBlcnJvciBzdGF0ZVxyXG4gICAgd3NDbGllbnQudXNlKFtcclxuICAgICAge1xyXG4gICAgICAgIGFwcGx5TWlkZGxld2FyZTogKF9vcHQsIG5leHQpID0+IHtcclxuICAgICAgICAgIGlmIChwcmV2ZW50V2Vic29ja2V0TWVzc2FnaW5nLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAvLyBuZXZlciBpbnZva2VzIG5leHQoKSAtIGVzc2VudGlhbGx5IHN0dWNrXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbmV4dCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdKVxyXG4gIH1cclxuXHJcbiAgLy8gU1NSIHJlcSBsb2dnaW5nIGxpbmtcclxuICBjb25zdCBsb2dnZXJMaW5rID0gbmV3IEFwb2xsb0xpbmsoKG9wZXJhdGlvbiwgZm9yd2FyZCkgPT4ge1xyXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxyXG4gICAgY29uc3QgbmFtZSA9IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lXHJcblxyXG4gICAgbnV4dEFwcC4kbG9nZ2VyLmRlYnVnKFxyXG4gICAgICB7IG9wZXJhdGlvbjogbmFtZSwgZ3JhcGhxbDogdHJ1ZSB9LFxyXG4gICAgICBgQXBvbGxvIG9wZXJhdGlvbiB7b3BlcmF0aW9ufSBzdGFydGVkLi4uYFxyXG4gICAgKVxyXG4gICAgcmV0dXJuIGZvcndhcmQob3BlcmF0aW9uKS5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBjb25zdCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWVcclxuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhKHJlc3VsdC5kYXRhICYmICFyZXN1bHQuZXJyb3JzPy5sZW5ndGgpXHJcblxyXG4gICAgICBudXh0QXBwLiRsb2dnZXIuaW5mbyhcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcGVyYXRpb246IG5hbWUsXHJcbiAgICAgICAgICBlbGFwc2VkLFxyXG4gICAgICAgICAgc3VjY2VzcyxcclxuICAgICAgICAgIGdyYXBocWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGBBcG9sbG8gb3BlcmF0aW9uIHtvcGVyYXRpb259IGZpbmlzaGVkIGluIHtlbGFwc2VkfW1zYFxyXG4gICAgICApXHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICB9KVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiBmcm9tKFtzdG9wTGluaywgLi4uKGltcG9ydC5tZXRhLnNlcnZlciA/IFtsb2dnZXJMaW5rXSA6IFtdKSwgZXJyb3JMaW5rLCBsaW5rXSlcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdENvbmZpZ1Jlc29sdmVyOiBBcG9sbG9Db25maWdSZXNvbHZlciA9ICgpID0+IHtcclxuICBjb25zdCB7XHJcbiAgICBwdWJsaWM6IHsgc3BlY2tsZVNlcnZlclZlcnNpb24gPSAndW5rbm93bicgfVxyXG4gIH0gPSB1c2VSdW50aW1lQ29uZmlnKClcclxuICBjb25zdCBhcGlPcmlnaW4gPSB1c2VBcGlPcmlnaW4oKVxyXG4gIGNvbnN0IG51eHRBcHAgPSB1c2VOdXh0QXBwKClcclxuICBjb25zdCByZXFJZCA9IHVzZVJlcXVlc3RJZCgpXHJcbiAgY29uc3QgeyBlZmZlY3RpdmVBdXRoVG9rZW4sIGxvZ291dCB9ID0gdXNlQXV0aE1hbmFnZXIoe1xyXG4gICAgZGVmZXJyZWRBcG9sbG86ICgpID0+IG51eHRBcHAuJGFwb2xsbz8uZGVmYXVsdFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGh0dHBFbmRwb2ludCA9IGAke2FwaU9yaWdpbn0vZ3JhcGhxbGBcclxuICBjb25zdCB3c0VuZHBvaW50ID0gaHR0cEVuZHBvaW50LnJlcGxhY2UoJ2h0dHAnLCAnd3MnKVxyXG5cclxuICBjb25zdCB3c0NsaWVudCA9IGltcG9ydC5tZXRhLmNsaWVudFxyXG4gICAgPyBjcmVhdGVXc0NsaWVudCh7IHdzRW5kcG9pbnQsIGF1dGhUb2tlbjogZWZmZWN0aXZlQXV0aFRva2VuLCByZXFJZCB9KVxyXG4gICAgOiB1bmRlZmluZWRcclxuICBjb25zdCBsaW5rID0gY3JlYXRlTGluayh7XHJcbiAgICBodHRwRW5kcG9pbnQsXHJcbiAgICB3c0NsaWVudCxcclxuICAgIGF1dGhUb2tlbjogZWZmZWN0aXZlQXV0aFRva2VuLFxyXG4gICAgbnV4dEFwcCxcclxuICAgIHJlcUlkLFxyXG4gICAgbG9nb3V0XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIElmIHdlIGRvbid0IG1hcmtSYXcgdGhlIGNhY2hlLCBzb21ldGltZXMgd2UgZ2V0IGNyeXB0aWMgaW50ZXJuYWwgQXBvbGxvIENsaWVudCBlcnJvcnMgdGhhdCBlc3NlbnRpYWxseVxyXG4gICAgLy8gcmVzdWx0IGZyb20gcGFydHMgb2YgaXRzIGludGVybmFscyBiZWluZyBtYWRlIHJlYWN0aXZlLCBldmVuIHRobyB0aGV5IHNob3VsZG4ndCBiZVxyXG4gICAgY2FjaGU6IG1hcmtSYXcoY3JlYXRlQ2FjaGUoKSksXHJcbiAgICBsaW5rLFxyXG4gICAgbmFtZTogYXBwTmFtZSxcclxuICAgIHZlcnNpb246IHNwZWNrbGVTZXJ2ZXJWZXJzaW9uLFxyXG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcclxuICAgICAgLy8gV2Ugd2FudCB0byByZXRhaW4gYWxsIGRhdGEgZXZlbiBpZiB0aGVyZSBhcmUgZXJyb3JzLCBjYXVzZSB0aGVyZSdzIG9mdGVuIGZpZWxkcyB3aXRoIHNwZWNpYWwgYXV0aCByZXF1aXJlbWVudHMgdGhhdCB3ZSBkb24ndCB3YW50XHJcbiAgICAgIC8vIHRvIGJlIGFibGUgdG8ga2lsbCB0aGUgZW50aXJlIHF1ZXJ5LiBCZXNpZGVzIC0gaW4gbW9zdCBjYXNlcyBwYXJ0aWFsIGRhdGEgaXMgYmV0dGVyIHRoYW4gbm8gZGF0YSBhdCBhbGwuXHJcbiAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgZXJyb3JQb2xpY3k6ICdhbGwnXHJcbiAgICAgIH0sXHJcbiAgICAgIG11dGF0ZToge1xyXG4gICAgICAgIGVycm9yUG9saWN5OiAnYWxsJ1xyXG4gICAgICB9LFxyXG4gICAgICB3YXRjaFF1ZXJ5OiB7XHJcbiAgICAgICAgZXJyb3JQb2xpY3k6ICdhbGwnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRDb25maWdSZXNvbHZlclxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL2NvcmUvY29uZmlncy9hcG9sbG8udHMifQ==