__vite_ssr_exportName__("RelayAgentAwarenessPlatform", () => { try { return RelayAgentAwarenessPlatform } catch {} });
__vite_ssr_exportName__("RelayAgentAwarenessPhase", () => { try { return RelayAgentAwarenessPhase } catch {} });
__vite_ssr_exportName__("RelayAgentAwarenessPreferences", () => { try { return RelayAgentAwarenessPreferences } catch {} });
__vite_ssr_exportName__("RelayApnsEnvironment", () => { try { return RelayApnsEnvironment } catch {} });
__vite_ssr_exportName__("RelayDeviceRegistrationRequest", () => { try { return RelayDeviceRegistrationRequest } catch {} });
__vite_ssr_exportName__("RelayClientDeviceRecord", () => { try { return RelayClientDeviceRecord } catch {} });
__vite_ssr_exportName__("RelayListDevicesResponse", () => { try { return RelayListDevicesResponse } catch {} });
__vite_ssr_exportName__("RelayListDevicesResponseV1", () => { try { return RelayListDevicesResponseV1 } catch {} });
__vite_ssr_exportName__("RelayLiveActivityRegistrationRequest", () => { try { return RelayLiveActivityRegistrationRequest } catch {} });
__vite_ssr_exportName__("RelayDeviceUnregistrationParams", () => { try { return RelayDeviceUnregistrationParams } catch {} });
__vite_ssr_exportName__("RelayAgentActivityState", () => { try { return RelayAgentActivityState } catch {} });
__vite_ssr_exportName__("RelayAgentActivityAggregateRow", () => { try { return RelayAgentActivityAggregateRow } catch {} });
__vite_ssr_exportName__("RelayAgentActivityAggregateState", () => { try { return RelayAgentActivityAggregateState } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointProviderKind", () => { try { return RelayManagedEndpointProviderKind } catch {} });
__vite_ssr_exportName__("RelayManagedEndpoint", () => { try { return RelayManagedEndpoint } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointOrigin", () => { try { return RelayManagedEndpointOrigin } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRuntimeConfig", () => { try { return RelayManagedEndpointRuntimeConfig } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRecoveryRequest", () => { try { return RelayManagedEndpointRecoveryRequest } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRecoveryRegistrationRequest", () => { try { return RelayManagedEndpointRecoveryRegistrationRequest } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRecoveryRegistrationResponse", () => { try { return RelayManagedEndpointRecoveryRegistrationResponse } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRecoveryResponse", () => { try { return RelayManagedEndpointRecoveryResponse } catch {} });
__vite_ssr_exportName__("RelayLinkProofRequest", () => { try { return RelayLinkProofRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConfigRequest", () => { try { return RelayEnvironmentConfigRequest } catch {} });
__vite_ssr_exportName__("RelayManagedEndpointRecoveryProofPayload", () => { try { return RelayManagedEndpointRecoveryProofPayload } catch {} });
__vite_ssr_exportName__("RelayAgentActivityPublishProofPayload", () => { try { return RelayAgentActivityPublishProofPayload } catch {} });
__vite_ssr_exportName__("RelayAgentActivityPublishRequest", () => { try { return RelayAgentActivityPublishRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkScope", () => { try { return RelayEnvironmentLinkScope } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkProofPayload", () => { try { return RelayEnvironmentLinkProofPayload } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkProof", () => { try { return RelayEnvironmentLinkProof } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkChallengeRequest", () => { try { return RelayEnvironmentLinkChallengeRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkChallengeResponse", () => { try { return RelayEnvironmentLinkChallengeResponse } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkRequest", () => { try { return RelayEnvironmentLinkRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkResponse", () => { try { return RelayEnvironmentLinkResponse } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkProofInvalidReason", () => { try { return RelayEnvironmentLinkProofInvalidReason } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkFailedReason", () => { try { return RelayEnvironmentLinkFailedReason } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkUnavailableReason", () => { try { return RelayEnvironmentLinkUnavailableReason } catch {} });
__vite_ssr_exportName__("RelayEnvironmentEndpointUnavailableReason", () => { try { return RelayEnvironmentEndpointUnavailableReason } catch {} });
__vite_ssr_exportName__("RelayEnvironmentEndpointFailure", () => { try { return RelayEnvironmentEndpointFailure } catch {} });
__vite_ssr_exportName__("RelayAgentActivityPublishProofInvalidReason", () => { try { return RelayAgentActivityPublishProofInvalidReason } catch {} });
__vite_ssr_exportName__("RelayAuthInvalidReason", () => { try { return RelayAuthInvalidReason } catch {} });
__vite_ssr_exportName__("RelayDpopFailureReason", () => { try { return RelayDpopFailureReason } catch {} });
__vite_ssr_exportName__("RelayInternalErrorReason", () => { try { return RelayInternalErrorReason } catch {} });
__vite_ssr_exportName__("RelayAuthInvalidError", () => { try { return RelayAuthInvalidError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkProofExpiredError", () => { try { return RelayEnvironmentLinkProofExpiredError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkProofInvalidError", () => { try { return RelayEnvironmentLinkProofInvalidError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConnectNotAuthorizedReason", () => { try { return RelayEnvironmentConnectNotAuthorizedReason } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConnectNotAuthorizedError", () => { try { return RelayEnvironmentConnectNotAuthorizedError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentEndpointUnavailableError", () => { try { return RelayEnvironmentEndpointUnavailableError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentEndpointTimedOutError", () => { try { return RelayEnvironmentEndpointTimedOutError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkFailedError", () => { try { return RelayEnvironmentLinkFailedError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkUnavailableError", () => { try { return RelayEnvironmentLinkUnavailableError } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkLimitExceededError", () => { try { return RelayEnvironmentLinkLimitExceededError } catch {} });
__vite_ssr_exportName__("RelayAgentActivityPublishProofExpiredError", () => { try { return RelayAgentActivityPublishProofExpiredError } catch {} });
__vite_ssr_exportName__("RelayAgentActivityPublishProofInvalidError", () => { try { return RelayAgentActivityPublishProofInvalidError } catch {} });
__vite_ssr_exportName__("RelayInternalError", () => { try { return RelayInternalError } catch {} });
__vite_ssr_exportName__("RelayProtectedError", () => { try { return RelayProtectedError } catch {} });
__vite_ssr_exportName__("RelayClientPrincipal", () => { try { return RelayClientPrincipal } catch {} });
__vite_ssr_exportName__("RelayEnvironmentPrincipal", () => { try { return RelayEnvironmentPrincipal } catch {} });
__vite_ssr_exportName__("RelayClientAuth", () => { try { return RelayClientAuth } catch {} });
__vite_ssr_exportName__("RelayEnvironmentAuth", () => { try { return RelayEnvironmentAuth } catch {} });
__vite_ssr_exportName__("RelayDpopClientAuth", () => { try { return RelayDpopClientAuth } catch {} });
__vite_ssr_exportName__("RelayClientEnvironmentRecord", () => { try { return RelayClientEnvironmentRecord } catch {} });
__vite_ssr_exportName__("RelayListEnvironmentsResponse", () => { try { return RelayListEnvironmentsResponse } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConnectRequest", () => { try { return RelayEnvironmentConnectRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConnectScope", () => { try { return RelayEnvironmentConnectScope } catch {} });
__vite_ssr_exportName__("RelayEnvironmentStatusScope", () => { try { return RelayEnvironmentStatusScope } catch {} });
__vite_ssr_exportName__("RelayMobileRegistrationScope", () => { try { return RelayMobileRegistrationScope } catch {} });
__vite_ssr_exportName__("RelayDpopAccessTokenScope", () => { try { return RelayDpopAccessTokenScope } catch {} });
__vite_ssr_exportName__("RelayDpopTokenExchangeGrantType", () => { try { return RelayDpopTokenExchangeGrantType } catch {} });
__vite_ssr_exportName__("RelayJwtSubjectTokenType", () => { try { return RelayJwtSubjectTokenType } catch {} });
__vite_ssr_exportName__("RelayAccessTokenType", () => { try { return RelayAccessTokenType } catch {} });
__vite_ssr_exportName__("RelayPublicClientId", () => { try { return RelayPublicClientId } catch {} });
__vite_ssr_exportName__("RelayMobileClientId", () => { try { return RelayMobileClientId } catch {} });
__vite_ssr_exportName__("RelayWebClientId", () => { try { return RelayWebClientId } catch {} });
__vite_ssr_exportName__("RelayDpopAccessTokenRequest", () => { try { return RelayDpopAccessTokenRequest } catch {} });
__vite_ssr_exportName__("RelayDpopAccessTokenResponse", () => { try { return RelayDpopAccessTokenResponse } catch {} });
__vite_ssr_exportName__("RelayBearerRequestHeaders", () => { try { return RelayBearerRequestHeaders } catch {} });
__vite_ssr_exportName__("RelayDpopProofRequestHeaders", () => { try { return RelayDpopProofRequestHeaders } catch {} });
__vite_ssr_exportName__("RelayDpopRequestHeaders", () => { try { return RelayDpopRequestHeaders } catch {} });
__vite_ssr_exportName__("RelayAuthorizationServerMetadata", () => { try { return RelayAuthorizationServerMetadata } catch {} });
__vite_ssr_exportName__("RelayProtectedResourceMetadata", () => { try { return RelayProtectedResourceMetadata } catch {} });
__vite_ssr_exportName__("RelayEnvironmentUnlinkParams", () => { try { return RelayEnvironmentUnlinkParams } catch {} });
__vite_ssr_exportName__("RelayEnvironmentConnectResponse", () => { try { return RelayEnvironmentConnectResponse } catch {} });
__vite_ssr_exportName__("RelayEnvironmentStatusValue", () => { try { return RelayEnvironmentStatusValue } catch {} });
__vite_ssr_exportName__("RelayEnvironmentStatusResponse", () => { try { return RelayEnvironmentStatusResponse } catch {} });
__vite_ssr_exportName__("RelayCloudMintCredentialProofPayload", () => { try { return RelayCloudMintCredentialProofPayload } catch {} });
__vite_ssr_exportName__("RelayCloudMintCredentialProof", () => { try { return RelayCloudMintCredentialProof } catch {} });
__vite_ssr_exportName__("RelayCloudMintCredentialRequest", () => { try { return RelayCloudMintCredentialRequest } catch {} });
__vite_ssr_exportName__("RelayCloudEnvironmentHealthProofPayload", () => { try { return RelayCloudEnvironmentHealthProofPayload } catch {} });
__vite_ssr_exportName__("RelayHookDeliveryProofPayload", () => { try { return RelayHookDeliveryProofPayload } catch {} });
__vite_ssr_exportName__("RelayCloudEnvironmentHealthProof", () => { try { return RelayCloudEnvironmentHealthProof } catch {} });
__vite_ssr_exportName__("RelayCloudEnvironmentHealthRequest", () => { try { return RelayCloudEnvironmentHealthRequest } catch {} });
__vite_ssr_exportName__("RelayEnvironmentHealthResponseProofPayload", () => { try { return RelayEnvironmentHealthResponseProofPayload } catch {} });
__vite_ssr_exportName__("RelayEnvironmentHealthResponse", () => { try { return RelayEnvironmentHealthResponse } catch {} });
__vite_ssr_exportName__("RelayEnvironmentMintResponseProofPayload", () => { try { return RelayEnvironmentMintResponseProofPayload } catch {} });
__vite_ssr_exportName__("RelayEnvironmentMintResponse", () => { try { return RelayEnvironmentMintResponse } catch {} });
__vite_ssr_exportName__("RelayDeliveryKind", () => { try { return RelayDeliveryKind } catch {} });
__vite_ssr_exportName__("RelayDeliveryResult", () => { try { return RelayDeliveryResult } catch {} });
__vite_ssr_exportName__("RelayOkResponse", () => { try { return RelayOkResponse } catch {} });
__vite_ssr_exportName__("RelayPublishResponse", () => { try { return RelayPublishResponse } catch {} });
__vite_ssr_exportName__("RelayHealthResponse", () => { try { return RelayHealthResponse } catch {} });
__vite_ssr_exportName__("RelayRegisterDeviceEndpoint", () => { try { return RelayRegisterDeviceEndpoint } catch {} });
__vite_ssr_exportName__("RelayRegisterLiveActivityEndpoint", () => { try { return RelayRegisterLiveActivityEndpoint } catch {} });
__vite_ssr_exportName__("RelayAgentActivitySnapshotResponse", () => { try { return RelayAgentActivitySnapshotResponse } catch {} });
__vite_ssr_exportName__("RelayAgentActivitySnapshotEndpoint", () => { try { return RelayAgentActivitySnapshotEndpoint } catch {} });
__vite_ssr_exportName__("RelayUnregisterDeviceEndpoint", () => { try { return RelayUnregisterDeviceEndpoint } catch {} });
__vite_ssr_exportName__("RelayExchangeDpopAccessTokenEndpoint", () => { try { return RelayExchangeDpopAccessTokenEndpoint } catch {} });
__vite_ssr_exportName__("RelayConnectEnvironmentEndpoint", () => { try { return RelayConnectEnvironmentEndpoint } catch {} });
__vite_ssr_exportName__("RelayGetEnvironmentStatusEndpoint", () => { try { return RelayGetEnvironmentStatusEndpoint } catch {} });
__vite_ssr_exportName__("RelayEnvironmentLinkPreferencesRequest", () => { try { return RelayEnvironmentLinkPreferencesRequest } catch {} });
__vite_ssr_exportName__("RelayWakeHeldHooksResponse", () => { try { return RelayWakeHeldHooksResponse } catch {} });
__vite_ssr_exportName__("RelayApi", () => { try { return RelayApi } catch {} });
const __vite_ssr_import_0__ = 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_1__ = 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_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/http-api/HttpApi.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/http-api/HttpApiEndpoint.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/http-api/HttpApiGroup.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/http-api/HttpApiMiddleware.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/http-api/HttpApiSchema.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/http-api/HttpApiSecurity.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/http-api/OpenApi.js");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/baseSchemas.ts", {"importedNames":["DpopFailureReason","EnvironmentId","ThreadId","TrimmedNonEmptyString"]});
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/environment.ts", {"importedNames":["ExecutionEnvironmentDescriptor"]});











const RelayAgentAwarenessPlatform = __vite_ssr_import_1__.Literals(["ios", "android"]);
const RelayAgentAwarenessPhase = __vite_ssr_import_1__.Literals([
	"starting",
	"running",
	"waiting_for_approval",
	"waiting_for_input",
	"completed",
	"failed",
	"stale"
]);
const RelayAgentAwarenessPreferences = __vite_ssr_import_1__.Struct({
	liveActivitiesEnabled: __vite_ssr_import_1__.Boolean,
	notificationsEnabled: __vite_ssr_import_1__.Boolean,
	notifyOnApproval: __vite_ssr_import_1__.Boolean,
	notifyOnInput: __vite_ssr_import_1__.Boolean,
	notifyOnCompletion: __vite_ssr_import_1__.Boolean,
	notifyOnFailure: __vite_ssr_import_1__.Boolean
});
const RelayApnsEnvironment = __vite_ssr_import_1__.Literals(["sandbox", "production"]);
const RelayDeviceRegistrationRequest = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	label: __vite_ssr_import_9__.TrimmedNonEmptyString,
	platform: RelayAgentAwarenessPlatform,
	iosMajorVersion: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(18))),
	androidApiLevel: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(24))),
	appVersion: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	// APNs topic must match the variant's bundle id; development-signed builds use sandbox tokens.
	bundleId: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	apsEnvironment: __vite_ssr_import_1__.optional(RelayApnsEnvironment),
	pushToken: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	pushToStartToken: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	preferences: RelayAgentAwarenessPreferences
}).check(__vite_ssr_import_1__.makeFilter((device) => device.platform === "ios" ? device.iosMajorVersion !== undefined : device.androidApiLevel !== undefined && device.iosMajorVersion === undefined && device.apsEnvironment === undefined && device.pushToStartToken === undefined));
const RelayClientDeviceRecord = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	label: __vite_ssr_import_9__.TrimmedNonEmptyString,
	platform: RelayAgentAwarenessPlatform,
	iosMajorVersion: __vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(18))),
	androidApiLevel: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.Int)),
	appVersion: __vite_ssr_import_1__.NullOr((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	notifications: __vite_ssr_import_1__.Struct({
		enabled: __vite_ssr_import_1__.Boolean,
		notifyOnApproval: __vite_ssr_import_1__.Boolean,
		notifyOnInput: __vite_ssr_import_1__.Boolean,
		notifyOnCompletion: __vite_ssr_import_1__.Boolean,
		notifyOnFailure: __vite_ssr_import_1__.Boolean
	}),
	liveActivities: __vite_ssr_import_1__.Struct({ enabled: __vite_ssr_import_1__.Boolean }),
	updatedAt: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayListDevicesResponse = __vite_ssr_import_1__.Struct({ devices: __vite_ssr_import_1__.Array(RelayClientDeviceRecord) });
// Installed clients decode v1 as iOS-only. Keep that response contract frozen.
const RelayListDevicesResponseV1 = __vite_ssr_import_1__.Struct({ devices: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Struct({
	...RelayClientDeviceRecord.fields,
	platform: __vite_ssr_import_1__.Literal("ios"),
	iosMajorVersion: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(18))
})) });
const RelayLiveActivityRegistrationRequest = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	activityPushToken: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayDeviceUnregistrationParams = __vite_ssr_import_1__.Struct({ deviceId: __vite_ssr_import_9__.TrimmedNonEmptyString });
const RelayAgentActivityState = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	threadId: __vite_ssr_import_9__.ThreadId,
	projectTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	threadTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	phase: RelayAgentAwarenessPhase,
	headline: __vite_ssr_import_9__.TrimmedNonEmptyString,
	detail: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	modelTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	updatedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	deepLink: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayAgentActivityAggregateRow = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	threadId: __vite_ssr_import_9__.ThreadId,
	projectTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	threadTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	modelTitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	phase: RelayAgentAwarenessPhase,
	status: __vite_ssr_import_9__.TrimmedNonEmptyString,
	updatedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	deepLink: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayAgentActivityAggregateState = __vite_ssr_import_1__.Struct({
	title: __vite_ssr_import_9__.TrimmedNonEmptyString,
	subtitle: __vite_ssr_import_9__.TrimmedNonEmptyString,
	activeCount: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(0)),
	updatedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	activities: __vite_ssr_import_1__.Array(RelayAgentActivityAggregateRow)
});
const RelayManagedEndpointProviderKind = __vite_ssr_import_1__.Literals([
	"manual",
	"cloudflare_tunnel",
	"t3_relay"
]);
const RelayManagedEndpoint = __vite_ssr_import_1__.Struct({
	httpBaseUrl: __vite_ssr_import_9__.TrimmedNonEmptyString,
	wsBaseUrl: __vite_ssr_import_9__.TrimmedNonEmptyString,
	providerKind: RelayManagedEndpointProviderKind
});
const RelayManagedEndpointOrigin = __vite_ssr_import_1__.Struct({
	localHttpHost: __vite_ssr_import_9__.TrimmedNonEmptyString,
	localHttpPort: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThanOrEqualTo(1), __vite_ssr_import_1__.isLessThanOrEqualTo(65535))
});
const RelayManagedEndpointRuntimeConfig = __vite_ssr_import_1__.Struct({
	providerKind: RelayManagedEndpointProviderKind,
	connectorToken: __vite_ssr_import_9__.TrimmedNonEmptyString,
	tunnelId: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	tunnelName: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString))
});
const RelayManagedEndpointRecoveryRequest = __vite_ssr_import_1__.Struct({
	cloudUserId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	origin: RelayManagedEndpointOrigin,
	proof: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayManagedEndpointRecoveryRegistrationRequest = __vite_ssr_import_1__.Struct({
	cloudUserId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	tunnelId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	origin: RelayManagedEndpointOrigin,
	proof: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayManagedEndpointRecoveryRegistrationResponse = __vite_ssr_import_1__.Struct({ status: __vite_ssr_import_1__.Literals(["ready", "recovery_required"]) });
const RelayManagedEndpointRecoveryResponse = __vite_ssr_import_1__.Struct({
	endpoint: RelayManagedEndpoint,
	endpointRuntime: RelayManagedEndpointRuntimeConfig
});
const RelayLinkProofRequest = __vite_ssr_import_1__.Struct({
	challenge: __vite_ssr_import_1__.String,
	relayIssuer: __vite_ssr_import_1__.String,
	endpoint: RelayManagedEndpoint,
	origin: RelayManagedEndpointOrigin
});
const RelayEnvironmentConfigRequest = __vite_ssr_import_1__.Struct({
	relayUrl: __vite_ssr_import_1__.String,
	relayIssuer: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	cloudUserId: __vite_ssr_import_1__.String,
	environmentCredential: __vite_ssr_import_1__.String,
	cloudMintPublicKey: __vite_ssr_import_1__.String,
	endpointRuntime: __vite_ssr_import_1__.NullOr(RelayManagedEndpointRuntimeConfig)
});
const RelaySignedJwtRegisteredClaims = {
	iss: __vite_ssr_import_9__.TrimmedNonEmptyString,
	aud: __vite_ssr_import_9__.TrimmedNonEmptyString,
	sub: __vite_ssr_import_9__.TrimmedNonEmptyString,
	jti: __vite_ssr_import_9__.TrimmedNonEmptyString,
	iat: __vite_ssr_import_1__.Int,
	exp: __vite_ssr_import_1__.Int
};
const RelayManagedEndpointRecoveryProofPayload = __vite_ssr_import_1__.Union([__vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	action: __vite_ssr_import_1__.Literal("register"),
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	cloudUserId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	tunnelId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	origin: RelayManagedEndpointOrigin
}), __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	action: __vite_ssr_import_1__.Literal("recover"),
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	cloudUserId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	origin: RelayManagedEndpointOrigin
})]);
const RelayAgentActivityPublishProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	threadId: __vite_ssr_import_9__.ThreadId,
	state: __vite_ssr_import_1__.NullOr(RelayAgentActivityState)
});
const RelayAgentActivityPublishRequest = __vite_ssr_import_1__.Struct({
	state: __vite_ssr_import_1__.NullOr(RelayAgentActivityState).annotate({ description: "Current agent-awareness state, or null to remove the published state." }),
	proof: __vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Environment-signed JWT covering this published activity state." })
}).annotate({ description: "Publishes a signed agent-awareness update from an environment." });
const RelayEnvironmentLinkScope = __vite_ssr_import_1__.Literals(["agent_activity_notifications", "managed_tunnels"]);
const RelayEnvironmentLinkProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	challenge: __vite_ssr_import_9__.TrimmedNonEmptyString,
	descriptor: __vite_ssr_import_10__.ExecutionEnvironmentDescriptor,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	environmentPublicKey: __vite_ssr_import_9__.TrimmedNonEmptyString,
	endpoint: RelayManagedEndpoint,
	origin: RelayManagedEndpointOrigin,
	scopes: __vite_ssr_import_1__.Array(RelayEnvironmentLinkScope)
});
const RelayEnvironmentLinkProof = __vite_ssr_import_9__.TrimmedNonEmptyString;
const RelayEnvironmentLinkChallengeRequest = __vite_ssr_import_1__.Struct({
	notificationsEnabled: __vite_ssr_import_1__.Boolean.annotate({ description: "Whether this link may deliver push notifications." }),
	liveActivitiesEnabled: __vite_ssr_import_1__.Boolean.annotate({ description: "Whether this link may update Live Activities." }),
	managedTunnelsEnabled: __vite_ssr_import_1__.Boolean.annotate({ description: "Whether the relay should provision a managed tunnel for this environment." })
}).annotate({ description: "Requested capabilities for a new environment-link challenge." });
const RelayEnvironmentLinkChallengeResponse = __vite_ssr_import_1__.Struct({
	challenge: __vite_ssr_import_9__.TrimmedNonEmptyString,
	expiresAt: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentLinkRequest = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_1__.optional(__vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Optional client device identifier associated with this link." })),
	proof: RelayEnvironmentLinkProof.annotate({ description: "Environment-signed proof bound to a previously issued link challenge." }),
	notificationsEnabled: __vite_ssr_import_1__.Boolean,
	liveActivitiesEnabled: __vite_ssr_import_1__.Boolean,
	managedTunnelsEnabled: __vite_ssr_import_1__.Boolean
}).annotate({ description: "Links an authenticated cloud user to a T3 environment." });
const RelayEnvironmentLinkResponse = __vite_ssr_import_1__.Struct({
	ok: __vite_ssr_import_1__.Boolean,
	cloudUserId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	endpoint: RelayManagedEndpoint,
	endpointRuntime: __vite_ssr_import_1__.NullOr(RelayManagedEndpointRuntimeConfig),
	relayIssuer: __vite_ssr_import_9__.TrimmedNonEmptyString,
	environmentCredential: __vite_ssr_import_9__.TrimmedNonEmptyString,
	cloudMintPublicKey: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentLinkProofInvalidReason = __vite_ssr_import_1__.Literals([
	"invalid_signature_or_scope",
	"descriptor_mismatch",
	"replayed_nonce",
	"challenge_invalid",
	"origin_not_allowed",
	"endpoint_not_secure"
]);
const RelayEnvironmentLinkFailedReason = __vite_ssr_import_1__.Literals([
	"link_persistence_failed",
	"credential_persistence_failed",
	"replay_persistence_failed",
	"internal_error"
]);
const RelayEnvironmentLinkUnavailableReason = __vite_ssr_import_1__.Literals(["managed_endpoint_not_configured", "managed_endpoint_provisioning_failed"]);
const RelayEnvironmentEndpointUnavailableReason = __vite_ssr_import_1__.Literals(["endpoint_request_failed", "endpoint_response_invalid"]);
/**
* Which part of the path from the relay to the environment failed. `tunnel_down`
* means Cloudflare has no live connector for the tunnel; `origin_unreachable`
* means the tunnel answered but T3 Code behind it did not. Optional on the wire
* so old relays and old clients keep working.
*/
const RelayEnvironmentEndpointFailure = __vite_ssr_import_1__.Literals([
	"tunnel_down",
	"origin_unreachable",
	"dns",
	"tls",
	"refused",
	"timeout",
	"invalid_response",
	"unknown"
]);
const RelayAgentActivityPublishProofInvalidReason = __vite_ssr_import_1__.Literals(["invalid_signature_or_payload", "replayed_nonce"]);
const RelayAuthInvalidReason = __vite_ssr_import_1__.Literals([
	"missing_bearer",
	"invalid_bearer",
	"invalid_dpop",
	"not_authorized"
]);
const RelayDpopFailureReason = __vite_ssr_import_9__.DpopFailureReason;
const RelayInternalErrorReason = __vite_ssr_import_1__.Literals([
	"database_unavailable",
	"persistence_failed",
	"upstream_unavailable",
	"internal_error"
]);
class RelayAuthInvalidError extends __vite_ssr_import_1__.TaggedError()("RelayAuthInvalidError", {
	code: __vite_ssr_import_1__.Literal("auth_invalid"),
	reason: RelayAuthInvalidReason,
	dpopFailureReason: __vite_ssr_import_1__.optionalKey(RelayDpopFailureReason),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 401 }) {
	get message() {
		return `Relay authentication failed: ${this.reason}`;
	}
};
class RelayEnvironmentLinkProofExpiredError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentLinkProofExpiredError", {
	code: __vite_ssr_import_1__.Literal("environment_link_proof_expired"),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 401 }) {
	get message() {
		return "Relay environment link proof expired";
	}
};
class RelayEnvironmentLinkProofInvalidError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentLinkProofInvalidError", {
	code: __vite_ssr_import_1__.Literal("environment_link_proof_invalid"),
	reason: RelayEnvironmentLinkProofInvalidReason,
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 400 }) {
	get message() {
		return `Relay environment link proof is invalid: ${this.reason}`;
	}
};
const RelayEnvironmentConnectNotAuthorizedReason = __vite_ssr_import_1__.Literals([
	"client_proof_key_thumbprint_missing",
	"environment_link_not_found",
	"endpoint_provider_not_managed",
	"managed_endpoint_allocation_not_found",
	"managed_endpoint_base_domain_not_configured",
	"managed_endpoint_allocation_not_ready",
	"managed_endpoint_hostname_invalid",
	"managed_endpoint_mismatch"
]);
class RelayEnvironmentConnectNotAuthorizedError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentConnectNotAuthorizedError", {
	code: __vite_ssr_import_1__.Literal("environment_connect_not_authorized"),
	reason: __vite_ssr_import_1__.optional(RelayEnvironmentConnectNotAuthorizedReason),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 403 }) {
	get message() {
		return this.reason ? `Relay environment connection is not authorized: ${this.reason}` : "Relay environment connection is not authorized";
	}
};
class RelayEnvironmentEndpointUnavailableError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentEndpointUnavailableError", {
	code: __vite_ssr_import_1__.Literal("environment_endpoint_unavailable"),
	reason: RelayEnvironmentEndpointUnavailableReason,
	endpointFailure: __vite_ssr_import_1__.optionalKey(RelayEnvironmentEndpointFailure),
	endpointStatus: __vite_ssr_import_1__.optionalKey(__vite_ssr_import_1__.Number),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 502 }) {
	get message() {
		return `Relay environment endpoint is unavailable: ${this.reason}`;
	}
};
class RelayEnvironmentEndpointTimedOutError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentEndpointTimedOutError", {
	code: __vite_ssr_import_1__.Literal("environment_endpoint_timed_out"),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 504 }) {
	get message() {
		return "Relay environment endpoint request timed out";
	}
};
class RelayEnvironmentLinkFailedError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentLinkFailedError", {
	code: __vite_ssr_import_1__.Literal("environment_link_failed"),
	reason: RelayEnvironmentLinkFailedReason,
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 500 }) {
	get message() {
		return `Relay environment link failed: ${this.reason}`;
	}
};
class RelayEnvironmentLinkUnavailableError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentLinkUnavailableError", {
	code: __vite_ssr_import_1__.Literal("environment_link_unavailable"),
	reason: RelayEnvironmentLinkUnavailableReason,
	provisioningStage: __vite_ssr_import_1__.optionalKey((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 503 }) {
	get message() {
		return `Relay environment link is unavailable: ${this.reason}`;
	}
};
class RelayEnvironmentLinkLimitExceededError extends __vite_ssr_import_1__.TaggedError()("RelayEnvironmentLinkLimitExceededError", {
	code: __vite_ssr_import_1__.Literal("environment_link_limit_exceeded"),
	maxTunnels: __vite_ssr_import_1__.Number,
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 403 }) {
	get message() {
		return `Relay managed tunnel limit reached: this account allows at most ${this.maxTunnels} tunnels`;
	}
};
class RelayAgentActivityPublishProofExpiredError extends __vite_ssr_import_1__.TaggedError()("RelayAgentActivityPublishProofExpiredError", {
	code: __vite_ssr_import_1__.Literal("agent_activity_publish_proof_expired"),
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 401 }) {
	get message() {
		return "Relay agent activity publish proof expired";
	}
};
class RelayAgentActivityPublishProofInvalidError extends __vite_ssr_import_1__.TaggedError()("RelayAgentActivityPublishProofInvalidError", {
	code: __vite_ssr_import_1__.Literal("agent_activity_publish_proof_invalid"),
	reason: RelayAgentActivityPublishProofInvalidReason,
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 401 }) {
	get message() {
		return `Relay agent activity publish proof is invalid: ${this.reason}`;
	}
};
class RelayInternalError extends __vite_ssr_import_1__.TaggedError()("RelayInternalError", {
	code: __vite_ssr_import_1__.Literal("internal_error"),
	reason: RelayInternalErrorReason,
	traceId: __vite_ssr_import_9__.TrimmedNonEmptyString
}, { httpApiStatus: 500 }) {
	get message() {
		return `Relay internal error: ${this.reason}`;
	}
};
const RelayProtectedError = __vite_ssr_import_1__.Union([
	RelayAuthInvalidError,
	RelayEnvironmentLinkProofExpiredError,
	RelayEnvironmentLinkProofInvalidError,
	RelayEnvironmentConnectNotAuthorizedError,
	RelayEnvironmentEndpointUnavailableError,
	RelayEnvironmentEndpointTimedOutError,
	RelayEnvironmentLinkFailedError,
	RelayEnvironmentLinkUnavailableError,
	RelayEnvironmentLinkLimitExceededError,
	RelayAgentActivityPublishProofExpiredError,
	RelayAgentActivityPublishProofInvalidError,
	RelayInternalError
]);
const RelayAuthAndInternalErrors = [RelayAuthInvalidError, RelayInternalError];
const RelayEnvironmentLinkErrors = [
	RelayAuthInvalidError,
	RelayEnvironmentLinkProofExpiredError,
	RelayEnvironmentLinkProofInvalidError,
	RelayEnvironmentLinkUnavailableError,
	RelayEnvironmentLinkLimitExceededError,
	RelayEnvironmentLinkFailedError,
	RelayInternalError
];
const RelayEnvironmentConnectErrors = [
	RelayAuthInvalidError,
	RelayEnvironmentConnectNotAuthorizedError,
	RelayEnvironmentEndpointUnavailableError,
	RelayEnvironmentEndpointTimedOutError,
	RelayInternalError
];
const RelayAgentActivityPublishErrors = [
	RelayAuthInvalidError,
	RelayAgentActivityPublishProofExpiredError,
	RelayAgentActivityPublishProofInvalidError,
	RelayInternalError
];
class RelayClientPrincipal extends __vite_ssr_import_0__.Service()("@t3tools/contracts/relay/RelayClientPrincipal") {};
class RelayEnvironmentPrincipal extends __vite_ssr_import_0__.Service()("@t3tools/contracts/relay/RelayEnvironmentPrincipal") {};
const RelayClientBearerAuthorization = __vite_ssr_import_7__.http({ scheme: "bearer" }).pipe(__vite_ssr_import_7__.annotate(__vite_ssr_import_8__.Description, "Clerk session or OAuth bearer token for the signed-in T3 Connect user."));
class RelayClientAuth extends __vite_ssr_import_5__.Service()("RelayClientAuth", {
	error: RelayAuthInvalidError,
	security: { clientBearer: RelayClientBearerAuthorization }
}) {};
const RelayEnvironmentBearerAuthorization = __vite_ssr_import_7__.http({ scheme: "bearer" }).pipe(__vite_ssr_import_7__.annotate(__vite_ssr_import_8__.Description, "Relay-issued environment credential installed when the environment is linked."));
class RelayEnvironmentAuth extends __vite_ssr_import_5__.Service()("RelayEnvironmentAuth", {
	error: [RelayAuthInvalidError, RelayInternalError],
	security: { environmentBearer: RelayEnvironmentBearerAuthorization }
}) {};
const RelayDpopAuthorization = __vite_ssr_import_7__.http({ scheme: "DPoP" }).pipe(__vite_ssr_import_7__.annotate(__vite_ssr_import_8__.Description, "DPoP-bound access token. Requests must also include the DPoP proof JWT header."));
class RelayDpopClientAuth extends __vite_ssr_import_5__.Service()("RelayDpopClientAuth", {
	error: RelayAuthInvalidError,
	security: { relayDpop: RelayDpopAuthorization }
}) {};
const RelayClientEnvironmentRecord = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	label: __vite_ssr_import_9__.TrimmedNonEmptyString,
	endpoint: RelayManagedEndpoint,
	linkedAt: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayListEnvironmentsResponse = __vite_ssr_import_1__.Struct({ environments: __vite_ssr_import_1__.Array(RelayClientEnvironmentRecord) });
const RelayEnvironmentConnectRequest = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_1__.optional(__vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Optional client device identifier requesting the connection." })),
	clientKeyThumbprint: __vite_ssr_import_1__.optional(__vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Deprecated alias for clientProofKeyThumbprint." })),
	clientProofKeyThumbprint: __vite_ssr_import_1__.optional(__vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "JWK thumbprint that the minted environment credential must be bound to." }))
}).annotate({ description: "Requests a short-lived credential for connecting to an environment." });
const RelayEnvironmentConnectScope = "environment:connect";
const RelayEnvironmentStatusScope = "environment:status";
const RelayMobileRegistrationScope = "mobile:registration";
const RelayDpopAccessTokenScope = __vite_ssr_import_1__.Literals([
	RelayEnvironmentConnectScope,
	RelayEnvironmentStatusScope,
	RelayMobileRegistrationScope
]);
const RelayDpopTokenExchangeGrantType = "urn:ietf:params:oauth:grant-type:token-exchange";
const RelayJwtSubjectTokenType = "urn:ietf:params:oauth:token-type:jwt";
const RelayAccessTokenType = "urn:ietf:params:oauth:token-type:access_token";
const RelayPublicClientId = __vite_ssr_import_1__.Literals(["t3-mobile", "t3-web"]);
const RelayMobileClientId = "t3-mobile";
const RelayWebClientId = "t3-web";
const RelayDpopAccessTokenRequest = __vite_ssr_import_1__.Struct({
	grant_type: __vite_ssr_import_1__.Literal(RelayDpopTokenExchangeGrantType),
	subject_token: __vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Clerk bearer token for the signed-in cloud user." }),
	subject_token_type: __vite_ssr_import_1__.Literal(RelayJwtSubjectTokenType),
	requested_token_type: __vite_ssr_import_1__.Literal(RelayAccessTokenType),
	resource: __vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Relay issuer URL that will receive the DPoP-bound access token." }),
	scope: __vite_ssr_import_9__.TrimmedNonEmptyString.annotate({ description: "Space-separated relay scopes requested by the client." }),
	client_id: RelayPublicClientId
}).annotate({ description: "OAuth token exchange request for a DPoP-bound relay access token." }).pipe(__vite_ssr_import_6__.asFormUrlEncoded());
const RelayDpopAccessTokenResponse = __vite_ssr_import_1__.Struct({
	access_token: __vite_ssr_import_9__.TrimmedNonEmptyString,
	issued_token_type: __vite_ssr_import_1__.Literal(RelayAccessTokenType),
	token_type: __vite_ssr_import_1__.Literal("DPoP"),
	expires_in: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isGreaterThan(0)),
	scope: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayBearerRequestHeaders = __vite_ssr_import_1__.Struct({ authorization: __vite_ssr_import_9__.TrimmedNonEmptyString });
const RelayDpopProofRequestHeaders = __vite_ssr_import_1__.Struct({ dpop: __vite_ssr_import_9__.TrimmedNonEmptyString });
const RelayDpopRequestHeaders = __vite_ssr_import_1__.Struct({
	authorization: __vite_ssr_import_9__.TrimmedNonEmptyString,
	dpop: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayAuthorizationServerMetadata = __vite_ssr_import_1__.Struct({
	issuer: __vite_ssr_import_9__.TrimmedNonEmptyString,
	token_endpoint: __vite_ssr_import_9__.TrimmedNonEmptyString,
	grant_types_supported: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal(RelayDpopTokenExchangeGrantType)),
	token_endpoint_auth_methods_supported: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal("none")),
	dpop_signing_alg_values_supported: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal("ES256")),
	scopes_supported: __vite_ssr_import_1__.Array(RelayDpopAccessTokenScope)
});
const RelayProtectedResourceMetadata = __vite_ssr_import_1__.Struct({
	resource: __vite_ssr_import_9__.TrimmedNonEmptyString,
	authorization_servers: __vite_ssr_import_1__.Array((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	scopes_supported: __vite_ssr_import_1__.Array(RelayDpopAccessTokenScope),
	dpop_bound_access_tokens_required: __vite_ssr_import_1__.Boolean,
	dpop_signing_alg_values_supported: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal("ES256"))
});
const RelayEnvironmentUnlinkParams = __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId });
const RelayEnvironmentConnectResponse = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	endpoint: RelayManagedEndpoint,
	credential: __vite_ssr_import_9__.TrimmedNonEmptyString,
	expiresAt: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentStatusValue = __vite_ssr_import_1__.Literals(["online", "offline"]);
const RelayEnvironmentOfflineReason = __vite_ssr_import_1__.Literals(["tunnel_released"]);
const RelayEnvironmentStatusResponse = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	endpoint: RelayManagedEndpoint,
	status: RelayEnvironmentStatusValue,
	checkedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	descriptor: __vite_ssr_import_1__.optional((0,__vite_ssr_import_10__.ExecutionEnvironmentDescriptor)),
	error: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	endpointFailure: __vite_ssr_import_1__.optional(RelayEnvironmentEndpointFailure),
	endpointStatus: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Number),
	offlineReason: __vite_ssr_import_1__.optional(RelayEnvironmentOfflineReason),
	traceId: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString))
});
const RelayCloudMintCredentialProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	clientProofKeyThumbprint: __vite_ssr_import_9__.TrimmedNonEmptyString,
	cnf: __vite_ssr_import_1__.Struct({ jkt: __vite_ssr_import_9__.TrimmedNonEmptyString }),
	deviceId: __vite_ssr_import_1__.optional((0,__vite_ssr_import_9__.TrimmedNonEmptyString)),
	nonce: __vite_ssr_import_9__.TrimmedNonEmptyString,
	scope: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal("environment:connect"))
});
const RelayCloudMintCredentialProof = __vite_ssr_import_9__.TrimmedNonEmptyString;
const RelayCloudMintCredentialRequest = __vite_ssr_import_1__.Struct({ proof: RelayCloudMintCredentialProof });
const RelayCloudEnvironmentHealthProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	nonce: __vite_ssr_import_9__.TrimmedNonEmptyString,
	scope: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Literal("environment:status"))
});
/** Verify x-t3-relay-delivery with the relay mint key before trusting delivery id, time, or trace context. */
const RelayHookDeliveryProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	deliveryId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	receivedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	hookId: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayCloudEnvironmentHealthProof = __vite_ssr_import_9__.TrimmedNonEmptyString;
const RelayCloudEnvironmentHealthRequest = __vite_ssr_import_1__.Struct({ proof: RelayCloudEnvironmentHealthProof });
const RelayEnvironmentHealthResponseProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	requestNonce: __vite_ssr_import_9__.TrimmedNonEmptyString,
	status: __vite_ssr_import_1__.Literal("online"),
	descriptor: __vite_ssr_import_10__.ExecutionEnvironmentDescriptor,
	checkedAt: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentHealthResponse = __vite_ssr_import_1__.Struct({
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	status: __vite_ssr_import_1__.Literal("online"),
	descriptor: __vite_ssr_import_10__.ExecutionEnvironmentDescriptor,
	checkedAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	proof: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentMintResponseProofPayload = __vite_ssr_import_1__.Struct({
	...RelaySignedJwtRegisteredClaims,
	environmentId: __vite_ssr_import_9__.EnvironmentId,
	clientProofKeyThumbprint: __vite_ssr_import_9__.TrimmedNonEmptyString,
	requestNonce: __vite_ssr_import_9__.TrimmedNonEmptyString,
	credential: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayEnvironmentMintResponse = __vite_ssr_import_1__.Struct({
	credential: __vite_ssr_import_9__.TrimmedNonEmptyString,
	expiresAt: __vite_ssr_import_9__.TrimmedNonEmptyString,
	proof: __vite_ssr_import_9__.TrimmedNonEmptyString
});
const RelayDeliveryKind = __vite_ssr_import_1__.Literals([
	"live_activity_start",
	"live_activity_update",
	"live_activity_end",
	"push_notification"
]);
const RelayDeliveryResult = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_9__.TrimmedNonEmptyString,
	kind: RelayDeliveryKind,
	ok: __vite_ssr_import_1__.Boolean,
	queued: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	apnsStatus: __vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.Number),
	apnsReason: __vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.String),
	apnsId: __vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.String)
});
const RelayOkResponse = __vite_ssr_import_1__.Struct({ ok: __vite_ssr_import_1__.Boolean });
const RelayPublishResponse = __vite_ssr_import_1__.Struct({
	ok: __vite_ssr_import_1__.Boolean,
	deliveries: __vite_ssr_import_1__.Array(RelayDeliveryResult)
});
const RelayHealthResponse = __vite_ssr_import_1__.Struct({
	ok: __vite_ssr_import_1__.Boolean,
	service: __vite_ssr_import_1__.Literal("relay")
});
const RelayHealthGroup = __vite_ssr_import_4__.make("health").add(__vite_ssr_import_3__.get("health", "/health", {
	success: RelayHealthResponse,
	error: RelayInternalError
}).annotate(__vite_ssr_import_8__.Summary, "Check relay health")).annotate(__vite_ssr_import_8__.Description, "Service health and readiness.");
const RelayMetadataGroup = __vite_ssr_import_4__.make("metadata").add(__vite_ssr_import_3__.get("authorizationServer", "/.well-known/oauth-authorization-server", { success: RelayAuthorizationServerMetadata }).annotate(__vite_ssr_import_8__.Summary, "Read OAuth authorization-server metadata"), __vite_ssr_import_3__.get("protectedResource", "/.well-known/oauth-protected-resource", { success: RelayProtectedResourceMetadata }).annotate(__vite_ssr_import_8__.Summary, "Read OAuth protected-resource metadata")).annotate(__vite_ssr_import_8__.Description, "OAuth and DPoP discovery metadata.");
const RelayRegisterDeviceEndpoint = __vite_ssr_import_3__.post("registerDevice", "/v1/mobile/devices", {
	headers: RelayDpopRequestHeaders,
	payload: RelayDeviceRegistrationRequest,
	success: RelayOkResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Register or update a mobile device");
const RelayRegisterLiveActivityEndpoint = __vite_ssr_import_3__.post("registerLiveActivity", "/v1/mobile/live-activities", {
	headers: RelayDpopRequestHeaders,
	payload: RelayLiveActivityRegistrationRequest,
	success: RelayOkResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Register a Live Activity push token");
const RelayAgentActivitySnapshotResponse = __vite_ssr_import_1__.Struct({ aggregate: __vite_ssr_import_1__.NullOr(RelayAgentActivityAggregateState) });
const RelayAgentActivitySnapshotEndpoint = __vite_ssr_import_3__.get("getAgentActivitySnapshot", "/v1/mobile/agent-activity", {
	headers: RelayDpopRequestHeaders,
	success: RelayAgentActivitySnapshotResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Read the current Live Activity aggregate");
const RelayUnregisterDeviceEndpoint = __vite_ssr_import_3__.delete("unregisterDevice", "/v1/mobile/devices/:deviceId", {
	headers: RelayDpopRequestHeaders,
	params: RelayDeviceUnregistrationParams,
	success: RelayOkResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Unregister a mobile device");
const RelayMobileGroup = __vite_ssr_import_4__.make("mobile").add(RelayRegisterDeviceEndpoint, RelayRegisterLiveActivityEndpoint, RelayAgentActivitySnapshotEndpoint, RelayUnregisterDeviceEndpoint).annotate(__vite_ssr_import_8__.Description, "Mobile push-notification and Live Activity registration.").middleware(RelayDpopClientAuth);
const RelayClientGroup = __vite_ssr_import_4__.make("client").add(__vite_ssr_import_3__.get("listEnvironments", "/v1/environments", {
	headers: RelayBearerRequestHeaders,
	success: RelayListEnvironmentsResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "List linked environments"), __vite_ssr_import_3__.get("listDevices", "/v1/client/devices", {
	headers: RelayBearerRequestHeaders,
	success: RelayListDevicesResponseV1,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "List registered iOS devices (legacy clients)"), __vite_ssr_import_3__.get("listDevicesV2", "/v2/client/devices", {
	headers: RelayBearerRequestHeaders,
	success: RelayListDevicesResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "List registered mobile devices"), __vite_ssr_import_3__.post("linkEnvironment", "/v1/client/environment-links", {
	headers: RelayBearerRequestHeaders,
	payload: RelayEnvironmentLinkRequest,
	success: RelayEnvironmentLinkResponse,
	error: RelayEnvironmentLinkErrors
}).annotate(__vite_ssr_import_8__.Summary, "Link an environment"), __vite_ssr_import_3__.post("createEnvironmentLinkChallenge", "/v1/client/environment-link-challenges", {
	headers: RelayBearerRequestHeaders,
	payload: RelayEnvironmentLinkChallengeRequest,
	success: RelayEnvironmentLinkChallengeResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Create an environment-link challenge"), __vite_ssr_import_3__.delete("unlinkEnvironment", "/v1/client/environment-links/:environmentId", {
	headers: RelayBearerRequestHeaders,
	params: RelayEnvironmentUnlinkParams,
	success: RelayOkResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Unlink an environment"), __vite_ssr_import_3__.delete("releaseEnvironmentTunnel", "/v1/client/environment-links/:environmentId/tunnel", {
	headers: RelayBearerRequestHeaders,
	params: RelayEnvironmentUnlinkParams,
	success: RelayOkResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Release an environment's managed tunnel").annotate(__vite_ssr_import_8__.Description, "Deletes the provisioned Cloudflare tunnel while keeping the environment link and its hostname reservation, so a later link re-provisions the tunnel under the same URL. Environments call this when they shut down; Cloudflare bills per provisioned tunnel, so idle tunnels should not outlive their environment.")).annotate(__vite_ssr_import_8__.Description, "Cloud-user environment links and registered devices.").middleware(RelayClientAuth);
const RelayExchangeDpopAccessTokenEndpoint = __vite_ssr_import_3__.post("exchangeDpopAccessToken", "/v1/client/dpop-token", {
	headers: RelayDpopProofRequestHeaders,
	payload: RelayDpopAccessTokenRequest,
	success: RelayDpopAccessTokenResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Exchange a Clerk token for a DPoP access token").annotate(__vite_ssr_import_8__.Description, "Bootstrap endpoint. Send the DPoP proof JWT in the dpop header and the Clerk token in subject_token. The returned access token is bound to the proof key.");
const RelayTokenGroup = __vite_ssr_import_4__.make("token").add(RelayExchangeDpopAccessTokenEndpoint).annotate(__vite_ssr_import_8__.Description, "OAuth token exchange for DPoP-bound client access.");
const RelayConnectEnvironmentEndpoint = __vite_ssr_import_3__.post("connectEnvironment", "/v1/environments/:environmentId/connect", {
	headers: RelayDpopRequestHeaders,
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	payload: RelayEnvironmentConnectRequest,
	success: RelayEnvironmentConnectResponse,
	error: RelayEnvironmentConnectErrors
}).annotate(__vite_ssr_import_8__.Summary, "Connect to an environment");
const RelayGetEnvironmentStatusEndpoint = __vite_ssr_import_3__.post("getEnvironmentStatus", "/v1/environments/:environmentId/status", {
	headers: RelayDpopRequestHeaders,
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	success: RelayEnvironmentStatusResponse,
	error: RelayEnvironmentConnectErrors
}).annotate(__vite_ssr_import_8__.Summary, "Check environment status");
const RelayDpopClientGroup = __vite_ssr_import_4__.make("dpopClient").add(RelayConnectEnvironmentEndpoint, RelayGetEnvironmentStatusEndpoint).annotate(__vite_ssr_import_8__.Description, "DPoP-authenticated client access to linked environments.").middleware(RelayDpopClientAuth);
const RelayEnvironmentLinkPreferencesRequest = __vite_ssr_import_1__.Struct({ holdWebhooksWhileOffline: __vite_ssr_import_1__.Boolean });
const RelayWakeHeldHooksResponse = __vite_ssr_import_1__.Struct({ pending: __vite_ssr_import_1__.Boolean });
const RelayServerGroup = __vite_ssr_import_4__.make("server").add(__vite_ssr_import_3__.post("registerManagedEndpointRecovery", "/v1/environments/:environmentId/tunnel/recovery", {
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	payload: RelayManagedEndpointRecoveryRegistrationRequest,
	success: RelayManagedEndpointRecoveryRegistrationResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Register managed tunnel recovery without provisioning"), __vite_ssr_import_3__.post("recoverManagedEndpoint", "/v1/environments/:environmentId/tunnel", {
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	payload: RelayManagedEndpointRecoveryRequest,
	success: RelayManagedEndpointRecoveryResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Recover an environment's managed tunnel"), __vite_ssr_import_3__.post("publishAgentActivity", "/v1/environments/:environmentId/threads/:threadId/agent-activity", {
	params: __vite_ssr_import_1__.Struct({
		environmentId: __vite_ssr_import_9__.EnvironmentId,
		threadId: __vite_ssr_import_9__.ThreadId
	}),
	payload: RelayAgentActivityPublishRequest,
	success: RelayPublishResponse,
	error: RelayAgentActivityPublishErrors
}).annotate(__vite_ssr_import_8__.Summary, "Publish agent activity"), __vite_ssr_import_3__.post("updateLinkPreferences", "/v1/environments/:environmentId/link-preferences", {
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	payload: RelayEnvironmentLinkPreferencesRequest,
	success: RelayEnvironmentLinkPreferencesRequest,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Update an environment's link preferences"), __vite_ssr_import_3__.post("wakeHeldHooks", "/v1/environments/:environmentId/hooks/wake", {
	params: __vite_ssr_import_1__.Struct({ environmentId: __vite_ssr_import_9__.EnvironmentId }),
	success: RelayWakeHeldHooksResponse,
	error: RelayAuthAndInternalErrors
}).annotate(__vite_ssr_import_8__.Summary, "Deliver webhook requests held while the environment was offline now")).annotate(__vite_ssr_import_8__.Description, "Environment-authenticated activity publication.").middleware(RelayEnvironmentAuth);
// Path token authenticates; forward raw bytes for signature verification.
// endpointKey is the managed endpoint hash, not the account-linkable environment id.
const RelayHookParams = __vite_ssr_import_1__.Struct({
	endpointKey: __vite_ssr_import_1__.String,
	hookId: __vite_ssr_import_1__.String,
	token: __vite_ssr_import_1__.String
});
const RELAY_HOOK_PATH = "/v1/hooks/:endpointKey/:hookId/:token";
const relayHookEndpoint = { params: RelayHookParams };
const RelayHooksGroup = __vite_ssr_import_4__.make("hooks").add(__vite_ssr_import_3__.post("forwardPost", RELAY_HOOK_PATH, relayHookEndpoint), __vite_ssr_import_3__.put("forwardPut", RELAY_HOOK_PATH, relayHookEndpoint), __vite_ssr_import_3__.patch("forwardPatch", RELAY_HOOK_PATH, relayHookEndpoint), __vite_ssr_import_3__.get("forwardGet", RELAY_HOOK_PATH, relayHookEndpoint)).annotate(__vite_ssr_import_8__.Description, "Forward webhook requests to an environment.");
const RelayApi = __vite_ssr_import_2__.make("RelayApi").add(RelayHealthGroup, RelayMetadataGroup, RelayMobileGroup, RelayClientGroup, RelayTokenGroup, RelayDpopClientGroup, RelayServerGroup, RelayHooksGroup).annotate(__vite_ssr_import_8__.Title, "T3 Code Relay API").annotate(__vite_ssr_import_8__.Version, "1.0.0").annotate(__vite_ssr_import_8__.Description, "Control-plane API for linking T3 environments, connecting authorized clients, and publishing agent activity.");
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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QUFJLGNBQWMsaUJBQWlCLGlCQUFpQixHQUNwRSxzQkFBZ0IsTUFBTSxnQkFBZ0IsaUJBQWlCLGlCQUFpQixHQUN4RSxzQkFBZ0IsSUFBSSxjQUFjLGlCQUFpQixpQkFBaUIsQ0FDdEUsQ0FBQyxDQUNBLFNBQVMsc0JBQVEsYUFBYSw2Q0FBNkM7QUFFdkUsTUFBTSxXQUFXLHNCQUFRLEtBQUssVUFBVSxDQUFDLENBQzdDLElBQ0Msa0JBQ0Esb0JBQ0Esa0JBQ0Esa0JBQ0EsaUJBQ0Esc0JBQ0Esa0JBQ0EsZUFDRixDQUFDLENBQ0EsU0FBUyxzQkFBUSxPQUFPLG1CQUFtQixDQUFDLENBQzVDLFNBQVMsc0JBQVEsU0FBUyxPQUFPLENBQUMsQ0FDbEMsU0FDQyxzQkFBUSxhQUNSLDhHQUNGIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJyZWxheS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDb250ZXh0IGZyb20gXCJlZmZlY3QvQ29udGV4dFwiO1xuaW1wb3J0ICogYXMgU2NoZW1hIGZyb20gXCJlZmZlY3QvU2NoZW1hXCI7XG5pbXBvcnQgKiBhcyBIdHRwQXBpIGZyb20gXCJlZmZlY3QvaHR0cC1hcGkvSHR0cEFwaVwiO1xuaW1wb3J0ICogYXMgSHR0cEFwaUVuZHBvaW50IGZyb20gXCJlZmZlY3QvaHR0cC1hcGkvSHR0cEFwaUVuZHBvaW50XCI7XG5pbXBvcnQgKiBhcyBIdHRwQXBpR3JvdXAgZnJvbSBcImVmZmVjdC9odHRwLWFwaS9IdHRwQXBpR3JvdXBcIjtcbmltcG9ydCAqIGFzIEh0dHBBcGlNaWRkbGV3YXJlIGZyb20gXCJlZmZlY3QvaHR0cC1hcGkvSHR0cEFwaU1pZGRsZXdhcmVcIjtcbmltcG9ydCAqIGFzIEh0dHBBcGlTY2hlbWEgZnJvbSBcImVmZmVjdC9odHRwLWFwaS9IdHRwQXBpU2NoZW1hXCI7XG5pbXBvcnQgKiBhcyBIdHRwQXBpU2VjdXJpdHkgZnJvbSBcImVmZmVjdC9odHRwLWFwaS9IdHRwQXBpU2VjdXJpdHlcIjtcbmltcG9ydCAqIGFzIE9wZW5BcGkgZnJvbSBcImVmZmVjdC9odHRwLWFwaS9PcGVuQXBpXCI7XG5cbmltcG9ydCB7XG4gIERwb3BGYWlsdXJlUmVhc29uLFxuICBFbnZpcm9ubWVudElkLFxuICBUaHJlYWRJZCxcbiAgVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSBmcm9tIFwiLi9iYXNlU2NoZW1hcy50c1wiO1xuaW1wb3J0IHsgRXhlY3V0aW9uRW52aXJvbm1lbnREZXNjcmlwdG9yIH0gZnJvbSBcIi4vZW52aXJvbm1lbnQudHNcIjtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QWdlbnRBd2FyZW5lc3NQbGF0Zm9ybSA9IFNjaGVtYS5MaXRlcmFscyhbXCJpb3NcIiwgXCJhbmRyb2lkXCJdKTtcbmV4cG9ydCB0eXBlIFJlbGF5QWdlbnRBd2FyZW5lc3NQbGF0Zm9ybSA9IHR5cGVvZiBSZWxheUFnZW50QXdhcmVuZXNzUGxhdGZvcm0uVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QWdlbnRBd2FyZW5lc3NQaGFzZSA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwic3RhcnRpbmdcIixcbiAgXCJydW5uaW5nXCIsXG4gIFwid2FpdGluZ19mb3JfYXBwcm92YWxcIixcbiAgXCJ3YWl0aW5nX2Zvcl9pbnB1dFwiLFxuICBcImNvbXBsZXRlZFwiLFxuICBcImZhaWxlZFwiLFxuICBcInN0YWxlXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5QWdlbnRBd2FyZW5lc3NQaGFzZSA9IHR5cGVvZiBSZWxheUFnZW50QXdhcmVuZXNzUGhhc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QWdlbnRBd2FyZW5lc3NQcmVmZXJlbmNlcyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBsaXZlQWN0aXZpdGllc0VuYWJsZWQ6IFNjaGVtYS5Cb29sZWFuLFxuICBub3RpZmljYXRpb25zRW5hYmxlZDogU2NoZW1hLkJvb2xlYW4sXG4gIG5vdGlmeU9uQXBwcm92YWw6IFNjaGVtYS5Cb29sZWFuLFxuICBub3RpZnlPbklucHV0OiBTY2hlbWEuQm9vbGVhbixcbiAgbm90aWZ5T25Db21wbGV0aW9uOiBTY2hlbWEuQm9vbGVhbixcbiAgbm90aWZ5T25GYWlsdXJlOiBTY2hlbWEuQm9vbGVhbixcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEF3YXJlbmVzc1ByZWZlcmVuY2VzID0gdHlwZW9mIFJlbGF5QWdlbnRBd2FyZW5lc3NQcmVmZXJlbmNlcy5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBcG5zRW52aXJvbm1lbnQgPSBTY2hlbWEuTGl0ZXJhbHMoW1wic2FuZGJveFwiLCBcInByb2R1Y3Rpb25cIl0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBcG5zRW52aXJvbm1lbnQgPSB0eXBlb2YgUmVsYXlBcG5zRW52aXJvbm1lbnQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBkZXZpY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBsYWJlbDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBwbGF0Zm9ybTogUmVsYXlBZ2VudEF3YXJlbmVzc1BsYXRmb3JtLFxuICBpb3NNYWpvclZlcnNpb246IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDE4KSkpLFxuICBhbmRyb2lkQXBpTGV2ZWw6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDI0KSkpLFxuICBhcHBWZXJzaW9uOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgLy8gQVBOcyB0b3BpYyBtdXN0IG1hdGNoIHRoZSB2YXJpYW50J3MgYnVuZGxlIGlkOyBkZXZlbG9wbWVudC1zaWduZWQgYnVpbGRzIHVzZSBzYW5kYm94IHRva2Vucy5cbiAgYnVuZGxlSWQ6IFNjaGVtYS5vcHRpb25hbChUcmltbWVkTm9uRW1wdHlTdHJpbmcpLFxuICBhcHNFbnZpcm9ubWVudDogU2NoZW1hLm9wdGlvbmFsKFJlbGF5QXBuc0Vudmlyb25tZW50KSxcbiAgcHVzaFRva2VuOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgcHVzaFRvU3RhcnRUb2tlbjogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWROb25FbXB0eVN0cmluZyksXG4gIHByZWZlcmVuY2VzOiBSZWxheUFnZW50QXdhcmVuZXNzUHJlZmVyZW5jZXMsXG59KS5jaGVjayhcbiAgU2NoZW1hLm1ha2VGaWx0ZXIoKGRldmljZSkgPT5cbiAgICBkZXZpY2UucGxhdGZvcm0gPT09IFwiaW9zXCJcbiAgICAgID8gZGV2aWNlLmlvc01ham9yVmVyc2lvbiAhPT0gdW5kZWZpbmVkXG4gICAgICA6IGRldmljZS5hbmRyb2lkQXBpTGV2ZWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBkZXZpY2UuaW9zTWFqb3JWZXJzaW9uID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGV2aWNlLmFwc0Vudmlyb25tZW50ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGV2aWNlLnB1c2hUb1N0YXJ0VG9rZW4gPT09IHVuZGVmaW5lZCxcbiAgKSxcbik7XG5leHBvcnQgdHlwZSBSZWxheURldmljZVJlZ2lzdHJhdGlvblJlcXVlc3QgPSB0eXBlb2YgUmVsYXlEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUNsaWVudERldmljZVJlY29yZCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBkZXZpY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBsYWJlbDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBwbGF0Zm9ybTogUmVsYXlBZ2VudEF3YXJlbmVzc1BsYXRmb3JtLFxuICBpb3NNYWpvclZlcnNpb246IFNjaGVtYS5OdWxsT3IoU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygxOCkpKSxcbiAgYW5kcm9pZEFwaUxldmVsOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLk51bGxPcihTY2hlbWEuSW50KSksXG4gIGFwcFZlcnNpb246IFNjaGVtYS5OdWxsT3IoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgbm90aWZpY2F0aW9uczogU2NoZW1hLlN0cnVjdCh7XG4gICAgZW5hYmxlZDogU2NoZW1hLkJvb2xlYW4sXG4gICAgbm90aWZ5T25BcHByb3ZhbDogU2NoZW1hLkJvb2xlYW4sXG4gICAgbm90aWZ5T25JbnB1dDogU2NoZW1hLkJvb2xlYW4sXG4gICAgbm90aWZ5T25Db21wbGV0aW9uOiBTY2hlbWEuQm9vbGVhbixcbiAgICBub3RpZnlPbkZhaWx1cmU6IFNjaGVtYS5Cb29sZWFuLFxuICB9KSxcbiAgbGl2ZUFjdGl2aXRpZXM6IFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIGVuYWJsZWQ6IFNjaGVtYS5Cb29sZWFuLFxuICB9KSxcbiAgdXBkYXRlZEF0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5Q2xpZW50RGV2aWNlUmVjb3JkID0gdHlwZW9mIFJlbGF5Q2xpZW50RGV2aWNlUmVjb3JkLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUxpc3REZXZpY2VzUmVzcG9uc2UgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlczogU2NoZW1hLkFycmF5KFJlbGF5Q2xpZW50RGV2aWNlUmVjb3JkKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlMaXN0RGV2aWNlc1Jlc3BvbnNlID0gdHlwZW9mIFJlbGF5TGlzdERldmljZXNSZXNwb25zZS5UeXBlO1xuXG4vLyBJbnN0YWxsZWQgY2xpZW50cyBkZWNvZGUgdjEgYXMgaU9TLW9ubHkuIEtlZXAgdGhhdCByZXNwb25zZSBjb250cmFjdCBmcm96ZW4uXG5leHBvcnQgY29uc3QgUmVsYXlMaXN0RGV2aWNlc1Jlc3BvbnNlVjEgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlczogU2NoZW1hLkFycmF5KFxuICAgIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgLi4uUmVsYXlDbGllbnREZXZpY2VSZWNvcmQuZmllbGRzLFxuICAgICAgcGxhdGZvcm06IFNjaGVtYS5MaXRlcmFsKFwiaW9zXCIpLFxuICAgICAgaW9zTWFqb3JWZXJzaW9uOiBTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDE4KSksXG4gICAgfSksXG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5TGl2ZUFjdGl2aXR5UmVnaXN0cmF0aW9uUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBkZXZpY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBhY3Rpdml0eVB1c2hUb2tlbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUxpdmVBY3Rpdml0eVJlZ2lzdHJhdGlvblJlcXVlc3QgPSB0eXBlb2YgUmVsYXlMaXZlQWN0aXZpdHlSZWdpc3RyYXRpb25SZXF1ZXN0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheURldmljZVVucmVnaXN0cmF0aW9uUGFyYW1zID0gU2NoZW1hLlN0cnVjdCh7XG4gIGRldmljZUlkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5RGV2aWNlVW5yZWdpc3RyYXRpb25QYXJhbXMgPSB0eXBlb2YgUmVsYXlEZXZpY2VVbnJlZ2lzdHJhdGlvblBhcmFtcy5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBZ2VudEFjdGl2aXR5U3RhdGUgPSBTY2hlbWEuU3RydWN0KHtcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICBwcm9qZWN0VGl0bGU6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgdGhyZWFkVGl0bGU6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgcGhhc2U6IFJlbGF5QWdlbnRBd2FyZW5lc3NQaGFzZSxcbiAgaGVhZGxpbmU6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgZGV0YWlsOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgbW9kZWxUaXRsZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB1cGRhdGVkQXQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgZGVlcExpbms6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEFjdGl2aXR5U3RhdGUgPSB0eXBlb2YgUmVsYXlBZ2VudEFjdGl2aXR5U3RhdGUuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVJvdyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICB0aHJlYWRJZDogVGhyZWFkSWQsXG4gIHByb2plY3RUaXRsZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB0aHJlYWRUaXRsZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBtb2RlbFRpdGxlOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHBoYXNlOiBSZWxheUFnZW50QXdhcmVuZXNzUGhhc2UsXG4gIHN0YXR1czogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB1cGRhdGVkQXQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgZGVlcExpbms6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEFjdGl2aXR5QWdncmVnYXRlUm93ID0gdHlwZW9mIFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVJvdy5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBZ2VudEFjdGl2aXR5QWdncmVnYXRlU3RhdGUgPSBTY2hlbWEuU3RydWN0KHtcbiAgdGl0bGU6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgc3VidGl0bGU6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgYWN0aXZlQ291bnQ6IFNjaGVtYS5JbnQuY2hlY2soU2NoZW1hLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCkpLFxuICB1cGRhdGVkQXQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgYWN0aXZpdGllczogU2NoZW1hLkFycmF5KFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVJvdyksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVN0YXRlID0gdHlwZW9mIFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVN0YXRlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheU1hbmFnZWRFbmRwb2ludFByb3ZpZGVyS2luZCA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwibWFudWFsXCIsXG4gIFwiY2xvdWRmbGFyZV90dW5uZWxcIixcbiAgXCJ0M19yZWxheVwiLFxuXSk7XG5leHBvcnQgdHlwZSBSZWxheU1hbmFnZWRFbmRwb2ludFByb3ZpZGVyS2luZCA9IHR5cGVvZiBSZWxheU1hbmFnZWRFbmRwb2ludFByb3ZpZGVyS2luZC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlNYW5hZ2VkRW5kcG9pbnQgPSBTY2hlbWEuU3RydWN0KHtcbiAgaHR0cEJhc2VVcmw6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgd3NCYXNlVXJsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHByb3ZpZGVyS2luZDogUmVsYXlNYW5hZ2VkRW5kcG9pbnRQcm92aWRlcktpbmQsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5TWFuYWdlZEVuZHBvaW50ID0gdHlwZW9mIFJlbGF5TWFuYWdlZEVuZHBvaW50LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheU1hbmFnZWRFbmRwb2ludE9yaWdpbiA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBsb2NhbEh0dHBIb3N0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGxvY2FsSHR0cFBvcnQ6IFNjaGVtYS5JbnQuY2hlY2soXG4gICAgU2NoZW1hLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMSksXG4gICAgU2NoZW1hLmlzTGVzc1RoYW5PckVxdWFsVG8oNjVfNTM1KSxcbiAgKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlNYW5hZ2VkRW5kcG9pbnRPcmlnaW4gPSB0eXBlb2YgUmVsYXlNYW5hZ2VkRW5kcG9pbnRPcmlnaW4uVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5TWFuYWdlZEVuZHBvaW50UnVudGltZUNvbmZpZyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBwcm92aWRlcktpbmQ6IFJlbGF5TWFuYWdlZEVuZHBvaW50UHJvdmlkZXJLaW5kLFxuICBjb25uZWN0b3JUb2tlbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB0dW5uZWxJZDogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWROb25FbXB0eVN0cmluZyksXG4gIHR1bm5lbE5hbWU6IFNjaGVtYS5vcHRpb25hbChUcmltbWVkTm9uRW1wdHlTdHJpbmcpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheU1hbmFnZWRFbmRwb2ludFJ1bnRpbWVDb25maWcgPSB0eXBlb2YgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSdW50aW1lQ29uZmlnLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBjbG91ZFVzZXJJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBvcmlnaW46IFJlbGF5TWFuYWdlZEVuZHBvaW50T3JpZ2luLFxuICBwcm9vZjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVxdWVzdCA9IHR5cGVvZiBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlZ2lzdHJhdGlvblJlcXVlc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgY2xvdWRVc2VySWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgdHVubmVsSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgb3JpZ2luOiBSZWxheU1hbmFnZWRFbmRwb2ludE9yaWdpbixcbiAgcHJvb2Y6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlZ2lzdHJhdGlvblJlcXVlc3QgPVxuICB0eXBlb2YgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlZ2lzdHJhdGlvblJlcXVlc3QuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5TWFuYWdlZEVuZHBvaW50UmVjb3ZlcnlSZWdpc3RyYXRpb25SZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBzdGF0dXM6IFNjaGVtYS5MaXRlcmFscyhbXCJyZWFkeVwiLCBcInJlY292ZXJ5X3JlcXVpcmVkXCJdKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlZ2lzdHJhdGlvblJlc3BvbnNlID1cbiAgdHlwZW9mIFJlbGF5TWFuYWdlZEVuZHBvaW50UmVjb3ZlcnlSZWdpc3RyYXRpb25SZXNwb25zZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlc3BvbnNlID0gU2NoZW1hLlN0cnVjdCh7XG4gIGVuZHBvaW50OiBSZWxheU1hbmFnZWRFbmRwb2ludCxcbiAgZW5kcG9pbnRSdW50aW1lOiBSZWxheU1hbmFnZWRFbmRwb2ludFJ1bnRpbWVDb25maWcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5TWFuYWdlZEVuZHBvaW50UmVjb3ZlcnlSZXNwb25zZSA9IHR5cGVvZiBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVzcG9uc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5TGlua1Byb29mUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBjaGFsbGVuZ2U6IFNjaGVtYS5TdHJpbmcsXG4gIHJlbGF5SXNzdWVyOiBTY2hlbWEuU3RyaW5nLFxuICBlbmRwb2ludDogUmVsYXlNYW5hZ2VkRW5kcG9pbnQsXG4gIG9yaWdpbjogUmVsYXlNYW5hZ2VkRW5kcG9pbnRPcmlnaW4sXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5TGlua1Byb29mUmVxdWVzdCA9IHR5cGVvZiBSZWxheUxpbmtQcm9vZlJlcXVlc3QuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRDb25maWdSZXF1ZXN0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIHJlbGF5VXJsOiBTY2hlbWEuU3RyaW5nLFxuICByZWxheUlzc3VlcjogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcpLFxuICBjbG91ZFVzZXJJZDogU2NoZW1hLlN0cmluZyxcbiAgZW52aXJvbm1lbnRDcmVkZW50aWFsOiBTY2hlbWEuU3RyaW5nLFxuICBjbG91ZE1pbnRQdWJsaWNLZXk6IFNjaGVtYS5TdHJpbmcsXG4gIGVuZHBvaW50UnVudGltZTogU2NoZW1hLk51bGxPcihSZWxheU1hbmFnZWRFbmRwb2ludFJ1bnRpbWVDb25maWcpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50Q29uZmlnUmVxdWVzdCA9IHR5cGVvZiBSZWxheUVudmlyb25tZW50Q29uZmlnUmVxdWVzdC5UeXBlO1xuXG5jb25zdCBSZWxheVNpZ25lZEp3dFJlZ2lzdGVyZWRDbGFpbXMgPSB7XG4gIGlzczogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBhdWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgc3ViOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGp0aTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBpYXQ6IFNjaGVtYS5JbnQsXG4gIGV4cDogU2NoZW1hLkludCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UHJvb2ZQYXlsb2FkID0gU2NoZW1hLlVuaW9uKFtcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgLi4uUmVsYXlTaWduZWRKd3RSZWdpc3RlcmVkQ2xhaW1zLFxuICAgIGFjdGlvbjogU2NoZW1hLkxpdGVyYWwoXCJyZWdpc3RlclwiKSxcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgIGNsb3VkVXNlcklkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gICAgdHVubmVsSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgICBvcmlnaW46IFJlbGF5TWFuYWdlZEVuZHBvaW50T3JpZ2luLFxuICB9KSxcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgLi4uUmVsYXlTaWduZWRKd3RSZWdpc3RlcmVkQ2xhaW1zLFxuICAgIGFjdGlvbjogU2NoZW1hLkxpdGVyYWwoXCJyZWNvdmVyXCIpLFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgY2xvdWRVc2VySWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgICBvcmlnaW46IFJlbGF5TWFuYWdlZEVuZHBvaW50T3JpZ2luLFxuICB9KSxcbl0pO1xuZXhwb3J0IHR5cGUgUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVByb29mUGF5bG9hZCA9XG4gIHR5cGVvZiBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UHJvb2ZQYXlsb2FkLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUFnZW50QWN0aXZpdHlQdWJsaXNoUHJvb2ZQYXlsb2FkID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlJlbGF5U2lnbmVkSnd0UmVnaXN0ZXJlZENsYWltcyxcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICBzdGF0ZTogU2NoZW1hLk51bGxPcihSZWxheUFnZW50QWN0aXZpdHlTdGF0ZSksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZlBheWxvYWQgPVxuICB0eXBlb2YgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mUGF5bG9hZC5UeXBlO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mID0gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFJlcXVlc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgc3RhdGU6IFNjaGVtYS5OdWxsT3IoUmVsYXlBZ2VudEFjdGl2aXR5U3RhdGUpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJDdXJyZW50IGFnZW50LWF3YXJlbmVzcyBzdGF0ZSwgb3IgbnVsbCB0byByZW1vdmUgdGhlIHB1Ymxpc2hlZCBzdGF0ZS5cIixcbiAgfSksXG4gIHByb29mOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIkVudmlyb25tZW50LXNpZ25lZCBKV1QgY292ZXJpbmcgdGhpcyBwdWJsaXNoZWQgYWN0aXZpdHkgc3RhdGUuXCIsXG4gIH0pLFxufSkuYW5ub3RhdGUoeyBkZXNjcmlwdGlvbjogXCJQdWJsaXNoZXMgYSBzaWduZWQgYWdlbnQtYXdhcmVuZXNzIHVwZGF0ZSBmcm9tIGFuIGVudmlyb25tZW50LlwiIH0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFJlcXVlc3QgPSB0eXBlb2YgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFJlcXVlc3QuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRMaW5rU2NvcGUgPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBcImFnZW50X2FjdGl2aXR5X25vdGlmaWNhdGlvbnNcIixcbiAgXCJtYW5hZ2VkX3R1bm5lbHNcIixcbl0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtTY29wZSA9IHR5cGVvZiBSZWxheUVudmlyb25tZW50TGlua1Njb3BlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua1Byb29mUGF5bG9hZCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5SZWxheVNpZ25lZEp3dFJlZ2lzdGVyZWRDbGFpbXMsXG4gIGNoYWxsZW5nZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBkZXNjcmlwdG9yOiBFeGVjdXRpb25FbnZpcm9ubWVudERlc2NyaXB0b3IsXG4gIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gIGVudmlyb25tZW50UHVibGljS2V5OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGVuZHBvaW50OiBSZWxheU1hbmFnZWRFbmRwb2ludCxcbiAgb3JpZ2luOiBSZWxheU1hbmFnZWRFbmRwb2ludE9yaWdpbixcbiAgc2NvcGVzOiBTY2hlbWEuQXJyYXkoUmVsYXlFbnZpcm9ubWVudExpbmtTY29wZSksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZQYXlsb2FkID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZQYXlsb2FkLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua1Byb29mID0gVHJpbW1lZE5vbkVtcHR5U3RyaW5nO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZiA9IHR5cGVvZiBSZWxheUVudmlyb25tZW50TGlua1Byb29mLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua0NoYWxsZW5nZVJlcXVlc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgbm90aWZpY2F0aW9uc0VuYWJsZWQ6IFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJXaGV0aGVyIHRoaXMgbGluayBtYXkgZGVsaXZlciBwdXNoIG5vdGlmaWNhdGlvbnMuXCIsXG4gIH0pLFxuICBsaXZlQWN0aXZpdGllc0VuYWJsZWQ6IFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJXaGV0aGVyIHRoaXMgbGluayBtYXkgdXBkYXRlIExpdmUgQWN0aXZpdGllcy5cIixcbiAgfSksXG4gIG1hbmFnZWRUdW5uZWxzRW5hYmxlZDogU2NoZW1hLkJvb2xlYW4uYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIldoZXRoZXIgdGhlIHJlbGF5IHNob3VsZCBwcm92aXNpb24gYSBtYW5hZ2VkIHR1bm5lbCBmb3IgdGhpcyBlbnZpcm9ubWVudC5cIixcbiAgfSksXG59KS5hbm5vdGF0ZSh7IGRlc2NyaXB0aW9uOiBcIlJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgZm9yIGEgbmV3IGVudmlyb25tZW50LWxpbmsgY2hhbGxlbmdlLlwiIH0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2VSZXF1ZXN0ID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlUmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2VSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBjaGFsbGVuZ2U6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgZXhwaXJlc0F0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlUmVzcG9uc2UgPVxuICB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2VSZXNwb25zZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudExpbmtSZXF1ZXN0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIGRldmljZUlkOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgVHJpbW1lZE5vbkVtcHR5U3RyaW5nLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wdGlvbmFsIGNsaWVudCBkZXZpY2UgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLlwiLFxuICAgIH0pLFxuICApLFxuICBwcm9vZjogUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZi5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiRW52aXJvbm1lbnQtc2lnbmVkIHByb29mIGJvdW5kIHRvIGEgcHJldmlvdXNseSBpc3N1ZWQgbGluayBjaGFsbGVuZ2UuXCIsXG4gIH0pLFxuICBub3RpZmljYXRpb25zRW5hYmxlZDogU2NoZW1hLkJvb2xlYW4sXG4gIGxpdmVBY3Rpdml0aWVzRW5hYmxlZDogU2NoZW1hLkJvb2xlYW4sXG4gIG1hbmFnZWRUdW5uZWxzRW5hYmxlZDogU2NoZW1hLkJvb2xlYW4sXG59KS5hbm5vdGF0ZSh7IGRlc2NyaXB0aW9uOiBcIkxpbmtzIGFuIGF1dGhlbnRpY2F0ZWQgY2xvdWQgdXNlciB0byBhIFQzIGVudmlyb25tZW50LlwiIH0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtSZXF1ZXN0ID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRMaW5rUmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudExpbmtSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBvazogU2NoZW1hLkJvb2xlYW4sXG4gIGNsb3VkVXNlcklkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gIGVuZHBvaW50OiBSZWxheU1hbmFnZWRFbmRwb2ludCxcbiAgZW5kcG9pbnRSdW50aW1lOiBTY2hlbWEuTnVsbE9yKFJlbGF5TWFuYWdlZEVuZHBvaW50UnVudGltZUNvbmZpZyksXG4gIHJlbGF5SXNzdWVyOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGVudmlyb25tZW50Q3JlZGVudGlhbDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBjbG91ZE1pbnRQdWJsaWNLZXk6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtSZXNwb25zZSA9IHR5cGVvZiBSZWxheUVudmlyb25tZW50TGlua1Jlc3BvbnNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua1Byb29mSW52YWxpZFJlYXNvbiA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwiaW52YWxpZF9zaWduYXR1cmVfb3Jfc2NvcGVcIixcbiAgXCJkZXNjcmlwdG9yX21pc21hdGNoXCIsXG4gIFwicmVwbGF5ZWRfbm9uY2VcIixcbiAgXCJjaGFsbGVuZ2VfaW52YWxpZFwiLFxuICBcIm9yaWdpbl9ub3RfYWxsb3dlZFwiLFxuICBcImVuZHBvaW50X25vdF9zZWN1cmVcIixcbl0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkludmFsaWRSZWFzb24gPVxuICB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkludmFsaWRSZWFzb24uVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkUmVhc29uID0gU2NoZW1hLkxpdGVyYWxzKFtcbiAgXCJsaW5rX3BlcnNpc3RlbmNlX2ZhaWxlZFwiLFxuICBcImNyZWRlbnRpYWxfcGVyc2lzdGVuY2VfZmFpbGVkXCIsXG4gIFwicmVwbGF5X3BlcnNpc3RlbmNlX2ZhaWxlZFwiLFxuICBcImludGVybmFsX2Vycm9yXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkUmVhc29uID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkUmVhc29uLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua1VuYXZhaWxhYmxlUmVhc29uID0gU2NoZW1hLkxpdGVyYWxzKFtcbiAgXCJtYW5hZ2VkX2VuZHBvaW50X25vdF9jb25maWd1cmVkXCIsXG4gIFwibWFuYWdlZF9lbmRwb2ludF9wcm92aXNpb25pbmdfZmFpbGVkXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rVW5hdmFpbGFibGVSZWFzb24gPVxuICB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudExpbmtVbmF2YWlsYWJsZVJlYXNvbi5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50VW5hdmFpbGFibGVSZWFzb24gPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBcImVuZHBvaW50X3JlcXVlc3RfZmFpbGVkXCIsXG4gIFwiZW5kcG9pbnRfcmVzcG9uc2VfaW52YWxpZFwiLFxuXSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50RW5kcG9pbnRVbmF2YWlsYWJsZVJlYXNvbiA9XG4gIHR5cGVvZiBSZWxheUVudmlyb25tZW50RW5kcG9pbnRVbmF2YWlsYWJsZVJlYXNvbi5UeXBlO1xuXG4vKipcbiAqIFdoaWNoIHBhcnQgb2YgdGhlIHBhdGggZnJvbSB0aGUgcmVsYXkgdG8gdGhlIGVudmlyb25tZW50IGZhaWxlZC4gYHR1bm5lbF9kb3duYFxuICogbWVhbnMgQ2xvdWRmbGFyZSBoYXMgbm8gbGl2ZSBjb25uZWN0b3IgZm9yIHRoZSB0dW5uZWw7IGBvcmlnaW5fdW5yZWFjaGFibGVgXG4gKiBtZWFucyB0aGUgdHVubmVsIGFuc3dlcmVkIGJ1dCBUMyBDb2RlIGJlaGluZCBpdCBkaWQgbm90LiBPcHRpb25hbCBvbiB0aGUgd2lyZVxuICogc28gb2xkIHJlbGF5cyBhbmQgb2xkIGNsaWVudHMga2VlcCB3b3JraW5nLlxuICovXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50RmFpbHVyZSA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwidHVubmVsX2Rvd25cIixcbiAgXCJvcmlnaW5fdW5yZWFjaGFibGVcIixcbiAgXCJkbnNcIixcbiAgXCJ0bHNcIixcbiAgXCJyZWZ1c2VkXCIsXG4gIFwidGltZW91dFwiLFxuICBcImludmFsaWRfcmVzcG9uc2VcIixcbiAgXCJ1bmtub3duXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludEZhaWx1cmUgPSB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50RmFpbHVyZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mSW52YWxpZFJlYXNvbiA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwiaW52YWxpZF9zaWduYXR1cmVfb3JfcGF5bG9hZFwiLFxuICBcInJlcGxheWVkX25vbmNlXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZkludmFsaWRSZWFzb24gPVxuICB0eXBlb2YgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mSW52YWxpZFJlYXNvbi5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlBdXRoSW52YWxpZFJlYXNvbiA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwibWlzc2luZ19iZWFyZXJcIixcbiAgXCJpbnZhbGlkX2JlYXJlclwiLFxuICBcImludmFsaWRfZHBvcFwiLFxuICBcIm5vdF9hdXRob3JpemVkXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5QXV0aEludmFsaWRSZWFzb24gPSB0eXBlb2YgUmVsYXlBdXRoSW52YWxpZFJlYXNvbi5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlEcG9wRmFpbHVyZVJlYXNvbiA9IERwb3BGYWlsdXJlUmVhc29uO1xuZXhwb3J0IHR5cGUgUmVsYXlEcG9wRmFpbHVyZVJlYXNvbiA9IHR5cGVvZiBSZWxheURwb3BGYWlsdXJlUmVhc29uLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUludGVybmFsRXJyb3JSZWFzb24gPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBcImRhdGFiYXNlX3VuYXZhaWxhYmxlXCIsXG4gIFwicGVyc2lzdGVuY2VfZmFpbGVkXCIsXG4gIFwidXBzdHJlYW1fdW5hdmFpbGFibGVcIixcbiAgXCJpbnRlcm5hbF9lcnJvclwiLFxuXSk7XG5leHBvcnQgdHlwZSBSZWxheUludGVybmFsRXJyb3JSZWFzb24gPSB0eXBlb2YgUmVsYXlJbnRlcm5hbEVycm9yUmVhc29uLlR5cGU7XG5cbmV4cG9ydCBjbGFzcyBSZWxheUF1dGhJbnZhbGlkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UmVsYXlBdXRoSW52YWxpZEVycm9yPigpKFxuICBcIlJlbGF5QXV0aEludmFsaWRFcnJvclwiLFxuICB7XG4gICAgY29kZTogU2NoZW1hLkxpdGVyYWwoXCJhdXRoX2ludmFsaWRcIiksXG4gICAgcmVhc29uOiBSZWxheUF1dGhJbnZhbGlkUmVhc29uLFxuICAgIGRwb3BGYWlsdXJlUmVhc29uOiBTY2hlbWEub3B0aW9uYWxLZXkoUmVsYXlEcG9wRmFpbHVyZVJlYXNvbiksXG4gICAgdHJhY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB9LFxuICB7IGh0dHBBcGlTdGF0dXM6IDQwMSB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBSZWxheSBhdXRoZW50aWNhdGlvbiBmYWlsZWQ6ICR7dGhpcy5yZWFzb259YDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkV4cGlyZWRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxSZWxheUVudmlyb25tZW50TGlua1Byb29mRXhwaXJlZEVycm9yPigpKFxuICBcIlJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZFeHBpcmVkRXJyb3JcIixcbiAge1xuICAgIGNvZGU6IFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnRfbGlua19wcm9vZl9leHBpcmVkXCIpLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA0MDEgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlJlbGF5IGVudmlyb25tZW50IGxpbmsgcHJvb2YgZXhwaXJlZFwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxheUVudmlyb25tZW50TGlua1Byb29mSW52YWxpZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZJbnZhbGlkRXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkludmFsaWRFcnJvclwiLFxuICB7XG4gICAgY29kZTogU2NoZW1hLkxpdGVyYWwoXCJlbnZpcm9ubWVudF9saW5rX3Byb29mX2ludmFsaWRcIiksXG4gICAgcmVhc29uOiBSZWxheUVudmlyb25tZW50TGlua1Byb29mSW52YWxpZFJlYXNvbixcbiAgICB0cmFjZUlkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIH0sXG4gIHsgaHR0cEFwaVN0YXR1czogNDAwIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFJlbGF5IGVudmlyb25tZW50IGxpbmsgcHJvb2YgaXMgaW52YWxpZDogJHt0aGlzLnJlYXNvbn1gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50Q29ubmVjdE5vdEF1dGhvcml6ZWRSZWFzb24gPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBcImNsaWVudF9wcm9vZl9rZXlfdGh1bWJwcmludF9taXNzaW5nXCIsXG4gIFwiZW52aXJvbm1lbnRfbGlua19ub3RfZm91bmRcIixcbiAgXCJlbmRwb2ludF9wcm92aWRlcl9ub3RfbWFuYWdlZFwiLFxuICBcIm1hbmFnZWRfZW5kcG9pbnRfYWxsb2NhdGlvbl9ub3RfZm91bmRcIixcbiAgXCJtYW5hZ2VkX2VuZHBvaW50X2Jhc2VfZG9tYWluX25vdF9jb25maWd1cmVkXCIsXG4gIFwibWFuYWdlZF9lbmRwb2ludF9hbGxvY2F0aW9uX25vdF9yZWFkeVwiLFxuICBcIm1hbmFnZWRfZW5kcG9pbnRfaG9zdG5hbWVfaW52YWxpZFwiLFxuICBcIm1hbmFnZWRfZW5kcG9pbnRfbWlzbWF0Y2hcIixcbl0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudENvbm5lY3ROb3RBdXRob3JpemVkUmVhc29uID1cbiAgdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRDb25uZWN0Tm90QXV0aG9yaXplZFJlYXNvbi5UeXBlO1xuXG5leHBvcnQgY2xhc3MgUmVsYXlFbnZpcm9ubWVudENvbm5lY3ROb3RBdXRob3JpemVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UmVsYXlFbnZpcm9ubWVudENvbm5lY3ROb3RBdXRob3JpemVkRXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudENvbm5lY3ROb3RBdXRob3JpemVkRXJyb3JcIixcbiAge1xuICAgIGNvZGU6IFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnRfY29ubmVjdF9ub3RfYXV0aG9yaXplZFwiKSxcbiAgICByZWFzb246IFNjaGVtYS5vcHRpb25hbChSZWxheUVudmlyb25tZW50Q29ubmVjdE5vdEF1dGhvcml6ZWRSZWFzb24pLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA0MDMgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlYXNvblxuICAgICAgPyBgUmVsYXkgZW52aXJvbm1lbnQgY29ubmVjdGlvbiBpcyBub3QgYXV0aG9yaXplZDogJHt0aGlzLnJlYXNvbn1gXG4gICAgICA6IFwiUmVsYXkgZW52aXJvbm1lbnQgY29ubmVjdGlvbiBpcyBub3QgYXV0aG9yaXplZFwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxheUVudmlyb25tZW50RW5kcG9pbnRVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludFVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50VW5hdmFpbGFibGVFcnJvclwiLFxuICB7XG4gICAgY29kZTogU2NoZW1hLkxpdGVyYWwoXCJlbnZpcm9ubWVudF9lbmRwb2ludF91bmF2YWlsYWJsZVwiKSxcbiAgICByZWFzb246IFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludFVuYXZhaWxhYmxlUmVhc29uLFxuICAgIGVuZHBvaW50RmFpbHVyZTogU2NoZW1hLm9wdGlvbmFsS2V5KFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludEZhaWx1cmUpLFxuICAgIGVuZHBvaW50U3RhdHVzOiBTY2hlbWEub3B0aW9uYWxLZXkoU2NoZW1hLk51bWJlciksXG4gICAgdHJhY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB9LFxuICB7IGh0dHBBcGlTdGF0dXM6IDUwMiB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBSZWxheSBlbnZpcm9ubWVudCBlbmRwb2ludCBpcyB1bmF2YWlsYWJsZTogJHt0aGlzLnJlYXNvbn1gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxheUVudmlyb25tZW50RW5kcG9pbnRUaW1lZE91dEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludFRpbWVkT3V0RXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50VGltZWRPdXRFcnJvclwiLFxuICB7XG4gICAgY29kZTogU2NoZW1hLkxpdGVyYWwoXCJlbnZpcm9ubWVudF9lbmRwb2ludF90aW1lZF9vdXRcIiksXG4gICAgdHJhY2VJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB9LFxuICB7IGh0dHBBcGlTdGF0dXM6IDUwNCB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiUmVsYXkgZW52aXJvbm1lbnQgZW5kcG9pbnQgcmVxdWVzdCB0aW1lZCBvdXRcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVsYXlFbnZpcm9ubWVudExpbmtGYWlsZWRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxSZWxheUVudmlyb25tZW50TGlua0ZhaWxlZEVycm9yPigpKFxuICBcIlJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkRXJyb3JcIixcbiAge1xuICAgIGNvZGU6IFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnRfbGlua19mYWlsZWRcIiksXG4gICAgcmVhc29uOiBSZWxheUVudmlyb25tZW50TGlua0ZhaWxlZFJlYXNvbixcbiAgICB0cmFjZUlkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIH0sXG4gIHsgaHR0cEFwaVN0YXR1czogNTAwIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFJlbGF5IGVudmlyb25tZW50IGxpbmsgZmFpbGVkOiAke3RoaXMucmVhc29ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF5RW52aXJvbm1lbnRMaW5rVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxSZWxheUVudmlyb25tZW50TGlua1VuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudExpbmtVbmF2YWlsYWJsZUVycm9yXCIsXG4gIHtcbiAgICBjb2RlOiBTY2hlbWEuTGl0ZXJhbChcImVudmlyb25tZW50X2xpbmtfdW5hdmFpbGFibGVcIiksXG4gICAgcmVhc29uOiBSZWxheUVudmlyb25tZW50TGlua1VuYXZhaWxhYmxlUmVhc29uLFxuICAgIHByb3Zpc2lvbmluZ1N0YWdlOiBTY2hlbWEub3B0aW9uYWxLZXkoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgICB0cmFjZUlkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIH0sXG4gIHsgaHR0cEFwaVN0YXR1czogNTAzIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFJlbGF5IGVudmlyb25tZW50IGxpbmsgaXMgdW5hdmFpbGFibGU6ICR7dGhpcy5yZWFzb259YDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVsYXlFbnZpcm9ubWVudExpbmtMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UmVsYXlFbnZpcm9ubWVudExpbmtMaW1pdEV4Y2VlZGVkRXJyb3I+KCkoXG4gIFwiUmVsYXlFbnZpcm9ubWVudExpbmtMaW1pdEV4Y2VlZGVkRXJyb3JcIixcbiAge1xuICAgIGNvZGU6IFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnRfbGlua19saW1pdF9leGNlZWRlZFwiKSxcbiAgICBtYXhUdW5uZWxzOiBTY2hlbWEuTnVtYmVyLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA0MDMgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUmVsYXkgbWFuYWdlZCB0dW5uZWwgbGltaXQgcmVhY2hlZDogdGhpcyBhY2NvdW50IGFsbG93cyBhdCBtb3N0ICR7dGhpcy5tYXhUdW5uZWxzfSB0dW5uZWxzYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mRXhwaXJlZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZkV4cGlyZWRFcnJvcj4oKShcbiAgXCJSZWxheUFnZW50QWN0aXZpdHlQdWJsaXNoUHJvb2ZFeHBpcmVkRXJyb3JcIixcbiAge1xuICAgIGNvZGU6IFNjaGVtYS5MaXRlcmFsKFwiYWdlbnRfYWN0aXZpdHlfcHVibGlzaF9wcm9vZl9leHBpcmVkXCIpLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA0MDEgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlJlbGF5IGFnZW50IGFjdGl2aXR5IHB1Ymxpc2ggcHJvb2YgZXhwaXJlZFwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxheUFnZW50QWN0aXZpdHlQdWJsaXNoUHJvb2ZJbnZhbGlkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mSW52YWxpZEVycm9yPigpKFxuICBcIlJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZkludmFsaWRFcnJvclwiLFxuICB7XG4gICAgY29kZTogU2NoZW1hLkxpdGVyYWwoXCJhZ2VudF9hY3Rpdml0eV9wdWJsaXNoX3Byb29mX2ludmFsaWRcIiksXG4gICAgcmVhc29uOiBSZWxheUFnZW50QWN0aXZpdHlQdWJsaXNoUHJvb2ZJbnZhbGlkUmVhc29uLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA0MDEgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUmVsYXkgYWdlbnQgYWN0aXZpdHkgcHVibGlzaCBwcm9vZiBpcyBpbnZhbGlkOiAke3RoaXMucmVhc29ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF5SW50ZXJuYWxFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxSZWxheUludGVybmFsRXJyb3I+KCkoXG4gIFwiUmVsYXlJbnRlcm5hbEVycm9yXCIsXG4gIHtcbiAgICBjb2RlOiBTY2hlbWEuTGl0ZXJhbChcImludGVybmFsX2Vycm9yXCIpLFxuICAgIHJlYXNvbjogUmVsYXlJbnRlcm5hbEVycm9yUmVhc29uLFxuICAgIHRyYWNlSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSxcbiAgeyBodHRwQXBpU3RhdHVzOiA1MDAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUmVsYXkgaW50ZXJuYWwgZXJyb3I6ICR7dGhpcy5yZWFzb259YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVsYXlQcm90ZWN0ZWRFcnJvciA9IFNjaGVtYS5VbmlvbihbXG4gIFJlbGF5QXV0aEludmFsaWRFcnJvcixcbiAgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkV4cGlyZWRFcnJvcixcbiAgUmVsYXlFbnZpcm9ubWVudExpbmtQcm9vZkludmFsaWRFcnJvcixcbiAgUmVsYXlFbnZpcm9ubWVudENvbm5lY3ROb3RBdXRob3JpemVkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludFVuYXZhaWxhYmxlRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRFbmRwb2ludFRpbWVkT3V0RXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rVW5hdmFpbGFibGVFcnJvcixcbiAgUmVsYXlFbnZpcm9ubWVudExpbmtMaW1pdEV4Y2VlZGVkRXJyb3IsXG4gIFJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZkV4cGlyZWRFcnJvcixcbiAgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mSW52YWxpZEVycm9yLFxuICBSZWxheUludGVybmFsRXJyb3IsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5UHJvdGVjdGVkRXJyb3IgPSB0eXBlb2YgUmVsYXlQcm90ZWN0ZWRFcnJvci5UeXBlO1xuXG5jb25zdCBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyA9IFtSZWxheUF1dGhJbnZhbGlkRXJyb3IsIFJlbGF5SW50ZXJuYWxFcnJvcl0gYXMgY29uc3Q7XG5cbmNvbnN0IFJlbGF5RW52aXJvbm1lbnRMaW5rRXJyb3JzID0gW1xuICBSZWxheUF1dGhJbnZhbGlkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZFeHBpcmVkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rUHJvb2ZJbnZhbGlkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rVW5hdmFpbGFibGVFcnJvcixcbiAgUmVsYXlFbnZpcm9ubWVudExpbmtMaW1pdEV4Y2VlZGVkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRMaW5rRmFpbGVkRXJyb3IsXG4gIFJlbGF5SW50ZXJuYWxFcnJvcixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFJlbGF5RW52aXJvbm1lbnRDb25uZWN0RXJyb3JzID0gW1xuICBSZWxheUF1dGhJbnZhbGlkRXJyb3IsXG4gIFJlbGF5RW52aXJvbm1lbnRDb25uZWN0Tm90QXV0aG9yaXplZEVycm9yLFxuICBSZWxheUVudmlyb25tZW50RW5kcG9pbnRVbmF2YWlsYWJsZUVycm9yLFxuICBSZWxheUVudmlyb25tZW50RW5kcG9pbnRUaW1lZE91dEVycm9yLFxuICBSZWxheUludGVybmFsRXJyb3IsXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBSZWxheUFnZW50QWN0aXZpdHlQdWJsaXNoRXJyb3JzID0gW1xuICBSZWxheUF1dGhJbnZhbGlkRXJyb3IsXG4gIFJlbGF5QWdlbnRBY3Rpdml0eVB1Ymxpc2hQcm9vZkV4cGlyZWRFcnJvcixcbiAgUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFByb29mSW52YWxpZEVycm9yLFxuICBSZWxheUludGVybmFsRXJyb3IsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgUmVsYXlDbGllbnRQcmluY2lwYWwgZXh0ZW5kcyBDb250ZXh0LlNlcnZpY2U8XG4gIFJlbGF5Q2xpZW50UHJpbmNpcGFsLFxuICB7XG4gICAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdG9rZW46IHN0cmluZztcbiAgICByZWFkb25seSBwcm9vZktleVRodW1icHJpbnQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZHBvcFNjb3Blcz86IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gIH1cbj4oKShcIkB0M3Rvb2xzL2NvbnRyYWN0cy9yZWxheS9SZWxheUNsaWVudFByaW5jaXBhbFwiKSB7fVxuXG5leHBvcnQgY2xhc3MgUmVsYXlFbnZpcm9ubWVudFByaW5jaXBhbCBleHRlbmRzIENvbnRleHQuU2VydmljZTxcbiAgUmVsYXlFbnZpcm9ubWVudFByaW5jaXBhbCxcbiAge1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICByZWFkb25seSBlbnZpcm9ubWVudFB1YmxpY0tleTogc3RyaW5nO1xuICB9XG4+KCkoXCJAdDN0b29scy9jb250cmFjdHMvcmVsYXkvUmVsYXlFbnZpcm9ubWVudFByaW5jaXBhbFwiKSB7fVxuXG5jb25zdCBSZWxheUNsaWVudEJlYXJlckF1dGhvcml6YXRpb24gPSBIdHRwQXBpU2VjdXJpdHkuaHR0cCh7IHNjaGVtZTogXCJiZWFyZXJcIiB9KS5waXBlKFxuICBIdHRwQXBpU2VjdXJpdHkuYW5ub3RhdGUoXG4gICAgT3BlbkFwaS5EZXNjcmlwdGlvbixcbiAgICBcIkNsZXJrIHNlc3Npb24gb3IgT0F1dGggYmVhcmVyIHRva2VuIGZvciB0aGUgc2lnbmVkLWluIFQzIENvbm5lY3QgdXNlci5cIixcbiAgKSxcbik7XG5cbmV4cG9ydCBjbGFzcyBSZWxheUNsaWVudEF1dGggZXh0ZW5kcyBIdHRwQXBpTWlkZGxld2FyZS5TZXJ2aWNlPFxuICBSZWxheUNsaWVudEF1dGgsXG4gIHsgcHJvdmlkZXM6IFJlbGF5Q2xpZW50UHJpbmNpcGFsIH1cbj4oKShcIlJlbGF5Q2xpZW50QXV0aFwiLCB7XG4gIGVycm9yOiBSZWxheUF1dGhJbnZhbGlkRXJyb3IsXG4gIHNlY3VyaXR5OiB7IGNsaWVudEJlYXJlcjogUmVsYXlDbGllbnRCZWFyZXJBdXRob3JpemF0aW9uIH0sXG59KSB7fVxuXG5jb25zdCBSZWxheUVudmlyb25tZW50QmVhcmVyQXV0aG9yaXphdGlvbiA9IEh0dHBBcGlTZWN1cml0eS5odHRwKHsgc2NoZW1lOiBcImJlYXJlclwiIH0pLnBpcGUoXG4gIEh0dHBBcGlTZWN1cml0eS5hbm5vdGF0ZShcbiAgICBPcGVuQXBpLkRlc2NyaXB0aW9uLFxuICAgIFwiUmVsYXktaXNzdWVkIGVudmlyb25tZW50IGNyZWRlbnRpYWwgaW5zdGFsbGVkIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIGxpbmtlZC5cIixcbiAgKSxcbik7XG5cbmV4cG9ydCBjbGFzcyBSZWxheUVudmlyb25tZW50QXV0aCBleHRlbmRzIEh0dHBBcGlNaWRkbGV3YXJlLlNlcnZpY2U8XG4gIFJlbGF5RW52aXJvbm1lbnRBdXRoLFxuICB7IHByb3ZpZGVzOiBSZWxheUVudmlyb25tZW50UHJpbmNpcGFsIH1cbj4oKShcIlJlbGF5RW52aXJvbm1lbnRBdXRoXCIsIHtcbiAgZXJyb3I6IFtSZWxheUF1dGhJbnZhbGlkRXJyb3IsIFJlbGF5SW50ZXJuYWxFcnJvcl0sXG4gIHNlY3VyaXR5OiB7IGVudmlyb25tZW50QmVhcmVyOiBSZWxheUVudmlyb25tZW50QmVhcmVyQXV0aG9yaXphdGlvbiB9LFxufSkge31cblxuY29uc3QgUmVsYXlEcG9wQXV0aG9yaXphdGlvbiA9IEh0dHBBcGlTZWN1cml0eS5odHRwKHsgc2NoZW1lOiBcIkRQb1BcIiB9KS5waXBlKFxuICBIdHRwQXBpU2VjdXJpdHkuYW5ub3RhdGUoXG4gICAgT3BlbkFwaS5EZXNjcmlwdGlvbixcbiAgICBcIkRQb1AtYm91bmQgYWNjZXNzIHRva2VuLiBSZXF1ZXN0cyBtdXN0IGFsc28gaW5jbHVkZSB0aGUgRFBvUCBwcm9vZiBKV1QgaGVhZGVyLlwiLFxuICApLFxuKTtcblxuZXhwb3J0IGNsYXNzIFJlbGF5RHBvcENsaWVudEF1dGggZXh0ZW5kcyBIdHRwQXBpTWlkZGxld2FyZS5TZXJ2aWNlPFxuICBSZWxheURwb3BDbGllbnRBdXRoLFxuICB7IHByb3ZpZGVzOiBSZWxheUNsaWVudFByaW5jaXBhbCB9XG4+KCkoXCJSZWxheURwb3BDbGllbnRBdXRoXCIsIHtcbiAgZXJyb3I6IFJlbGF5QXV0aEludmFsaWRFcnJvcixcbiAgc2VjdXJpdHk6IHsgcmVsYXlEcG9wOiBSZWxheURwb3BBdXRob3JpemF0aW9uIH0sXG59KSB7fVxuXG5leHBvcnQgY29uc3QgUmVsYXlDbGllbnRFbnZpcm9ubWVudFJlY29yZCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICBsYWJlbDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBlbmRwb2ludDogUmVsYXlNYW5hZ2VkRW5kcG9pbnQsXG4gIGxpbmtlZEF0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5Q2xpZW50RW52aXJvbm1lbnRSZWNvcmQgPSB0eXBlb2YgUmVsYXlDbGllbnRFbnZpcm9ubWVudFJlY29yZC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlMaXN0RW52aXJvbm1lbnRzUmVzcG9uc2UgPSBTY2hlbWEuU3RydWN0KHtcbiAgZW52aXJvbm1lbnRzOiBTY2hlbWEuQXJyYXkoUmVsYXlDbGllbnRFbnZpcm9ubWVudFJlY29yZCksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5TGlzdEVudmlyb25tZW50c1Jlc3BvbnNlID0gdHlwZW9mIFJlbGF5TGlzdEVudmlyb25tZW50c1Jlc3BvbnNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50Q29ubmVjdFJlcXVlc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlSWQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiT3B0aW9uYWwgY2xpZW50IGRldmljZSBpZGVudGlmaWVyIHJlcXVlc3RpbmcgdGhlIGNvbm5lY3Rpb24uXCIsXG4gICAgfSksXG4gICksXG4gIGNsaWVudEtleVRodW1icHJpbnQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiRGVwcmVjYXRlZCBhbGlhcyBmb3IgY2xpZW50UHJvb2ZLZXlUaHVtYnByaW50LlwiLFxuICAgIH0pLFxuICApLFxuICBjbGllbnRQcm9vZktleVRodW1icHJpbnQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiSldLIHRodW1icHJpbnQgdGhhdCB0aGUgbWludGVkIGVudmlyb25tZW50IGNyZWRlbnRpYWwgbXVzdCBiZSBib3VuZCB0by5cIixcbiAgICB9KSxcbiAgKSxcbn0pLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFwiUmVxdWVzdHMgYSBzaG9ydC1saXZlZCBjcmVkZW50aWFsIGZvciBjb25uZWN0aW5nIHRvIGFuIGVudmlyb25tZW50LlwiIH0pO1xuZXhwb3J0IHR5cGUgUmVsYXlFbnZpcm9ubWVudENvbm5lY3RSZXF1ZXN0ID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRDb25uZWN0UmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudENvbm5lY3RTY29wZSA9IFwiZW52aXJvbm1lbnQ6Y29ubmVjdFwiIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRTdGF0dXNTY29wZSA9IFwiZW52aXJvbm1lbnQ6c3RhdHVzXCIgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgUmVsYXlNb2JpbGVSZWdpc3RyYXRpb25TY29wZSA9IFwibW9iaWxlOnJlZ2lzdHJhdGlvblwiIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFJlbGF5RHBvcEFjY2Vzc1Rva2VuU2NvcGUgPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBSZWxheUVudmlyb25tZW50Q29ubmVjdFNjb3BlLFxuICBSZWxheUVudmlyb25tZW50U3RhdHVzU2NvcGUsXG4gIFJlbGF5TW9iaWxlUmVnaXN0cmF0aW9uU2NvcGUsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5RHBvcEFjY2Vzc1Rva2VuU2NvcGUgPSB0eXBlb2YgUmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlEcG9wVG9rZW5FeGNoYW5nZUdyYW50VHlwZSA9XG4gIFwidXJuOmlldGY6cGFyYW1zOm9hdXRoOmdyYW50LXR5cGU6dG9rZW4tZXhjaGFuZ2VcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBSZWxheUp3dFN1YmplY3RUb2tlblR5cGUgPSBcInVybjppZXRmOnBhcmFtczpvYXV0aDp0b2tlbi10eXBlOmp3dFwiIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFJlbGF5QWNjZXNzVG9rZW5UeXBlID0gXCJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6dG9rZW4tdHlwZTphY2Nlc3NfdG9rZW5cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBSZWxheVB1YmxpY0NsaWVudElkID0gU2NoZW1hLkxpdGVyYWxzKFtcInQzLW1vYmlsZVwiLCBcInQzLXdlYlwiXSk7XG5leHBvcnQgdHlwZSBSZWxheVB1YmxpY0NsaWVudElkID0gdHlwZW9mIFJlbGF5UHVibGljQ2xpZW50SWQuVHlwZTtcbmV4cG9ydCBjb25zdCBSZWxheU1vYmlsZUNsaWVudElkID0gXCJ0My1tb2JpbGVcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBSZWxheVdlYkNsaWVudElkID0gXCJ0My13ZWJcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RHBvcEFjY2Vzc1Rva2VuUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBncmFudF90eXBlOiBTY2hlbWEuTGl0ZXJhbChSZWxheURwb3BUb2tlbkV4Y2hhbmdlR3JhbnRUeXBlKSxcbiAgc3ViamVjdF90b2tlbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJDbGVyayBiZWFyZXIgdG9rZW4gZm9yIHRoZSBzaWduZWQtaW4gY2xvdWQgdXNlci5cIixcbiAgfSksXG4gIHN1YmplY3RfdG9rZW5fdHlwZTogU2NoZW1hLkxpdGVyYWwoUmVsYXlKd3RTdWJqZWN0VG9rZW5UeXBlKSxcbiAgcmVxdWVzdGVkX3Rva2VuX3R5cGU6IFNjaGVtYS5MaXRlcmFsKFJlbGF5QWNjZXNzVG9rZW5UeXBlKSxcbiAgcmVzb3VyY2U6IFRyaW1tZWROb25FbXB0eVN0cmluZy5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiUmVsYXkgaXNzdWVyIFVSTCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgRFBvUC1ib3VuZCBhY2Nlc3MgdG9rZW4uXCIsXG4gIH0pLFxuICBzY29wZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJTcGFjZS1zZXBhcmF0ZWQgcmVsYXkgc2NvcGVzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LlwiLFxuICB9KSxcbiAgY2xpZW50X2lkOiBSZWxheVB1YmxpY0NsaWVudElkLFxufSlcbiAgLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFwiT0F1dGggdG9rZW4gZXhjaGFuZ2UgcmVxdWVzdCBmb3IgYSBEUG9QLWJvdW5kIHJlbGF5IGFjY2VzcyB0b2tlbi5cIiB9KVxuICAucGlwZShIdHRwQXBpU2NoZW1hLmFzRm9ybVVybEVuY29kZWQoKSk7XG5leHBvcnQgdHlwZSBSZWxheURwb3BBY2Nlc3NUb2tlblJlcXVlc3QgPSB0eXBlb2YgUmVsYXlEcG9wQWNjZXNzVG9rZW5SZXF1ZXN0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheURwb3BBY2Nlc3NUb2tlblJlc3BvbnNlID0gU2NoZW1hLlN0cnVjdCh7XG4gIGFjY2Vzc190b2tlbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBpc3N1ZWRfdG9rZW5fdHlwZTogU2NoZW1hLkxpdGVyYWwoUmVsYXlBY2Nlc3NUb2tlblR5cGUpLFxuICB0b2tlbl90eXBlOiBTY2hlbWEuTGl0ZXJhbChcIkRQb1BcIiksXG4gIGV4cGlyZXNfaW46IFNjaGVtYS5JbnQuY2hlY2soU2NoZW1hLmlzR3JlYXRlclRoYW4oMCkpLFxuICBzY29wZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheURwb3BBY2Nlc3NUb2tlblJlc3BvbnNlID0gdHlwZW9mIFJlbGF5RHBvcEFjY2Vzc1Rva2VuUmVzcG9uc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QmVhcmVyUmVxdWVzdEhlYWRlcnMgPSBTY2hlbWEuU3RydWN0KHtcbiAgYXV0aG9yaXphdGlvbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5cbmV4cG9ydCBjb25zdCBSZWxheURwb3BQcm9vZlJlcXVlc3RIZWFkZXJzID0gU2NoZW1hLlN0cnVjdCh7XG4gIGRwb3A6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbn0pO1xuXG5leHBvcnQgY29uc3QgUmVsYXlEcG9wUmVxdWVzdEhlYWRlcnMgPSBTY2hlbWEuU3RydWN0KHtcbiAgYXV0aG9yaXphdGlvbjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBkcG9wOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QXV0aG9yaXphdGlvblNlcnZlck1ldGFkYXRhID0gU2NoZW1hLlN0cnVjdCh7XG4gIGlzc3VlcjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB0b2tlbl9lbmRwb2ludDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBncmFudF90eXBlc19zdXBwb3J0ZWQ6IFNjaGVtYS5BcnJheShTY2hlbWEuTGl0ZXJhbChSZWxheURwb3BUb2tlbkV4Y2hhbmdlR3JhbnRUeXBlKSksXG4gIHRva2VuX2VuZHBvaW50X2F1dGhfbWV0aG9kc19zdXBwb3J0ZWQ6IFNjaGVtYS5BcnJheShTY2hlbWEuTGl0ZXJhbChcIm5vbmVcIikpLFxuICBkcG9wX3NpZ25pbmdfYWxnX3ZhbHVlc19zdXBwb3J0ZWQ6IFNjaGVtYS5BcnJheShTY2hlbWEuTGl0ZXJhbChcIkVTMjU2XCIpKSxcbiAgc2NvcGVzX3N1cHBvcnRlZDogU2NoZW1hLkFycmF5KFJlbGF5RHBvcEFjY2Vzc1Rva2VuU2NvcGUpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBSZWxheVByb3RlY3RlZFJlc291cmNlTWV0YWRhdGEgPSBTY2hlbWEuU3RydWN0KHtcbiAgcmVzb3VyY2U6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgYXV0aG9yaXphdGlvbl9zZXJ2ZXJzOiBTY2hlbWEuQXJyYXkoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgc2NvcGVzX3N1cHBvcnRlZDogU2NoZW1hLkFycmF5KFJlbGF5RHBvcEFjY2Vzc1Rva2VuU2NvcGUpLFxuICBkcG9wX2JvdW5kX2FjY2Vzc190b2tlbnNfcmVxdWlyZWQ6IFNjaGVtYS5Cb29sZWFuLFxuICBkcG9wX3NpZ25pbmdfYWxnX3ZhbHVlc19zdXBwb3J0ZWQ6IFNjaGVtYS5BcnJheShTY2hlbWEuTGl0ZXJhbChcIkVTMjU2XCIpKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudFVubGlua1BhcmFtcyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50VW5saW5rUGFyYW1zID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRVbmxpbmtQYXJhbXMuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRDb25uZWN0UmVzcG9uc2UgPSBTY2hlbWEuU3RydWN0KHtcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgZW5kcG9pbnQ6IFJlbGF5TWFuYWdlZEVuZHBvaW50LFxuICBjcmVkZW50aWFsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGV4cGlyZXNBdDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50Q29ubmVjdFJlc3BvbnNlID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRDb25uZWN0UmVzcG9uc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRTdGF0dXNWYWx1ZSA9IFNjaGVtYS5MaXRlcmFscyhbXCJvbmxpbmVcIiwgXCJvZmZsaW5lXCJdKTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRTdGF0dXNWYWx1ZSA9IHR5cGVvZiBSZWxheUVudmlyb25tZW50U3RhdHVzVmFsdWUuVHlwZTtcblxuY29uc3QgUmVsYXlFbnZpcm9ubWVudE9mZmxpbmVSZWFzb24gPSBTY2hlbWEuTGl0ZXJhbHMoW1widHVubmVsX3JlbGVhc2VkXCJdKTtcbnR5cGUgUmVsYXlFbnZpcm9ubWVudE9mZmxpbmVSZWFzb24gPSB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudE9mZmxpbmVSZWFzb24uVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRTdGF0dXNSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICBlbmRwb2ludDogUmVsYXlNYW5hZ2VkRW5kcG9pbnQsXG4gIHN0YXR1czogUmVsYXlFbnZpcm9ubWVudFN0YXR1c1ZhbHVlLFxuICBjaGVja2VkQXQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgZGVzY3JpcHRvcjogU2NoZW1hLm9wdGlvbmFsKEV4ZWN1dGlvbkVudmlyb25tZW50RGVzY3JpcHRvciksXG4gIGVycm9yOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgZW5kcG9pbnRGYWlsdXJlOiBTY2hlbWEub3B0aW9uYWwoUmVsYXlFbnZpcm9ubWVudEVuZHBvaW50RmFpbHVyZSksXG4gIGVuZHBvaW50U3RhdHVzOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLk51bWJlciksXG4gIG9mZmxpbmVSZWFzb246IFNjaGVtYS5vcHRpb25hbChSZWxheUVudmlyb25tZW50T2ZmbGluZVJlYXNvbiksXG4gIHRyYWNlSWQ6IFNjaGVtYS5vcHRpb25hbChUcmltbWVkTm9uRW1wdHlTdHJpbmcpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50U3RhdHVzUmVzcG9uc2UgPSB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudFN0YXR1c1Jlc3BvbnNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUNsb3VkTWludENyZWRlbnRpYWxQcm9vZlBheWxvYWQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUmVsYXlTaWduZWRKd3RSZWdpc3RlcmVkQ2xhaW1zLFxuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICBjbGllbnRQcm9vZktleVRodW1icHJpbnQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgY25mOiBTY2hlbWEuU3RydWN0KHtcbiAgICBqa3Q6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSksXG4gIGRldmljZUlkOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgbm9uY2U6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgc2NvcGU6IFNjaGVtYS5BcnJheShTY2hlbWEuTGl0ZXJhbChcImVudmlyb25tZW50OmNvbm5lY3RcIikpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUNsb3VkTWludENyZWRlbnRpYWxQcm9vZlBheWxvYWQgPSB0eXBlb2YgUmVsYXlDbG91ZE1pbnRDcmVkZW50aWFsUHJvb2ZQYXlsb2FkLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUNsb3VkTWludENyZWRlbnRpYWxQcm9vZiA9IFRyaW1tZWROb25FbXB0eVN0cmluZztcbmV4cG9ydCB0eXBlIFJlbGF5Q2xvdWRNaW50Q3JlZGVudGlhbFByb29mID0gdHlwZW9mIFJlbGF5Q2xvdWRNaW50Q3JlZGVudGlhbFByb29mLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUNsb3VkTWludENyZWRlbnRpYWxSZXF1ZXN0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIHByb29mOiBSZWxheUNsb3VkTWludENyZWRlbnRpYWxQcm9vZixcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlDbG91ZE1pbnRDcmVkZW50aWFsUmVxdWVzdCA9IHR5cGVvZiBSZWxheUNsb3VkTWludENyZWRlbnRpYWxSZXF1ZXN0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUNsb3VkRW52aXJvbm1lbnRIZWFsdGhQcm9vZlBheWxvYWQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUmVsYXlTaWduZWRKd3RSZWdpc3RlcmVkQ2xhaW1zLFxuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICBub25jZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBzY29wZTogU2NoZW1hLkFycmF5KFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnQ6c3RhdHVzXCIpKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlDbG91ZEVudmlyb25tZW50SGVhbHRoUHJvb2ZQYXlsb2FkID1cbiAgdHlwZW9mIFJlbGF5Q2xvdWRFbnZpcm9ubWVudEhlYWx0aFByb29mUGF5bG9hZC5UeXBlO1xuXG4vKiogVmVyaWZ5IHgtdDMtcmVsYXktZGVsaXZlcnkgd2l0aCB0aGUgcmVsYXkgbWludCBrZXkgYmVmb3JlIHRydXN0aW5nIGRlbGl2ZXJ5IGlkLCB0aW1lLCBvciB0cmFjZSBjb250ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IFJlbGF5SG9va0RlbGl2ZXJ5UHJvb2ZQYXlsb2FkID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlJlbGF5U2lnbmVkSnd0UmVnaXN0ZXJlZENsYWltcyxcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgZGVsaXZlcnlJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICByZWNlaXZlZEF0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGhvb2tJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUhvb2tEZWxpdmVyeVByb29mUGF5bG9hZCA9IHR5cGVvZiBSZWxheUhvb2tEZWxpdmVyeVByb29mUGF5bG9hZC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlDbG91ZEVudmlyb25tZW50SGVhbHRoUHJvb2YgPSBUcmltbWVkTm9uRW1wdHlTdHJpbmc7XG5leHBvcnQgdHlwZSBSZWxheUNsb3VkRW52aXJvbm1lbnRIZWFsdGhQcm9vZiA9IHR5cGVvZiBSZWxheUNsb3VkRW52aXJvbm1lbnRIZWFsdGhQcm9vZi5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlDbG91ZEVudmlyb25tZW50SGVhbHRoUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBwcm9vZjogUmVsYXlDbG91ZEVudmlyb25tZW50SGVhbHRoUHJvb2YsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5Q2xvdWRFbnZpcm9ubWVudEhlYWx0aFJlcXVlc3QgPSB0eXBlb2YgUmVsYXlDbG91ZEVudmlyb25tZW50SGVhbHRoUmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudEhlYWx0aFJlc3BvbnNlUHJvb2ZQYXlsb2FkID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlJlbGF5U2lnbmVkSnd0UmVnaXN0ZXJlZENsYWltcyxcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgcmVxdWVzdE5vbmNlOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHN0YXR1czogU2NoZW1hLkxpdGVyYWwoXCJvbmxpbmVcIiksXG4gIGRlc2NyaXB0b3I6IEV4ZWN1dGlvbkVudmlyb25tZW50RGVzY3JpcHRvcixcbiAgY2hlY2tlZEF0OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRIZWFsdGhSZXNwb25zZVByb29mUGF5bG9hZCA9XG4gIHR5cGVvZiBSZWxheUVudmlyb25tZW50SGVhbHRoUmVzcG9uc2VQcm9vZlBheWxvYWQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RW52aXJvbm1lbnRIZWFsdGhSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICBzdGF0dXM6IFNjaGVtYS5MaXRlcmFsKFwib25saW5lXCIpLFxuICBkZXNjcmlwdG9yOiBFeGVjdXRpb25FbnZpcm9ubWVudERlc2NyaXB0b3IsXG4gIGNoZWNrZWRBdDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBwcm9vZjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50SGVhbHRoUmVzcG9uc2UgPSB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudEhlYWx0aFJlc3BvbnNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TWludFJlc3BvbnNlUHJvb2ZQYXlsb2FkID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlJlbGF5U2lnbmVkSnd0UmVnaXN0ZXJlZENsYWltcyxcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgY2xpZW50UHJvb2ZLZXlUaHVtYnByaW50OiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHJlcXVlc3ROb25jZTogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBjcmVkZW50aWFsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5RW52aXJvbm1lbnRNaW50UmVzcG9uc2VQcm9vZlBheWxvYWQgPVxuICB0eXBlb2YgUmVsYXlFbnZpcm9ubWVudE1pbnRSZXNwb25zZVByb29mUGF5bG9hZC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlFbnZpcm9ubWVudE1pbnRSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBjcmVkZW50aWFsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGV4cGlyZXNBdDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBwcm9vZjogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50TWludFJlc3BvbnNlID0gdHlwZW9mIFJlbGF5RW52aXJvbm1lbnRNaW50UmVzcG9uc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5RGVsaXZlcnlLaW5kID0gU2NoZW1hLkxpdGVyYWxzKFtcbiAgXCJsaXZlX2FjdGl2aXR5X3N0YXJ0XCIsXG4gIFwibGl2ZV9hY3Rpdml0eV91cGRhdGVcIixcbiAgXCJsaXZlX2FjdGl2aXR5X2VuZFwiLFxuICBcInB1c2hfbm90aWZpY2F0aW9uXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFJlbGF5RGVsaXZlcnlLaW5kID0gdHlwZW9mIFJlbGF5RGVsaXZlcnlLaW5kLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheURlbGl2ZXJ5UmVzdWx0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIGRldmljZUlkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIGtpbmQ6IFJlbGF5RGVsaXZlcnlLaW5kLFxuICBvazogU2NoZW1hLkJvb2xlYW4sXG4gIHF1ZXVlZDogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgYXBuc1N0YXR1czogU2NoZW1hLk51bGxPcihTY2hlbWEuTnVtYmVyKSxcbiAgYXBuc1JlYXNvbjogU2NoZW1hLk51bGxPcihTY2hlbWEuU3RyaW5nKSxcbiAgYXBuc0lkOiBTY2hlbWEuTnVsbE9yKFNjaGVtYS5TdHJpbmcpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheURlbGl2ZXJ5UmVzdWx0ID0gdHlwZW9mIFJlbGF5RGVsaXZlcnlSZXN1bHQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5T2tSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBvazogU2NoZW1hLkJvb2xlYW4sXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5T2tSZXNwb25zZSA9IHR5cGVvZiBSZWxheU9rUmVzcG9uc2UuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5UHVibGlzaFJlc3BvbnNlID0gU2NoZW1hLlN0cnVjdCh7XG4gIG9rOiBTY2hlbWEuQm9vbGVhbixcbiAgZGVsaXZlcmllczogU2NoZW1hLkFycmF5KFJlbGF5RGVsaXZlcnlSZXN1bHQpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheVB1Ymxpc2hSZXNwb25zZSA9IHR5cGVvZiBSZWxheVB1Ymxpc2hSZXNwb25zZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlIZWFsdGhSZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBvazogU2NoZW1hLkJvb2xlYW4sXG4gIHNlcnZpY2U6IFNjaGVtYS5MaXRlcmFsKFwicmVsYXlcIiksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5SGVhbHRoUmVzcG9uc2UgPSB0eXBlb2YgUmVsYXlIZWFsdGhSZXNwb25zZS5UeXBlO1xuXG5jb25zdCBSZWxheUhlYWx0aEdyb3VwID0gSHR0cEFwaUdyb3VwLm1ha2UoXCJoZWFsdGhcIilcbiAgLmFkZChcbiAgICBIdHRwQXBpRW5kcG9pbnQuZ2V0KFwiaGVhbHRoXCIsIFwiL2hlYWx0aFwiLCB7XG4gICAgICBzdWNjZXNzOiBSZWxheUhlYWx0aFJlc3BvbnNlLFxuICAgICAgZXJyb3I6IFJlbGF5SW50ZXJuYWxFcnJvcixcbiAgICB9KS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiQ2hlY2sgcmVsYXkgaGVhbHRoXCIpLFxuICApXG4gIC5hbm5vdGF0ZShPcGVuQXBpLkRlc2NyaXB0aW9uLCBcIlNlcnZpY2UgaGVhbHRoIGFuZCByZWFkaW5lc3MuXCIpO1xuXG5jb25zdCBSZWxheU1ldGFkYXRhR3JvdXAgPSBIdHRwQXBpR3JvdXAubWFrZShcIm1ldGFkYXRhXCIpXG4gIC5hZGQoXG4gICAgSHR0cEFwaUVuZHBvaW50LmdldChcImF1dGhvcml6YXRpb25TZXJ2ZXJcIiwgXCIvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXJcIiwge1xuICAgICAgc3VjY2VzczogUmVsYXlBdXRob3JpemF0aW9uU2VydmVyTWV0YWRhdGEsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIlJlYWQgT0F1dGggYXV0aG9yaXphdGlvbi1zZXJ2ZXIgbWV0YWRhdGFcIiksXG4gICAgSHR0cEFwaUVuZHBvaW50LmdldChcInByb3RlY3RlZFJlc291cmNlXCIsIFwiLy53ZWxsLWtub3duL29hdXRoLXByb3RlY3RlZC1yZXNvdXJjZVwiLCB7XG4gICAgICBzdWNjZXNzOiBSZWxheVByb3RlY3RlZFJlc291cmNlTWV0YWRhdGEsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIlJlYWQgT0F1dGggcHJvdGVjdGVkLXJlc291cmNlIG1ldGFkYXRhXCIpLFxuICApXG4gIC5hbm5vdGF0ZShPcGVuQXBpLkRlc2NyaXB0aW9uLCBcIk9BdXRoIGFuZCBEUG9QIGRpc2NvdmVyeSBtZXRhZGF0YS5cIik7XG5cbmV4cG9ydCBjb25zdCBSZWxheVJlZ2lzdGVyRGV2aWNlRW5kcG9pbnQgPSBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgXCJyZWdpc3RlckRldmljZVwiLFxuICBcIi92MS9tb2JpbGUvZGV2aWNlc1wiLFxuICB7XG4gICAgaGVhZGVyczogUmVsYXlEcG9wUmVxdWVzdEhlYWRlcnMsXG4gICAgcGF5bG9hZDogUmVsYXlEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgIHN1Y2Nlc3M6IFJlbGF5T2tSZXNwb25zZSxcbiAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gIH0sXG4pLmFubm90YXRlKE9wZW5BcGkuU3VtbWFyeSwgXCJSZWdpc3RlciBvciB1cGRhdGUgYSBtb2JpbGUgZGV2aWNlXCIpO1xuXG5leHBvcnQgY29uc3QgUmVsYXlSZWdpc3RlckxpdmVBY3Rpdml0eUVuZHBvaW50ID0gSHR0cEFwaUVuZHBvaW50LnBvc3QoXG4gIFwicmVnaXN0ZXJMaXZlQWN0aXZpdHlcIixcbiAgXCIvdjEvbW9iaWxlL2xpdmUtYWN0aXZpdGllc1wiLFxuICB7XG4gICAgaGVhZGVyczogUmVsYXlEcG9wUmVxdWVzdEhlYWRlcnMsXG4gICAgcGF5bG9hZDogUmVsYXlMaXZlQWN0aXZpdHlSZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgIHN1Y2Nlc3M6IFJlbGF5T2tSZXNwb25zZSxcbiAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gIH0sXG4pLmFubm90YXRlKE9wZW5BcGkuU3VtbWFyeSwgXCJSZWdpc3RlciBhIExpdmUgQWN0aXZpdHkgcHVzaCB0b2tlblwiKTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QWdlbnRBY3Rpdml0eVNuYXBzaG90UmVzcG9uc2UgPSBTY2hlbWEuU3RydWN0KHtcbiAgYWdncmVnYXRlOiBTY2hlbWEuTnVsbE9yKFJlbGF5QWdlbnRBY3Rpdml0eUFnZ3JlZ2F0ZVN0YXRlKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVsYXlBZ2VudEFjdGl2aXR5U25hcHNob3RSZXNwb25zZSA9IHR5cGVvZiBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdFJlc3BvbnNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdEVuZHBvaW50ID0gSHR0cEFwaUVuZHBvaW50LmdldChcbiAgXCJnZXRBZ2VudEFjdGl2aXR5U25hcHNob3RcIixcbiAgXCIvdjEvbW9iaWxlL2FnZW50LWFjdGl2aXR5XCIsXG4gIHtcbiAgICBoZWFkZXJzOiBSZWxheURwb3BSZXF1ZXN0SGVhZGVycyxcbiAgICBzdWNjZXNzOiBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdFJlc3BvbnNlLFxuICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgfSxcbikuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIlJlYWQgdGhlIGN1cnJlbnQgTGl2ZSBBY3Rpdml0eSBhZ2dyZWdhdGVcIik7XG5cbmV4cG9ydCBjb25zdCBSZWxheVVucmVnaXN0ZXJEZXZpY2VFbmRwb2ludCA9IEh0dHBBcGlFbmRwb2ludC5kZWxldGUoXG4gIFwidW5yZWdpc3RlckRldmljZVwiLFxuICBcIi92MS9tb2JpbGUvZGV2aWNlcy86ZGV2aWNlSWRcIixcbiAge1xuICAgIGhlYWRlcnM6IFJlbGF5RHBvcFJlcXVlc3RIZWFkZXJzLFxuICAgIHBhcmFtczogUmVsYXlEZXZpY2VVbnJlZ2lzdHJhdGlvblBhcmFtcyxcbiAgICBzdWNjZXNzOiBSZWxheU9rUmVzcG9uc2UsXG4gICAgZXJyb3I6IFJlbGF5QXV0aEFuZEludGVybmFsRXJyb3JzLFxuICB9LFxuKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiVW5yZWdpc3RlciBhIG1vYmlsZSBkZXZpY2VcIik7XG5cbmNvbnN0IFJlbGF5TW9iaWxlR3JvdXAgPSBIdHRwQXBpR3JvdXAubWFrZShcIm1vYmlsZVwiKVxuICAuYWRkKFxuICAgIFJlbGF5UmVnaXN0ZXJEZXZpY2VFbmRwb2ludCxcbiAgICBSZWxheVJlZ2lzdGVyTGl2ZUFjdGl2aXR5RW5kcG9pbnQsXG4gICAgUmVsYXlBZ2VudEFjdGl2aXR5U25hcHNob3RFbmRwb2ludCxcbiAgICBSZWxheVVucmVnaXN0ZXJEZXZpY2VFbmRwb2ludCxcbiAgKVxuICAuYW5ub3RhdGUoT3BlbkFwaS5EZXNjcmlwdGlvbiwgXCJNb2JpbGUgcHVzaC1ub3RpZmljYXRpb24gYW5kIExpdmUgQWN0aXZpdHkgcmVnaXN0cmF0aW9uLlwiKVxuICAubWlkZGxld2FyZShSZWxheURwb3BDbGllbnRBdXRoKTtcblxuY29uc3QgUmVsYXlDbGllbnRHcm91cCA9IEh0dHBBcGlHcm91cC5tYWtlKFwiY2xpZW50XCIpXG4gIC5hZGQoXG4gICAgSHR0cEFwaUVuZHBvaW50LmdldChcImxpc3RFbnZpcm9ubWVudHNcIiwgXCIvdjEvZW52aXJvbm1lbnRzXCIsIHtcbiAgICAgIGhlYWRlcnM6IFJlbGF5QmVhcmVyUmVxdWVzdEhlYWRlcnMsXG4gICAgICBzdWNjZXNzOiBSZWxheUxpc3RFbnZpcm9ubWVudHNSZXNwb25zZSxcbiAgICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgICB9KS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiTGlzdCBsaW5rZWQgZW52aXJvbm1lbnRzXCIpLFxuICAgIEh0dHBBcGlFbmRwb2ludC5nZXQoXCJsaXN0RGV2aWNlc1wiLCBcIi92MS9jbGllbnQvZGV2aWNlc1wiLCB7XG4gICAgICBoZWFkZXJzOiBSZWxheUJlYXJlclJlcXVlc3RIZWFkZXJzLFxuICAgICAgc3VjY2VzczogUmVsYXlMaXN0RGV2aWNlc1Jlc3BvbnNlVjEsXG4gICAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIkxpc3QgcmVnaXN0ZXJlZCBpT1MgZGV2aWNlcyAobGVnYWN5IGNsaWVudHMpXCIpLFxuICAgIEh0dHBBcGlFbmRwb2ludC5nZXQoXCJsaXN0RGV2aWNlc1YyXCIsIFwiL3YyL2NsaWVudC9kZXZpY2VzXCIsIHtcbiAgICAgIGhlYWRlcnM6IFJlbGF5QmVhcmVyUmVxdWVzdEhlYWRlcnMsXG4gICAgICBzdWNjZXNzOiBSZWxheUxpc3REZXZpY2VzUmVzcG9uc2UsXG4gICAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIkxpc3QgcmVnaXN0ZXJlZCBtb2JpbGUgZGV2aWNlc1wiKSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucG9zdChcImxpbmtFbnZpcm9ubWVudFwiLCBcIi92MS9jbGllbnQvZW52aXJvbm1lbnQtbGlua3NcIiwge1xuICAgICAgaGVhZGVyczogUmVsYXlCZWFyZXJSZXF1ZXN0SGVhZGVycyxcbiAgICAgIHBheWxvYWQ6IFJlbGF5RW52aXJvbm1lbnRMaW5rUmVxdWVzdCxcbiAgICAgIHN1Y2Nlc3M6IFJlbGF5RW52aXJvbm1lbnRMaW5rUmVzcG9uc2UsXG4gICAgICBlcnJvcjogUmVsYXlFbnZpcm9ubWVudExpbmtFcnJvcnMsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIkxpbmsgYW4gZW52aXJvbm1lbnRcIiksXG4gICAgSHR0cEFwaUVuZHBvaW50LnBvc3QoXG4gICAgICBcImNyZWF0ZUVudmlyb25tZW50TGlua0NoYWxsZW5nZVwiLFxuICAgICAgXCIvdjEvY2xpZW50L2Vudmlyb25tZW50LWxpbmstY2hhbGxlbmdlc1wiLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiBSZWxheUJlYXJlclJlcXVlc3RIZWFkZXJzLFxuICAgICAgICBwYXlsb2FkOiBSZWxheUVudmlyb25tZW50TGlua0NoYWxsZW5nZVJlcXVlc3QsXG4gICAgICAgIHN1Y2Nlc3M6IFJlbGF5RW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlUmVzcG9uc2UsXG4gICAgICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgICAgIH0sXG4gICAgKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiQ3JlYXRlIGFuIGVudmlyb25tZW50LWxpbmsgY2hhbGxlbmdlXCIpLFxuICAgIEh0dHBBcGlFbmRwb2ludC5kZWxldGUoXCJ1bmxpbmtFbnZpcm9ubWVudFwiLCBcIi92MS9jbGllbnQvZW52aXJvbm1lbnQtbGlua3MvOmVudmlyb25tZW50SWRcIiwge1xuICAgICAgaGVhZGVyczogUmVsYXlCZWFyZXJSZXF1ZXN0SGVhZGVycyxcbiAgICAgIHBhcmFtczogUmVsYXlFbnZpcm9ubWVudFVubGlua1BhcmFtcyxcbiAgICAgIHN1Y2Nlc3M6IFJlbGF5T2tSZXNwb25zZSxcbiAgICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgICB9KS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiVW5saW5rIGFuIGVudmlyb25tZW50XCIpLFxuICAgIEh0dHBBcGlFbmRwb2ludC5kZWxldGUoXG4gICAgICBcInJlbGVhc2VFbnZpcm9ubWVudFR1bm5lbFwiLFxuICAgICAgXCIvdjEvY2xpZW50L2Vudmlyb25tZW50LWxpbmtzLzplbnZpcm9ubWVudElkL3R1bm5lbFwiLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiBSZWxheUJlYXJlclJlcXVlc3RIZWFkZXJzLFxuICAgICAgICBwYXJhbXM6IFJlbGF5RW52aXJvbm1lbnRVbmxpbmtQYXJhbXMsXG4gICAgICAgIHN1Y2Nlc3M6IFJlbGF5T2tSZXNwb25zZSxcbiAgICAgICAgZXJyb3I6IFJlbGF5QXV0aEFuZEludGVybmFsRXJyb3JzLFxuICAgICAgfSxcbiAgICApXG4gICAgICAuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIlJlbGVhc2UgYW4gZW52aXJvbm1lbnQncyBtYW5hZ2VkIHR1bm5lbFwiKVxuICAgICAgLmFubm90YXRlKFxuICAgICAgICBPcGVuQXBpLkRlc2NyaXB0aW9uLFxuICAgICAgICBcIkRlbGV0ZXMgdGhlIHByb3Zpc2lvbmVkIENsb3VkZmxhcmUgdHVubmVsIHdoaWxlIGtlZXBpbmcgdGhlIGVudmlyb25tZW50IGxpbmsgYW5kIGl0cyBob3N0bmFtZSByZXNlcnZhdGlvbiwgc28gYSBsYXRlciBsaW5rIHJlLXByb3Zpc2lvbnMgdGhlIHR1bm5lbCB1bmRlciB0aGUgc2FtZSBVUkwuIEVudmlyb25tZW50cyBjYWxsIHRoaXMgd2hlbiB0aGV5IHNodXQgZG93bjsgQ2xvdWRmbGFyZSBiaWxscyBwZXIgcHJvdmlzaW9uZWQgdHVubmVsLCBzbyBpZGxlIHR1bm5lbHMgc2hvdWxkIG5vdCBvdXRsaXZlIHRoZWlyIGVudmlyb25tZW50LlwiLFxuICAgICAgKSxcbiAgKVxuICAuYW5ub3RhdGUoT3BlbkFwaS5EZXNjcmlwdGlvbiwgXCJDbG91ZC11c2VyIGVudmlyb25tZW50IGxpbmtzIGFuZCByZWdpc3RlcmVkIGRldmljZXMuXCIpXG4gIC5taWRkbGV3YXJlKFJlbGF5Q2xpZW50QXV0aCk7XG5cbmV4cG9ydCBjb25zdCBSZWxheUV4Y2hhbmdlRHBvcEFjY2Vzc1Rva2VuRW5kcG9pbnQgPSBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgXCJleGNoYW5nZURwb3BBY2Nlc3NUb2tlblwiLFxuICBcIi92MS9jbGllbnQvZHBvcC10b2tlblwiLFxuICB7XG4gICAgaGVhZGVyczogUmVsYXlEcG9wUHJvb2ZSZXF1ZXN0SGVhZGVycyxcbiAgICBwYXlsb2FkOiBSZWxheURwb3BBY2Nlc3NUb2tlblJlcXVlc3QsXG4gICAgc3VjY2VzczogUmVsYXlEcG9wQWNjZXNzVG9rZW5SZXNwb25zZSxcbiAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gIH0sXG4pXG4gIC5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiRXhjaGFuZ2UgYSBDbGVyayB0b2tlbiBmb3IgYSBEUG9QIGFjY2VzcyB0b2tlblwiKVxuICAuYW5ub3RhdGUoXG4gICAgT3BlbkFwaS5EZXNjcmlwdGlvbixcbiAgICBcIkJvb3RzdHJhcCBlbmRwb2ludC4gU2VuZCB0aGUgRFBvUCBwcm9vZiBKV1QgaW4gdGhlIGRwb3AgaGVhZGVyIGFuZCB0aGUgQ2xlcmsgdG9rZW4gaW4gc3ViamVjdF90b2tlbi4gVGhlIHJldHVybmVkIGFjY2VzcyB0b2tlbiBpcyBib3VuZCB0byB0aGUgcHJvb2Yga2V5LlwiLFxuICApO1xuXG5jb25zdCBSZWxheVRva2VuR3JvdXAgPSBIdHRwQXBpR3JvdXAubWFrZShcInRva2VuXCIpXG4gIC5hZGQoUmVsYXlFeGNoYW5nZURwb3BBY2Nlc3NUb2tlbkVuZHBvaW50KVxuICAuYW5ub3RhdGUoT3BlbkFwaS5EZXNjcmlwdGlvbiwgXCJPQXV0aCB0b2tlbiBleGNoYW5nZSBmb3IgRFBvUC1ib3VuZCBjbGllbnQgYWNjZXNzLlwiKTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5Q29ubmVjdEVudmlyb25tZW50RW5kcG9pbnQgPSBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgXCJjb25uZWN0RW52aXJvbm1lbnRcIixcbiAgXCIvdjEvZW52aXJvbm1lbnRzLzplbnZpcm9ubWVudElkL2Nvbm5lY3RcIixcbiAge1xuICAgIGhlYWRlcnM6IFJlbGF5RHBvcFJlcXVlc3RIZWFkZXJzLFxuICAgIHBhcmFtczogU2NoZW1hLlN0cnVjdCh7XG4gICAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLFxuICAgIH0pLFxuICAgIHBheWxvYWQ6IFJlbGF5RW52aXJvbm1lbnRDb25uZWN0UmVxdWVzdCxcbiAgICBzdWNjZXNzOiBSZWxheUVudmlyb25tZW50Q29ubmVjdFJlc3BvbnNlLFxuICAgIGVycm9yOiBSZWxheUVudmlyb25tZW50Q29ubmVjdEVycm9ycyxcbiAgfSxcbikuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIkNvbm5lY3QgdG8gYW4gZW52aXJvbm1lbnRcIik7XG5cbmV4cG9ydCBjb25zdCBSZWxheUdldEVudmlyb25tZW50U3RhdHVzRW5kcG9pbnQgPSBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgXCJnZXRFbnZpcm9ubWVudFN0YXR1c1wiLFxuICBcIi92MS9lbnZpcm9ubWVudHMvOmVudmlyb25tZW50SWQvc3RhdHVzXCIsXG4gIHtcbiAgICBoZWFkZXJzOiBSZWxheURwb3BSZXF1ZXN0SGVhZGVycyxcbiAgICBwYXJhbXM6IFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICB9KSxcbiAgICBzdWNjZXNzOiBSZWxheUVudmlyb25tZW50U3RhdHVzUmVzcG9uc2UsXG4gICAgZXJyb3I6IFJlbGF5RW52aXJvbm1lbnRDb25uZWN0RXJyb3JzLFxuICB9LFxuKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiQ2hlY2sgZW52aXJvbm1lbnQgc3RhdHVzXCIpO1xuXG5jb25zdCBSZWxheURwb3BDbGllbnRHcm91cCA9IEh0dHBBcGlHcm91cC5tYWtlKFwiZHBvcENsaWVudFwiKVxuICAuYWRkKFJlbGF5Q29ubmVjdEVudmlyb25tZW50RW5kcG9pbnQsIFJlbGF5R2V0RW52aXJvbm1lbnRTdGF0dXNFbmRwb2ludClcbiAgLmFubm90YXRlKE9wZW5BcGkuRGVzY3JpcHRpb24sIFwiRFBvUC1hdXRoZW50aWNhdGVkIGNsaWVudCBhY2Nlc3MgdG8gbGlua2VkIGVudmlyb25tZW50cy5cIilcbiAgLm1pZGRsZXdhcmUoUmVsYXlEcG9wQ2xpZW50QXV0aCk7XG5cbmV4cG9ydCBjb25zdCBSZWxheUVudmlyb25tZW50TGlua1ByZWZlcmVuY2VzUmVxdWVzdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBob2xkV2ViaG9va3NXaGlsZU9mZmxpbmU6IFNjaGVtYS5Cb29sZWFuLFxufSk7XG5leHBvcnQgdHlwZSBSZWxheUVudmlyb25tZW50TGlua1ByZWZlcmVuY2VzUmVxdWVzdCA9XG4gIHR5cGVvZiBSZWxheUVudmlyb25tZW50TGlua1ByZWZlcmVuY2VzUmVxdWVzdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUmVsYXlXYWtlSGVsZEhvb2tzUmVzcG9uc2UgPSBTY2hlbWEuU3RydWN0KHtcbiAgcGVuZGluZzogU2NoZW1hLkJvb2xlYW4sXG59KTtcbmV4cG9ydCB0eXBlIFJlbGF5V2FrZUhlbGRIb29rc1Jlc3BvbnNlID0gdHlwZW9mIFJlbGF5V2FrZUhlbGRIb29rc1Jlc3BvbnNlLlR5cGU7XG5cbmNvbnN0IFJlbGF5U2VydmVyR3JvdXAgPSBIdHRwQXBpR3JvdXAubWFrZShcInNlcnZlclwiKVxuICAuYWRkKFxuICAgIEh0dHBBcGlFbmRwb2ludC5wb3N0KFxuICAgICAgXCJyZWdpc3Rlck1hbmFnZWRFbmRwb2ludFJlY292ZXJ5XCIsXG4gICAgICBcIi92MS9lbnZpcm9ubWVudHMvOmVudmlyb25tZW50SWQvdHVubmVsL3JlY292ZXJ5XCIsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogU2NoZW1hLlN0cnVjdCh7XG4gICAgICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICAgICAgfSksXG4gICAgICAgIHBheWxvYWQ6IFJlbGF5TWFuYWdlZEVuZHBvaW50UmVjb3ZlcnlSZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgICAgICBzdWNjZXNzOiBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVnaXN0cmF0aW9uUmVzcG9uc2UsXG4gICAgICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgICAgIH0sXG4gICAgKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiUmVnaXN0ZXIgbWFuYWdlZCB0dW5uZWwgcmVjb3Zlcnkgd2l0aG91dCBwcm92aXNpb25pbmdcIiksXG4gICAgSHR0cEFwaUVuZHBvaW50LnBvc3QoXCJyZWNvdmVyTWFuYWdlZEVuZHBvaW50XCIsIFwiL3YxL2Vudmlyb25tZW50cy86ZW52aXJvbm1lbnRJZC90dW5uZWxcIiwge1xuICAgICAgcGFyYW1zOiBTY2hlbWEuU3RydWN0KHtcbiAgICAgICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgICAgIH0pLFxuICAgICAgcGF5bG9hZDogUmVsYXlNYW5hZ2VkRW5kcG9pbnRSZWNvdmVyeVJlcXVlc3QsXG4gICAgICBzdWNjZXNzOiBSZWxheU1hbmFnZWRFbmRwb2ludFJlY292ZXJ5UmVzcG9uc2UsXG4gICAgICBlcnJvcjogUmVsYXlBdXRoQW5kSW50ZXJuYWxFcnJvcnMsXG4gICAgfSkuYW5ub3RhdGUoT3BlbkFwaS5TdW1tYXJ5LCBcIlJlY292ZXIgYW4gZW52aXJvbm1lbnQncyBtYW5hZ2VkIHR1bm5lbFwiKSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgICAgIFwicHVibGlzaEFnZW50QWN0aXZpdHlcIixcbiAgICAgIFwiL3YxL2Vudmlyb25tZW50cy86ZW52aXJvbm1lbnRJZC90aHJlYWRzLzp0aHJlYWRJZC9hZ2VudC1hY3Rpdml0eVwiLFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgICAgICAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICAgICAgICB9KSxcbiAgICAgICAgcGF5bG9hZDogUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaFJlcXVlc3QsXG4gICAgICAgIHN1Y2Nlc3M6IFJlbGF5UHVibGlzaFJlc3BvbnNlLFxuICAgICAgICBlcnJvcjogUmVsYXlBZ2VudEFjdGl2aXR5UHVibGlzaEVycm9ycyxcbiAgICAgIH0sXG4gICAgKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiUHVibGlzaCBhZ2VudCBhY3Rpdml0eVwiKSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucG9zdChcbiAgICAgIFwidXBkYXRlTGlua1ByZWZlcmVuY2VzXCIsXG4gICAgICBcIi92MS9lbnZpcm9ubWVudHMvOmVudmlyb25tZW50SWQvbGluay1wcmVmZXJlbmNlc1wiLFxuICAgICAge1xuICAgICAgICBwYXJhbXM6IFNjaGVtYS5TdHJ1Y3QoeyBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkIH0pLFxuICAgICAgICBwYXlsb2FkOiBSZWxheUVudmlyb25tZW50TGlua1ByZWZlcmVuY2VzUmVxdWVzdCxcbiAgICAgICAgc3VjY2VzczogUmVsYXlFbnZpcm9ubWVudExpbmtQcmVmZXJlbmNlc1JlcXVlc3QsXG4gICAgICAgIGVycm9yOiBSZWxheUF1dGhBbmRJbnRlcm5hbEVycm9ycyxcbiAgICAgIH0sXG4gICAgKS5hbm5vdGF0ZShPcGVuQXBpLlN1bW1hcnksIFwiVXBkYXRlIGFuIGVudmlyb25tZW50J3MgbGluayBwcmVmZXJlbmNlc1wiKSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucG9zdChcIndha2VIZWxkSG9va3NcIiwgXCIvdjEvZW52aXJvbm1lbnRzLzplbnZpcm9ubWVudElkL2hvb2tzL3dha2VcIiwge1xuICAgICAgcGFyYW1zOiBTY2hlbWEuU3RydWN0KHsgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCB9KSxcbiAgICAgIHN1Y2Nlc3M6IFJlbGF5V2FrZUhlbGRIb29rc1Jlc3BvbnNlLFxuICAgICAgZXJyb3I6IFJlbGF5QXV0aEFuZEludGVybmFsRXJyb3JzLFxuICAgIH0pLmFubm90YXRlKFxuICAgICAgT3BlbkFwaS5TdW1tYXJ5LFxuICAgICAgXCJEZWxpdmVyIHdlYmhvb2sgcmVxdWVzdHMgaGVsZCB3aGlsZSB0aGUgZW52aXJvbm1lbnQgd2FzIG9mZmxpbmUgbm93XCIsXG4gICAgKSxcbiAgKVxuICAuYW5ub3RhdGUoT3BlbkFwaS5EZXNjcmlwdGlvbiwgXCJFbnZpcm9ubWVudC1hdXRoZW50aWNhdGVkIGFjdGl2aXR5IHB1YmxpY2F0aW9uLlwiKVxuICAubWlkZGxld2FyZShSZWxheUVudmlyb25tZW50QXV0aCk7XG5cbi8vIFBhdGggdG9rZW4gYXV0aGVudGljYXRlczsgZm9yd2FyZCByYXcgYnl0ZXMgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uXG4vLyBlbmRwb2ludEtleSBpcyB0aGUgbWFuYWdlZCBlbmRwb2ludCBoYXNoLCBub3QgdGhlIGFjY291bnQtbGlua2FibGUgZW52aXJvbm1lbnQgaWQuXG5jb25zdCBSZWxheUhvb2tQYXJhbXMgPSBTY2hlbWEuU3RydWN0KHtcbiAgZW5kcG9pbnRLZXk6IFNjaGVtYS5TdHJpbmcsXG4gIGhvb2tJZDogU2NoZW1hLlN0cmluZyxcbiAgdG9rZW46IFNjaGVtYS5TdHJpbmcsXG59KTtcbmNvbnN0IFJFTEFZX0hPT0tfUEFUSCA9IFwiL3YxL2hvb2tzLzplbmRwb2ludEtleS86aG9va0lkLzp0b2tlblwiO1xuY29uc3QgcmVsYXlIb29rRW5kcG9pbnQgPSB7IHBhcmFtczogUmVsYXlIb29rUGFyYW1zIH0gYXMgY29uc3Q7XG5jb25zdCBSZWxheUhvb2tzR3JvdXAgPSBIdHRwQXBpR3JvdXAubWFrZShcImhvb2tzXCIpXG4gIC5hZGQoXG4gICAgSHR0cEFwaUVuZHBvaW50LnBvc3QoXCJmb3J3YXJkUG9zdFwiLCBSRUxBWV9IT09LX1BBVEgsIHJlbGF5SG9va0VuZHBvaW50KSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucHV0KFwiZm9yd2FyZFB1dFwiLCBSRUxBWV9IT09LX1BBVEgsIHJlbGF5SG9va0VuZHBvaW50KSxcbiAgICBIdHRwQXBpRW5kcG9pbnQucGF0Y2goXCJmb3J3YXJkUGF0Y2hcIiwgUkVMQVlfSE9PS19QQVRILCByZWxheUhvb2tFbmRwb2ludCksXG4gICAgSHR0cEFwaUVuZHBvaW50LmdldChcImZvcndhcmRHZXRcIiwgUkVMQVlfSE9PS19QQVRILCByZWxheUhvb2tFbmRwb2ludCksXG4gIClcbiAgLmFubm90YXRlKE9wZW5BcGkuRGVzY3JpcHRpb24sIFwiRm9yd2FyZCB3ZWJob29rIHJlcXVlc3RzIHRvIGFuIGVudmlyb25tZW50LlwiKTtcblxuZXhwb3J0IGNvbnN0IFJlbGF5QXBpID0gSHR0cEFwaS5tYWtlKFwiUmVsYXlBcGlcIilcbiAgLmFkZChcbiAgICBSZWxheUhlYWx0aEdyb3VwLFxuICAgIFJlbGF5TWV0YWRhdGFHcm91cCxcbiAgICBSZWxheU1vYmlsZUdyb3VwLFxuICAgIFJlbGF5Q2xpZW50R3JvdXAsXG4gICAgUmVsYXlUb2tlbkdyb3VwLFxuICAgIFJlbGF5RHBvcENsaWVudEdyb3VwLFxuICAgIFJlbGF5U2VydmVyR3JvdXAsXG4gICAgUmVsYXlIb29rc0dyb3VwLFxuICApXG4gIC5hbm5vdGF0ZShPcGVuQXBpLlRpdGxlLCBcIlQzIENvZGUgUmVsYXkgQVBJXCIpXG4gIC5hbm5vdGF0ZShPcGVuQXBpLlZlcnNpb24sIFwiMS4wLjBcIilcbiAgLmFubm90YXRlKFxuICAgIE9wZW5BcGkuRGVzY3JpcHRpb24sXG4gICAgXCJDb250cm9sLXBsYW5lIEFQSSBmb3IgbGlua2luZyBUMyBlbnZpcm9ubWVudHMsIGNvbm5lY3RpbmcgYXV0aG9yaXplZCBjbGllbnRzLCBhbmQgcHVibGlzaGluZyBhZ2VudCBhY3Rpdml0eS5cIixcbiAgKTtcbmV4cG9ydCB0eXBlIFJlbGF5QXBpID0gdHlwZW9mIFJlbGF5QXBpO1xuIl0sImZpbGUiOiIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvcmVsYXkudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9yZWxheS50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9yZWxheS50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4Il0sW10sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCJdLHt9LCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0NvbnRleHQuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVtYS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvaHR0cC1hcGkvSHR0cEFwaS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvaHR0cC1hcGkvSHR0cEFwaUVuZHBvaW50LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9odHRwLWFwaS9IdHRwQXBpR3JvdXAuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L2h0dHAtYXBpL0h0dHBBcGlNaWRkbGV3YXJlLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9odHRwLWFwaS9IdHRwQXBpU2NoZW1hLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9odHRwLWFwaS9IdHRwQXBpU2VjdXJpdHkuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L2h0dHAtYXBpL09wZW5BcGkuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvYmFzZVNjaGVtYXMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvZW52aXJvbm1lbnQudHMiXQ==