240 lines
27 KiB
Plaintext
240 lines
27 KiB
Plaintext
import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { useApolloClientFromNuxt } from "/_nuxt/lib/common/composables/graphql.ts";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { convertThrowIntoFetchResult } from "/_nuxt/lib/common/helpers/graphql.ts";
|
|
import {
|
|
homeRoute,
|
|
modelRoute,
|
|
modelVersionsRoute,
|
|
projectRoute,
|
|
serverManagementRoute
|
|
} from "/_nuxt/lib/common/helpers/route.ts";
|
|
import { ViewerHashStateKeys } from "/_nuxt/lib/viewer/composables/setup/urlHashState.ts";
|
|
|
|
import { defineParallelizedNuxtRouteMiddleware } from "/_nuxt/utils/globals.ts";
|
|
import { useLogger } from "/_nuxt/composables/logging.ts";
|
|
import { navigateTo } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
const legacyBranchMetadataQuery = graphql(`
|
|
query LegacyBranchRedirectMetadata($streamId: String!, $branchName: String!) {
|
|
project(id: $streamId) {
|
|
modelByName(name: $branchName) {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const legacyViewerCommitMetadataQuery = graphql(`
|
|
query LegacyViewerCommitRedirectMetadata($streamId: String!, $commitId: String!) {
|
|
project(id: $streamId) {
|
|
version(id: $commitId) {
|
|
id
|
|
model {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const legacyViewerStreamMetadataQuery = graphql(`
|
|
query LegacyViewerStreamRedirectMetadata($streamId: String!) {
|
|
project(id: $streamId) {
|
|
id
|
|
versions(limit: 1) {
|
|
totalCount
|
|
items {
|
|
id
|
|
model {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const viewerPageRgx = /^\/streams\/([a-zA-Z0-9-_]+)\/(commits|objects)\/([a-zA-Z0-9-_]+)\/?/;
|
|
const embedViewerPageRgx = /^\/embed\/?/;
|
|
const streamBranchPageRgx = /^\/streams\/([a-zA-Z0-9-_]+)\/branches\/([a-zA-Z0-9-_%]+)\/?/;
|
|
const streamPageRgx = /^\/streams\/([a-zA-Z0-9-_]+)\/?/;
|
|
const adminPageRgx = /^\/admin\/?/;
|
|
export default defineParallelizedNuxtRouteMiddleware(async (to) => {
|
|
const logger = useLogger();
|
|
const path = to.path;
|
|
const apollo = useApolloClientFromNuxt();
|
|
const resourceBuilder = () => SpeckleViewer.ViewerRoute.resourceBuilder();
|
|
if (["/streams", "/commits", "/streams/", "/commits/"].includes(path)) {
|
|
return navigateTo(homeRoute);
|
|
}
|
|
const [, viewerStreamId, viewerType, viewerId] = path.match(viewerPageRgx) || [];
|
|
if (viewerStreamId && viewerType && viewerId) {
|
|
const resourceIdStringBuilder = resourceBuilder();
|
|
const commentId = to.query["cId"];
|
|
const hashState = commentId?.length ? { [ViewerHashStateKeys.FocusedThreadId]: commentId } : void 0;
|
|
if (viewerType === "objects") {
|
|
const resourceIdString = resourceIdStringBuilder.addObject(viewerId).toString();
|
|
return navigateTo(modelRoute(viewerStreamId, resourceIdString, hashState));
|
|
} else {
|
|
const { data, errors } = await apollo.query({
|
|
query: legacyViewerCommitMetadataQuery,
|
|
variables: { streamId: viewerStreamId, commitId: viewerId }
|
|
}).catch(convertThrowIntoFetchResult);
|
|
const branchId = data?.project?.version?.model?.id;
|
|
if (branchId) {
|
|
return navigateTo(
|
|
modelRoute(
|
|
viewerStreamId,
|
|
resourceIdStringBuilder.addModel(branchId, viewerId).toString(),
|
|
hashState
|
|
)
|
|
);
|
|
} else {
|
|
logger.warn(
|
|
{
|
|
errors,
|
|
streamId: viewerStreamId,
|
|
commitId: viewerId
|
|
},
|
|
"Couldn't resolve legacy viewer redirect commit metadata"
|
|
);
|
|
return navigateTo(projectRoute(viewerStreamId));
|
|
}
|
|
}
|
|
}
|
|
const isEmbed = embedViewerPageRgx.test(path);
|
|
if (isEmbed) {
|
|
const embedOptions = {
|
|
isEnabled: true,
|
|
...to.query["transparent"] === "true" ? { isTransparent: true } : {},
|
|
...to.query["hidecontrols"] === "true" ? { hideControls: true } : {},
|
|
...to.query["hideselectioninfo"] === "true" ? { hideSelectionInfo: true } : {},
|
|
...to.query["disablemodellink"] === "true" ? { disableModelLink: true } : {},
|
|
...to.query["noscroll"] === "true" ? { noScroll: true } : {},
|
|
...to.query["autoload"] === "true" ? { manualLoad: false } : { manualLoad: true }
|
|
};
|
|
const streamId2 = to.query["stream"];
|
|
const commitId = to.query["commit"];
|
|
const objectId = to.query["object"];
|
|
const branchName2 = to.query["branch"];
|
|
if (!streamId2?.length) {
|
|
logger.warn("No stream ID provided for embed viewer redirect");
|
|
return navigateTo(homeRoute);
|
|
}
|
|
if (objectId?.length) {
|
|
return navigateTo(
|
|
modelRoute(streamId2, resourceBuilder().addObject(objectId).toString(), {
|
|
[ViewerHashStateKeys.EmbedOptions]: JSON.stringify(embedOptions)
|
|
})
|
|
);
|
|
} else if (commitId?.length) {
|
|
const { data, errors } = await apollo.query({
|
|
query: legacyViewerCommitMetadataQuery,
|
|
variables: { streamId: streamId2, commitId }
|
|
}).catch(convertThrowIntoFetchResult);
|
|
const branchId = data?.project?.version?.model?.id;
|
|
if (branchId) {
|
|
return navigateTo(
|
|
modelRoute(
|
|
streamId2,
|
|
resourceBuilder().addModel(branchId, commitId).toString(),
|
|
{
|
|
[ViewerHashStateKeys.EmbedOptions]: JSON.stringify(embedOptions)
|
|
}
|
|
)
|
|
);
|
|
} else {
|
|
logger.warn(
|
|
{
|
|
errors,
|
|
streamId: streamId2,
|
|
commitId
|
|
},
|
|
"Couldn't resolve legacy commit embed redirect metadata"
|
|
);
|
|
return navigateTo(projectRoute(streamId2));
|
|
}
|
|
} else if (branchName2?.length) {
|
|
const { data, errors } = await apollo.query({
|
|
query: legacyBranchMetadataQuery,
|
|
variables: {
|
|
streamId: streamId2,
|
|
branchName: decodeURIComponent(branchName2)
|
|
}
|
|
}).catch(convertThrowIntoFetchResult);
|
|
const branchId = data?.project?.modelByName?.id;
|
|
if (branchId) {
|
|
return navigateTo(
|
|
modelRoute(streamId2, resourceBuilder().addModel(branchId).toString(), {
|
|
[ViewerHashStateKeys.EmbedOptions]: JSON.stringify(embedOptions)
|
|
})
|
|
);
|
|
} else {
|
|
logger.warn(
|
|
{
|
|
errors,
|
|
streamId: streamId2,
|
|
branchName: decodeURIComponent(branchName2)
|
|
},
|
|
"Couldn't resolve legacy branch embed redirect metadata"
|
|
);
|
|
return navigateTo(projectRoute(streamId2));
|
|
}
|
|
} else {
|
|
const { data, errors } = await apollo.query({ query: legacyViewerStreamMetadataQuery, variables: { streamId: streamId2 } }).catch(convertThrowIntoFetchResult);
|
|
if (data?.project?.versions?.items?.length && data.project.versions.items[0].model) {
|
|
return navigateTo(
|
|
modelRoute(
|
|
data.project.id,
|
|
SpeckleViewer.ViewerRoute.resourceBuilder().addModel(
|
|
data.project.versions.items[0].model.id,
|
|
data.project.versions.items[0].id
|
|
).toString(),
|
|
{
|
|
[ViewerHashStateKeys.EmbedOptions]: JSON.stringify(embedOptions)
|
|
}
|
|
)
|
|
);
|
|
} else {
|
|
logger.warn(
|
|
{
|
|
errors,
|
|
streamId: streamId2
|
|
},
|
|
"Couldn't resolve legacy stream embed redirect metadata"
|
|
);
|
|
return navigateTo(projectRoute(streamId2));
|
|
}
|
|
}
|
|
}
|
|
const [, branchStreamId, branchName] = path.match(streamBranchPageRgx) || [];
|
|
if (branchStreamId && branchName) {
|
|
const { data, errors } = await apollo.query({
|
|
query: legacyBranchMetadataQuery,
|
|
variables: {
|
|
streamId: branchStreamId,
|
|
branchName: decodeURIComponent(branchName)
|
|
}
|
|
}).catch(convertThrowIntoFetchResult);
|
|
const branchId = data?.project?.modelByName?.id;
|
|
if (branchId) {
|
|
return navigateTo(modelVersionsRoute(branchStreamId, branchId));
|
|
} else {
|
|
logger.warn(
|
|
{
|
|
errors,
|
|
streamId: branchStreamId,
|
|
branchName: decodeURIComponent(branchName)
|
|
},
|
|
"Couldn't resolve legacy branch redirect metadata"
|
|
);
|
|
return navigateTo(projectRoute(branchStreamId));
|
|
}
|
|
}
|
|
const [, streamId] = path.match(streamPageRgx) || [];
|
|
if (streamId) {
|
|
return navigateTo(projectRoute(streamId));
|
|
}
|
|
if (adminPageRgx.test(path)) {
|
|
return navigateTo(serverManagementRoute);
|
|
}
|
|
});
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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WUFBWSxtQkFBbUIsVUFBVTtBQUFBLFFBQzNDO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFFQSxhQUFPLFdBQVcsYUFBYSxjQUFjLENBQUM7QUFBQSxJQUNoRDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLENBQUMsRUFBRSxRQUFRLElBQUksS0FBSyxNQUFNLGFBQWEsS0FBSyxDQUFDO0FBQ25ELE1BQUksVUFBVTtBQUNaLFdBQU8sV0FBVyxhQUFhLFFBQVEsQ0FBQztBQUFBLEVBQzFDO0FBRUEsTUFBSSxhQUFhLEtBQUssSUFBSSxHQUFHO0FBQzNCLFdBQU8sV0FBVyxxQkFBcUI7QUFBQSxFQUN6QztBQUNGLENBQUMiLCJuYW1lcyI6WyJzdHJlYW1JZCIsImJyYW5jaE5hbWUiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiMDAyLXJlZGlyZWN0cy5nbG9iYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BlY2tsZVZpZXdlciwgdHlwZSBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50RnJvbU51eHQgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvZ3JhcGhxbCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgeyBjb252ZXJ0VGhyb3dJbnRvRmV0Y2hSZXN1bHQgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9ncmFwaHFsJ1xyXG5pbXBvcnQge1xyXG4gIGhvbWVSb3V0ZSxcclxuICBtb2RlbFJvdXRlLFxyXG4gIG1vZGVsVmVyc2lvbnNSb3V0ZSxcclxuICBwcm9qZWN0Um91dGUsXHJcbiAgc2VydmVyTWFuYWdlbWVudFJvdXRlXHJcbn0gZnJvbSAnfi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB0eXBlIHsgRW1iZWRPcHRpb25zIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwL2VtYmVkJ1xyXG5pbXBvcnQgeyBWaWV3ZXJIYXNoU3RhdGVLZXlzIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwL3VybEhhc2hTdGF0ZSdcclxuXHJcbmNvbnN0IGxlZ2FjeUJyYW5jaE1ldGFkYXRhUXVlcnkgPSBncmFwaHFsKGBcclxuICBxdWVyeSBMZWdhY3lCcmFuY2hSZWRpcmVjdE1ldGFkYXRhKCRzdHJlYW1JZDogU3RyaW5nISwgJGJyYW5jaE5hbWU6IFN0cmluZyEpIHtcclxuICAgIHByb2plY3QoaWQ6ICRzdHJlYW1JZCkge1xyXG4gICAgICBtb2RlbEJ5TmFtZShuYW1lOiAkYnJhbmNoTmFtZSkge1xyXG4gICAgICAgIGlkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBsZWdhY3lWaWV3ZXJDb21taXRNZXRhZGF0YVF1ZXJ5ID0gZ3JhcGhxbChgXHJcbiAgcXVlcnkgTGVnYWN5Vmlld2VyQ29tbWl0UmVkaXJlY3RNZXRhZGF0YSgkc3RyZWFtSWQ6IFN0cmluZyEsICRjb21taXRJZDogU3RyaW5nISkge1xyXG4gICAgcHJvamVjdChpZDogJHN0cmVhbUlkKSB7XHJcbiAgICAgIHZlcnNpb24oaWQ6ICRjb21taXRJZCkge1xyXG4gICAgICAgIGlkXHJcbiAgICAgICAgbW9kZWwge1xyXG4gICAgICAgICAgaWRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBsZWdhY3lWaWV3ZXJTdHJlYW1NZXRhZGF0YVF1ZXJ5ID0gZ3JhcGhxbChgXHJcbiAgcXVlcnkgTGVnYWN5Vmlld2VyU3RyZWFtUmVkaXJlY3RNZXRhZGF0YSgkc3RyZWFtSWQ6IFN0cmluZyEpIHtcclxuICAgIHByb2plY3QoaWQ6ICRzdHJlYW1JZCkge1xyXG4gICAgICBpZFxyXG4gICAgICB2ZXJzaW9ucyhsaW1pdDogMSkge1xyXG4gICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICBpdGVtcyB7XHJcbiAgICAgICAgICBpZFxyXG4gICAgICAgICAgbW9kZWwge1xyXG4gICAgICAgICAgICBpZFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHZpZXdlclBhZ2VSZ3ggPVxyXG4gIC9eXFwvc3RyZWFtc1xcLyhbYS16QS1aMC05LV9dKylcXC8oY29tbWl0c3xvYmplY3RzKVxcLyhbYS16QS1aMC05LV9dKylcXC8/L1xyXG5cclxuY29uc3QgZW1iZWRWaWV3ZXJQYWdlUmd4ID0gL15cXC9lbWJlZFxcLz8vXHJcblxyXG5jb25zdCBzdHJlYW1CcmFuY2hQYWdlUmd4ID1cclxuICAvXlxcL3N0cmVhbXNcXC8oW2EtekEtWjAtOS1fXSspXFwvYnJhbmNoZXNcXC8oW2EtekEtWjAtOS1fJV0rKVxcLz8vXHJcblxyXG5jb25zdCBzdHJlYW1QYWdlUmd4ID0gL15cXC9zdHJlYW1zXFwvKFthLXpBLVowLTktX10rKVxcLz8vXHJcbmNvbnN0IGFkbWluUGFnZVJneCA9IC9eXFwvYWRtaW5cXC8/L1xyXG5cclxuLyoqXHJcbiAqIFNldHRpbmcgdXAgYWxsIGtpbmRzIG9mIHJlZGlyZWN0cyAoZS5nLiBmb3IgRkUxIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxyXG4gKi9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZVBhcmFsbGVsaXplZE51eHRSb3V0ZU1pZGRsZXdhcmUoYXN5bmMgKHRvKSA9PiB7XHJcbiAgY29uc3QgbG9nZ2VyID0gdXNlTG9nZ2VyKClcclxuICBjb25zdCBwYXRoID0gdG8ucGF0aFxyXG4gIGNvbnN0IGFwb2xsbyA9IHVzZUFwb2xsb0NsaWVudEZyb21OdXh0KClcclxuICBjb25zdCByZXNvdXJjZUJ1aWxkZXIgPSAoKSA9PiBTcGVja2xlVmlld2VyLlZpZXdlclJvdXRlLnJlc291cmNlQnVpbGRlcigpXHJcblxyXG4gIGlmIChbJy9zdHJlYW1zJywgJy9jb21taXRzJywgJy9zdHJlYW1zLycsICcvY29tbWl0cy8nXS5pbmNsdWRlcyhwYXRoKSkge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRlVG8oaG9tZVJvdXRlKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgWywgdmlld2VyU3RyZWFtSWQsIHZpZXdlclR5cGUsIHZpZXdlcklkXSA9IHBhdGgubWF0Y2godmlld2VyUGFnZVJneCkgfHwgW11cclxuICBpZiAodmlld2VyU3RyZWFtSWQgJiYgdmlld2VyVHlwZSAmJiB2aWV3ZXJJZCkge1xyXG4gICAgY29uc3QgcmVzb3VyY2VJZFN0cmluZ0J1aWxkZXIgPSByZXNvdXJjZUJ1aWxkZXIoKVxyXG5cclxuICAgIC8vIFJlc29sdmUgY29tbWVudCBJRCwgaWYgYW55XHJcbiAgICBjb25zdCBjb21tZW50SWQgPSB0by5xdWVyeVsnY0lkJ10gYXMgT3B0aW9uYWw8c3RyaW5nPlxyXG4gICAgY29uc3QgaGFzaFN0YXRlOiBPcHRpb25hbDxQYXJ0aWFsPFJlY29yZDxWaWV3ZXJIYXNoU3RhdGVLZXlzLCBzdHJpbmc+Pj4gPVxyXG4gICAgICBjb21tZW50SWQ/Lmxlbmd0aFxyXG4gICAgICAgID8geyBbVmlld2VySGFzaFN0YXRlS2V5cy5Gb2N1c2VkVGhyZWFkSWRdOiBjb21tZW50SWQgfVxyXG4gICAgICAgIDogdW5kZWZpbmVkXHJcblxyXG4gICAgaWYgKHZpZXdlclR5cGUgPT09ICdvYmplY3RzJykge1xyXG4gICAgICBjb25zdCByZXNvdXJjZUlkU3RyaW5nID0gcmVzb3VyY2VJZFN0cmluZ0J1aWxkZXIuYWRkT2JqZWN0KHZpZXdlcklkKS50b1N0cmluZygpXHJcbiAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKG1vZGVsUm91dGUodmlld2VyU3RyZWFtSWQsIHJlc291cmNlSWRTdHJpbmcsIGhhc2hTdGF0ZSkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB7IGRhdGEsIGVycm9ycyB9ID0gYXdhaXQgYXBvbGxvXHJcbiAgICAgICAgLnF1ZXJ5KHtcclxuICAgICAgICAgIHF1ZXJ5OiBsZWdhY3lWaWV3ZXJDb21taXRNZXRhZGF0YVF1ZXJ5LFxyXG4gICAgICAgICAgdmFyaWFibGVzOiB7IHN0cmVhbUlkOiB2aWV3ZXJTdHJlYW1JZCwgY29tbWl0SWQ6IHZpZXdlcklkIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChjb252ZXJ0VGhyb3dJbnRvRmV0Y2hSZXN1bHQpXHJcbiAgICAgIGNvbnN0IGJyYW5jaElkID0gZGF0YT8ucHJvamVjdD8udmVyc2lvbj8ubW9kZWw/LmlkXHJcblxyXG4gICAgICBpZiAoYnJhbmNoSWQpIHtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdGVUbyhcclxuICAgICAgICAgIG1vZGVsUm91dGUoXHJcbiAgICAgICAgICAgIHZpZXdlclN0cmVhbUlkLFxyXG4gICAgICAgICAgICByZXNvdXJjZUlkU3RyaW5nQnVpbGRlci5hZGRNb2RlbChicmFuY2hJZCwgdmlld2VySWQpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIGhhc2hTdGF0ZVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2dnZXIud2FybihcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZXJyb3JzLFxyXG4gICAgICAgICAgICBzdHJlYW1JZDogdmlld2VyU3RyZWFtSWQsXHJcbiAgICAgICAgICAgIGNvbW1pdElkOiB2aWV3ZXJJZFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiQ291bGRuJ3QgcmVzb2x2ZSBsZWdhY3kgdmlld2VyIHJlZGlyZWN0IGNvbW1pdCBtZXRhZGF0YVwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKHByb2plY3RSb3V0ZSh2aWV3ZXJTdHJlYW1JZCkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGlzRW1iZWQgPSBlbWJlZFZpZXdlclBhZ2VSZ3gudGVzdChwYXRoKVxyXG4gIGlmIChpc0VtYmVkKSB7XHJcbiAgICBjb25zdCBlbWJlZE9wdGlvbnM6IEVtYmVkT3B0aW9ucyA9IHtcclxuICAgICAgaXNFbmFibGVkOiB0cnVlLFxyXG4gICAgICAuLi4odG8ucXVlcnlbJ3RyYW5zcGFyZW50J10gPT09ICd0cnVlJyA/IHsgaXNUcmFuc3BhcmVudDogdHJ1ZSB9IDoge30pLFxyXG4gICAgICAuLi4odG8ucXVlcnlbJ2hpZGVjb250cm9scyddID09PSAndHJ1ZScgPyB7IGhpZGVDb250cm9sczogdHJ1ZSB9IDoge30pLFxyXG4gICAgICAuLi4odG8ucXVlcnlbJ2hpZGVzZWxlY3Rpb25pbmZvJ10gPT09ICd0cnVlJyA/IHsgaGlkZVNlbGVjdGlvbkluZm86IHRydWUgfSA6IHt9KSxcclxuICAgICAgLi4uKHRvLnF1ZXJ5WydkaXNhYmxlbW9kZWxsaW5rJ10gPT09ICd0cnVlJyA/IHsgZGlzYWJsZU1vZGVsTGluazogdHJ1ZSB9IDoge30pLFxyXG4gICAgICAuLi4odG8ucXVlcnlbJ25vc2Nyb2xsJ10gPT09ICd0cnVlJyA/IHsgbm9TY3JvbGw6IHRydWUgfSA6IHt9KSxcclxuICAgICAgLi4uKHRvLnF1ZXJ5WydhdXRvbG9hZCddID09PSAndHJ1ZSdcclxuICAgICAgICA/IHsgbWFudWFsTG9hZDogZmFsc2UgfVxyXG4gICAgICAgIDogeyBtYW51YWxMb2FkOiB0cnVlIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzb2x2ZSBzdHJlYW0vb2JqZWN0L2NvbW1pdCBJRCBmcm9tIHF1ZXJ5XHJcbiAgICBjb25zdCBzdHJlYW1JZCA9IHRvLnF1ZXJ5WydzdHJlYW0nXSBhcyBPcHRpb25hbDxzdHJpbmc+IC8vIGdldCBmaXJzdCBzdHJlYW0gY29tbWl0XHJcbiAgICBjb25zdCBjb21taXRJZCA9IHRvLnF1ZXJ5Wydjb21taXQnXSBhcyBPcHRpb25hbDxzdHJpbmc+IC8vIGdldCBzcGVjaWZpYyBjb21taXRcclxuICAgIGNvbnN0IG9iamVjdElkID0gdG8ucXVlcnlbJ29iamVjdCddIGFzIE9wdGlvbmFsPHN0cmluZz4gLy8gZ2V0IHNwZWNpZmljIG9iamVjdFxyXG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IHRvLnF1ZXJ5WydicmFuY2gnXSBhcyBPcHRpb25hbDxzdHJpbmc+IC8vIGdldCBmaXJzdCBicmFuY2ggY29tbWl0XHJcblxyXG4gICAgaWYgKCFzdHJlYW1JZD8ubGVuZ3RoKSB7XHJcbiAgICAgIGxvZ2dlci53YXJuKCdObyBzdHJlYW0gSUQgcHJvdmlkZWQgZm9yIGVtYmVkIHZpZXdlciByZWRpcmVjdCcpXHJcbiAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKGhvbWVSb3V0ZSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JqZWN0SWQ/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGVUbyhcclxuICAgICAgICBtb2RlbFJvdXRlKHN0cmVhbUlkLCByZXNvdXJjZUJ1aWxkZXIoKS5hZGRPYmplY3Qob2JqZWN0SWQpLnRvU3RyaW5nKCksIHtcclxuICAgICAgICAgIFtWaWV3ZXJIYXNoU3RhdGVLZXlzLkVtYmVkT3B0aW9uc106IEpTT04uc3RyaW5naWZ5KGVtYmVkT3B0aW9ucylcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9IGVsc2UgaWYgKGNvbW1pdElkPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvcnMgfSA9IGF3YWl0IGFwb2xsb1xyXG4gICAgICAgIC5xdWVyeSh7XHJcbiAgICAgICAgICBxdWVyeTogbGVnYWN5Vmlld2VyQ29tbWl0TWV0YWRhdGFRdWVyeSxcclxuICAgICAgICAgIHZhcmlhYmxlczogeyBzdHJlYW1JZCwgY29tbWl0SWQgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGNvbnZlcnRUaHJvd0ludG9GZXRjaFJlc3VsdClcclxuICAgICAgY29uc3QgYnJhbmNoSWQgPSBkYXRhPy5wcm9qZWN0Py52ZXJzaW9uPy5tb2RlbD8uaWRcclxuXHJcbiAgICAgIGlmIChicmFuY2hJZCkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKFxyXG4gICAgICAgICAgbW9kZWxSb3V0ZShcclxuICAgICAgICAgICAgc3RyZWFtSWQsXHJcbiAgICAgICAgICAgIHJlc291cmNlQnVpbGRlcigpLmFkZE1vZGVsKGJyYW5jaElkLCBjb21taXRJZCkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFtWaWV3ZXJIYXNoU3RhdGVLZXlzLkVtYmVkT3B0aW9uc106IEpTT04uc3RyaW5naWZ5KGVtYmVkT3B0aW9ucylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2dnZXIud2FybihcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZXJyb3JzLFxyXG4gICAgICAgICAgICBzdHJlYW1JZCxcclxuICAgICAgICAgICAgY29tbWl0SWRcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIkNvdWxkbid0IHJlc29sdmUgbGVnYWN5IGNvbW1pdCBlbWJlZCByZWRpcmVjdCBtZXRhZGF0YVwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKHByb2plY3RSb3V0ZShzdHJlYW1JZCkpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoYnJhbmNoTmFtZT8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3JzIH0gPSBhd2FpdCBhcG9sbG9cclxuICAgICAgICAucXVlcnkoe1xyXG4gICAgICAgICAgcXVlcnk6IGxlZ2FjeUJyYW5jaE1ldGFkYXRhUXVlcnksXHJcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICAgICAgc3RyZWFtSWQsXHJcbiAgICAgICAgICAgIGJyYW5jaE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChicmFuY2hOYW1lKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGNvbnZlcnRUaHJvd0ludG9GZXRjaFJlc3VsdClcclxuXHJcbiAgICAgIGNvbnN0IGJyYW5jaElkID0gZGF0YT8ucHJvamVjdD8ubW9kZWxCeU5hbWU/LmlkXHJcbiAgICAgIGlmIChicmFuY2hJZCkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKFxyXG4gICAgICAgICAgbW9kZWxSb3V0ZShzdHJlYW1JZCwgcmVzb3VyY2VCdWlsZGVyKCkuYWRkTW9kZWwoYnJhbmNoSWQpLnRvU3RyaW5nKCksIHtcclxuICAgICAgICAgICAgW1ZpZXdlckhhc2hTdGF0ZUtleXMuRW1iZWRPcHRpb25zXTogSlNPTi5zdHJpbmdpZnkoZW1iZWRPcHRpb25zKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgc3RyZWFtSWQsXHJcbiAgICAgICAgICAgIGJyYW5jaE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChicmFuY2hOYW1lKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiQ291bGRuJ3QgcmVzb2x2ZSBsZWdhY3kgYnJhbmNoIGVtYmVkIHJlZGlyZWN0IG1ldGFkYXRhXCJcclxuICAgICAgICApXHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRlVG8ocHJvamVjdFJvdXRlKHN0cmVhbUlkKSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvcnMgfSA9IGF3YWl0IGFwb2xsb1xyXG4gICAgICAgIC5xdWVyeSh7IHF1ZXJ5OiBsZWdhY3lWaWV3ZXJTdHJlYW1NZXRhZGF0YVF1ZXJ5LCB2YXJpYWJsZXM6IHsgc3RyZWFtSWQgfSB9KVxyXG4gICAgICAgIC5jYXRjaChjb252ZXJ0VGhyb3dJbnRvRmV0Y2hSZXN1bHQpXHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZGF0YT8ucHJvamVjdD8udmVyc2lvbnM/Lml0ZW1zPy5sZW5ndGggJiZcclxuICAgICAgICBkYXRhLnByb2plY3QudmVyc2lvbnMuaXRlbXNbMF0ubW9kZWxcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRlVG8oXHJcbiAgICAgICAgICBtb2RlbFJvdXRlKFxyXG4gICAgICAgICAgICBkYXRhLnByb2plY3QuaWQsXHJcbiAgICAgICAgICAgIFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGUucmVzb3VyY2VCdWlsZGVyKClcclxuICAgICAgICAgICAgICAuYWRkTW9kZWwoXHJcbiAgICAgICAgICAgICAgICBkYXRhLnByb2plY3QudmVyc2lvbnMuaXRlbXNbMF0ubW9kZWwuaWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhLnByb2plY3QudmVyc2lvbnMuaXRlbXNbMF0uaWRcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBbVmlld2VySGFzaFN0YXRlS2V5cy5FbWJlZE9wdGlvbnNdOiBKU09OLnN0cmluZ2lmeShlbWJlZE9wdGlvbnMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgc3RyZWFtSWRcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIkNvdWxkbid0IHJlc29sdmUgbGVnYWN5IHN0cmVhbSBlbWJlZCByZWRpcmVjdCBtZXRhZGF0YVwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKHByb2plY3RSb3V0ZShzdHJlYW1JZCkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IFssIGJyYW5jaFN0cmVhbUlkLCBicmFuY2hOYW1lXSA9IHBhdGgubWF0Y2goc3RyZWFtQnJhbmNoUGFnZVJneCkgfHwgW11cclxuICBpZiAoYnJhbmNoU3RyZWFtSWQgJiYgYnJhbmNoTmFtZSkge1xyXG4gICAgY29uc3QgeyBkYXRhLCBlcnJvcnMgfSA9IGF3YWl0IGFwb2xsb1xyXG4gICAgICAucXVlcnkoe1xyXG4gICAgICAgIHF1ZXJ5OiBsZWdhY3lCcmFuY2hNZXRhZGF0YVF1ZXJ5LFxyXG4gICAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgICAgc3RyZWFtSWQ6IGJyYW5jaFN0cmVhbUlkLFxyXG4gICAgICAgICAgYnJhbmNoTmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5jaE5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goY29udmVydFRocm93SW50b0ZldGNoUmVzdWx0KVxyXG4gICAgY29uc3QgYnJhbmNoSWQgPSBkYXRhPy5wcm9qZWN0Py5tb2RlbEJ5TmFtZT8uaWRcclxuXHJcbiAgICBpZiAoYnJhbmNoSWQpIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRlVG8obW9kZWxWZXJzaW9uc1JvdXRlKGJyYW5jaFN0cmVhbUlkLCBicmFuY2hJZCkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2dnZXIud2FybihcclxuICAgICAgICB7XHJcbiAgICAgICAgICBlcnJvcnMsXHJcbiAgICAgICAgICBzdHJlYW1JZDogYnJhbmNoU3RyZWFtSWQsXHJcbiAgICAgICAgICBicmFuY2hOYW1lOiBkZWNvZGVVUklDb21wb25lbnQoYnJhbmNoTmFtZSlcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiQ291bGRuJ3QgcmVzb2x2ZSBsZWdhY3kgYnJhbmNoIHJlZGlyZWN0IG1ldGFkYXRhXCJcclxuICAgICAgKVxyXG5cclxuICAgICAgcmV0dXJuIG5hdmlnYXRlVG8ocHJvamVjdFJvdXRlKGJyYW5jaFN0cmVhbUlkKSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IFssIHN0cmVhbUlkXSA9IHBhdGgubWF0Y2goc3RyZWFtUGFnZVJneCkgfHwgW11cclxuICBpZiAoc3RyZWFtSWQpIHtcclxuICAgIHJldHVybiBuYXZpZ2F0ZVRvKHByb2plY3RSb3V0ZShzdHJlYW1JZCkpXHJcbiAgfVxyXG5cclxuICBpZiAoYWRtaW5QYWdlUmd4LnRlc3QocGF0aCkpIHtcclxuICAgIHJldHVybiBuYXZpZ2F0ZVRvKHNlcnZlck1hbmFnZW1lbnRSb3V0ZSlcclxuICB9XHJcbn0pXHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9taWRkbGV3YXJlLzAwMi1yZWRpcmVjdHMuZ2xvYmFsLnRzIn0= |