__vite_ssr_exportName__("EnvironmentNotRegisteredError", () => { try { return EnvironmentNotRegisteredError } catch {} });
__vite_ssr_exportName__("PlatformEnvironmentRemovalError", () => { try { return PlatformEnvironmentRemovalError } catch {} });
__vite_ssr_exportName__("EnvironmentRegistry", () => { try { return EnvironmentRegistry } catch {} });
__vite_ssr_exportName__("make", () => { try { return make } catch {} });
__vite_ssr_exportName__("layer", () => { try { return layer } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/index.ts", {"importedNames":["EnvironmentId"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Context.js");
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Effect.js");
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Equal.js");
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Exit.js");
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Layer.js");
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Option.js");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Ref.js");
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Schema.js");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Scope.js");
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Semaphore.js");
const __vite_ssr_import_11__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Stream.js");
const __vite_ssr_import_12__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/SubscriptionRef.js");
const __vite_ssr_import_13__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/platform/capabilities.ts");
const __vite_ssr_import_14__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/catalog.ts", {"importedNames":["SshConnectionProfile","connectionRegistrationCatalogEntry"]});
const __vite_ssr_import_15__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/credentialStore.ts");
const __vite_ssr_import_16__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/profileStore.ts");
const __vite_ssr_import_17__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/connectivity.ts");
const __vite_ssr_import_18__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/model.ts", {"importedNames":["ConnectionBlockedError"]});
const __vite_ssr_import_19__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/platform/persistence.ts");
const __vite_ssr_import_20__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/supervisor.ts");
const __vite_ssr_import_21__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/driver.ts");
const __vite_ssr_import_22__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/wakeups.ts");
const __vite_ssr_import_23__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/pullRequestRoutingPermissions.ts", {"importedNames":["PullRequestRoutingPermissions","pullRequestRoutingConnectionKey"]});
const __vite_ssr_import_24__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/routes.ts", {"importedNames":["RELAY_ROUTE_ID","connectionRouteId","connectionRoutes","credentialConnectionId","entryWithRoutes","findRouteToSameAddress","hasSavedBearerRoute","mergeLearnedRoutes","routesAfterRemoving","upsertRoute"]});

























const isSshConnectionProfile = __vite_ssr_import_8__.is((0,__vite_ssr_import_14__.SshConnectionProfile));
function unsupportedState(entry) {
	return {
		...entry.unsupportedReason === undefined ? {} : { unsupportedReason: entry.unsupportedReason },
		...entry.serverUpdateRequired === true ? { serverUpdateRequired: true } : {}
	};
}
class EnvironmentNotRegisteredError extends __vite_ssr_import_8__.TaggedError()("EnvironmentNotRegisteredError", { environmentId: __vite_ssr_import_0__.EnvironmentId }) {
	get message() {
		return `Environment ${this.environmentId} is not registered.`;
	}
};
class PlatformEnvironmentRemovalError extends __vite_ssr_import_8__.TaggedError()("PlatformEnvironmentRemovalError", { environmentId: __vite_ssr_import_0__.EnvironmentId }) {
	get message() {
		return `Platform-managed environment ${this.environmentId} cannot be removed.`;
	}
};
class EnvironmentRegistry extends __vite_ssr_import_1__.Service()("@t3tools/client-runtime/connection/registry/EnvironmentRegistry") {};
/** @public */
const make = __vite_ssr_import_2__.gen(function* () {
	const registryScope = yield* __vite_ssr_import_9__.Scope;
	const storage = yield* __vite_ssr_import_19__.ConnectionTargetStore;
	const registrations = yield* __vite_ssr_import_19__.ConnectionRegistrationStore;
	const cache = yield* __vite_ssr_import_19__.EnvironmentCacheStore;
	const ownedDataCleanup = yield* __vite_ssr_import_19__.EnvironmentOwnedDataCleanup;
	const profiles = yield* __vite_ssr_import_16__.ConnectionProfileStore;
	const credentials = yield* __vite_ssr_import_15__.ConnectionCredentialStore;
	const pullRequestRoutingPermissions = yield* __vite_ssr_import_23__.PullRequestRoutingPermissions;
	const connectivity = yield* __vite_ssr_import_17__.Connectivity;
	const driver = yield* __vite_ssr_import_21__.ConnectionDriver;
	const wakeups = yield* __vite_ssr_import_22__.ConnectionWakeups;
	const ssh = yield* __vite_ssr_import_13__.SshEnvironmentGateway;
	const persistedTargets = yield* storage.list;
	const disabledEnvironmentIds = new Set(yield* storage.listDisabled);
	const loadRoute = __vite_ssr_import_2__.fn("EnvironmentRegistry.loadRoute")(function* (target) {
		const profile = target._tag === "BearerConnectionTarget" || target._tag === "SshConnectionTarget" ? yield* profiles.get(target.connectionId) : __vite_ssr_import_6__.none();
		return {
			target,
			profile
		};
	});
	const persistedRoutesByEnvironment = new Map();
	for (const target of persistedTargets) {
		const routes = persistedRoutesByEnvironment.get(target.environmentId) ?? [];
		routes.push(target);
		persistedRoutesByEnvironment.set(target.environmentId, routes);
	};
	const initialEntries = new Map(yield* __vite_ssr_import_2__.forEach(persistedRoutesByEnvironment, __vite_ssr_import_2__.fn("EnvironmentRegistry.loadCatalogEntry")(function* ([environmentId, targets]) {
		const loaded = yield* __vite_ssr_import_2__.forEach(targets, loadRoute, { concurrency: "unbounded" });
		const seen = new Set();
		const usable = loaded.filter((route) => {
			const id = (0,__vite_ssr_import_24__.connectionRouteId)(route.target);
			if (seen.has(id)) return false;
			seen.add(id);
			return !(id.startsWith("learned:") && __vite_ssr_import_6__.isNone(route.profile));
		});
		const routes = usable.length > 0 ? usable : loaded.slice(0, 1);
		const first = routes[0];
		return [environmentId, (0,__vite_ssr_import_24__.entryWithRoutes)({
			target: first.target,
			profile: first.profile,
			enabled: !disabledEnvironmentIds.has(environmentId)
		}, routes)];
	}), { concurrency: "unbounded" }));
	const entries = yield* __vite_ssr_import_12__.make(initialEntries);
	const networkStatus = yield* __vite_ssr_import_12__.make(yield* connectivity.status);
	const serviceScopes = yield* __vite_ssr_import_12__.make(new Map());
	const platformEnvironmentIds = yield* __vite_ssr_import_7__.make(new Set());
	const persistedEnvironmentIds = yield* __vite_ssr_import_7__.make(new Set(persistedRoutesByEnvironment.keys()));
	const leaseLocks = yield* __vite_ssr_import_7__.make(new Map());
	const leaseLocksGuard = yield* __vite_ssr_import_10__.make(1);
	const started = yield* __vite_ssr_import_7__.make(false);
	const withLeaseLock = (environmentId, effect) => __vite_ssr_import_2__.acquireUseRelease(leaseLocksGuard.withPermits(1)(__vite_ssr_import_2__.gen(function* () {
		const current = yield* __vite_ssr_import_7__.get(leaseLocks);
		const existing = current.get(environmentId);
		if (existing !== undefined) {
			yield* __vite_ssr_import_7__.set(leaseLocks, new Map(current).set(environmentId, {
				semaphore: existing.semaphore,
				users: existing.users + 1
			}));
			return existing.semaphore;
		};
		const semaphore = yield* __vite_ssr_import_10__.make(1);
		yield* __vite_ssr_import_7__.set(leaseLocks, new Map(current).set(environmentId, {
			semaphore,
			users: 1
		}));
		return semaphore;
	})), (semaphore) => semaphore.withPermits(1)(effect), (semaphore) => leaseLocksGuard.withPermits(1)(__vite_ssr_import_7__.update(leaseLocks, (current) => {
		const existing = current.get(environmentId);
		if (existing === undefined || existing.semaphore !== semaphore) {
			return current;
		};
		const next = new Map(current);
		if (existing.users === 1) {
			next.delete(environmentId);
		} else {
			next.set(environmentId, {
				semaphore,
				users: existing.users - 1
			});
		};
		return next;
	}))).pipe(__vite_ssr_import_2__.withSpan("EnvironmentRegistry.withLeaseLock"));
	const getEntry = __vite_ssr_import_2__.fn("EnvironmentRegistry.getEntry")(function* (environmentId) {
		const entry = (yield* __vite_ssr_import_12__.get(entries)).get(environmentId);
		if (entry === undefined) {
			return yield* new EnvironmentNotRegisteredError({ environmentId });
		};
		return entry;
	});
	const closeServiceScope = __vite_ssr_import_2__.fn("EnvironmentRegistry.closeServiceScope")(function* (environmentId) {
		const current = yield* __vite_ssr_import_12__.get(serviceScopes);
		const lease = current.get(environmentId);
		if (lease === undefined) {
			return;
		};
		const next = new Map(current);
		next.delete(environmentId);
		yield* __vite_ssr_import_12__.set(serviceScopes, next);
		yield* __vite_ssr_import_9__.close(lease.scope, __vite_ssr_import_4__.void);
	});
	const createServiceScope = __vite_ssr_import_2__.fn("EnvironmentRegistry.createServiceScope")((entry) => __vite_ssr_import_2__.uninterruptible(__vite_ssr_import_2__.gen(function* () {
		const environmentId = entry.target.environmentId;
		const scope = yield* __vite_ssr_import_9__.fork(registryScope);
		const supervisor = yield* __vite_ssr_import_20__.make(entry, {
			// Seed the intent to avoid publishing a false switched-off state
			// before an enabled, compatible environment starts connecting.
			initiallyDesired: entry.enabled && entry.unsupportedReason === undefined,
			learnRoutes: (input) => learnRoutes({
				environmentId,
				...input
			})
		}).pipe(__vite_ssr_import_2__.provideService(__vite_ssr_import_17__.Connectivity, connectivity), __vite_ssr_import_2__.provideService(__vite_ssr_import_21__.ConnectionDriver, driver), __vite_ssr_import_2__.provideService(__vite_ssr_import_22__.ConnectionWakeups, wakeups), __vite_ssr_import_9__.provide(scope), __vite_ssr_import_2__.onError(() => __vite_ssr_import_9__.close(scope, __vite_ssr_import_4__.void)));
		yield* __vite_ssr_import_12__.update(serviceScopes, (current) => {
			const next = new Map(current);
			next.set(environmentId, {
				entry,
				supervisor,
				scope
			});
			return next;
		});
		yield* __vite_ssr_import_12__.changes(supervisor.state).pipe(__vite_ssr_import_11__.runForEach((state) => state.phase === "blocked" && state.lastFailure?.reason === "unsupported" ? setCompatibility(environmentId, state.lastFailure) : __vite_ssr_import_2__.void), __vite_ssr_import_2__.forkIn(scope));
		return supervisor;
	})));
	const acquireSupervisor = __vite_ssr_import_2__.fn("EnvironmentRegistry.acquireSupervisor")(function* (environmentId) {
		return yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = yield* getEntry(environmentId);
			const existing = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(environmentId);
			if (existing !== undefined) {
				if (__vite_ssr_import_3__.equals(existing.entry, entry)) {
					return existing.supervisor;
				};
				yield* closeServiceScope(environmentId);
			};
			return yield* createServiceScope(entry);
		}));
	});
	const run = __vite_ssr_import_2__.fn("EnvironmentRegistry.run")(function* (environmentId, effect) {
		const supervisor = yield* acquireSupervisor(environmentId);
		return yield* __vite_ssr_import_2__.provideService(effect, __vite_ssr_import_20__.EnvironmentSupervisor, supervisor);
	});
	const runStream = (environmentId, stream) => __vite_ssr_import_11__.unwrap(acquireSupervisor(environmentId).pipe(__vite_ssr_import_2__.map((supervisor) => __vite_ssr_import_11__.provideService(stream, __vite_ssr_import_20__.EnvironmentSupervisor, supervisor))));
	const followStream = (environmentId, stream) => __vite_ssr_import_11__.concat(__vite_ssr_import_11__.fromEffect(__vite_ssr_import_12__.get(entries)), __vite_ssr_import_12__.changes(entries)).pipe(__vite_ssr_import_11__.map((current) => __vite_ssr_import_6__.fromUndefinedOr(current.get(environmentId))), __vite_ssr_import_11__.changesWith((previous, current) => __vite_ssr_import_6__.getOrNull(previous) === __vite_ssr_import_6__.getOrNull(current)), __vite_ssr_import_11__.switchMap(__vite_ssr_import_6__.match({
		onNone: () => __vite_ssr_import_11__.empty,
		onSome: () => __vite_ssr_import_11__.unwrap(acquireSupervisor(environmentId).pipe(__vite_ssr_import_2__.match({
			onFailure: () => __vite_ssr_import_11__.empty,
			onSuccess: (supervisor) => __vite_ssr_import_11__.provideService(stream, __vite_ssr_import_20__.EnvironmentSupervisor, supervisor)
		})))
	})));
	const start = __vite_ssr_import_2__.gen(function* () {
		if (yield* __vite_ssr_import_7__.getAndSet(started, true)) {
			return;
		};
		yield* __vite_ssr_import_2__.forEach(persistedRoutesByEnvironment.keys(), (environmentId) => acquireSupervisor(environmentId).pipe(__vite_ssr_import_2__.catchTags({ EnvironmentNotRegisteredError: () => __vite_ssr_import_2__.void })), {
			concurrency: "unbounded",
			discard: true
		});
	}).pipe(__vite_ssr_import_2__.withSpan("EnvironmentRegistry.start"));
	const installEntryLocked = __vite_ssr_import_2__.fn("EnvironmentRegistry.installEntryLocked")(function* (entry, options) {
		const target = entry.target;
		const previous = (yield* __vite_ssr_import_12__.get(entries)).get(target.environmentId);
		const existingScope = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(target.environmentId);
		if (options?.retainEquivalentRuntime === true && previous !== undefined && __vite_ssr_import_3__.equals(previous, entry) && existingScope !== undefined && __vite_ssr_import_3__.equals(existingScope.entry, entry)) {
			return;
		};
		yield* closeServiceScope(target.environmentId);
		yield* __vite_ssr_import_12__.update(entries, (current) => {
			const next = new Map(current);
			next.set(target.environmentId, entry);
			return next;
		});
		yield* createServiceScope(entry);
	});
	const forgetRoutingTrust = (environmentId, operation) => pullRequestRoutingPermissions.forget(environmentId).pipe(__vite_ssr_import_2__.mapError((error) => new __vite_ssr_import_19__.ConnectionPersistenceError({
		operation,
		message: error.message
	})));
	const persistedRoutes = (entry) => (0,__vite_ssr_import_24__.connectionRoutes)(entry).map((route) => route.target);
	/**
	* Pull request routing trust and an unsupported verdict both belong to the saved addresses: a changed set may
	* reach a different server, so both are dropped and the next connection decides.
	*/
	const withRoutes = (previous, routes) => {
		const next = (0,__vite_ssr_import_24__.entryWithRoutes)(previous, routes);
		if ((0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(previous) === (0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(next)) {
			return {
				entry: next,
				addressesChanged: false
			};
		};
		const { unsupportedReason: _reason, serverUpdateRequired: _update, ...rest } = next;
		return {
			entry: rest,
			addressesChanged: true
		};
	};
	const register = __vite_ssr_import_2__.fn("EnvironmentRegistry.register")(function* (registration) {
		const registered = (0,__vite_ssr_import_14__.connectionRegistrationCatalogEntry)(registration);
		const environmentId = registered.target.environmentId;
		return yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			if ((yield* __vite_ssr_import_7__.get(platformEnvironmentIds)).has(environmentId)) {
				return false;
			};
			const previous = (yield* __vite_ssr_import_12__.get(entries)).get(environmentId);
			let entry = registered;
			if (previous !== undefined) {
				const route = {
					target: registered.target,
					profile: registered.profile
				};
				const existing = (0,__vite_ssr_import_24__.connectionRoutes)(previous);
				const sameAddress = (0,__vite_ssr_import_24__.findRouteToSameAddress)(existing, route);
				const routes = existing.filter((existing) => existing !== sameAddress || (0,__vite_ssr_import_24__.connectionRouteId)(existing.target) === (0,__vite_ssr_import_24__.connectionRouteId)(route.target));
				const next = withRoutes(previous, (0,__vite_ssr_import_24__.upsertRoute)(routes, route));
				if (next.addressesChanged) {
					yield* forgetRoutingTrust(environmentId, "register-connection");
				};
				entry = next.entry;
			};
			yield* registrations.register(registration, persistedRoutes(entry));
			yield* __vite_ssr_import_7__.update(persistedEnvironmentIds, (current) => new Set(current).add(environmentId));
			yield* installEntryLocked(entry);
			return true;
		}));
	});
	const replaceRoutesLocked = __vite_ssr_import_2__.fn("EnvironmentRegistry.replaceRoutesLocked")(function* (previous, routes) {
		const environmentId = previous.target.environmentId;
		const next = withRoutes(previous, routes);
		if (next.addressesChanged) {
			yield* forgetRoutingTrust(environmentId, "set-connection-routes");
		};
		yield* registrations.setRoutes(environmentId, persistedRoutes(next.entry));
		yield* installEntryLocked(next.entry);
	});
	const userEntry = __vite_ssr_import_2__.fn("EnvironmentRegistry.userEntry")(function* (environmentId) {
		if ((yield* __vite_ssr_import_7__.get(platformEnvironmentIds)).has(environmentId)) {
			return yield* new PlatformEnvironmentRemovalError({ environmentId });
		};
		return yield* getEntry(environmentId);
	});
	const installPlatformRegistration = __vite_ssr_import_2__.fn("EnvironmentRegistry.installPlatformRegistration")(function* (registration) {
		const registered = (0,__vite_ssr_import_14__.connectionRegistrationCatalogEntry)(registration);
		const target = registered.target;
		yield* withLeaseLock(target.environmentId, __vite_ssr_import_2__.gen(function* () {
			const previous = (yield* __vite_ssr_import_12__.get(entries)).get(target.environmentId);
			const entry = previous?.unsupportedReason !== undefined && (0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(previous) === (0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(registered) ? {
				...registered,
				...unsupportedState(previous)
			} : registered;
			const persisted = (yield* __vite_ssr_import_7__.get(persistedEnvironmentIds)).has(target.environmentId);
			if (persisted || previous !== undefined && (0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(previous) !== (0,__vite_ssr_import_23__.pullRequestRoutingConnectionKey)(entry)) {
				const revoked = yield* pullRequestRoutingPermissions.forget(target.environmentId).pipe(__vite_ssr_import_2__.tapError((error) => __vite_ssr_import_2__.logWarning("Could not clear pull request routing permission for a platform environment.", {
					environmentId: target.environmentId,
					error
				})), __vite_ssr_import_2__.exit);
				if (__vite_ssr_import_4__.isFailure(revoked)) return;
			};
			yield* __vite_ssr_import_7__.update(platformEnvironmentIds, (current) => {
				const next = new Set(current);
				next.add(target.environmentId);
				return next;
			});
			// Secondary desktop-local backends (e.g. a parallel WSL backend) live
			// on their own loopback origin, so they authenticate with a bearer
			// token instead of the primary's same-origin cookie. Stash it where
			// the resolver's bearer broker looks it up.
			let bearerReplaced = false;
			if (registration._tag === "BearerConnectionRegistration") {
				const stored = yield* credentials.get(registration.target.connectionId).pipe(__vite_ssr_import_2__.orElseSucceed(() => __vite_ssr_import_6__.none()));
				const changed = __vite_ssr_import_6__.isSome(stored) && !__vite_ssr_import_3__.equals(stored.value, registration.credential);
				// Only a bearer that was actually stored can be retried with; a
				// failed write leaves the rejected one in place.
				bearerReplaced = yield* credentials.put(registration.target.connectionId, registration.credential).pipe(__vite_ssr_import_2__.as(changed), __vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not store the platform bearer credential.", {
					environmentId: target.environmentId,
					error
				}).pipe(__vite_ssr_import_2__.as(false))));
			};
			if (persisted) {
				yield* registrations.remove(target.environmentId).pipe(__vite_ssr_import_2__.tap(() => __vite_ssr_import_7__.update(persistedEnvironmentIds, (current) => {
					const next = new Set(current);
					next.delete(target.environmentId);
					return next;
				})), __vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not remove a persisted registration shadowed by a platform environment.", {
					environmentId: target.environmentId,
					error
				})));
			};
			yield* installEntryLocked(entry, { retainEquivalentRuntime: true });
			if (bearerReplaced && registration._tag === "BearerConnectionRegistration") {
				const scope = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(target.environmentId);
				if (scope !== undefined) {
					const state = yield* __vite_ssr_import_12__.get(scope.supervisor.state);
					if (state.phase === "connecting" || state.phase === "backoff" || state.phase === "blocked" && state.lastFailure?._tag === "ConnectionBlockedError" && state.lastFailure.reason === "authentication") {
						yield* scope.supervisor.retryNow;
					} else if (state.phase === "connected") {
						const token = registration.credential.token;
						yield* __vite_ssr_import_12__.updateSome(scope.supervisor.prepared, (current) => __vite_ssr_import_6__.isSome(current) && current.value.target._tag === "BearerConnectionTarget" && (0,__vite_ssr_import_24__.credentialConnectionId)(current.value.target.connectionId) === registration.target.connectionId && current.value.httpAuthorization?._tag === "Bearer" && current.value.httpAuthorization.token !== token ? __vite_ssr_import_6__.some(__vite_ssr_import_6__.some({
							...current.value,
							httpAuthorization: {
								_tag: "Bearer",
								token
							}
						})) : __vite_ssr_import_6__.none());
					}
				}
			}
		}));
	});
	const removePlatformEnvironment = __vite_ssr_import_2__.fn("EnvironmentRegistry.removePlatformEnvironment")(function* (environmentId) {
		yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = (yield* __vite_ssr_import_12__.get(entries)).get(environmentId);
			const revoked = yield* pullRequestRoutingPermissions.forget(environmentId).pipe(__vite_ssr_import_2__.tapError((error) => __vite_ssr_import_2__.logWarning("Could not clear pull request routing permission after platform removal.", {
				environmentId,
				error
			})), __vite_ssr_import_2__.exit);
			if (__vite_ssr_import_4__.isFailure(revoked)) return;
			yield* __vite_ssr_import_7__.update(platformEnvironmentIds, (current) => {
				const next = new Set(current);
				next.delete(environmentId);
				return next;
			});
			yield* closeServiceScope(environmentId);
			yield* __vite_ssr_import_12__.update(entries, (current) => {
				const next = new Map(current);
				next.delete(environmentId);
				return next;
			});
			if (entry !== undefined && entry.target._tag === "BearerConnectionTarget") {
				yield* credentials.remove(entry.target.connectionId).pipe(__vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not clear the platform bearer credential.", {
					environmentId,
					error
				})));
			};
			yield* __vite_ssr_import_2__.all([cache.clear(environmentId).pipe(__vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not clear cached environment data after removal.", {
				environmentId,
				error
			}))), ownedDataCleanup.clear(environmentId)], {
				concurrency: "unbounded",
				discard: true
			});
		}));
	});
	const registerPlatform = __vite_ssr_import_2__.fn("EnvironmentRegistry.registerPlatform")(function* (registration) {
		yield* installPlatformRegistration(registration);
	});
	const reconcilePlatform = __vite_ssr_import_2__.fn("EnvironmentRegistry.reconcilePlatform")(function* (platformRegistrations) {
		const desiredIds = new Set(platformRegistrations.map((registration) => registration.target.environmentId));
		const currentPlatformIds = yield* __vite_ssr_import_7__.get(platformEnvironmentIds);
		yield* __vite_ssr_import_2__.forEach(currentPlatformIds, (environmentId) => desiredIds.has(environmentId) ? __vite_ssr_import_2__.void : removePlatformEnvironment(environmentId), { discard: true });
		yield* __vite_ssr_import_2__.forEach(platformRegistrations, installPlatformRegistration, { discard: true });
	});
	/** Callers hold its lease lock. */
	const removeLocked = __vite_ssr_import_2__.fn("EnvironmentRegistry.removeLocked")(function* (environmentId) {
		if ((yield* __vite_ssr_import_7__.get(platformEnvironmentIds)).has(environmentId)) {
			return yield* new PlatformEnvironmentRemovalError({ environmentId });
		};
		const entry = yield* getEntry(environmentId);
		yield* pullRequestRoutingPermissions.forget(environmentId);
		yield* registrations.remove(environmentId);
		yield* __vite_ssr_import_7__.update(persistedEnvironmentIds, (current) => {
			const next = new Set(current);
			next.delete(environmentId);
			return next;
		});
		yield* closeServiceScope(environmentId);
		yield* __vite_ssr_import_12__.update(entries, (current) => {
			const next = new Map(current);
			next.delete(environmentId);
			return next;
		});
		yield* __vite_ssr_import_2__.all([cache.clear(environmentId).pipe(__vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not clear cached environment data after removal.", {
			environmentId,
			error
		}))), ownedDataCleanup.clear(environmentId)], {
			concurrency: "unbounded",
			discard: true
		});
		for (const route of (0,__vite_ssr_import_24__.connectionRoutes)(entry)) {
			const profile = __vite_ssr_import_6__.getOrNull(route.profile);
			if (profile !== null && isSshConnectionProfile(profile)) {
				yield* disconnectSsh(environmentId, profile);
			}
		}
	});
	const remove = __vite_ssr_import_2__.fn("EnvironmentRegistry.remove")(function* (environmentId) {
		return yield* withLeaseLock(environmentId, removeLocked(environmentId));
	});
	const disconnectSsh = (environmentId, profile) => ssh.disconnect(profile.target).pipe(__vite_ssr_import_2__.tapError((error) => __vite_ssr_import_2__.logWarning("Could not disconnect the managed SSH environment.", {
		environmentId,
		error
	})), __vite_ssr_import_2__.ignore);
	// Plain HTTP routes are unusable from an HTTPS page, which blocks mixed content.
	const allowInsecureRoutes = typeof globalThis.location === "undefined" || globalThis.location.protocol !== "https:";
	/**
	* Learned routes reuse the active route's credential, so they do not revoke pull request routing
	* trust the way a newly paired address does.
	*/
	const learnRoutes = __vite_ssr_import_2__.fn("EnvironmentRegistry.learnRoutes")(function* (input) {
		return yield* withLeaseLock(input.environmentId, __vite_ssr_import_2__.gen(function* () {
			if ((yield* __vite_ssr_import_7__.get(platformEnvironmentIds)).has(input.environmentId)) {
				return __vite_ssr_import_6__.none();
			};
			const entry = (yield* __vite_ssr_import_12__.get(entries)).get(input.environmentId);
			if (entry === undefined) return __vite_ssr_import_6__.none();
			const routes = (0,__vite_ssr_import_24__.mergeLearnedRoutes)({
				entry,
				activeRoute: input.activeRoute,
				reported: input.reported,
				allowInsecure: allowInsecureRoutes
			});
			if (routes === null) return __vite_ssr_import_6__.none();
			const next = (0,__vite_ssr_import_24__.entryWithRoutes)(entry, routes);
			const previousProfiles = new Map((0,__vite_ssr_import_24__.connectionRoutes)(entry).map((route) => [(0,__vite_ssr_import_24__.connectionRouteId)(route.target), __vite_ssr_import_6__.getOrNull(route.profile)]));
			for (const route of routes) {
				const profile = __vite_ssr_import_6__.getOrNull(route.profile);
				if (profile === null || previousProfiles.get((0,__vite_ssr_import_24__.connectionRouteId)(route.target)) === profile) {
					continue;
				};
				yield* profiles.put(profile);
			};
			yield* registrations.setRoutes(input.environmentId, persistedRoutes(next));
			const lease = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(input.environmentId);
			if (lease !== undefined) {
				yield* __vite_ssr_import_12__.update(serviceScopes, (current) => new Map(current).set(input.environmentId, {
					...lease,
					entry: next
				}));
			};
			yield* __vite_ssr_import_12__.update(entries, (current) => new Map(current).set(input.environmentId, next));
			return __vite_ssr_import_6__.some(next);
		})).pipe(__vite_ssr_import_2__.catch((error) => __vite_ssr_import_2__.logWarning("Could not save routes learned from the environment.", {
			environmentId: input.environmentId,
			error
		}).pipe(__vite_ssr_import_2__.as(__vite_ssr_import_6__.none()))));
	});
	const removeRoute = __vite_ssr_import_2__.fn("EnvironmentRegistry.removeRoute")(function* (environmentId, routeId) {
		// One lock for the whole decision: a route registered between "this was
		// the last route" and the removal must not be deleted with it.
		yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = yield* userEntry(environmentId);
			const routes = (0,__vite_ssr_import_24__.connectionRoutes)(entry);
			const route = routes.find((candidate) => (0,__vite_ssr_import_24__.connectionRouteId)(candidate.target) === routeId);
			if (route === undefined) return;
			const remaining = (0,__vite_ssr_import_24__.routesAfterRemoving)(routes, routeId);
			if (remaining.length === 0) return yield* removeLocked(environmentId);
			yield* replaceRoutesLocked(entry, remaining);
			const profile = __vite_ssr_import_6__.getOrNull(route.profile);
			if (profile !== null && isSshConnectionProfile(profile)) {
				yield* disconnectSsh(environmentId, profile);
			}
		}));
	});
	const reorderRoutes = __vite_ssr_import_2__.fn("EnvironmentRegistry.reorderRoutes")(function* (environmentId, routeIds) {
		yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = yield* userEntry(environmentId);
			const routes = (0,__vite_ssr_import_24__.connectionRoutes)(entry);
			const byId = new Map(routes.map((route) => [(0,__vite_ssr_import_24__.connectionRouteId)(route.target), route]));
			const reordered = routeIds.flatMap((id) => byId.get(id) ?? []);
			if (reordered.length !== routes.length || new Set(routeIds).size !== routes.length) {
				return yield* new __vite_ssr_import_18__.ConnectionBlockedError({
					reason: "configuration",
					detail: "The route order must list every saved route once."
				});
			};
			if (reordered.every((route, index) => route === routes[index])) return;
			yield* replaceRoutesLocked(entry, reordered);
		}));
	});
	const removeRelayEnvironments = __vite_ssr_import_2__.fn("EnvironmentRegistry.removeRelayEnvironments")(function* () {
		const relayEnvironmentIds = [...(yield* __vite_ssr_import_12__.get(entries)).values()].filter((entry) => (0,__vite_ssr_import_24__.connectionRoutes)(entry).some((route) => route.target._tag === "RelayConnectionTarget")).map((entry) => entry.target.environmentId);
		yield* __vite_ssr_import_2__.forEach(relayEnvironmentIds, (environmentId) => removeRoute(environmentId, (0,__vite_ssr_import_24__.RELAY_ROUTE_ID)).pipe(__vite_ssr_import_2__.catchTags({ EnvironmentNotRegisteredError: () => __vite_ssr_import_2__.void })), {
			concurrency: "unbounded",
			discard: true
		});
	});
	const retryNow = (environmentId) => acquireSupervisor(environmentId).pipe(__vite_ssr_import_2__.flatMap((supervisor) => supervisor.retryNow), __vite_ssr_import_2__.catchTags({ EnvironmentNotRegisteredError: () => __vite_ssr_import_2__.void }), __vite_ssr_import_2__.withSpan("EnvironmentRegistry.retryNow"));
	const setEnabled = __vite_ssr_import_2__.fn("EnvironmentRegistry.setEnabled")(function* (environmentId, enabled) {
		yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = yield* getEntry(environmentId);
			const retryUnsupported = enabled && entry.unsupportedReason !== undefined;
			if (retryUnsupported && !(0,__vite_ssr_import_24__.hasSavedBearerRoute)(entry)) {
				return yield* new __vite_ssr_import_18__.ConnectionBlockedError({
					reason: "unsupported",
					detail: entry.unsupportedReason
				});
			};
			if (entry.enabled === enabled && !retryUnsupported) {
				return;
			};
			if (!(yield* __vite_ssr_import_7__.get(platformEnvironmentIds)).has(environmentId)) {
				yield* registrations.setEnabled(environmentId, enabled);
			};
			// A cached rejection can outlive a server update.
			const { unsupportedReason: _reason, serverUpdateRequired: _update, ...rest } = entry;
			const next = {
				...retryUnsupported ? rest : entry,
				enabled
			};
			// Update the lease in place so the supervisor keeps its generation and
			// durable streams; `installEntryLocked` would tear it down instead.
			const lease = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(environmentId);
			if (lease !== undefined) {
				yield* __vite_ssr_import_12__.update(serviceScopes, (current) => {
					const nextScopes = new Map(current);
					nextScopes.set(environmentId, {
						...lease,
						entry: next
					});
					return nextScopes;
				});
			};
			yield* __vite_ssr_import_12__.update(entries, (current) => {
				const nextEntries = new Map(current);
				nextEntries.set(environmentId, next);
				return nextEntries;
			});
			if (lease !== undefined) {
				yield* enabled ? lease.supervisor.connect : lease.supervisor.disconnect;
			} else if (enabled) {
				yield* createServiceScope(next);
			};
			// The supervisor only owns the RPC session. A managed SSH backend and
			// its tunnel outlive it, so switching off tears those down as well.
			if (!enabled) {
				for (const route of (0,__vite_ssr_import_24__.connectionRoutes)(entry)) {
					const profile = __vite_ssr_import_6__.getOrNull(route.profile);
					if (profile !== null && isSshConnectionProfile(profile)) {
						yield* disconnectSsh(environmentId, profile);
					}
				}
			}
		}));
	});
	const state = __vite_ssr_import_2__.fn("EnvironmentRegistry.state")(function* (environmentId) {
		const supervisor = yield* acquireSupervisor(environmentId);
		return yield* __vite_ssr_import_12__.get(supervisor.state);
	});
	const stateChanges = (environmentId) => followStream(environmentId, __vite_ssr_import_11__.unwrap(__vite_ssr_import_20__.EnvironmentSupervisor.pipe(__vite_ssr_import_2__.map((supervisor) => __vite_ssr_import_12__.changes(supervisor.state)))));
	yield* __vite_ssr_import_2__.addFinalizer(() => __vite_ssr_import_12__.get(serviceScopes).pipe(__vite_ssr_import_2__.flatMap((current) => __vite_ssr_import_2__.forEach(current.values(), (lease) => __vite_ssr_import_9__.close(lease.scope, __vite_ssr_import_4__.void), {
		concurrency: "unbounded",
		discard: true
	}))));
	yield* connectivity.changes.pipe(__vite_ssr_import_11__.runForEach((status) => __vite_ssr_import_12__.set(networkStatus, status)), __vite_ssr_import_2__.forkScoped);
	const setCompatibility = __vite_ssr_import_2__.fn("EnvironmentRegistry.setCompatibility")(function* (environmentId, error) {
		yield* withLeaseLock(environmentId, __vite_ssr_import_2__.gen(function* () {
			const entry = (yield* __vite_ssr_import_12__.get(entries)).get(environmentId);
			if (entry === undefined || entry.unsupportedReason === (error?.message ?? undefined) && entry.serverUpdateRequired === (error?.serverUpdateRequired ?? undefined)) return;
			const { unsupportedReason: _previousReason, serverUpdateRequired: _previousUpdateRequired, ...rest } = entry;
			// Compatibility pauses connections without changing the user's saved on/off choice.
			const next = error === null ? rest : {
				...rest,
				unsupportedReason: error.message,
				...error.serverUpdateRequired === true ? { serverUpdateRequired: true } : {}
			};
			const lease = (yield* __vite_ssr_import_12__.get(serviceScopes)).get(environmentId);
			if (lease !== undefined) {
				yield* __vite_ssr_import_12__.update(serviceScopes, (current) => new Map(current).set(environmentId, {
					...lease,
					entry: next
				}));
				if (error !== null) yield* lease.supervisor.disconnect;
				else if (next.enabled) yield* lease.supervisor.connect;
			};
			yield* __vite_ssr_import_12__.update(entries, (current) => new Map(current).set(environmentId, next));
		}));
	});
	return EnvironmentRegistry.of({
		entries,
		networkStatus,
		start,
		register,
		registerPlatform,
		reconcilePlatform,
		remove,
		removeRoute,
		reorderRoutes,
		removeRelayEnvironments,
		retryNow,
		setEnabled,
		setCompatibility,
		state,
		stateChanges,
		run,
		runStream,
		followStream
	});
});
const layer = __vite_ssr_import_5__.effect(EnvironmentRegistry, make);
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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QUksVUFBVSxNQUFNLE9BQU8sTUFBTSxXQUFXO1NBQ3ZDLElBQUksS0FBSyxTQUFTLE9BQU8sTUFBTSxXQUFXO0dBQ2pEO0dBQ0EsT0FBTyx1QkFBZ0IsT0FBTyxVQUFVLFlBQ3RDLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLGVBQWUsSUFBSSxDQUMxQztFQUNGLENBQUMsQ0FDSDtDQUNGLENBQUM7Q0FFRCxPQUFPLG9CQUFvQixHQUFHO0VBQzVCO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtDQUNGLENBQUM7QUFDSCxDQUFDO0FBRU0sTUFBTSxRQUFRLHNCQUFNLE9BQU8scUJBQXFCLElBQUkiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50SWQgfSBmcm9tIFwiQHQzdG9vbHMvY29udHJhY3RzXCI7XG5pbXBvcnQgKiBhcyBDb250ZXh0IGZyb20gXCJlZmZlY3QvQ29udGV4dFwiO1xuaW1wb3J0ICogYXMgRWZmZWN0IGZyb20gXCJlZmZlY3QvRWZmZWN0XCI7XG5pbXBvcnQgKiBhcyBFcXVhbCBmcm9tIFwiZWZmZWN0L0VxdWFsXCI7XG5pbXBvcnQgKiBhcyBFeGl0IGZyb20gXCJlZmZlY3QvRXhpdFwiO1xuaW1wb3J0ICogYXMgTGF5ZXIgZnJvbSBcImVmZmVjdC9MYXllclwiO1xuaW1wb3J0ICogYXMgT3B0aW9uIGZyb20gXCJlZmZlY3QvT3B0aW9uXCI7XG5pbXBvcnQgKiBhcyBSZWYgZnJvbSBcImVmZmVjdC9SZWZcIjtcbmltcG9ydCAqIGFzIFNjaGVtYSBmcm9tIFwiZWZmZWN0L1NjaGVtYVwiO1xuaW1wb3J0ICogYXMgU2NvcGUgZnJvbSBcImVmZmVjdC9TY29wZVwiO1xuaW1wb3J0ICogYXMgU2VtYXBob3JlIGZyb20gXCJlZmZlY3QvU2VtYXBob3JlXCI7XG5pbXBvcnQgKiBhcyBTdHJlYW0gZnJvbSBcImVmZmVjdC9TdHJlYW1cIjtcbmltcG9ydCAqIGFzIFN1YnNjcmlwdGlvblJlZiBmcm9tIFwiZWZmZWN0L1N1YnNjcmlwdGlvblJlZlwiO1xuXG5pbXBvcnQgKiBhcyBDbGllbnRDYXBhYmlsaXRpZXMgZnJvbSBcIi4uL3BsYXRmb3JtL2NhcGFiaWxpdGllcy50c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuICB0eXBlIENvbm5lY3Rpb25DcmVkZW50aWFsLFxuICB0eXBlIENvbm5lY3Rpb25Qcm9maWxlLFxuICB0eXBlIENvbm5lY3Rpb25SZWdpc3RyYXRpb24sXG4gIHR5cGUgQ29ubmVjdGlvblJvdXRlLFxuICB0eXBlIFBsYXRmb3JtQ29ubmVjdGlvblJlZ2lzdHJhdGlvbixcbiAgdHlwZSBQcmltYXJ5Q29ubmVjdGlvblJlZ2lzdHJhdGlvbixcbiAgU3NoQ29ubmVjdGlvblByb2ZpbGUsXG4gIGNvbm5lY3Rpb25SZWdpc3RyYXRpb25DYXRhbG9nRW50cnksXG59IGZyb20gXCIuL2NhdGFsb2cudHNcIjtcbmltcG9ydCAqIGFzIENvbm5lY3Rpb25DcmVkZW50aWFsU3RvcmUgZnJvbSBcIi4vY3JlZGVudGlhbFN0b3JlLnRzXCI7XG5pbXBvcnQgKiBhcyBDb25uZWN0aW9uUHJvZmlsZVN0b3JlIGZyb20gXCIuL3Byb2ZpbGVTdG9yZS50c1wiO1xuaW1wb3J0ICogYXMgQ29ubmVjdGl2aXR5IGZyb20gXCIuL2Nvbm5lY3Rpdml0eS50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb25uZWN0aW9uQXR0ZW1wdEVycm9yLFxuICBDb25uZWN0aW9uVGFyZ2V0LFxuICBOZXR3b3JrU3RhdHVzLFxuICBQZXJzaXN0ZWRDb25uZWN0aW9uVGFyZ2V0LFxuICBTdXBlcnZpc29yQ29ubmVjdGlvblN0YXRlLFxufSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJsb2NrZWRFcnJvciB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgKiBhcyBQZXJzaXN0ZW5jZSBmcm9tIFwiLi4vcGxhdGZvcm0vcGVyc2lzdGVuY2UudHNcIjtcbmltcG9ydCAqIGFzIEVudmlyb25tZW50U3VwZXJ2aXNvciBmcm9tIFwiLi9zdXBlcnZpc29yLnRzXCI7XG5pbXBvcnQgKiBhcyBDb25uZWN0aW9uRHJpdmVyIGZyb20gXCIuL2RyaXZlci50c1wiO1xuaW1wb3J0ICogYXMgQ29ubmVjdGlvbldha2V1cHMgZnJvbSBcIi4vd2FrZXVwcy50c1wiO1xuaW1wb3J0IHtcbiAgUHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnMsXG4gIHB1bGxSZXF1ZXN0Um91dGluZ0Nvbm5lY3Rpb25LZXksXG59IGZyb20gXCIuL3B1bGxSZXF1ZXN0Um91dGluZ1Blcm1pc3Npb25zLnRzXCI7XG5pbXBvcnQge1xuICBSRUxBWV9ST1VURV9JRCxcbiAgY29ubmVjdGlvblJvdXRlSWQsXG4gIGNvbm5lY3Rpb25Sb3V0ZXMsXG4gIGNyZWRlbnRpYWxDb25uZWN0aW9uSWQsXG4gIGVudHJ5V2l0aFJvdXRlcyxcbiAgZmluZFJvdXRlVG9TYW1lQWRkcmVzcyxcbiAgaGFzU2F2ZWRCZWFyZXJSb3V0ZSxcbiAgbWVyZ2VMZWFybmVkUm91dGVzLFxuICByb3V0ZXNBZnRlclJlbW92aW5nLFxuICB1cHNlcnRSb3V0ZSxcbiAgdHlwZSBSZXBvcnRlZEVuZHBvaW50LFxufSBmcm9tIFwiLi9yb3V0ZXMudHNcIjtcblxuY29uc3QgaXNTc2hDb25uZWN0aW9uUHJvZmlsZSA9IFNjaGVtYS5pcyhTc2hDb25uZWN0aW9uUHJvZmlsZSk7XG5cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkU3RhdGUoXG4gIGVudHJ5OiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuKTogUGljazxDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LCBcInVuc3VwcG9ydGVkUmVhc29uXCIgfCBcInNlcnZlclVwZGF0ZVJlcXVpcmVkXCI+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZW50cnkudW5zdXBwb3J0ZWRSZWFzb24gPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7IHVuc3VwcG9ydGVkUmVhc29uOiBlbnRyeS51bnN1cHBvcnRlZFJlYXNvbiB9KSxcbiAgICAuLi4oZW50cnkuc2VydmVyVXBkYXRlUmVxdWlyZWQgPT09IHRydWUgPyB7IHNlcnZlclVwZGF0ZVJlcXVpcmVkOiB0cnVlIH0gOiB7fSksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvcj4oKShcbiAgXCJFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvclwiLFxuICB7XG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRW52aXJvbm1lbnQgJHt0aGlzLmVudmlyb25tZW50SWR9IGlzIG5vdCByZWdpc3RlcmVkLmA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtRW52aXJvbm1lbnRSZW1vdmFsRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UGxhdGZvcm1FbnZpcm9ubWVudFJlbW92YWxFcnJvcj4oKShcbiAgXCJQbGF0Zm9ybUVudmlyb25tZW50UmVtb3ZhbEVycm9yXCIsXG4gIHtcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQbGF0Zm9ybS1tYW5hZ2VkIGVudmlyb25tZW50ICR7dGhpcy5lbnZpcm9ubWVudElkfSBjYW5ub3QgYmUgcmVtb3ZlZC5gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudFJlZ2lzdHJ5IGV4dGVuZHMgQ29udGV4dC5TZXJ2aWNlPFxuICBFbnZpcm9ubWVudFJlZ2lzdHJ5LFxuICB7XG4gICAgcmVhZG9ubHkgZW50cmllczogU3Vic2NyaXB0aW9uUmVmLlN1YnNjcmlwdGlvblJlZjxcbiAgICAgIFJlYWRvbmx5TWFwPEVudmlyb25tZW50SWQsIENvbm5lY3Rpb25DYXRhbG9nRW50cnk+XG4gICAgPjtcbiAgICByZWFkb25seSBuZXR3b3JrU3RhdHVzOiBTdWJzY3JpcHRpb25SZWYuU3Vic2NyaXB0aW9uUmVmPE5ldHdvcmtTdGF0dXM+O1xuICAgIHJlYWRvbmx5IHN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFN1Y2NlZWRzIHdpdGggYGZhbHNlYCBhbmQgY2hhbmdlcyBub3RoaW5nIHdoZW4gdGhlIGVudmlyb25tZW50IGlzXG4gICAgICogcGxhdGZvcm0tbWFuYWdlZCwgc2luY2UgdGhlIGhvc3Qgb3ducyB0aGF0IGVudHJ5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lzdGVyOiAoXG4gICAgICByZWdpc3RyYXRpb246IENvbm5lY3Rpb25SZWdpc3RyYXRpb24sXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PGJvb2xlYW4sIFBlcnNpc3RlbmNlLkNvbm5lY3Rpb25QZXJzaXN0ZW5jZUVycm9yPjtcbiAgICByZWFkb25seSByZWdpc3RlclBsYXRmb3JtOiAocmVnaXN0cmF0aW9uOiBQcmltYXJ5Q29ubmVjdGlvblJlZ2lzdHJhdGlvbikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPjtcbiAgICByZWFkb25seSByZWNvbmNpbGVQbGF0Zm9ybTogKFxuICAgICAgcmVnaXN0cmF0aW9uczogUmVhZG9ubHlBcnJheTxQbGF0Zm9ybUNvbm5lY3Rpb25SZWdpc3RyYXRpb24+LFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPjtcbiAgICByZWFkb25seSByZW1vdmU6IChcbiAgICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PFxuICAgICAgdm9pZCxcbiAgICAgIHwgUGVyc2lzdGVuY2UuQ29ubmVjdGlvblBlcnNpc3RlbmNlRXJyb3JcbiAgICAgIHwgQ29ubmVjdGlvbkF0dGVtcHRFcnJvclxuICAgICAgfCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvclxuICAgICAgfCBQbGF0Zm9ybUVudmlyb25tZW50UmVtb3ZhbEVycm9yXG4gICAgPjtcbiAgICAvKipcbiAgICAgKiBSZW1vdmluZyBhbiBlbnZpcm9ubWVudCdzIGxhc3Qgcm91dGUgcmVtb3ZlcyB0aGUgZW52aXJvbm1lbnQsIHRoZSBzYW1lIGFzXG4gICAgICogYHJlbW92ZWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVtb3ZlUm91dGU6IChcbiAgICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgICByb3V0ZUlkOiBzdHJpbmcsXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PFxuICAgICAgdm9pZCxcbiAgICAgIHwgUGVyc2lzdGVuY2UuQ29ubmVjdGlvblBlcnNpc3RlbmNlRXJyb3JcbiAgICAgIHwgQ29ubmVjdGlvbkF0dGVtcHRFcnJvclxuICAgICAgfCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvclxuICAgICAgfCBQbGF0Zm9ybUVudmlyb25tZW50UmVtb3ZhbEVycm9yXG4gICAgPjtcbiAgICByZWFkb25seSByZW9yZGVyUm91dGVzOiAoXG4gICAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgICAgcm91dGVJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8XG4gICAgICB2b2lkLFxuICAgICAgfCBQZXJzaXN0ZW5jZS5Db25uZWN0aW9uUGVyc2lzdGVuY2VFcnJvclxuICAgICAgfCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvclxuICAgICAgfCBQbGF0Zm9ybUVudmlyb25tZW50UmVtb3ZhbEVycm9yXG4gICAgICB8IENvbm5lY3Rpb25CbG9ja2VkRXJyb3JcbiAgICA+O1xuICAgIHJlYWRvbmx5IHJlbW92ZVJlbGF5RW52aXJvbm1lbnRzOiAoKSA9PiBFZmZlY3QuRWZmZWN0PFxuICAgICAgdm9pZCxcbiAgICAgIHwgUGVyc2lzdGVuY2UuQ29ubmVjdGlvblBlcnNpc3RlbmNlRXJyb3JcbiAgICAgIHwgQ29ubmVjdGlvbkF0dGVtcHRFcnJvclxuICAgICAgfCBQbGF0Zm9ybUVudmlyb25tZW50UmVtb3ZhbEVycm9yXG4gICAgPjtcbiAgICByZWFkb25seSByZXRyeU5vdzogKGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD47XG4gICAgcmVhZG9ubHkgc2V0RW5hYmxlZDogKFxuICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICAgIGVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PFxuICAgICAgdm9pZCxcbiAgICAgIHwgRW52aXJvbm1lbnROb3RSZWdpc3RlcmVkRXJyb3JcbiAgICAgIHwgUGVyc2lzdGVuY2UuQ29ubmVjdGlvblBlcnNpc3RlbmNlRXJyb3JcbiAgICAgIHwgQ29ubmVjdGlvbkJsb2NrZWRFcnJvclxuICAgID47XG4gICAgcmVhZG9ubHkgc2V0Q29tcGF0aWJpbGl0eTogKFxuICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICAgIGVycm9yOiBDb25uZWN0aW9uQmxvY2tlZEVycm9yIHwgbnVsbCxcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgUGVyc2lzdGVuY2UuQ29ubmVjdGlvblBlcnNpc3RlbmNlRXJyb3I+O1xuICAgIHJlYWRvbmx5IHN0YXRlOiAoXG4gICAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxTdXBlcnZpc29yQ29ubmVjdGlvblN0YXRlLCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvcj47XG4gICAgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzOiAoXG4gICAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgICkgPT4gU3RyZWFtLlN0cmVhbTxTdXBlcnZpc29yQ29ubmVjdGlvblN0YXRlLCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvcj47XG4gICAgcmVhZG9ubHkgcnVuOiA8QSwgRSwgUj4oXG4gICAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxcbiAgICAgIEEsXG4gICAgICBFIHwgRW52aXJvbm1lbnROb3RSZWdpc3RlcmVkRXJyb3IsXG4gICAgICBFeGNsdWRlPFIsIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3I+XG4gICAgPjtcbiAgICByZWFkb25seSBydW5TdHJlYW06IDxBLCBFLCBSPihcbiAgICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgICBzdHJlYW06IFN0cmVhbS5TdHJlYW08QSwgRSwgUj4sXG4gICAgKSA9PiBTdHJlYW0uU3RyZWFtPFxuICAgICAgQSxcbiAgICAgIEUgfCBFbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvcixcbiAgICAgIEV4Y2x1ZGU8UiwgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvcj5cbiAgICA+O1xuICAgIHJlYWRvbmx5IGZvbGxvd1N0cmVhbTogPEEsIEUsIFI+KFxuICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxBLCBFLCBSPixcbiAgICApID0+IFN0cmVhbS5TdHJlYW08QSwgRSwgRXhjbHVkZTxSLCBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yPj47XG4gIH1cbj4oKShcIkB0M3Rvb2xzL2NsaWVudC1ydW50aW1lL2Nvbm5lY3Rpb24vcmVnaXN0cnkvRW52aXJvbm1lbnRSZWdpc3RyeVwiKSB7fVxuXG5pbnRlcmZhY2UgRW52aXJvbm1lbnRTZXJ2aWNlU2NvcGUge1xuICByZWFkb25seSBlbnRyeTogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeTtcbiAgcmVhZG9ubHkgc3VwZXJ2aXNvcjogRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvcltcIlNlcnZpY2VcIl07XG4gIHJlYWRvbmx5IHNjb3BlOiBTY29wZS5DbG9zZWFibGU7XG59XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgY29uc3QgbWFrZSA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgY29uc3QgcmVnaXN0cnlTY29wZSA9IHlpZWxkKiBTY29wZS5TY29wZTtcbiAgY29uc3Qgc3RvcmFnZSA9IHlpZWxkKiBQZXJzaXN0ZW5jZS5Db25uZWN0aW9uVGFyZ2V0U3RvcmU7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbnMgPSB5aWVsZCogUGVyc2lzdGVuY2UuQ29ubmVjdGlvblJlZ2lzdHJhdGlvblN0b3JlO1xuICBjb25zdCBjYWNoZSA9IHlpZWxkKiBQZXJzaXN0ZW5jZS5FbnZpcm9ubWVudENhY2hlU3RvcmU7XG4gIGNvbnN0IG93bmVkRGF0YUNsZWFudXAgPSB5aWVsZCogUGVyc2lzdGVuY2UuRW52aXJvbm1lbnRPd25lZERhdGFDbGVhbnVwO1xuICBjb25zdCBwcm9maWxlcyA9IHlpZWxkKiBDb25uZWN0aW9uUHJvZmlsZVN0b3JlLkNvbm5lY3Rpb25Qcm9maWxlU3RvcmU7XG4gIGNvbnN0IGNyZWRlbnRpYWxzID0geWllbGQqIENvbm5lY3Rpb25DcmVkZW50aWFsU3RvcmUuQ29ubmVjdGlvbkNyZWRlbnRpYWxTdG9yZTtcbiAgY29uc3QgcHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnMgPSB5aWVsZCogUHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnM7XG4gIGNvbnN0IGNvbm5lY3Rpdml0eSA9IHlpZWxkKiBDb25uZWN0aXZpdHkuQ29ubmVjdGl2aXR5O1xuICBjb25zdCBkcml2ZXIgPSB5aWVsZCogQ29ubmVjdGlvbkRyaXZlci5Db25uZWN0aW9uRHJpdmVyO1xuICBjb25zdCB3YWtldXBzID0geWllbGQqIENvbm5lY3Rpb25XYWtldXBzLkNvbm5lY3Rpb25XYWtldXBzO1xuICBjb25zdCBzc2ggPSB5aWVsZCogQ2xpZW50Q2FwYWJpbGl0aWVzLlNzaEVudmlyb25tZW50R2F0ZXdheTtcbiAgY29uc3QgcGVyc2lzdGVkVGFyZ2V0cyA9IHlpZWxkKiBzdG9yYWdlLmxpc3Q7XG4gIGNvbnN0IGRpc2FibGVkRW52aXJvbm1lbnRJZHMgPSBuZXcgU2V0KHlpZWxkKiBzdG9yYWdlLmxpc3REaXNhYmxlZCk7XG4gIGNvbnN0IGxvYWRSb3V0ZSA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkubG9hZFJvdXRlXCIpKGZ1bmN0aW9uKiAoXG4gICAgdGFyZ2V0OiBDb25uZWN0aW9uVGFyZ2V0LFxuICApIHtcbiAgICBjb25zdCBwcm9maWxlOiBPcHRpb24uT3B0aW9uPENvbm5lY3Rpb25Qcm9maWxlPiA9XG4gICAgICB0YXJnZXQuX3RhZyA9PT0gXCJCZWFyZXJDb25uZWN0aW9uVGFyZ2V0XCIgfHwgdGFyZ2V0Ll90YWcgPT09IFwiU3NoQ29ubmVjdGlvblRhcmdldFwiXG4gICAgICAgID8geWllbGQqIHByb2ZpbGVzLmdldCh0YXJnZXQuY29ubmVjdGlvbklkKVxuICAgICAgICA6IE9wdGlvbi5ub25lKCk7XG4gICAgcmV0dXJuIHsgdGFyZ2V0LCBwcm9maWxlIH0gc2F0aXNmaWVzIENvbm5lY3Rpb25Sb3V0ZTtcbiAgfSk7XG4gIGNvbnN0IHBlcnNpc3RlZFJvdXRlc0J5RW52aXJvbm1lbnQgPSBuZXcgTWFwPEVudmlyb25tZW50SWQsIEFycmF5PENvbm5lY3Rpb25UYXJnZXQ+PigpO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBwZXJzaXN0ZWRUYXJnZXRzKSB7XG4gICAgY29uc3Qgcm91dGVzID0gcGVyc2lzdGVkUm91dGVzQnlFbnZpcm9ubWVudC5nZXQodGFyZ2V0LmVudmlyb25tZW50SWQpID8/IFtdO1xuICAgIHJvdXRlcy5wdXNoKHRhcmdldCk7XG4gICAgcGVyc2lzdGVkUm91dGVzQnlFbnZpcm9ubWVudC5zZXQodGFyZ2V0LmVudmlyb25tZW50SWQsIHJvdXRlcyk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEVudHJpZXMgPSBuZXcgTWFwKFxuICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChcbiAgICAgIHBlcnNpc3RlZFJvdXRlc0J5RW52aXJvbm1lbnQsXG4gICAgICBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LmxvYWRDYXRhbG9nRW50cnlcIikoZnVuY3Rpb24qIChbZW52aXJvbm1lbnRJZCwgdGFyZ2V0c10pIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0geWllbGQqIEVmZmVjdC5mb3JFYWNoKHRhcmdldHMsIGxvYWRSb3V0ZSwgeyBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIiB9KTtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCB1c2FibGUgPSBsb2FkZWQuZmlsdGVyKChyb3V0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gY29ubmVjdGlvblJvdXRlSWQocm91dGUudGFyZ2V0KTtcbiAgICAgICAgICBpZiAoc2Vlbi5oYXMoaWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgc2Vlbi5hZGQoaWQpO1xuICAgICAgICAgIHJldHVybiAhKGlkLnN0YXJ0c1dpdGgoXCJsZWFybmVkOlwiKSAmJiBPcHRpb24uaXNOb25lKHJvdXRlLnByb2ZpbGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvdXRlcyA9IHVzYWJsZS5sZW5ndGggPiAwID8gdXNhYmxlIDogbG9hZGVkLnNsaWNlKDAsIDEpO1xuICAgICAgICBjb25zdCBmaXJzdCA9IHJvdXRlc1swXSE7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICBlbnRyeVdpdGhSb3V0ZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogZmlyc3QudGFyZ2V0LFxuICAgICAgICAgICAgICBwcm9maWxlOiBmaXJzdC5wcm9maWxlLFxuICAgICAgICAgICAgICBlbmFibGVkOiAhZGlzYWJsZWRFbnZpcm9ubWVudElkcy5oYXMoZW52aXJvbm1lbnRJZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm91dGVzLFxuICAgICAgICAgICksXG4gICAgICAgIF0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICAgIHsgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIgfSxcbiAgICApLFxuICApO1xuICBjb25zdCBlbnRyaWVzID1cbiAgICB5aWVsZCogU3Vic2NyaXB0aW9uUmVmLm1ha2U8UmVhZG9ubHlNYXA8RW52aXJvbm1lbnRJZCwgQ29ubmVjdGlvbkNhdGFsb2dFbnRyeT4+KGluaXRpYWxFbnRyaWVzKTtcbiAgY29uc3QgbmV0d29ya1N0YXR1cyA9IHlpZWxkKiBTdWJzY3JpcHRpb25SZWYubWFrZSh5aWVsZCogY29ubmVjdGl2aXR5LnN0YXR1cyk7XG4gIGNvbnN0IHNlcnZpY2VTY29wZXMgPSB5aWVsZCogU3Vic2NyaXB0aW9uUmVmLm1ha2U8XG4gICAgUmVhZG9ubHlNYXA8RW52aXJvbm1lbnRJZCwgRW52aXJvbm1lbnRTZXJ2aWNlU2NvcGU+XG4gID4obmV3IE1hcCgpKTtcbiAgY29uc3QgcGxhdGZvcm1FbnZpcm9ubWVudElkcyA9IHlpZWxkKiBSZWYubWFrZTxSZWFkb25seVNldDxFbnZpcm9ubWVudElkPj4obmV3IFNldCgpKTtcbiAgY29uc3QgcGVyc2lzdGVkRW52aXJvbm1lbnRJZHMgPSB5aWVsZCogUmVmLm1ha2U8UmVhZG9ubHlTZXQ8RW52aXJvbm1lbnRJZD4+KFxuICAgIG5ldyBTZXQocGVyc2lzdGVkUm91dGVzQnlFbnZpcm9ubWVudC5rZXlzKCkpLFxuICApO1xuICBpbnRlcmZhY2UgTGVhc2VMb2NrIHtcbiAgICByZWFkb25seSBzZW1hcGhvcmU6IFNlbWFwaG9yZS5TZW1hcGhvcmU7XG4gICAgcmVhZG9ubHkgdXNlcnM6IG51bWJlcjtcbiAgfVxuXG4gIGNvbnN0IGxlYXNlTG9ja3MgPSB5aWVsZCogUmVmLm1ha2U8UmVhZG9ubHlNYXA8RW52aXJvbm1lbnRJZCwgTGVhc2VMb2NrPj4obmV3IE1hcCgpKTtcbiAgY29uc3QgbGVhc2VMb2Nrc0d1YXJkID0geWllbGQqIFNlbWFwaG9yZS5tYWtlKDEpO1xuICBjb25zdCBzdGFydGVkID0geWllbGQqIFJlZi5tYWtlKGZhbHNlKTtcblxuICBjb25zdCB3aXRoTGVhc2VMb2NrID0gPEEsIEUsIFI+KFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuICApOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+ID0+XG4gICAgRWZmZWN0LmFjcXVpcmVVc2VSZWxlYXNlKFxuICAgICAgbGVhc2VMb2Nrc0d1YXJkLndpdGhQZXJtaXRzKDEpKFxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHlpZWxkKiBSZWYuZ2V0KGxlYXNlTG9ja3MpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gY3VycmVudC5nZXQoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHlpZWxkKiBSZWYuc2V0KFxuICAgICAgICAgICAgICBsZWFzZUxvY2tzLFxuICAgICAgICAgICAgICBuZXcgTWFwKGN1cnJlbnQpLnNldChlbnZpcm9ubWVudElkLCB7XG4gICAgICAgICAgICAgICAgc2VtYXBob3JlOiBleGlzdGluZy5zZW1hcGhvcmUsXG4gICAgICAgICAgICAgICAgdXNlcnM6IGV4aXN0aW5nLnVzZXJzICsgMSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nLnNlbWFwaG9yZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VtYXBob3JlID0geWllbGQqIFNlbWFwaG9yZS5tYWtlKDEpO1xuICAgICAgICAgIHlpZWxkKiBSZWYuc2V0KGxlYXNlTG9ja3MsIG5ldyBNYXAoY3VycmVudCkuc2V0KGVudmlyb25tZW50SWQsIHsgc2VtYXBob3JlLCB1c2VyczogMSB9KSk7XG4gICAgICAgICAgcmV0dXJuIHNlbWFwaG9yZTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgKHNlbWFwaG9yZSkgPT4gc2VtYXBob3JlLndpdGhQZXJtaXRzKDEpKGVmZmVjdCksXG4gICAgICAoc2VtYXBob3JlKSA9PlxuICAgICAgICBsZWFzZUxvY2tzR3VhcmQud2l0aFBlcm1pdHMoMSkoXG4gICAgICAgICAgUmVmLnVwZGF0ZShsZWFzZUxvY2tzLCAoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjdXJyZW50LmdldChlbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkIHx8IGV4aXN0aW5nLnNlbWFwaG9yZSAhPT0gc2VtYXBob3JlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAoY3VycmVudCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcudXNlcnMgPT09IDEpIHtcbiAgICAgICAgICAgICAgbmV4dC5kZWxldGUoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXh0LnNldChlbnZpcm9ubWVudElkLCB7XG4gICAgICAgICAgICAgICAgc2VtYXBob3JlLFxuICAgICAgICAgICAgICAgIHVzZXJzOiBleGlzdGluZy51c2VycyAtIDEsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKS5waXBlKEVmZmVjdC53aXRoU3BhbihcIkVudmlyb25tZW50UmVnaXN0cnkud2l0aExlYXNlTG9ja1wiKSk7XG5cbiAgY29uc3QgZ2V0RW50cnkgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LmdldEVudHJ5XCIpKGZ1bmN0aW9uKiAoXG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgKSB7XG4gICAgY29uc3QgZW50cnkgPSAoeWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoZW50cmllcykpLmdldChlbnZpcm9ubWVudElkKTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHlpZWxkKiBuZXcgRW52aXJvbm1lbnROb3RSZWdpc3RlcmVkRXJyb3Ioe1xuICAgICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfSk7XG5cbiAgY29uc3QgY2xvc2VTZXJ2aWNlU2NvcGUgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LmNsb3NlU2VydmljZVNjb3BlXCIpKGZ1bmN0aW9uKiAoXG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHlpZWxkKiBTdWJzY3JpcHRpb25SZWYuZ2V0KHNlcnZpY2VTY29wZXMpO1xuICAgIGNvbnN0IGxlYXNlID0gY3VycmVudC5nZXQoZW52aXJvbm1lbnRJZCk7XG4gICAgaWYgKGxlYXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAoY3VycmVudCk7XG4gICAgbmV4dC5kZWxldGUoZW52aXJvbm1lbnRJZCk7XG4gICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi5zZXQoc2VydmljZVNjb3BlcywgbmV4dCk7XG4gICAgeWllbGQqIFNjb3BlLmNsb3NlKGxlYXNlLnNjb3BlLCBFeGl0LnZvaWQpO1xuICB9KTtcblxuICBjb25zdCBjcmVhdGVTZXJ2aWNlU2NvcGUgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LmNyZWF0ZVNlcnZpY2VTY29wZVwiKShcbiAgICAoZW50cnk6IENvbm5lY3Rpb25DYXRhbG9nRW50cnkpID0+XG4gICAgICBFZmZlY3QudW5pbnRlcnJ1cHRpYmxlKFxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJZCA9IGVudHJ5LnRhcmdldC5lbnZpcm9ubWVudElkO1xuICAgICAgICAgIGNvbnN0IHNjb3BlID0geWllbGQqIFNjb3BlLmZvcmsocmVnaXN0cnlTY29wZSk7XG4gICAgICAgICAgY29uc3Qgc3VwZXJ2aXNvciA9IHlpZWxkKiBFbnZpcm9ubWVudFN1cGVydmlzb3IubWFrZShlbnRyeSwge1xuICAgICAgICAgICAgLy8gU2VlZCB0aGUgaW50ZW50IHRvIGF2b2lkIHB1Ymxpc2hpbmcgYSBmYWxzZSBzd2l0Y2hlZC1vZmYgc3RhdGVcbiAgICAgICAgICAgIC8vIGJlZm9yZSBhbiBlbmFibGVkLCBjb21wYXRpYmxlIGVudmlyb25tZW50IHN0YXJ0cyBjb25uZWN0aW5nLlxuICAgICAgICAgICAgaW5pdGlhbGx5RGVzaXJlZDogZW50cnkuZW5hYmxlZCAmJiBlbnRyeS51bnN1cHBvcnRlZFJlYXNvbiA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGVhcm5Sb3V0ZXM6IChpbnB1dCkgPT4gbGVhcm5Sb3V0ZXMoeyBlbnZpcm9ubWVudElkLCAuLi5pbnB1dCB9KSxcbiAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKENvbm5lY3Rpdml0eS5Db25uZWN0aXZpdHksIGNvbm5lY3Rpdml0eSksXG4gICAgICAgICAgICBFZmZlY3QucHJvdmlkZVNlcnZpY2UoQ29ubmVjdGlvbkRyaXZlci5Db25uZWN0aW9uRHJpdmVyLCBkcml2ZXIpLFxuICAgICAgICAgICAgRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKENvbm5lY3Rpb25XYWtldXBzLkNvbm5lY3Rpb25XYWtldXBzLCB3YWtldXBzKSxcbiAgICAgICAgICAgIFNjb3BlLnByb3ZpZGUoc2NvcGUpLFxuICAgICAgICAgICAgRWZmZWN0Lm9uRXJyb3IoKCkgPT4gU2NvcGUuY2xvc2Uoc2NvcGUsIEV4aXQudm9pZCkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoc2VydmljZVNjb3BlcywgKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKGN1cnJlbnQpO1xuICAgICAgICAgICAgbmV4dC5zZXQoZW52aXJvbm1lbnRJZCwgeyBlbnRyeSwgc3VwZXJ2aXNvciwgc2NvcGUgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmNoYW5nZXMoc3VwZXJ2aXNvci5zdGF0ZSkucGlwZShcbiAgICAgICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChzdGF0ZSkgPT5cbiAgICAgICAgICAgICAgc3RhdGUucGhhc2UgPT09IFwiYmxvY2tlZFwiICYmIHN0YXRlLmxhc3RGYWlsdXJlPy5yZWFzb24gPT09IFwidW5zdXBwb3J0ZWRcIlxuICAgICAgICAgICAgICAgID8gc2V0Q29tcGF0aWJpbGl0eShlbnZpcm9ubWVudElkLCBzdGF0ZS5sYXN0RmFpbHVyZSlcbiAgICAgICAgICAgICAgICA6IEVmZmVjdC52b2lkLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEVmZmVjdC5mb3JrSW4oc2NvcGUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHN1cGVydmlzb3I7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgKTtcblxuICBjb25zdCBhY3F1aXJlU3VwZXJ2aXNvciA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkuYWNxdWlyZVN1cGVydmlzb3JcIikoZnVuY3Rpb24qIChcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICApIHtcbiAgICByZXR1cm4geWllbGQqIHdpdGhMZWFzZUxvY2soXG4gICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHlpZWxkKiBnZXRFbnRyeShlbnZpcm9ubWVudElkKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSAoeWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoc2VydmljZVNjb3BlcykpLmdldChlbnZpcm9ubWVudElkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoRXF1YWwuZXF1YWxzKGV4aXN0aW5nLmVudHJ5LCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZy5zdXBlcnZpc29yO1xuICAgICAgICAgIH1cbiAgICAgICAgICB5aWVsZCogY2xvc2VTZXJ2aWNlU2NvcGUoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBjcmVhdGVTZXJ2aWNlU2NvcGUoZW50cnkpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3QgcnVuOiBFbnZpcm9ubWVudFJlZ2lzdHJ5W1wiU2VydmljZVwiXVtcInJ1blwiXSA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucnVuXCIpKFxuICAgIGZ1bmN0aW9uKiA8QSwgRSwgUj4oZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCwgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+KSB7XG4gICAgICBjb25zdCBzdXBlcnZpc29yID0geWllbGQqIGFjcXVpcmVTdXBlcnZpc29yKGVudmlyb25tZW50SWQpO1xuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QucHJvdmlkZVNlcnZpY2UoXG4gICAgICAgIGVmZmVjdCxcbiAgICAgICAgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvcixcbiAgICAgICAgc3VwZXJ2aXNvcixcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBydW5TdHJlYW06IEVudmlyb25tZW50UmVnaXN0cnlbXCJTZXJ2aWNlXCJdW1wicnVuU3RyZWFtXCJdID0gPEEsIEUsIFI+KFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgc3RyZWFtOiBTdHJlYW0uU3RyZWFtPEEsIEUsIFI+LFxuICApID0+XG4gICAgU3RyZWFtLnVud3JhcChcbiAgICAgIGFjcXVpcmVTdXBlcnZpc29yKGVudmlyb25tZW50SWQpLnBpcGUoXG4gICAgICAgIEVmZmVjdC5tYXAoKHN1cGVydmlzb3IpID0+XG4gICAgICAgICAgU3RyZWFtLnByb3ZpZGVTZXJ2aWNlKHN0cmVhbSwgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvciwgc3VwZXJ2aXNvciksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgY29uc3QgZm9sbG93U3RyZWFtOiBFbnZpcm9ubWVudFJlZ2lzdHJ5W1wiU2VydmljZVwiXVtcImZvbGxvd1N0cmVhbVwiXSA9IDxBLCBFLCBSPihcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxBLCBFLCBSPixcbiAgKSA9PlxuICAgIFN0cmVhbS5jb25jYXQoXG4gICAgICBTdHJlYW0uZnJvbUVmZmVjdChTdWJzY3JpcHRpb25SZWYuZ2V0KGVudHJpZXMpKSxcbiAgICAgIFN1YnNjcmlwdGlvblJlZi5jaGFuZ2VzKGVudHJpZXMpLFxuICAgICkucGlwZShcbiAgICAgIFN0cmVhbS5tYXAoKGN1cnJlbnQpID0+IE9wdGlvbi5mcm9tVW5kZWZpbmVkT3IoY3VycmVudC5nZXQoZW52aXJvbm1lbnRJZCkpKSxcbiAgICAgIFN0cmVhbS5jaGFuZ2VzV2l0aChcbiAgICAgICAgKHByZXZpb3VzLCBjdXJyZW50KSA9PiBPcHRpb24uZ2V0T3JOdWxsKHByZXZpb3VzKSA9PT0gT3B0aW9uLmdldE9yTnVsbChjdXJyZW50KSxcbiAgICAgICksXG4gICAgICBTdHJlYW0uc3dpdGNoTWFwKFxuICAgICAgICBPcHRpb24ubWF0Y2goe1xuICAgICAgICAgIG9uTm9uZTogKCkgPT4gU3RyZWFtLmVtcHR5LFxuICAgICAgICAgIG9uU29tZTogKCkgPT5cbiAgICAgICAgICAgIFN0cmVhbS51bndyYXAoXG4gICAgICAgICAgICAgIGFjcXVpcmVTdXBlcnZpc29yKGVudmlyb25tZW50SWQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0Lm1hdGNoKHtcbiAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZTogKCkgPT4gU3RyZWFtLmVtcHR5LFxuICAgICAgICAgICAgICAgICAgb25TdWNjZXNzOiAoc3VwZXJ2aXNvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgU3RyZWFtLnByb3ZpZGVTZXJ2aWNlKFxuICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yLFxuICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3IsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcblxuICBjb25zdCBzdGFydCA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoeWllbGQqIFJlZi5nZXRBbmRTZXQoc3RhcnRlZCwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgeWllbGQqIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgcGVyc2lzdGVkUm91dGVzQnlFbnZpcm9ubWVudC5rZXlzKCksXG4gICAgICAoZW52aXJvbm1lbnRJZCkgPT5cbiAgICAgICAgYWNxdWlyZVN1cGVydmlzb3IoZW52aXJvbm1lbnRJZCkucGlwZShcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hUYWdzKHsgRW52aXJvbm1lbnROb3RSZWdpc3RlcmVkRXJyb3I6ICgpID0+IEVmZmVjdC52b2lkIH0pLFxuICAgICAgICApLFxuICAgICAge1xuICAgICAgICBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIixcbiAgICAgICAgZGlzY2FyZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSkucGlwZShFZmZlY3Qud2l0aFNwYW4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LnN0YXJ0XCIpKTtcblxuICBjb25zdCBpbnN0YWxsRW50cnlMb2NrZWQgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5Lmluc3RhbGxFbnRyeUxvY2tlZFwiKShmdW5jdGlvbiogKFxuICAgIGVudHJ5OiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IHJldGFpbkVxdWl2YWxlbnRSdW50aW1lPzogYm9vbGVhbiB9LFxuICApIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlbnRyeS50YXJnZXQ7XG4gICAgY29uc3QgcHJldmlvdXMgPSAoeWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoZW50cmllcykpLmdldCh0YXJnZXQuZW52aXJvbm1lbnRJZCk7XG4gICAgY29uc3QgZXhpc3RpbmdTY29wZSA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChzZXJ2aWNlU2NvcGVzKSkuZ2V0KHRhcmdldC5lbnZpcm9ubWVudElkKTtcbiAgICBpZiAoXG4gICAgICBvcHRpb25zPy5yZXRhaW5FcXVpdmFsZW50UnVudGltZSA9PT0gdHJ1ZSAmJlxuICAgICAgcHJldmlvdXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgRXF1YWwuZXF1YWxzKHByZXZpb3VzLCBlbnRyeSkgJiZcbiAgICAgIGV4aXN0aW5nU2NvcGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgRXF1YWwuZXF1YWxzKGV4aXN0aW5nU2NvcGUuZW50cnksIGVudHJ5KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkKiBjbG9zZVNlcnZpY2VTY29wZSh0YXJnZXQuZW52aXJvbm1lbnRJZCk7XG4gICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoZW50cmllcywgKGN1cnJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKGN1cnJlbnQpO1xuICAgICAgbmV4dC5zZXQodGFyZ2V0LmVudmlyb25tZW50SWQsIGVudHJ5KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICAgIHlpZWxkKiBjcmVhdGVTZXJ2aWNlU2NvcGUoZW50cnkpO1xuICB9KTtcblxuICBjb25zdCBmb3JnZXRSb3V0aW5nVHJ1c3QgPSAoXG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICBvcGVyYXRpb246IFwicmVnaXN0ZXItY29ubmVjdGlvblwiIHwgXCJzZXQtY29ubmVjdGlvbi1yb3V0ZXNcIixcbiAgKSA9PlxuICAgIHB1bGxSZXF1ZXN0Um91dGluZ1Blcm1pc3Npb25zLmZvcmdldChlbnZpcm9ubWVudElkKS5waXBlKFxuICAgICAgRWZmZWN0Lm1hcEVycm9yKFxuICAgICAgICAoZXJyb3IpID0+XG4gICAgICAgICAgbmV3IFBlcnNpc3RlbmNlLkNvbm5lY3Rpb25QZXJzaXN0ZW5jZUVycm9yKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG5cbiAgY29uc3QgcGVyc2lzdGVkUm91dGVzID0gKGVudHJ5OiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5KSA9PlxuICAgIGNvbm5lY3Rpb25Sb3V0ZXMoZW50cnkpLm1hcCgocm91dGUpID0+IHJvdXRlLnRhcmdldCBhcyBQZXJzaXN0ZWRDb25uZWN0aW9uVGFyZ2V0KTtcblxuICAvKipcbiAgICogUHVsbCByZXF1ZXN0IHJvdXRpbmcgdHJ1c3QgYW5kIGFuIHVuc3VwcG9ydGVkIHZlcmRpY3QgYm90aCBiZWxvbmcgdG8gdGhlIHNhdmVkIGFkZHJlc3NlczogYSBjaGFuZ2VkIHNldCBtYXlcbiAgICogcmVhY2ggYSBkaWZmZXJlbnQgc2VydmVyLCBzbyBib3RoIGFyZSBkcm9wcGVkIGFuZCB0aGUgbmV4dCBjb25uZWN0aW9uIGRlY2lkZXMuXG4gICAqL1xuICBjb25zdCB3aXRoUm91dGVzID0gKHByZXZpb3VzOiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LCByb3V0ZXM6IFJlYWRvbmx5QXJyYXk8Q29ubmVjdGlvblJvdXRlPikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlbnRyeVdpdGhSb3V0ZXMocHJldmlvdXMsIHJvdXRlcyk7XG4gICAgaWYgKHB1bGxSZXF1ZXN0Um91dGluZ0Nvbm5lY3Rpb25LZXkocHJldmlvdXMpID09PSBwdWxsUmVxdWVzdFJvdXRpbmdDb25uZWN0aW9uS2V5KG5leHQpKSB7XG4gICAgICByZXR1cm4geyBlbnRyeTogbmV4dCwgYWRkcmVzc2VzQ2hhbmdlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgY29uc3QgeyB1bnN1cHBvcnRlZFJlYXNvbjogX3JlYXNvbiwgc2VydmVyVXBkYXRlUmVxdWlyZWQ6IF91cGRhdGUsIC4uLnJlc3QgfSA9IG5leHQ7XG4gICAgcmV0dXJuIHsgZW50cnk6IHJlc3QsIGFkZHJlc3Nlc0NoYW5nZWQ6IHRydWUgfTtcbiAgfTtcblxuICBjb25zdCByZWdpc3RlciA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucmVnaXN0ZXJcIikoZnVuY3Rpb24qIChcbiAgICByZWdpc3RyYXRpb246IENvbm5lY3Rpb25SZWdpc3RyYXRpb24sXG4gICkge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBjb25uZWN0aW9uUmVnaXN0cmF0aW9uQ2F0YWxvZ0VudHJ5KHJlZ2lzdHJhdGlvbik7XG4gICAgY29uc3QgZW52aXJvbm1lbnRJZCA9IHJlZ2lzdGVyZWQudGFyZ2V0LmVudmlyb25tZW50SWQ7XG4gICAgcmV0dXJuIHlpZWxkKiB3aXRoTGVhc2VMb2NrKFxuICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCh5aWVsZCogUmVmLmdldChwbGF0Zm9ybUVudmlyb25tZW50SWRzKSkuaGFzKGVudmlyb25tZW50SWQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gKHlpZWxkKiBTdWJzY3JpcHRpb25SZWYuZ2V0KGVudHJpZXMpKS5nZXQoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgIGxldCBlbnRyeSA9IHJlZ2lzdGVyZWQ7XG4gICAgICAgIGlmIChwcmV2aW91cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgcm91dGU6IENvbm5lY3Rpb25Sb3V0ZSA9IHsgdGFyZ2V0OiByZWdpc3RlcmVkLnRhcmdldCwgcHJvZmlsZTogcmVnaXN0ZXJlZC5wcm9maWxlIH07XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjb25uZWN0aW9uUm91dGVzKHByZXZpb3VzKTtcbiAgICAgICAgICBjb25zdCBzYW1lQWRkcmVzcyA9IGZpbmRSb3V0ZVRvU2FtZUFkZHJlc3MoZXhpc3RpbmcsIHJvdXRlKTtcbiAgICAgICAgICBjb25zdCByb3V0ZXMgPSBleGlzdGluZy5maWx0ZXIoXG4gICAgICAgICAgICAoZXhpc3RpbmcpID0+XG4gICAgICAgICAgICAgIGV4aXN0aW5nICE9PSBzYW1lQWRkcmVzcyB8fFxuICAgICAgICAgICAgICBjb25uZWN0aW9uUm91dGVJZChleGlzdGluZy50YXJnZXQpID09PSBjb25uZWN0aW9uUm91dGVJZChyb3V0ZS50YXJnZXQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHdpdGhSb3V0ZXMocHJldmlvdXMsIHVwc2VydFJvdXRlKHJvdXRlcywgcm91dGUpKTtcbiAgICAgICAgICBpZiAobmV4dC5hZGRyZXNzZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB5aWVsZCogZm9yZ2V0Um91dGluZ1RydXN0KGVudmlyb25tZW50SWQsIFwicmVnaXN0ZXItY29ubmVjdGlvblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkgPSBuZXh0LmVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiByZWdpc3RyYXRpb25zLnJlZ2lzdGVyKHJlZ2lzdHJhdGlvbiwgcGVyc2lzdGVkUm91dGVzKGVudHJ5KSk7XG4gICAgICAgIHlpZWxkKiBSZWYudXBkYXRlKHBlcnNpc3RlZEVudmlyb25tZW50SWRzLCAoY3VycmVudCkgPT5cbiAgICAgICAgICBuZXcgU2V0KGN1cnJlbnQpLmFkZChlbnZpcm9ubWVudElkKSxcbiAgICAgICAgKTtcbiAgICAgICAgeWllbGQqIGluc3RhbGxFbnRyeUxvY2tlZChlbnRyeSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSksXG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVwbGFjZVJvdXRlc0xvY2tlZCA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucmVwbGFjZVJvdXRlc0xvY2tlZFwiKShmdW5jdGlvbiogKFxuICAgIHByZXZpb3VzOiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuICAgIHJvdXRlczogUmVhZG9ubHlBcnJheTxDb25uZWN0aW9uUm91dGU+LFxuICApIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudElkID0gcHJldmlvdXMudGFyZ2V0LmVudmlyb25tZW50SWQ7XG4gICAgY29uc3QgbmV4dCA9IHdpdGhSb3V0ZXMocHJldmlvdXMsIHJvdXRlcyk7XG4gICAgaWYgKG5leHQuYWRkcmVzc2VzQ2hhbmdlZCkge1xuICAgICAgeWllbGQqIGZvcmdldFJvdXRpbmdUcnVzdChlbnZpcm9ubWVudElkLCBcInNldC1jb25uZWN0aW9uLXJvdXRlc1wiKTtcbiAgICB9XG4gICAgeWllbGQqIHJlZ2lzdHJhdGlvbnMuc2V0Um91dGVzKGVudmlyb25tZW50SWQsIHBlcnNpc3RlZFJvdXRlcyhuZXh0LmVudHJ5KSk7XG4gICAgeWllbGQqIGluc3RhbGxFbnRyeUxvY2tlZChuZXh0LmVudHJ5KTtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckVudHJ5ID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS51c2VyRW50cnlcIikoZnVuY3Rpb24qIChcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICApIHtcbiAgICBpZiAoKHlpZWxkKiBSZWYuZ2V0KHBsYXRmb3JtRW52aXJvbm1lbnRJZHMpKS5oYXMoZW52aXJvbm1lbnRJZCkpIHtcbiAgICAgIHJldHVybiB5aWVsZCogbmV3IFBsYXRmb3JtRW52aXJvbm1lbnRSZW1vdmFsRXJyb3IoeyBlbnZpcm9ubWVudElkIH0pO1xuICAgIH1cbiAgICByZXR1cm4geWllbGQqIGdldEVudHJ5KGVudmlyb25tZW50SWQpO1xuICB9KTtcblxuICBjb25zdCBpbnN0YWxsUGxhdGZvcm1SZWdpc3RyYXRpb24gPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5Lmluc3RhbGxQbGF0Zm9ybVJlZ2lzdHJhdGlvblwiKShcbiAgICBmdW5jdGlvbiogKHJlZ2lzdHJhdGlvbjogUGxhdGZvcm1Db25uZWN0aW9uUmVnaXN0cmF0aW9uKSB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkID0gY29ubmVjdGlvblJlZ2lzdHJhdGlvbkNhdGFsb2dFbnRyeShyZWdpc3RyYXRpb24pO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gcmVnaXN0ZXJlZC50YXJnZXQ7XG4gICAgICB5aWVsZCogd2l0aExlYXNlTG9jayhcbiAgICAgICAgdGFyZ2V0LmVudmlyb25tZW50SWQsXG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChlbnRyaWVzKSkuZ2V0KHRhcmdldC5lbnZpcm9ubWVudElkKTtcbiAgICAgICAgICBjb25zdCBlbnRyeTogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSA9XG4gICAgICAgICAgICBwcmV2aW91cz8udW5zdXBwb3J0ZWRSZWFzb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgcHVsbFJlcXVlc3RSb3V0aW5nQ29ubmVjdGlvbktleShwcmV2aW91cykgPT09XG4gICAgICAgICAgICAgIHB1bGxSZXF1ZXN0Um91dGluZ0Nvbm5lY3Rpb25LZXkocmVnaXN0ZXJlZClcbiAgICAgICAgICAgICAgPyB7IC4uLnJlZ2lzdGVyZWQsIC4uLnVuc3VwcG9ydGVkU3RhdGUocHJldmlvdXMpIH1cbiAgICAgICAgICAgICAgOiByZWdpc3RlcmVkO1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlZCA9ICh5aWVsZCogUmVmLmdldChwZXJzaXN0ZWRFbnZpcm9ubWVudElkcykpLmhhcyh0YXJnZXQuZW52aXJvbm1lbnRJZCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGVyc2lzdGVkIHx8XG4gICAgICAgICAgICAocHJldmlvdXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBwdWxsUmVxdWVzdFJvdXRpbmdDb25uZWN0aW9uS2V5KHByZXZpb3VzKSAhPT0gcHVsbFJlcXVlc3RSb3V0aW5nQ29ubmVjdGlvbktleShlbnRyeSkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCByZXZva2VkID0geWllbGQqIHB1bGxSZXF1ZXN0Um91dGluZ1Blcm1pc3Npb25zLmZvcmdldCh0YXJnZXQuZW52aXJvbm1lbnRJZCkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0LnRhcEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgICAgICAgICBFZmZlY3QubG9nV2FybmluZyhcbiAgICAgICAgICAgICAgICAgIFwiQ291bGQgbm90IGNsZWFyIHB1bGwgcmVxdWVzdCByb3V0aW5nIHBlcm1pc3Npb24gZm9yIGEgcGxhdGZvcm0gZW52aXJvbm1lbnQuXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50SWQ6IHRhcmdldC5lbnZpcm9ubWVudElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgRWZmZWN0LmV4aXQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKEV4aXQuaXNGYWlsdXJlKHJldm9rZWQpKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHlpZWxkKiBSZWYudXBkYXRlKHBsYXRmb3JtRW52aXJvbm1lbnRJZHMsIChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3IFNldChjdXJyZW50KTtcbiAgICAgICAgICAgIG5leHQuYWRkKHRhcmdldC5lbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gU2Vjb25kYXJ5IGRlc2t0b3AtbG9jYWwgYmFja2VuZHMgKGUuZy4gYSBwYXJhbGxlbCBXU0wgYmFja2VuZCkgbGl2ZVxuICAgICAgICAgIC8vIG9uIHRoZWlyIG93biBsb29wYmFjayBvcmlnaW4sIHNvIHRoZXkgYXV0aGVudGljYXRlIHdpdGggYSBiZWFyZXJcbiAgICAgICAgICAvLyB0b2tlbiBpbnN0ZWFkIG9mIHRoZSBwcmltYXJ5J3Mgc2FtZS1vcmlnaW4gY29va2llLiBTdGFzaCBpdCB3aGVyZVxuICAgICAgICAgIC8vIHRoZSByZXNvbHZlcidzIGJlYXJlciBicm9rZXIgbG9va3MgaXQgdXAuXG4gICAgICAgICAgbGV0IGJlYXJlclJlcGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5fdGFnID09PSBcIkJlYXJlckNvbm5lY3Rpb25SZWdpc3RyYXRpb25cIikge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkID0geWllbGQqIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICAgIC5nZXQocmVnaXN0cmF0aW9uLnRhcmdldC5jb25uZWN0aW9uSWQpXG4gICAgICAgICAgICAgIC5waXBlKEVmZmVjdC5vckVsc2VTdWNjZWVkKCgpID0+IE9wdGlvbi5ub25lPENvbm5lY3Rpb25DcmVkZW50aWFsPigpKSk7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkID1cbiAgICAgICAgICAgICAgT3B0aW9uLmlzU29tZShzdG9yZWQpICYmICFFcXVhbC5lcXVhbHMoc3RvcmVkLnZhbHVlLCByZWdpc3RyYXRpb24uY3JlZGVudGlhbCk7XG4gICAgICAgICAgICAvLyBPbmx5IGEgYmVhcmVyIHRoYXQgd2FzIGFjdHVhbGx5IHN0b3JlZCBjYW4gYmUgcmV0cmllZCB3aXRoOyBhXG4gICAgICAgICAgICAvLyBmYWlsZWQgd3JpdGUgbGVhdmVzIHRoZSByZWplY3RlZCBvbmUgaW4gcGxhY2UuXG4gICAgICAgICAgICBiZWFyZXJSZXBsYWNlZCA9IHlpZWxkKiBjcmVkZW50aWFsc1xuICAgICAgICAgICAgICAucHV0KHJlZ2lzdHJhdGlvbi50YXJnZXQuY29ubmVjdGlvbklkLCByZWdpc3RyYXRpb24uY3JlZGVudGlhbClcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmFzKGNoYW5nZWQpLFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaCgoZXJyb3IpID0+XG4gICAgICAgICAgICAgICAgICBFZmZlY3QubG9nV2FybmluZyhcIkNvdWxkIG5vdCBzdG9yZSB0aGUgcGxhdGZvcm0gYmVhcmVyIGNyZWRlbnRpYWwuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZDogdGFyZ2V0LmVudmlyb25tZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgfSkucGlwZShFZmZlY3QuYXMoZmFsc2UpKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwZXJzaXN0ZWQpIHtcbiAgICAgICAgICAgIHlpZWxkKiByZWdpc3RyYXRpb25zLnJlbW92ZSh0YXJnZXQuZW52aXJvbm1lbnRJZCkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0LnRhcCgoKSA9PlxuICAgICAgICAgICAgICAgIFJlZi51cGRhdGUocGVyc2lzdGVkRW52aXJvbm1lbnRJZHMsIChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3IFNldChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgIG5leHQuZGVsZXRlKHRhcmdldC5lbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFxuICAgICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgcmVtb3ZlIGEgcGVyc2lzdGVkIHJlZ2lzdHJhdGlvbiBzaGFkb3dlZCBieSBhIHBsYXRmb3JtIGVudmlyb25tZW50LlwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudElkOiB0YXJnZXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBpbnN0YWxsRW50cnlMb2NrZWQoZW50cnksIHsgcmV0YWluRXF1aXZhbGVudFJ1bnRpbWU6IHRydWUgfSk7XG5cbiAgICAgICAgICBpZiAoYmVhcmVyUmVwbGFjZWQgJiYgcmVnaXN0cmF0aW9uLl90YWcgPT09IFwiQmVhcmVyQ29ubmVjdGlvblJlZ2lzdHJhdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChzZXJ2aWNlU2NvcGVzKSkuZ2V0KHRhcmdldC5lbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgIGlmIChzY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0geWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoc2NvcGUuc3VwZXJ2aXNvci5zdGF0ZSk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdGF0ZS5waGFzZSA9PT0gXCJjb25uZWN0aW5nXCIgfHxcbiAgICAgICAgICAgICAgICBzdGF0ZS5waGFzZSA9PT0gXCJiYWNrb2ZmXCIgfHxcbiAgICAgICAgICAgICAgICAoc3RhdGUucGhhc2UgPT09IFwiYmxvY2tlZFwiICYmXG4gICAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0RmFpbHVyZT8uX3RhZyA9PT0gXCJDb25uZWN0aW9uQmxvY2tlZEVycm9yXCIgJiZcbiAgICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RGYWlsdXJlLnJlYXNvbiA9PT0gXCJhdXRoZW50aWNhdGlvblwiKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogc2NvcGUuc3VwZXJ2aXNvci5yZXRyeU5vdztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5waGFzZSA9PT0gXCJjb25uZWN0ZWRcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVnaXN0cmF0aW9uLmNyZWRlbnRpYWwudG9rZW47XG4gICAgICAgICAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGVTb21lKHNjb3BlLnN1cGVydmlzb3IucHJlcGFyZWQsIChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgT3B0aW9uLmlzU29tZShjdXJyZW50KSAmJlxuICAgICAgICAgICAgICAgICAgY3VycmVudC52YWx1ZS50YXJnZXQuX3RhZyA9PT0gXCJCZWFyZXJDb25uZWN0aW9uVGFyZ2V0XCIgJiZcbiAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxDb25uZWN0aW9uSWQoY3VycmVudC52YWx1ZS50YXJnZXQuY29ubmVjdGlvbklkKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLnRhcmdldC5jb25uZWN0aW9uSWQgJiZcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQudmFsdWUuaHR0cEF1dGhvcml6YXRpb24/Ll90YWcgPT09IFwiQmVhcmVyXCIgJiZcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQudmFsdWUuaHR0cEF1dGhvcml6YXRpb24udG9rZW4gIT09IHRva2VuXG4gICAgICAgICAgICAgICAgICAgID8gT3B0aW9uLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBPcHRpb24uc29tZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBBdXRob3JpemF0aW9uOiB7IF90YWc6IFwiQmVhcmVyXCIsIHRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogT3B0aW9uLm5vbmUoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCByZW1vdmVQbGF0Zm9ybUVudmlyb25tZW50ID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS5yZW1vdmVQbGF0Zm9ybUVudmlyb25tZW50XCIpKFxuICAgIGZ1bmN0aW9uKiAoZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCkge1xuICAgICAgeWllbGQqIHdpdGhMZWFzZUxvY2soXG4gICAgICAgIGVudmlyb25tZW50SWQsXG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChlbnRyaWVzKSkuZ2V0KGVudmlyb25tZW50SWQpO1xuICAgICAgICAgIGNvbnN0IHJldm9rZWQgPSB5aWVsZCogcHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnMuZm9yZ2V0KGVudmlyb25tZW50SWQpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwRXJyb3IoKGVycm9yKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QubG9nV2FybmluZyhcbiAgICAgICAgICAgICAgICBcIkNvdWxkIG5vdCBjbGVhciBwdWxsIHJlcXVlc3Qgcm91dGluZyBwZXJtaXNzaW9uIGFmdGVyIHBsYXRmb3JtIHJlbW92YWwuXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LmV4aXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoRXhpdC5pc0ZhaWx1cmUocmV2b2tlZCkpIHJldHVybjtcbiAgICAgICAgICB5aWVsZCogUmVmLnVwZGF0ZShwbGF0Zm9ybUVudmlyb25tZW50SWRzLCAoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQoY3VycmVudCk7XG4gICAgICAgICAgICBuZXh0LmRlbGV0ZShlbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHlpZWxkKiBjbG9zZVNlcnZpY2VTY29wZShlbnZpcm9ubWVudElkKTtcbiAgICAgICAgICB5aWVsZCogU3Vic2NyaXB0aW9uUmVmLnVwZGF0ZShlbnRyaWVzLCAoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAoY3VycmVudCk7XG4gICAgICAgICAgICBuZXh0LmRlbGV0ZShlbnZpcm9ubWVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnRhcmdldC5fdGFnID09PSBcIkJlYXJlckNvbm5lY3Rpb25UYXJnZXRcIikge1xuICAgICAgICAgICAgeWllbGQqIGNyZWRlbnRpYWxzLnJlbW92ZShlbnRyeS50YXJnZXQuY29ubmVjdGlvbklkKS5waXBlKFxuICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFwiQ291bGQgbm90IGNsZWFyIHRoZSBwbGF0Zm9ybSBiZWFyZXIgY3JlZGVudGlhbC5cIiwge1xuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNhY2hlLmNsZWFyKGVudmlyb25tZW50SWQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFwiQ291bGQgbm90IGNsZWFyIGNhY2hlZCBlbnZpcm9ubWVudCBkYXRhIGFmdGVyIHJlbW92YWwuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBvd25lZERhdGFDbGVhbnVwLmNsZWFyKGVudmlyb25tZW50SWQpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIsIGRpc2NhcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCByZWdpc3RlclBsYXRmb3JtID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS5yZWdpc3RlclBsYXRmb3JtXCIpKGZ1bmN0aW9uKiAoXG4gICAgcmVnaXN0cmF0aW9uOiBQcmltYXJ5Q29ubmVjdGlvblJlZ2lzdHJhdGlvbixcbiAgKSB7XG4gICAgeWllbGQqIGluc3RhbGxQbGF0Zm9ybVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pO1xuICB9KTtcblxuICBjb25zdCByZWNvbmNpbGVQbGF0Zm9ybSA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucmVjb25jaWxlUGxhdGZvcm1cIikoZnVuY3Rpb24qIChcbiAgICBwbGF0Zm9ybVJlZ2lzdHJhdGlvbnM6IFJlYWRvbmx5QXJyYXk8UGxhdGZvcm1Db25uZWN0aW9uUmVnaXN0cmF0aW9uPixcbiAgKSB7XG4gICAgY29uc3QgZGVzaXJlZElkcyA9IG5ldyBTZXQoXG4gICAgICBwbGF0Zm9ybVJlZ2lzdHJhdGlvbnMubWFwKChyZWdpc3RyYXRpb24pID0+IHJlZ2lzdHJhdGlvbi50YXJnZXQuZW52aXJvbm1lbnRJZCksXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50UGxhdGZvcm1JZHMgPSB5aWVsZCogUmVmLmdldChwbGF0Zm9ybUVudmlyb25tZW50SWRzKTtcbiAgICB5aWVsZCogRWZmZWN0LmZvckVhY2goXG4gICAgICBjdXJyZW50UGxhdGZvcm1JZHMsXG4gICAgICAoZW52aXJvbm1lbnRJZCkgPT5cbiAgICAgICAgZGVzaXJlZElkcy5oYXMoZW52aXJvbm1lbnRJZCkgPyBFZmZlY3Qudm9pZCA6IHJlbW92ZVBsYXRmb3JtRW52aXJvbm1lbnQoZW52aXJvbm1lbnRJZCksXG4gICAgICB7IGRpc2NhcmQ6IHRydWUgfSxcbiAgICApO1xuICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChwbGF0Zm9ybVJlZ2lzdHJhdGlvbnMsIGluc3RhbGxQbGF0Zm9ybVJlZ2lzdHJhdGlvbiwgeyBkaXNjYXJkOiB0cnVlIH0pO1xuICB9KTtcblxuICAvKiogQ2FsbGVycyBob2xkIGl0cyBsZWFzZSBsb2NrLiAqL1xuICBjb25zdCByZW1vdmVMb2NrZWQgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LnJlbW92ZUxvY2tlZFwiKShmdW5jdGlvbiogKFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICkge1xuICAgIGlmICgoeWllbGQqIFJlZi5nZXQocGxhdGZvcm1FbnZpcm9ubWVudElkcykpLmhhcyhlbnZpcm9ubWVudElkKSkge1xuICAgICAgcmV0dXJuIHlpZWxkKiBuZXcgUGxhdGZvcm1FbnZpcm9ubWVudFJlbW92YWxFcnJvcih7XG4gICAgICAgIGVudmlyb25tZW50SWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSB5aWVsZCogZ2V0RW50cnkoZW52aXJvbm1lbnRJZCk7XG5cbiAgICB5aWVsZCogcHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnMuZm9yZ2V0KGVudmlyb25tZW50SWQpO1xuICAgIHlpZWxkKiByZWdpc3RyYXRpb25zLnJlbW92ZShlbnZpcm9ubWVudElkKTtcbiAgICB5aWVsZCogUmVmLnVwZGF0ZShwZXJzaXN0ZWRFbnZpcm9ubWVudElkcywgKGN1cnJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KGN1cnJlbnQpO1xuICAgICAgbmV4dC5kZWxldGUoZW52aXJvbm1lbnRJZCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICB5aWVsZCogY2xvc2VTZXJ2aWNlU2NvcGUoZW52aXJvbm1lbnRJZCk7XG4gICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoZW50cmllcywgKGN1cnJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKGN1cnJlbnQpO1xuICAgICAgbmV4dC5kZWxldGUoZW52aXJvbm1lbnRJZCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICB5aWVsZCogRWZmZWN0LmFsbChcbiAgICAgIFtcbiAgICAgICAgY2FjaGUuY2xlYXIoZW52aXJvbm1lbnRJZCkucGlwZShcbiAgICAgICAgICBFZmZlY3QuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ1dhcm5pbmcoXCJDb3VsZCBub3QgY2xlYXIgY2FjaGVkIGVudmlyb25tZW50IGRhdGEgYWZ0ZXIgcmVtb3ZhbC5cIiwge1xuICAgICAgICAgICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICAgIG93bmVkRGF0YUNsZWFudXAuY2xlYXIoZW52aXJvbm1lbnRJZCksXG4gICAgICBdLFxuICAgICAgeyBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIiwgZGlzY2FyZDogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIGNvbm5lY3Rpb25Sb3V0ZXMoZW50cnkpKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gT3B0aW9uLmdldE9yTnVsbChyb3V0ZS5wcm9maWxlKTtcbiAgICAgIGlmIChwcm9maWxlICE9PSBudWxsICYmIGlzU3NoQ29ubmVjdGlvblByb2ZpbGUocHJvZmlsZSkpIHtcbiAgICAgICAgeWllbGQqIGRpc2Nvbm5lY3RTc2goZW52aXJvbm1lbnRJZCwgcHJvZmlsZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZW1vdmUgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LnJlbW92ZVwiKShmdW5jdGlvbiogKGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQpIHtcbiAgICByZXR1cm4geWllbGQqIHdpdGhMZWFzZUxvY2soZW52aXJvbm1lbnRJZCwgcmVtb3ZlTG9ja2VkKGVudmlyb25tZW50SWQpKTtcbiAgfSk7XG5cbiAgY29uc3QgZGlzY29ubmVjdFNzaCA9IChlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLCBwcm9maWxlOiBTc2hDb25uZWN0aW9uUHJvZmlsZSkgPT5cbiAgICBzc2guZGlzY29ubmVjdChwcm9maWxlLnRhcmdldCkucGlwZShcbiAgICAgIEVmZmVjdC50YXBFcnJvcigoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFwiQ291bGQgbm90IGRpc2Nvbm5lY3QgdGhlIG1hbmFnZWQgU1NIIGVudmlyb25tZW50LlwiLCB7XG4gICAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgRWZmZWN0Lmlnbm9yZSxcbiAgICApO1xuXG4gIC8vIFBsYWluIEhUVFAgcm91dGVzIGFyZSB1bnVzYWJsZSBmcm9tIGFuIEhUVFBTIHBhZ2UsIHdoaWNoIGJsb2NrcyBtaXhlZCBjb250ZW50LlxuICBjb25zdCBhbGxvd0luc2VjdXJlUm91dGVzID1cbiAgICB0eXBlb2YgZ2xvYmFsVGhpcy5sb2NhdGlvbiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBnbG9iYWxUaGlzLmxvY2F0aW9uLnByb3RvY29sICE9PSBcImh0dHBzOlwiO1xuXG4gIC8qKlxuICAgKiBMZWFybmVkIHJvdXRlcyByZXVzZSB0aGUgYWN0aXZlIHJvdXRlJ3MgY3JlZGVudGlhbCwgc28gdGhleSBkbyBub3QgcmV2b2tlIHB1bGwgcmVxdWVzdCByb3V0aW5nXG4gICAqIHRydXN0IHRoZSB3YXkgYSBuZXdseSBwYWlyZWQgYWRkcmVzcyBkb2VzLlxuICAgKi9cbiAgY29uc3QgbGVhcm5Sb3V0ZXMgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJlZ2lzdHJ5LmxlYXJuUm91dGVzXCIpKGZ1bmN0aW9uKiAoaW5wdXQ6IHtcbiAgICByZWFkb25seSBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkO1xuICAgIHJlYWRvbmx5IGFjdGl2ZVJvdXRlOiBDb25uZWN0aW9uUm91dGU7XG4gICAgcmVhZG9ubHkgcmVwb3J0ZWQ6IFJlYWRvbmx5QXJyYXk8UmVwb3J0ZWRFbmRwb2ludD47XG4gIH0pIHtcbiAgICByZXR1cm4geWllbGQqIHdpdGhMZWFzZUxvY2soXG4gICAgICBpbnB1dC5lbnZpcm9ubWVudElkLFxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoKHlpZWxkKiBSZWYuZ2V0KHBsYXRmb3JtRW52aXJvbm1lbnRJZHMpKS5oYXMoaW5wdXQuZW52aXJvbm1lbnRJZCkpIHtcbiAgICAgICAgICByZXR1cm4gT3B0aW9uLm5vbmU8Q29ubmVjdGlvbkNhdGFsb2dFbnRyeT4oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChlbnRyaWVzKSkuZ2V0KGlucHV0LmVudmlyb25tZW50SWQpO1xuICAgICAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIE9wdGlvbi5ub25lPENvbm5lY3Rpb25DYXRhbG9nRW50cnk+KCk7XG4gICAgICAgIGNvbnN0IHJvdXRlcyA9IG1lcmdlTGVhcm5lZFJvdXRlcyh7XG4gICAgICAgICAgZW50cnksXG4gICAgICAgICAgYWN0aXZlUm91dGU6IGlucHV0LmFjdGl2ZVJvdXRlLFxuICAgICAgICAgIHJlcG9ydGVkOiBpbnB1dC5yZXBvcnRlZCxcbiAgICAgICAgICBhbGxvd0luc2VjdXJlOiBhbGxvd0luc2VjdXJlUm91dGVzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJvdXRlcyA9PT0gbnVsbCkgcmV0dXJuIE9wdGlvbi5ub25lPENvbm5lY3Rpb25DYXRhbG9nRW50cnk+KCk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBlbnRyeVdpdGhSb3V0ZXMoZW50cnksIHJvdXRlcyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzUHJvZmlsZXMgPSBuZXcgTWFwKFxuICAgICAgICAgIGNvbm5lY3Rpb25Sb3V0ZXMoZW50cnkpLm1hcCgocm91dGUpID0+IFtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25Sb3V0ZUlkKHJvdXRlLnRhcmdldCksXG4gICAgICAgICAgICBPcHRpb24uZ2V0T3JOdWxsKHJvdXRlLnByb2ZpbGUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBPcHRpb24uZ2V0T3JOdWxsKHJvdXRlLnByb2ZpbGUpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2ZpbGUgPT09IG51bGwgfHxcbiAgICAgICAgICAgIHByZXZpb3VzUHJvZmlsZXMuZ2V0KGNvbm5lY3Rpb25Sb3V0ZUlkKHJvdXRlLnRhcmdldCkpID09PSBwcm9maWxlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgeWllbGQqIHByb2ZpbGVzLnB1dChwcm9maWxlKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogcmVnaXN0cmF0aW9ucy5zZXRSb3V0ZXMoaW5wdXQuZW52aXJvbm1lbnRJZCwgcGVyc2lzdGVkUm91dGVzKG5leHQpKTtcbiAgICAgICAgY29uc3QgbGVhc2UgPSAoeWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoc2VydmljZVNjb3BlcykpLmdldChpbnB1dC5lbnZpcm9ubWVudElkKTtcbiAgICAgICAgaWYgKGxlYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB5aWVsZCogU3Vic2NyaXB0aW9uUmVmLnVwZGF0ZShzZXJ2aWNlU2NvcGVzLCAoY3VycmVudCkgPT5cbiAgICAgICAgICAgIG5ldyBNYXAoY3VycmVudCkuc2V0KGlucHV0LmVudmlyb25tZW50SWQsIHsgLi4ubGVhc2UsIGVudHJ5OiBuZXh0IH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoZW50cmllcywgKGN1cnJlbnQpID0+XG4gICAgICAgICAgbmV3IE1hcChjdXJyZW50KS5zZXQoaW5wdXQuZW52aXJvbm1lbnRJZCwgbmV4dCksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBPcHRpb24uc29tZShuZXh0KTtcbiAgICAgIH0pLFxuICAgICkucGlwZShcbiAgICAgIEVmZmVjdC5jYXRjaCgoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFwiQ291bGQgbm90IHNhdmUgcm91dGVzIGxlYXJuZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuXCIsIHtcbiAgICAgICAgICBlbnZpcm9ubWVudElkOiBpbnB1dC5lbnZpcm9ubWVudElkLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KS5waXBlKEVmZmVjdC5hcyhPcHRpb24ubm9uZTxDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5PigpKSksXG4gICAgICApLFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbW92ZVJvdXRlID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS5yZW1vdmVSb3V0ZVwiKShmdW5jdGlvbiogKFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgcm91dGVJZDogc3RyaW5nLFxuICApIHtcbiAgICAvLyBPbmUgbG9jayBmb3IgdGhlIHdob2xlIGRlY2lzaW9uOiBhIHJvdXRlIHJlZ2lzdGVyZWQgYmV0d2VlbiBcInRoaXMgd2FzXG4gICAgLy8gdGhlIGxhc3Qgcm91dGVcIiBhbmQgdGhlIHJlbW92YWwgbXVzdCBub3QgYmUgZGVsZXRlZCB3aXRoIGl0LlxuICAgIHlpZWxkKiB3aXRoTGVhc2VMb2NrKFxuICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB5aWVsZCogdXNlckVudHJ5KGVudmlyb25tZW50SWQpO1xuICAgICAgICBjb25zdCByb3V0ZXMgPSBjb25uZWN0aW9uUm91dGVzKGVudHJ5KTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjb25uZWN0aW9uUm91dGVJZChjYW5kaWRhdGUudGFyZ2V0KSA9PT0gcm91dGVJZCk7XG4gICAgICAgIGlmIChyb3V0ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHJvdXRlc0FmdGVyUmVtb3Zpbmcocm91dGVzLCByb3V0ZUlkKTtcbiAgICAgICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHJldHVybiB5aWVsZCogcmVtb3ZlTG9ja2VkKGVudmlyb25tZW50SWQpO1xuICAgICAgICB5aWVsZCogcmVwbGFjZVJvdXRlc0xvY2tlZChlbnRyeSwgcmVtYWluaW5nKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IE9wdGlvbi5nZXRPck51bGwocm91dGUucHJvZmlsZSk7XG4gICAgICAgIGlmIChwcm9maWxlICE9PSBudWxsICYmIGlzU3NoQ29ubmVjdGlvblByb2ZpbGUocHJvZmlsZSkpIHtcbiAgICAgICAgICB5aWVsZCogZGlzY29ubmVjdFNzaChlbnZpcm9ubWVudElkLCBwcm9maWxlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVvcmRlclJvdXRlcyA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucmVvcmRlclJvdXRlc1wiKShmdW5jdGlvbiogKFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgcm91dGVJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgKSB7XG4gICAgeWllbGQqIHdpdGhMZWFzZUxvY2soXG4gICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHlpZWxkKiB1c2VyRW50cnkoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHJvdXRlcyA9IGNvbm5lY3Rpb25Sb3V0ZXMoZW50cnkpO1xuICAgICAgICBjb25zdCBieUlkID0gbmV3IE1hcChyb3V0ZXMubWFwKChyb3V0ZSkgPT4gW2Nvbm5lY3Rpb25Sb3V0ZUlkKHJvdXRlLnRhcmdldCksIHJvdXRlXSkpO1xuICAgICAgICBjb25zdCByZW9yZGVyZWQgPSByb3V0ZUlkcy5mbGF0TWFwKChpZCkgPT4gYnlJZC5nZXQoaWQpID8/IFtdKTtcbiAgICAgICAgaWYgKHJlb3JkZXJlZC5sZW5ndGggIT09IHJvdXRlcy5sZW5ndGggfHwgbmV3IFNldChyb3V0ZUlkcykuc2l6ZSAhPT0gcm91dGVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB5aWVsZCogbmV3IENvbm5lY3Rpb25CbG9ja2VkRXJyb3Ioe1xuICAgICAgICAgICAgcmVhc29uOiBcImNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIGRldGFpbDogXCJUaGUgcm91dGUgb3JkZXIgbXVzdCBsaXN0IGV2ZXJ5IHNhdmVkIHJvdXRlIG9uY2UuXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlb3JkZXJlZC5ldmVyeSgocm91dGUsIGluZGV4KSA9PiByb3V0ZSA9PT0gcm91dGVzW2luZGV4XSkpIHJldHVybjtcbiAgICAgICAgeWllbGQqIHJlcGxhY2VSb3V0ZXNMb2NrZWQoZW50cnksIHJlb3JkZXJlZCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICBjb25zdCByZW1vdmVSZWxheUVudmlyb25tZW50cyA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkucmVtb3ZlUmVsYXlFbnZpcm9ubWVudHNcIikoXG4gICAgZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHJlbGF5RW52aXJvbm1lbnRJZHMgPSBbLi4uKHlpZWxkKiBTdWJzY3JpcHRpb25SZWYuZ2V0KGVudHJpZXMpKS52YWx1ZXMoKV1cbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+XG4gICAgICAgICAgY29ubmVjdGlvblJvdXRlcyhlbnRyeSkuc29tZSgocm91dGUpID0+IHJvdXRlLnRhcmdldC5fdGFnID09PSBcIlJlbGF5Q29ubmVjdGlvblRhcmdldFwiKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudGFyZ2V0LmVudmlyb25tZW50SWQpO1xuXG4gICAgICB5aWVsZCogRWZmZWN0LmZvckVhY2goXG4gICAgICAgIHJlbGF5RW52aXJvbm1lbnRJZHMsXG4gICAgICAgIChlbnZpcm9ubWVudElkKSA9PlxuICAgICAgICAgIHJlbW92ZVJvdXRlKGVudmlyb25tZW50SWQsIFJFTEFZX1JPVVRFX0lEKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoVGFncyh7IEVudmlyb25tZW50Tm90UmVnaXN0ZXJlZEVycm9yOiAoKSA9PiBFZmZlY3Qudm9pZCB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB7XG4gICAgICAgICAgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIsXG4gICAgICAgICAgZGlzY2FyZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCByZXRyeU5vdyA9IChlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkKSA9PlxuICAgIGFjcXVpcmVTdXBlcnZpc29yKGVudmlyb25tZW50SWQpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgoc3VwZXJ2aXNvcikgPT4gc3VwZXJ2aXNvci5yZXRyeU5vdyksXG4gICAgICBFZmZlY3QuY2F0Y2hUYWdzKHsgRW52aXJvbm1lbnROb3RSZWdpc3RlcmVkRXJyb3I6ICgpID0+IEVmZmVjdC52b2lkIH0pLFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS5yZXRyeU5vd1wiKSxcbiAgICApO1xuICBjb25zdCBzZXRFbmFibGVkID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRSZWdpc3RyeS5zZXRFbmFibGVkXCIpKGZ1bmN0aW9uKiAoXG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApIHtcbiAgICB5aWVsZCogd2l0aExlYXNlTG9jayhcbiAgICAgIGVudmlyb25tZW50SWQsXG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0geWllbGQqIGdldEVudHJ5KGVudmlyb25tZW50SWQpO1xuICAgICAgICBjb25zdCByZXRyeVVuc3VwcG9ydGVkID0gZW5hYmxlZCAmJiBlbnRyeS51bnN1cHBvcnRlZFJlYXNvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmV0cnlVbnN1cHBvcnRlZCAmJiAhaGFzU2F2ZWRCZWFyZXJSb3V0ZShlbnRyeSkpIHtcbiAgICAgICAgICByZXR1cm4geWllbGQqIG5ldyBDb25uZWN0aW9uQmxvY2tlZEVycm9yKHtcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgICAgZGV0YWlsOiBlbnRyeS51bnN1cHBvcnRlZFJlYXNvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZW5hYmxlZCA9PT0gZW5hYmxlZCAmJiAhcmV0cnlVbnN1cHBvcnRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh5aWVsZCogUmVmLmdldChwbGF0Zm9ybUVudmlyb25tZW50SWRzKSkuaGFzKGVudmlyb25tZW50SWQpKSB7XG4gICAgICAgICAgeWllbGQqIHJlZ2lzdHJhdGlvbnMuc2V0RW5hYmxlZChlbnZpcm9ubWVudElkLCBlbmFibGVkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGNhY2hlZCByZWplY3Rpb24gY2FuIG91dGxpdmUgYSBzZXJ2ZXIgdXBkYXRlLlxuICAgICAgICBjb25zdCB7IHVuc3VwcG9ydGVkUmVhc29uOiBfcmVhc29uLCBzZXJ2ZXJVcGRhdGVSZXF1aXJlZDogX3VwZGF0ZSwgLi4ucmVzdCB9ID0gZW50cnk7XG4gICAgICAgIGNvbnN0IG5leHQ6IENvbm5lY3Rpb25DYXRhbG9nRW50cnkgPSB7IC4uLihyZXRyeVVuc3VwcG9ydGVkID8gcmVzdCA6IGVudHJ5KSwgZW5hYmxlZCB9O1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGxlYXNlIGluIHBsYWNlIHNvIHRoZSBzdXBlcnZpc29yIGtlZXBzIGl0cyBnZW5lcmF0aW9uIGFuZFxuICAgICAgICAvLyBkdXJhYmxlIHN0cmVhbXM7IGBpbnN0YWxsRW50cnlMb2NrZWRgIHdvdWxkIHRlYXIgaXQgZG93biBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBsZWFzZSA9ICh5aWVsZCogU3Vic2NyaXB0aW9uUmVmLmdldChzZXJ2aWNlU2NvcGVzKSkuZ2V0KGVudmlyb25tZW50SWQpO1xuICAgICAgICBpZiAobGVhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHlpZWxkKiBTdWJzY3JpcHRpb25SZWYudXBkYXRlKHNlcnZpY2VTY29wZXMsIChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NvcGVzID0gbmV3IE1hcChjdXJyZW50KTtcbiAgICAgICAgICAgIG5leHRTY29wZXMuc2V0KGVudmlyb25tZW50SWQsIHsgLi4ubGVhc2UsIGVudHJ5OiBuZXh0IH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5leHRTY29wZXM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoZW50cmllcywgKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0RW50cmllcyA9IG5ldyBNYXAoY3VycmVudCk7XG4gICAgICAgICAgbmV4dEVudHJpZXMuc2V0KGVudmlyb25tZW50SWQsIG5leHQpO1xuICAgICAgICAgIHJldHVybiBuZXh0RW50cmllcztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeWllbGQqIGVuYWJsZWQgPyBsZWFzZS5zdXBlcnZpc29yLmNvbm5lY3QgOiBsZWFzZS5zdXBlcnZpc29yLmRpc2Nvbm5lY3Q7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgIHlpZWxkKiBjcmVhdGVTZXJ2aWNlU2NvcGUobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHN1cGVydmlzb3Igb25seSBvd25zIHRoZSBSUEMgc2Vzc2lvbi4gQSBtYW5hZ2VkIFNTSCBiYWNrZW5kIGFuZFxuICAgICAgICAvLyBpdHMgdHVubmVsIG91dGxpdmUgaXQsIHNvIHN3aXRjaGluZyBvZmYgdGVhcnMgdGhvc2UgZG93biBhcyB3ZWxsLlxuICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIGNvbm5lY3Rpb25Sb3V0ZXMoZW50cnkpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9maWxlID0gT3B0aW9uLmdldE9yTnVsbChyb3V0ZS5wcm9maWxlKTtcbiAgICAgICAgICAgIGlmIChwcm9maWxlICE9PSBudWxsICYmIGlzU3NoQ29ubmVjdGlvblByb2ZpbGUocHJvZmlsZSkpIHtcbiAgICAgICAgICAgICAgeWllbGQqIGRpc2Nvbm5lY3RTc2goZW52aXJvbm1lbnRJZCwgcHJvZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICBjb25zdCBzdGF0ZSA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkuc3RhdGVcIikoZnVuY3Rpb24qIChlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkKSB7XG4gICAgY29uc3Qgc3VwZXJ2aXNvciA9IHlpZWxkKiBhY3F1aXJlU3VwZXJ2aXNvcihlbnZpcm9ubWVudElkKTtcbiAgICByZXR1cm4geWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoc3VwZXJ2aXNvci5zdGF0ZSk7XG4gIH0pO1xuICBjb25zdCBzdGF0ZUNoYW5nZXMgPSAoZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCkgPT5cbiAgICBmb2xsb3dTdHJlYW0oXG4gICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgU3RyZWFtLnVud3JhcChcbiAgICAgICAgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvci5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXAoKHN1cGVydmlzb3IpID0+IFN1YnNjcmlwdGlvblJlZi5jaGFuZ2VzKHN1cGVydmlzb3Iuc3RhdGUpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICB5aWVsZCogRWZmZWN0LmFkZEZpbmFsaXplcigoKSA9PlxuICAgIFN1YnNjcmlwdGlvblJlZi5nZXQoc2VydmljZVNjb3BlcykucGlwZShcbiAgICAgIEVmZmVjdC5mbGF0TWFwKChjdXJyZW50KSA9PlxuICAgICAgICBFZmZlY3QuZm9yRWFjaChjdXJyZW50LnZhbHVlcygpLCAobGVhc2UpID0+IFNjb3BlLmNsb3NlKGxlYXNlLnNjb3BlLCBFeGl0LnZvaWQpLCB7XG4gICAgICAgICAgY29uY3VycmVuY3k6IFwidW5ib3VuZGVkXCIsXG4gICAgICAgICAgZGlzY2FyZDogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICk7XG4gIHlpZWxkKiBjb25uZWN0aXZpdHkuY2hhbmdlcy5waXBlKFxuICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChzdGF0dXMpID0+IFN1YnNjcmlwdGlvblJlZi5zZXQobmV0d29ya1N0YXR1cywgc3RhdHVzKSksXG4gICAgRWZmZWN0LmZvcmtTY29wZWQsXG4gICk7XG5cbiAgY29uc3Qgc2V0Q29tcGF0aWJpbGl0eSA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UmVnaXN0cnkuc2V0Q29tcGF0aWJpbGl0eVwiKShmdW5jdGlvbiogKFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgZXJyb3I6IENvbm5lY3Rpb25CbG9ja2VkRXJyb3IgfCBudWxsLFxuICApIHtcbiAgICB5aWVsZCogd2l0aExlYXNlTG9jayhcbiAgICAgIGVudmlyb25tZW50SWQsXG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gKHlpZWxkKiBTdWJzY3JpcHRpb25SZWYuZ2V0KGVudHJpZXMpKS5nZXQoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbnRyeSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVudHJ5LnVuc3VwcG9ydGVkUmVhc29uID09PSAoZXJyb3I/Lm1lc3NhZ2UgPz8gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgZW50cnkuc2VydmVyVXBkYXRlUmVxdWlyZWQgPT09IChlcnJvcj8uc2VydmVyVXBkYXRlUmVxdWlyZWQgPz8gdW5kZWZpbmVkKSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVuc3VwcG9ydGVkUmVhc29uOiBfcHJldmlvdXNSZWFzb24sXG4gICAgICAgICAgc2VydmVyVXBkYXRlUmVxdWlyZWQ6IF9wcmV2aW91c1VwZGF0ZVJlcXVpcmVkLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSA9IGVudHJ5O1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IHBhdXNlcyBjb25uZWN0aW9ucyB3aXRob3V0IGNoYW5naW5nIHRoZSB1c2VyJ3Mgc2F2ZWQgb24vb2ZmIGNob2ljZS5cbiAgICAgICAgY29uc3QgbmV4dDogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSA9XG4gICAgICAgICAgZXJyb3IgPT09IG51bGxcbiAgICAgICAgICAgID8gcmVzdFxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZFJlYXNvbjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAuLi4oZXJyb3Iuc2VydmVyVXBkYXRlUmVxdWlyZWQgPT09IHRydWUgPyB7IHNlcnZlclVwZGF0ZVJlcXVpcmVkOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxlYXNlID0gKHlpZWxkKiBTdWJzY3JpcHRpb25SZWYuZ2V0KHNlcnZpY2VTY29wZXMpKS5nZXQoZW52aXJvbm1lbnRJZCk7XG4gICAgICAgIGlmIChsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoc2VydmljZVNjb3BlcywgKGN1cnJlbnQpID0+XG4gICAgICAgICAgICBuZXcgTWFwKGN1cnJlbnQpLnNldChlbnZpcm9ubWVudElkLCB7IC4uLmxlYXNlLCBlbnRyeTogbmV4dCB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkgeWllbGQqIGxlYXNlLnN1cGVydmlzb3IuZGlzY29ubmVjdDtcbiAgICAgICAgICBlbHNlIGlmIChuZXh0LmVuYWJsZWQpIHlpZWxkKiBsZWFzZS5zdXBlcnZpc29yLmNvbm5lY3Q7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIFN1YnNjcmlwdGlvblJlZi51cGRhdGUoZW50cmllcywgKGN1cnJlbnQpID0+XG4gICAgICAgICAgbmV3IE1hcChjdXJyZW50KS5zZXQoZW52aXJvbm1lbnRJZCwgbmV4dCksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4gRW52aXJvbm1lbnRSZWdpc3RyeS5vZih7XG4gICAgZW50cmllcyxcbiAgICBuZXR3b3JrU3RhdHVzLFxuICAgIHN0YXJ0LFxuICAgIHJlZ2lzdGVyLFxuICAgIHJlZ2lzdGVyUGxhdGZvcm0sXG4gICAgcmVjb25jaWxlUGxhdGZvcm0sXG4gICAgcmVtb3ZlLFxuICAgIHJlbW92ZVJvdXRlLFxuICAgIHJlb3JkZXJSb3V0ZXMsXG4gICAgcmVtb3ZlUmVsYXlFbnZpcm9ubWVudHMsXG4gICAgcmV0cnlOb3csXG4gICAgc2V0RW5hYmxlZCxcbiAgICBzZXRDb21wYXRpYmlsaXR5LFxuICAgIHN0YXRlLFxuICAgIHN0YXRlQ2hhbmdlcyxcbiAgICBydW4sXG4gICAgcnVuU3RyZWFtLFxuICAgIGZvbGxvd1N0cmVhbSxcbiAgfSk7XG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyID0gTGF5ZXIuZWZmZWN0KEVudmlyb25tZW50UmVnaXN0cnksIG1ha2UpO1xuIl0sImZpbGUiOiIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL3JlZ2lzdHJ5LnRzIn0=

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vcmVnaXN0cnkudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL3JlZ2lzdHJ5LnRzIix7InVybHMiOiI2IiwiaWRzIjoiNyJ9LFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMzAiLCIzMSIsIjMyIl0sW10sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIzMCIsIjMxIiwiMzIiXSx7fSwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL2luZGV4LnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9Db250ZXh0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FZmZlY3QuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0VxdWFsLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FeGl0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9MYXllci5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvT3B0aW9uLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9SZWYuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVtYS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU2NvcGUuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NlbWFwaG9yZS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU3RyZWFtLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9TdWJzY3JpcHRpb25SZWYuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9wbGF0Zm9ybS9jYXBhYmlsaXRpZXMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL2NhdGFsb2cudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL2NyZWRlbnRpYWxTdG9yZS50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vcHJvZmlsZVN0b3JlLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9jb25uZWN0aXZpdHkudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL21vZGVsLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvcGxhdGZvcm0vcGVyc2lzdGVuY2UudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL3N1cGVydmlzb3IudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL2RyaXZlci50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vd2FrZXVwcy50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vcHVsbFJlcXVlc3RSb3V0aW5nUGVybWlzc2lvbnMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL3JvdXRlcy50cyJd