__vite_ssr_exportName__("DevicePlatform", () => { try { return DevicePlatform } catch {} });
__vite_ssr_exportName__("DeviceHostId", () => { try { return DeviceHostId } catch {} });
__vite_ssr_exportName__("LOCAL_DEVICE_HOST_ID", () => { try { return LOCAL_DEVICE_HOST_ID } catch {} });
__vite_ssr_exportName__("LOCAL_DEVICE_HOST_LABEL", () => { try { return LOCAL_DEVICE_HOST_LABEL } catch {} });
__vite_ssr_exportName__("SshDeviceHostConfig", () => { try { return SshDeviceHostConfig } catch {} });
__vite_ssr_exportName__("EasDeviceHostConfig", () => { try { return EasDeviceHostConfig } catch {} });
__vite_ssr_exportName__("SshDeviceHostConfigs", () => { try { return SshDeviceHostConfigs } catch {} });
__vite_ssr_exportName__("EasDeviceHostConfigs", () => { try { return EasDeviceHostConfigs } catch {} });
__vite_ssr_exportName__("DeviceEasAccountInput", () => { try { return DeviceEasAccountInput } catch {} });
__vite_ssr_exportName__("DeviceEasAccount", () => { try { return DeviceEasAccount } catch {} });
__vite_ssr_exportName__("DeviceEasAccountError", () => { try { return DeviceEasAccountError } catch {} });
__vite_ssr_exportName__("DeviceId", () => { try { return DeviceId } catch {} });
__vite_ssr_exportName__("DeviceSummary", () => { try { return DeviceSummary } catch {} });
__vite_ssr_exportName__("DevicePlatformAvailability", () => { try { return DevicePlatformAvailability } catch {} });
__vite_ssr_exportName__("DeviceToolVersion", () => { try { return DeviceToolVersion } catch {} });
__vite_ssr_exportName__("DeviceToolVersions", () => { try { return DeviceToolVersions } catch {} });
__vite_ssr_exportName__("DeviceHostSummary", () => { try { return DeviceHostSummary } catch {} });
__vite_ssr_exportName__("DeviceHostStatus", () => { try { return DeviceHostStatus } catch {} });
__vite_ssr_exportName__("DeviceSession", () => { try { return DeviceSession } catch {} });
__vite_ssr_exportName__("DeviceHostStatuses", () => { try { return DeviceHostStatuses } catch {} });
__vite_ssr_exportName__("DeviceServiceState", () => { try { return DeviceServiceState } catch {} });
__vite_ssr_exportName__("DeviceListInput", () => { try { return DeviceListInput } catch {} });
__vite_ssr_exportName__("DeviceConfigureInput", () => { try { return DeviceConfigureInput } catch {} });
__vite_ssr_exportName__("DeviceOpenInput", () => { try { return DeviceOpenInput } catch {} });
__vite_ssr_exportName__("DeviceCloseInput", () => { try { return DeviceCloseInput } catch {} });
__vite_ssr_exportName__("DeviceShutdownInput", () => { try { return DeviceShutdownInput } catch {} });
__vite_ssr_exportName__("DeviceAppearance", () => { try { return DeviceAppearance } catch {} });
__vite_ssr_exportName__("DeviceTextSize", () => { try { return DeviceTextSize } catch {} });
__vite_ssr_exportName__("DeviceColorFilter", () => { try { return DeviceColorFilter } catch {} });
__vite_ssr_exportName__("DeviceOrientation", () => { try { return DeviceOrientation } catch {} });
__vite_ssr_exportName__("DeviceSettings", () => { try { return DeviceSettings } catch {} });
__vite_ssr_exportName__("DeviceForegroundApp", () => { try { return DeviceForegroundApp } catch {} });
__vite_ssr_exportName__("DeviceDetail", () => { try { return DeviceDetail } catch {} });
__vite_ssr_exportName__("DevicePermission", () => { try { return DevicePermission } catch {} });
__vite_ssr_exportName__("DeviceActionInput", () => { try { return DeviceActionInput } catch {} });
__vite_ssr_exportName__("DeviceDetailInput", () => { try { return DeviceDetailInput } catch {} });
__vite_ssr_exportName__("DeviceHostUnavailableError", () => { try { return DeviceHostUnavailableError } catch {} });
__vite_ssr_exportName__("DevicePlatformUnavailableError", () => { try { return DevicePlatformUnavailableError } catch {} });
__vite_ssr_exportName__("DeviceNotFoundError", () => { try { return DeviceNotFoundError } catch {} });
__vite_ssr_exportName__("DeviceBootError", () => { try { return DeviceBootError } catch {} });
__vite_ssr_exportName__("DeviceOperationError", () => { try { return DeviceOperationError } catch {} });
__vite_ssr_exportName__("DeviceActionUnavailableError", () => { try { return DeviceActionUnavailableError } catch {} });
__vite_ssr_exportName__("DeviceError", () => { try { return DeviceError } catch {} });
__vite_ssr_exportName__("DeviceToolListResult", () => { try { return DeviceToolListResult } catch {} });
__vite_ssr_exportName__("DeviceToolOpenInput", () => { try { return DeviceToolOpenInput } catch {} });
__vite_ssr_exportName__("DeviceToolOpenResult", () => { try { return DeviceToolOpenResult } catch {} });
__vite_ssr_exportName__("DeviceToolTargetInput", () => { try { return DeviceToolTargetInput } catch {} });
__vite_ssr_exportName__("DeviceToolScreenshotResult", () => { try { return DeviceToolScreenshotResult } catch {} });
__vite_ssr_exportName__("DeviceToolCloseInput", () => { try { return DeviceToolCloseInput } catch {} });
__vite_ssr_exportName__("DeviceToolUnavailableError", () => { try { return DeviceToolUnavailableError } catch {} });
__vite_ssr_exportName__("DeviceToolError", () => { try { return DeviceToolError } catch {} });
__vite_ssr_exportName__("deviceToolInstallMessage", () => { try { return deviceToolInstallMessage } 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/Effect.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/SchemaTransformation.js");
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/baseSchemas.ts", {"importedNames":["ThreadId","TrimmedNonEmptyString","TrimmedString"]});




const DevicePlatform = __vite_ssr_import_1__.Literals(["ios", "android"]);
const DeviceHostId = __vite_ssr_import_3__.TrimmedNonEmptyString.check(__vite_ssr_import_1__.isMaxLength(128));
const LOCAL_DEVICE_HOST_ID = "local";
const LOCAL_DEVICE_HOST_LABEL = "This machine";
const ConfiguredDeviceHostId = DeviceHostId.check(__vite_ssr_import_1__.isPattern(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/), __vite_ssr_import_1__.makeFilter((id) => id !== "local" || "The local host id is reserved."));
const SshDeviceHostConfig = __vite_ssr_import_1__.Struct({
	// Hosts saved before EAS hosts existed carry no kind.
	kind: __vite_ssr_import_1__.Literal("ssh").pipe(__vite_ssr_import_1__.withDecodingDefaultKey(__vite_ssr_import_0__.succeed("ssh"))),
	id: ConfiguredDeviceHostId,
	label: __vite_ssr_import_3__.TrimmedNonEmptyString,
	target: __vite_ssr_import_3__.TrimmedNonEmptyString.check(__vite_ssr_import_1__.isPattern(/^[^\s-][^\s]*$/)),
	identityFile: __vite_ssr_import_1__.optional((0,__vite_ssr_import_3__.TrimmedNonEmptyString)),
	port: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isBetween({
		minimum: 1,
		maximum: 65535
	})))
});
/**
* Cloud simulators from EAS Simulator. Sessions bill the Expo account until
* they stop, so every one is bounded. The Expo credential is not stored here.
*/
const EasDeviceHostConfig = __vite_ssr_import_1__.Struct({
	kind: __vite_ssr_import_1__.Literal("eas"),
	id: ConfiguredDeviceHostId,
	label: __vite_ssr_import_3__.TrimmedNonEmptyString,
	/** EAS project that sessions run under, when the project's app config does not name one. */
	appId: __vite_ssr_import_1__.optional((0,__vite_ssr_import_3__.TrimmedNonEmptyString)),
	/**
	* Expo access token, kept in the secret store. When empty the server uses
	* EXPO_TOKEN, then the `eas login` session. This is `secretSetting` from
	* settings.ts, which imports this module.
	*/
	accessToken: __vite_ssr_import_3__.TrimmedString.pipe(__vite_ssr_import_1__.withDecodingDefaultKey(__vite_ssr_import_0__.succeed("")), __vite_ssr_import_1__.annotateKey({ settingsSecret: true })),
	/** EAS allows at most 40 minutes on free accounts and 115 on paid ones. */
	maxSessionMinutes: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isBetween({
		minimum: 1,
		maximum: 115
	})).pipe(__vite_ssr_import_1__.withDecodingDefaultKey(__vite_ssr_import_0__.succeed(30))),
	idleMinutes: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isBetween({
		minimum: 1,
		maximum: 60
	})).pipe(__vite_ssr_import_1__.withDecodingDefaultKey(__vite_ssr_import_0__.succeed(10))),
	maxConcurrentSessions: __vite_ssr_import_1__.Int.check(__vite_ssr_import_1__.isBetween({
		minimum: 1,
		maximum: 20
	})).pipe(__vite_ssr_import_1__.withDecodingDefaultKey(__vite_ssr_import_0__.succeed(2)))
}).check(
	// EAS requires the idle limit to be smaller than the session limit.
	__vite_ssr_import_1__.makeFilter((host) => host.idleMinutes < host.maxSessionMinutes || "Idle minutes must be smaller than session minutes.")
);
const uniqueHostIds = __vite_ssr_import_1__.makeFilter((hosts) => new Set(hosts.map((host) => host.id)).size === hosts.length || "Device host ids must be unique.");
const SshDeviceHostConfigs = __vite_ssr_import_1__.Array(SshDeviceHostConfig).check(uniqueHostIds);
/**
* Kept apart from the SSH hosts in settings: servers and clients from before
* EAS hosts decode `deviceHosts` as SSH hosts and would reject the whole file
* or snapshot over one EAS entry.
*/
const EasDeviceHostConfigs = __vite_ssr_import_1__.Array(EasDeviceHostConfig).check(uniqueHostIds);
const DeviceEasAccountInput = __vite_ssr_import_1__.Struct({
	/** A saved EAS host whose stored token is checked when no new token is given. */
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	accessToken: __vite_ssr_import_1__.optional((0,__vite_ssr_import_3__.TrimmedString))
});
const DeviceEasAccount = __vite_ssr_import_1__.Struct({
	signedInAs: __vite_ssr_import_1__.String,
	credentialSource: __vite_ssr_import_1__.Literals([
		"settings",
		"env",
		"eas-login"
	]),
	apps: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Struct({
		id: __vite_ssr_import_1__.String,
		fullName: __vite_ssr_import_1__.String
	}))
});
/** Checking an Expo credential failed; no device host is involved yet. */
class DeviceEasAccountError extends __vite_ssr_import_1__.TaggedError()(
	"DeviceEasAccountError",
	// No cause: this error reaches the browser, and the reason already says what Expo answered.
	{ reason: __vite_ssr_import_1__.String }
) {
	get message() {
		return this.reason;
	}
};
const DeviceId = __vite_ssr_import_3__.TrimmedNonEmptyString.check(__vite_ssr_import_1__.isMaxLength(256));
const DeviceSummary = __vite_ssr_import_1__.Struct({
	hostId: DeviceHostId,
	id: DeviceId,
	platform: DevicePlatform,
	name: __vite_ssr_import_3__.TrimmedNonEmptyString,
	version: __vite_ssr_import_1__.String,
	booted: __vite_ssr_import_1__.Boolean,
	physical: __vite_ssr_import_1__.Boolean
});
const DevicePlatformAvailability = __vite_ssr_import_1__.Struct({
	platform: DevicePlatform,
	available: __vite_ssr_import_1__.Boolean,
	reason: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String)
});
const DeviceToolVersion = __vite_ssr_import_1__.Struct({
	requiredVersion: __vite_ssr_import_1__.String,
	installedVersions: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.String),
	runningVersion: __vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.String)
});
const DeviceToolVersions = __vite_ssr_import_1__.Struct({
	hub: DeviceToolVersion,
	agent: DeviceToolVersion
});
const deviceHostSummaryFields = {
	id: DeviceHostId,
	label: __vite_ssr_import_3__.TrimmedNonEmptyString,
	platforms: __vite_ssr_import_1__.Array(DevicePlatformAvailability),
	tools: __vite_ssr_import_1__.optional(DeviceToolVersions),
	toolInspectionError: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	hubInstalled: __vite_ssr_import_1__.Boolean,
	agentDeviceInstalled: __vite_ssr_import_1__.Boolean
};
const MachineDeviceHostSummary = __vite_ssr_import_1__.Struct({
	...deviceHostSummaryFields,
	kind: __vite_ssr_import_1__.Literals(["local", "ssh"])
});
const EasDeviceHostSummary = __vite_ssr_import_1__.Struct({
	...deviceHostSummaryFields,
	kind: __vite_ssr_import_1__.Literal("eas")
});
const DeviceHostSummary = __vite_ssr_import_1__.Union([MachineDeviceHostSummary, EasDeviceHostSummary]);
const DeviceHostStatus = __vite_ssr_import_1__.Literals([
	"disabled",
	"idle",
	"installing",
	"starting",
	"ready",
	"failed"
]);
const DeviceSession = __vite_ssr_import_1__.Struct({
	threadId: __vite_ssr_import_3__.ThreadId,
	hostId: DeviceHostId,
	deviceId: DeviceId,
	platform: DevicePlatform,
	openedAt: __vite_ssr_import_1__.String
});
const DeviceHostStatuses = __vite_ssr_import_1__.Record(DeviceHostId, __vite_ssr_import_1__.Struct({
	status: DeviceHostStatus,
	detail: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	androidDiscoveryIncomplete: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean)
}));
const deviceServiceStateFields = {
	supportsHostRetry: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	supportsToolUpdate: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	supportsToolInspection: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	/** Servers from before EAS hosts ignore `easDeviceHosts`, so clients offer them only when set. */
	supportsEasHosts: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	hostStatus: DeviceHostStatus,
	hostStatusDetail: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	hostStatuses: DeviceHostStatuses,
	devices: __vite_ssr_import_1__.Array(DeviceSummary),
	sessions: __vite_ssr_import_1__.Array(DeviceSession),
	bootingDevices: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Array(__vite_ssr_import_1__.Struct({
		...DeviceSummary.fields,
		threadId: __vite_ssr_import_3__.ThreadId
	}))),
	onboardingCompleted: __vite_ssr_import_1__.Boolean,
	agentAccessEnabled: __vite_ssr_import_1__.Boolean,
	hubBasePath: __vite_ssr_import_1__.String,
	revision: __vite_ssr_import_1__.Int
};
/**
* EAS host summaries travel as `easHosts`: clients from before EAS hosts
* decode `hosts` with a `local | ssh` kind and would reject the whole state.
* Decoded, every host is in `hosts`.
*/
const DeviceServiceStateWire = __vite_ssr_import_1__.Struct({
	...deviceServiceStateFields,
	hosts: __vite_ssr_import_1__.Array(MachineDeviceHostSummary),
	easHosts: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Array(EasDeviceHostSummary))
});
const DeviceServiceStateDecoded = __vite_ssr_import_1__.Struct({
	...deviceServiceStateFields,
	hosts: __vite_ssr_import_1__.Array(DeviceHostSummary)
});
const DeviceServiceState = DeviceServiceStateWire.pipe(__vite_ssr_import_1__.decodeTo(__vite_ssr_import_1__.toType(DeviceServiceStateDecoded), __vite_ssr_import_2__.transform({
	decode: ({ easHosts, ...state }) => ({
		...state,
		hosts: [...state.hosts, ...easHosts ?? []]
	}),
	encode: (state) => ({
		...state,
		hosts: state.hosts.filter((host) => host.kind !== "eas"),
		easHosts: state.hosts.filter((host) => host.kind === "eas")
	})
})));
const DeviceListInput = __vite_ssr_import_1__.Struct({
	updateTool: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Literals(["hub", "agent"])),
	inspectOnly: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	retryHostId: __vite_ssr_import_1__.optional(DeviceHostId)
});
const DeviceConfigureInput = __vite_ssr_import_1__.Struct({
	enabled: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	agentAccessEnabled: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	onboardingCompleted: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean)
});
const DeviceOpenInput = __vite_ssr_import_1__.Struct({
	threadId: __vite_ssr_import_3__.ThreadId,
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	deviceId: DeviceId,
	platform: DevicePlatform,
	/** Boot the simulator or emulator when it is not running. Defaults to true. */
	boot: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean)
});
const DeviceCloseInput = __vite_ssr_import_1__.Struct({
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	threadId: __vite_ssr_import_3__.ThreadId,
	/** Omit to close every device session for the thread. */
	deviceId: __vite_ssr_import_1__.optional(DeviceId),
	/** Also shut the simulator or emulator down. Defaults to false. */
	shutdown: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean)
});
const DeviceShutdownInput = __vite_ssr_import_1__.Struct({
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	deviceId: DeviceId,
	platform: DevicePlatform
});
const DeviceAppearance = __vite_ssr_import_1__.Literals(["light", "dark"]);
const DeviceTextSize = __vite_ssr_import_1__.Literals([
	"small",
	"default",
	"large",
	"extra-large"
]);
const DeviceColorFilter = __vite_ssr_import_1__.Literals([
	"none",
	"grayscale",
	"red-green",
	"green-red",
	"blue-yellow"
]);
const DeviceOrientation = __vite_ssr_import_1__.Literals([
	"portrait",
	"landscape_left",
	"portrait_upside_down",
	"landscape_right"
]);
const DeviceSettings = __vite_ssr_import_1__.Struct({
	appearance: __vite_ssr_import_1__.optional(DeviceAppearance),
	textSize: __vite_ssr_import_1__.optional(DeviceTextSize),
	reduceMotion: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	increaseContrast: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	reduceTransparency: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	showBorders: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	voiceOver: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	liquidGlass: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Literals(["clear", "tinted"])),
	colorFilter: __vite_ssr_import_1__.optional(DeviceColorFilter),
	networkEnabled: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean),
	location: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.NullOr(__vite_ssr_import_1__.Struct({
		latitude: __vite_ssr_import_1__.Number,
		longitude: __vite_ssr_import_1__.Number
	})))
});
const DeviceForegroundApp = __vite_ssr_import_1__.Struct({
	id: __vite_ssr_import_1__.String,
	name: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	version: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String)
});
const DeviceDetail = __vite_ssr_import_1__.Struct({
	hostId: DeviceHostId,
	deviceId: DeviceId,
	settings: DeviceSettings,
	foregroundApp: __vite_ssr_import_1__.NullOr(DeviceForegroundApp),
	readAt: __vite_ssr_import_1__.String
});
const DevicePermission = __vite_ssr_import_1__.Literals([
	"camera",
	"microphone",
	"photos",
	"contacts",
	"calendar",
	"reminders",
	"location",
	"notifications",
	"motion",
	"media-library",
	"faceid"
]);
const DeviceTarget = {
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	deviceId: DeviceId
};
const DeviceActionInput = __vite_ssr_import_1__.Union([
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setAppearance"),
		value: DeviceAppearance
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setTextSize"),
		value: DeviceTextSize
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setToggle"),
		setting: __vite_ssr_import_1__.Literals([
			"reduceMotion",
			"increaseContrast",
			"reduceTransparency",
			"showBorders",
			"voiceOver",
			"networkEnabled"
		]),
		value: __vite_ssr_import_1__.Boolean
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setLiquidGlass"),
		value: __vite_ssr_import_1__.Literals(["clear", "tinted"])
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setColorFilter"),
		value: DeviceColorFilter
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setOrientation"),
		value: DeviceOrientation
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setLocation"),
		latitude: __vite_ssr_import_1__.Number.check(__vite_ssr_import_1__.isBetween({
			minimum: -90,
			maximum: 90
		})),
		longitude: __vite_ssr_import_1__.Number.check(__vite_ssr_import_1__.isBetween({
			minimum: -180,
			maximum: 180
		}))
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("clearLocation")
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("setPermission"),
		appId: __vite_ssr_import_3__.TrimmedNonEmptyString,
		permission: DevicePermission,
		decision: __vite_ssr_import_1__.Literals([
			"grant",
			"revoke",
			"reset"
		])
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("openUrl"),
		url: __vite_ssr_import_3__.TrimmedNonEmptyString
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("launchApp"),
		appId: __vite_ssr_import_3__.TrimmedNonEmptyString
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("terminateApp"),
		appId: __vite_ssr_import_3__.TrimmedNonEmptyString
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("shake")
	}),
	__vite_ssr_import_1__.Struct({
		...DeviceTarget,
		type: __vite_ssr_import_1__.Literal("sendPush"),
		appId: __vite_ssr_import_3__.TrimmedNonEmptyString,
		payload: __vite_ssr_import_1__.Union([__vite_ssr_import_1__.String, __vite_ssr_import_1__.Record(__vite_ssr_import_1__.String, __vite_ssr_import_1__.Unknown)])
	})
]);
const DeviceDetailInput = __vite_ssr_import_1__.Struct(DeviceTarget);
class DeviceHostUnavailableError extends __vite_ssr_import_1__.TaggedError()("DeviceHostUnavailableError", {
	hostId: DeviceHostId,
	/** The host's name in Settings, which the message shows instead of its id. */
	hostLabel: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String),
	reason: __vite_ssr_import_1__.String,
	cause: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Defect())
}) {
	get message() {
		return `${this.hostLabel ?? `Device host ${this.hostId}`} is unavailable: ${this.reason}`;
	}
};
class DevicePlatformUnavailableError extends __vite_ssr_import_1__.TaggedError()("DevicePlatformUnavailableError", {
	hostId: DeviceHostId,
	platform: DevicePlatform,
	reason: __vite_ssr_import_1__.String
}) {
	get message() {
		return `${this.platform} devices are unavailable on host ${this.hostId}: ${this.reason}`;
	}
};
class DeviceNotFoundError extends __vite_ssr_import_1__.TaggedError()("DeviceNotFoundError", {
	hostId: DeviceHostId,
	deviceId: DeviceId
}) {
	get message() {
		return `Device ${this.deviceId} was not found on host ${this.hostId}.`;
	}
};
class DeviceBootError extends __vite_ssr_import_1__.TaggedError()("DeviceBootError", {
	hostId: DeviceHostId,
	deviceId: DeviceId,
	reason: __vite_ssr_import_1__.Literals([
		"disk_space",
		"timeout",
		"launch_failed"
	]),
	diagnostics: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.String.check(__vite_ssr_import_1__.isMaxLength(2e3))),
	cause: __vite_ssr_import_1__.Defect()
}) {
	get message() {
		const explanation = {
			disk_space: "There is not enough free disk space on the environment server.",
			timeout: "The device did not become ready in time.",
			launch_failed: "The simulator or emulator could not start. Check its configuration on the environment server."
		}[this.reason];
		const summary = `Device ${this.deviceId} failed to boot: ${explanation}`;
		return this.diagnostics ? `${summary}\n\n${this.diagnostics}` : summary;
	}
};
class DeviceOperationError extends __vite_ssr_import_1__.TaggedError()("DeviceOperationError", {
	operation: __vite_ssr_import_1__.String,
	reason: __vite_ssr_import_1__.Literals([
		"command_failed",
		"request_failed",
		"invalid_payload",
		"settings_failed",
		"hub_rejected"
	]),
	exitCode: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Number),
	cause: __vite_ssr_import_1__.Defect()
}) {
	get message() {
		const explanation = {
			command_failed: `The device command failed${this.exitCode === undefined ? "" : ` (exit code ${this.exitCode})`}.`,
			request_failed: "Could not communicate with device support. Try refreshing devices.",
			invalid_payload: "The device request could not be encoded.",
			settings_failed: "Could not read or save device settings.",
			hub_rejected: "The device hub could not complete the request."
		}[this.reason];
		return `Device ${this.operation} failed: ${explanation}`;
	}
};
class DeviceActionUnavailableError extends __vite_ssr_import_1__.TaggedError()("DeviceActionUnavailableError", {
	operation: __vite_ssr_import_1__.String,
	platform: DevicePlatform,
	reason: __vite_ssr_import_1__.Literals(["unsupported", "helper_missing"])
}) {
	get message() {
		return this.reason === "helper_missing" ? `Device ${this.operation} requires a helper missing from this install. Set up device support again.` : `Device ${this.operation} is not supported on ${this.platform}.`;
	}
};
const DeviceError = __vite_ssr_import_1__.Union([
	DeviceHostUnavailableError,
	DevicePlatformUnavailableError,
	DeviceNotFoundError,
	DeviceBootError,
	DeviceOperationError,
	DeviceActionUnavailableError
]);
const DeviceToolListResult = __vite_ssr_import_1__.Struct({
	hostStatuses: DeviceHostStatuses,
	hosts: __vite_ssr_import_1__.Array(DeviceHostSummary),
	devices: __vite_ssr_import_1__.Array(DeviceSummary),
	open: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.Struct({
		hostId: DeviceHostId,
		deviceId: DeviceId
	}))
});
const DeviceToolOpenInput = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_1__.optional(DeviceId.annotate({ description: "Simulator udid or emulator serial from device_list. Omit to use the booted device for the platform, or the most recently used one." })),
	platform: __vite_ssr_import_1__.optional(DevicePlatform.annotate({ description: "Required when deviceId is omitted and both platforms are available." })),
	hostId: __vite_ssr_import_1__.optional(DeviceHostId.annotate({ description: "Device host from device_list. Defaults to local." }))
}).annotate({ description: "Boots the device if needed, starts its live stream, and opens the Device panel so the user can watch. Returns how to drive it with the agent-device CLI." });
const DeviceToolOpenResult = __vite_ssr_import_1__.Struct({
	device: DeviceSummary,
	agentDevice: __vite_ssr_import_1__.Struct({
		command: __vite_ssr_import_1__.String,
		targetArgs: __vite_ssr_import_1__.Array(__vite_ssr_import_1__.String)
	}),
	quickStart: __vite_ssr_import_1__.String
});
const DeviceToolTargetInput = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_1__.optional(DeviceId.annotate({ description: "Device from device_list. Omit to use the device most recently opened in this thread." })),
	hostId: __vite_ssr_import_1__.optional(DeviceHostId)
});
const DeviceToolScreenshotResult = __vite_ssr_import_1__.Struct({
	device: DeviceSummary,
	screenshot: __vite_ssr_import_1__.Struct({
		mimeType: __vite_ssr_import_1__.Literal("image/png"),
		data: __vite_ssr_import_1__.String,
		width: __vite_ssr_import_1__.Int,
		height: __vite_ssr_import_1__.Int
	})
});
const DeviceToolCloseInput = __vite_ssr_import_1__.Struct({
	deviceId: __vite_ssr_import_1__.optional(DeviceId.annotate({ description: "Device to close. Omit to close every device in this thread." })),
	hostId: __vite_ssr_import_1__.optional(DeviceHostId),
	shutdown: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Boolean.annotate({ description: "Also power the simulator or emulator off. Defaults to false." }))
});
class DeviceToolUnavailableError extends __vite_ssr_import_1__.TaggedError()("DeviceToolUnavailableError", {
	reason: __vite_ssr_import_1__.String,
	cause: __vite_ssr_import_1__.optional(__vite_ssr_import_1__.Defect())
}) {
	get message() {
		return this.reason;
	}
};
const DeviceToolError = __vite_ssr_import_1__.Union([
	DeviceToolUnavailableError,
	DeviceHostUnavailableError,
	DevicePlatformUnavailableError,
	DeviceNotFoundError,
	DeviceBootError,
	DeviceOperationError,
	DeviceActionUnavailableError
]);
function deviceToolInstallMessage(name, tool) {
	if (!tool) return `Installing ${name}…`;
	const previous = tool.runningVersion ?? [...tool.installedVersions].sort((a, b) => a.localeCompare(b, "en", { numeric: true })).at(-1);
	return previous && !tool.installedVersions.includes(tool.requiredVersion) ? `Updating ${name} from ${previous} to ${tool.requiredVersion}…` : `Installing ${name} ${tool.requiredVersion}…`;
}
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUVPLE1BQU0saUJBQWlCLHNCQUFPLFNBQVMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztBQUd6RCxNQUFNLGVBQWUsNENBQXNCLE1BQU0sc0JBQU8sWUFBWSxHQUFHLENBQUM7QUFHeEUsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSwwQkFBMEI7QUFFdkMsTUFBTSx5QkFBeUIsYUFBYSxNQUMxQyxzQkFBTyxVQUFVLDZCQUE2QixHQUM5QyxzQkFBTyxZQUFZLE9BQU8sT0FBTyxXQUFXLGdDQUFnQyxDQUM5RTtBQUVPLE1BQU0sc0JBQXNCLHNCQUFPLE9BQU87O0NBRS9DLE1BQU0sc0JBQU8sUUFBUSxLQUFLLENBQUMsQ0FBQyxLQUFLLHNCQUFPLHVCQUF1QixzQkFBTyxRQUFRLEtBQWMsQ0FBQyxDQUFDO0NBQzlGLElBQUk7Q0FDSixPQUFPO0NBQ1AsUUFBUSw0Q0FBc0IsTUFBTSxzQkFBTyxVQUFVLGdCQUFnQixDQUFDO0NBQ3RFLGNBQWMsc0JBQU8sWUFBUyw0Q0FBcUI7Q0FDbkQsTUFBTSxzQkFBTyxTQUFTLHNCQUFPLElBQUksTUFBTSxzQkFBTyxVQUFVO0VBQUUsU0FBUztFQUFHLFNBQVM7Q0FBTSxDQUFDLENBQUMsQ0FBQztBQUMxRixDQUFDOzs7OztBQU9NLE1BQU0sc0JBQXNCLHNCQUFPLE9BQU87Q0FDL0MsTUFBTSxzQkFBTyxRQUFRLEtBQUs7Q0FDMUIsSUFBSTtDQUNKLE9BQU87O0NBRVAsT0FBTyxzQkFBTyxZQUFTLDRDQUFxQjs7Ozs7O0NBTTVDLGFBQWEsb0NBQWMsS0FDekIsc0JBQU8sdUJBQXVCLHNCQUFPLFFBQVEsRUFBRSxDQUFDLEdBQ2hELHNCQUFPLFlBQVksRUFBRSxnQkFBZ0IsS0FBSyxDQUFDLENBQzdDOztDQUVBLG1CQUFtQixzQkFBTyxJQUFJLE1BQU0sc0JBQU8sVUFBVTtFQUFFLFNBQVM7RUFBRyxTQUFTO0NBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUNsRixzQkFBTyx1QkFBdUIsc0JBQU8sUUFBUSxFQUFFLENBQUMsQ0FDbEQ7Q0FDQSxhQUFhLHNCQUFPLElBQUksTUFBTSxzQkFBTyxVQUFVO0VBQUUsU0FBUztFQUFHLFNBQVM7Q0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQzNFLHNCQUFPLHVCQUF1QixzQkFBTyxRQUFRLEVBQUUsQ0FBQyxDQUNsRDtDQUNBLHVCQUF1QixzQkFBTyxJQUFJLE1BQU0sc0JBQU8sVUFBVTtFQUFFLFNBQVM7RUFBRyxTQUFTO0NBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUNyRixzQkFBTyx1QkFBdUIsc0JBQU8sUUFBUSxDQUFDLENBQUMsQ0FDakQ7QUFDRixDQUFDLENBQUMsQ0FBQzs7Q0FFRCxzQkFBTyxZQUNKLFNBQ0MsS0FBSyxjQUFjLEtBQUsscUJBQ3hCLG9EQUNKO0FBQ0Y7QUFLQSxNQUFNLGdCQUFnQixzQkFBTyxZQUMxQixVQUNDLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLFVBQ3JELGlDQUNKO0FBRU8sTUFBTSx1QkFBdUIsc0JBQU8sTUFBTSxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sYUFBYTs7Ozs7O0FBT2xGLE1BQU0sdUJBQXVCLHNCQUFPLE1BQU0sbUJBQW1CLENBQUMsQ0FBQyxNQUFNLGFBQWE7QUFFbEYsTUFBTSx3QkFBd0Isc0JBQU8sT0FBTzs7Q0FFakQsUUFBUSxzQkFBTyxTQUFTLFlBQVk7Q0FDcEMsYUFBYSxzQkFBTyxZQUFTLG9DQUFhO0FBQzVDLENBQUM7QUFHTSxNQUFNLG1CQUFtQixzQkFBTyxPQUFPO0NBQzVDLFlBQVksc0JBQU87Q0FDbkIsa0JBQWtCLHNCQUFPLFNBQVM7RUFBQztFQUFZO0VBQU87Q0FBVyxDQUFDO0NBQ2xFLE1BQU0sc0JBQU8sTUFBTSxzQkFBTyxPQUFPO0VBQUUsSUFBSSxzQkFBTztFQUFRLFVBQVUsc0JBQU87Q0FBTyxDQUFDLENBQUM7QUFDbEYsQ0FBQzs7QUFJTSxNQUFNLDhCQUE4QixzQkFBTyxZQUFtQyxDQUFDO0NBQ3BGOztDQUVBLEVBQUUsUUFBUSxzQkFBTyxPQUFPO0FBQzFCLENBQUMsQ0FBQztDQUNBLElBQWEsVUFBa0I7RUFDN0IsT0FBTyxLQUFLO0NBQ2Q7QUFDRjtBQUVPLE1BQU0sV0FBVyw0Q0FBc0IsTUFBTSxzQkFBTyxZQUFZLEdBQUcsQ0FBQztBQUdwRSxNQUFNLGdCQUFnQixzQkFBTyxPQUFPO0NBQ3pDLFFBQVE7Q0FDUixJQUFJO0NBQ0osVUFBVTtDQUNWLE1BQU07Q0FDTixTQUFTLHNCQUFPO0NBQ2hCLFFBQVEsc0JBQU87Q0FDZixVQUFVLHNCQUFPO0FBQ25CLENBQUM7QUFHTSxNQUFNLDZCQUE2QixzQkFBTyxPQUFPO0NBQ3RELFVBQVU7Q0FDVixXQUFXLHNCQUFPO0NBQ2xCLFFBQVEsc0JBQU8sU0FBUyxzQkFBTyxNQUFNO0FBQ3ZDLENBQUM7QUFHTSxNQUFNLG9CQUFvQixzQkFBTyxPQUFPO0NBQzdDLGlCQUFpQixzQkFBTztDQUN4QixtQkFBbUIsc0JBQU8sTUFBTSxzQkFBTyxNQUFNO0NBQzdDLGdCQUFnQixzQkFBTyxPQUFPLHNCQUFPLE1BQU07QUFDN0MsQ0FBQztBQUdNLE1BQU0scUJBQXFCLHNCQUFPLE9BQU87Q0FDOUMsS0FBSztDQUNMLE9BQU87QUFDVCxDQUFDO0FBR0QsTUFBTSwwQkFBMEI7Q0FDOUIsSUFBSTtDQUNKLE9BQU87Q0FDUCxXQUFXLHNCQUFPLE1BQU0sMEJBQTBCO0NBQ2xELE9BQU8sc0JBQU8sU0FBUyxrQkFBa0I7Q0FDekMscUJBQXFCLHNCQUFPLFNBQVMsc0JBQU8sTUFBTTtDQUNsRCxjQUFjLHNCQUFPO0NBQ3JCLHNCQUFzQixzQkFBTztBQUMvQjtBQUNBLE1BQU0sMkJBQTJCLHNCQUFPLE9BQU87Q0FDN0MsR0FBRztDQUNILE1BQU0sc0JBQU8sU0FBUyxDQUFDLFNBQVMsS0FBSyxDQUFDO0FBQ3hDLENBQUM7QUFDRCxNQUFNLHVCQUF1QixzQkFBTyxPQUFPO0NBQ3pDLEdBQUc7Q0FDSCxNQUFNLHNCQUFPLFFBQVEsS0FBSztBQUM1QixDQUFDO0FBQ00sTUFBTSxvQkFBb0Isc0JBQU8sTUFBTSxDQUFDLDBCQUEwQixvQkFBb0IsQ0FBQztBQUd2RixNQUFNLG1CQUFtQixzQkFBTyxTQUFTO0NBQzlDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFHTSxNQUFNLGdCQUFnQixzQkFBTyxPQUFPO0NBQ3pDLFVBQVU7Q0FDVixRQUFRO0NBQ1IsVUFBVTtDQUNWLFVBQVU7Q0FDVixVQUFVLHNCQUFPO0FBQ25CLENBQUM7QUFHTSxNQUFNLHFCQUFxQixzQkFBTyxPQUN2QyxjQUNBLHNCQUFPLE9BQU87Q0FDWixRQUFRO0NBQ1IsUUFBUSxzQkFBTyxTQUFTLHNCQUFPLE1BQU07Q0FDckMsNEJBQTRCLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztBQUM1RCxDQUFDLENBQ0g7QUFFQSxNQUFNLDJCQUEyQjtDQUMvQixtQkFBbUIsc0JBQU8sU0FBUyxzQkFBTyxPQUFPO0NBQ2pELG9CQUFvQixzQkFBTyxTQUFTLHNCQUFPLE9BQU87Q0FDbEQsd0JBQXdCLHNCQUFPLFNBQVMsc0JBQU8sT0FBTzs7Q0FFdEQsa0JBQWtCLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztDQUNoRCxZQUFZO0NBQ1osa0JBQWtCLHNCQUFPLFNBQVMsc0JBQU8sTUFBTTtDQUMvQyxjQUFjO0NBQ2QsU0FBUyxzQkFBTyxNQUFNLGFBQWE7Q0FDbkMsVUFBVSxzQkFBTyxNQUFNLGFBQWE7Q0FDcEMsZ0JBQWdCLHNCQUFPLFNBQ3JCLHNCQUFPLE1BQU0sc0JBQU8sT0FBTztFQUFFLEdBQUcsY0FBYztFQUFRLFVBQVU7Q0FBUyxDQUFDLENBQUMsQ0FDN0U7Q0FDQSxxQkFBcUIsc0JBQU87Q0FDNUIsb0JBQW9CLHNCQUFPO0NBQzNCLGFBQWEsc0JBQU87Q0FDcEIsVUFBVSxzQkFBTztBQUNuQjs7Ozs7O0FBT0EsTUFBTSx5QkFBeUIsc0JBQU8sT0FBTztDQUMzQyxHQUFHO0NBQ0gsT0FBTyxzQkFBTyxNQUFNLHdCQUF3QjtDQUM1QyxVQUFVLHNCQUFPLFNBQVMsc0JBQU8sTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxDQUFDO0FBQ0QsTUFBTSw0QkFBNEIsc0JBQU8sT0FBTztDQUM5QyxHQUFHO0NBQ0gsT0FBTyxzQkFBTyxNQUFNLGlCQUFpQjtBQUN2QyxDQUFDO0FBRU0sTUFBTSxxQkFBcUIsdUJBQXVCLEtBQ3ZELHNCQUFPLFNBQ0wsc0JBQU8sT0FBTyx5QkFBeUIsR0FDdkMsc0JBQXFCLFVBR25CO0NBQ0EsU0FBUyxFQUFFLFVBQVUsR0FBRyxhQUFhO0VBQ25DLEdBQUc7RUFDSCxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sR0FBSSxZQUFZLENBQUMsQ0FBRTtDQUM3QztDQUNBLFNBQVMsV0FBVztFQUNsQixHQUFHO0VBQ0gsT0FBTyxNQUFNLE1BQU0sUUFDaEIsU0FBdUQsS0FBSyxTQUFTLEtBQ3hFO0VBQ0EsVUFBVSxNQUFNLE1BQU0sUUFDbkIsU0FBbUQsS0FBSyxTQUFTLEtBQ3BFO0NBQ0Y7QUFDRixDQUFDLENBQ0gsQ0FDRjtBQUdPLE1BQU0sa0JBQWtCLHNCQUFPLE9BQU87Q0FDM0MsWUFBWSxzQkFBTyxTQUFTLHNCQUFPLFNBQVMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDO0NBQzdELGFBQWEsc0JBQU8sU0FBUyxzQkFBTyxPQUFPO0NBQzNDLGFBQWEsc0JBQU8sU0FBUyxZQUFZO0FBQzNDLENBQUM7QUFHTSxNQUFNLHVCQUF1QixzQkFBTyxPQUFPO0NBQ2hELFNBQVMsc0JBQU8sU0FBUyxzQkFBTyxPQUFPO0NBQ3ZDLG9CQUFvQixzQkFBTyxTQUFTLHNCQUFPLE9BQU87Q0FDbEQscUJBQXFCLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztBQUNyRCxDQUFDO0FBR00sTUFBTSxrQkFBa0Isc0JBQU8sT0FBTztDQUMzQyxVQUFVO0NBQ1YsUUFBUSxzQkFBTyxTQUFTLFlBQVk7Q0FDcEMsVUFBVTtDQUNWLFVBQVU7O0NBRVYsTUFBTSxzQkFBTyxTQUFTLHNCQUFPLE9BQU87QUFDdEMsQ0FBQztBQUdNLE1BQU0sbUJBQW1CLHNCQUFPLE9BQU87Q0FDNUMsUUFBUSxzQkFBTyxTQUFTLFlBQVk7Q0FDcEMsVUFBVTs7Q0FFVixVQUFVLHNCQUFPLFNBQVMsUUFBUTs7Q0FFbEMsVUFBVSxzQkFBTyxTQUFTLHNCQUFPLE9BQU87QUFDMUMsQ0FBQztBQUdNLE1BQU0sc0JBQXNCLHNCQUFPLE9BQU87Q0FDL0MsUUFBUSxzQkFBTyxTQUFTLFlBQVk7Q0FDcEMsVUFBVTtDQUNWLFVBQVU7QUFDWixDQUFDO0FBR00sTUFBTSxtQkFBbUIsc0JBQU8sU0FBUyxDQUFDLFNBQVMsTUFBTSxDQUFDO0FBRzFELE1BQU0saUJBQWlCLHNCQUFPLFNBQVM7Q0FBQztDQUFTO0NBQVc7Q0FBUztBQUFhLENBQUM7QUFHbkYsTUFBTSxvQkFBb0Isc0JBQU8sU0FBUztDQUMvQztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUdNLE1BQU0sb0JBQW9CLHNCQUFPLFNBQVM7Q0FDL0M7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBR00sTUFBTSxpQkFBaUIsc0JBQU8sT0FBTztDQUMxQyxZQUFZLHNCQUFPLFNBQVMsZ0JBQWdCO0NBQzVDLFVBQVUsc0JBQU8sU0FBUyxjQUFjO0NBQ3hDLGNBQWMsc0JBQU8sU0FBUyxzQkFBTyxPQUFPO0NBQzVDLGtCQUFrQixzQkFBTyxTQUFTLHNCQUFPLE9BQU87Q0FDaEQsb0JBQW9CLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztDQUNsRCxhQUFhLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztDQUMzQyxXQUFXLHNCQUFPLFNBQVMsc0JBQU8sT0FBTztDQUN6QyxhQUFhLHNCQUFPLFNBQVMsc0JBQU8sU0FBUyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUM7Q0FDakUsYUFBYSxzQkFBTyxTQUFTLGlCQUFpQjtDQUM5QyxnQkFBZ0Isc0JBQU8sU0FBUyxzQkFBTyxPQUFPO0NBQzlDLFVBQVUsc0JBQU8sU0FDZixzQkFBTyxPQUFPLHNCQUFPLE9BQU87RUFBRSxVQUFVLHNCQUFPO0VBQVEsV0FBVyxzQkFBTztDQUFPLENBQUMsQ0FBQyxDQUNwRjtBQUNGLENBQUM7QUFHTSxNQUFNLHNCQUFzQixzQkFBTyxPQUFPO0NBQy9DLElBQUksc0JBQU87Q0FDWCxNQUFNLHNCQUFPLFNBQVMsc0JBQU8sTUFBTTtDQUNuQyxTQUFTLHNCQUFPLFNBQVMsc0JBQU8sTUFBTTtBQUN4QyxDQUFDO0FBR00sTUFBTSxlQUFlLHNCQUFPLE9BQU87Q0FDeEMsUUFBUTtDQUNSLFVBQVU7Q0FDVixVQUFVO0NBQ1YsZUFBZSxzQkFBTyxPQUFPLG1CQUFtQjtDQUNoRCxRQUFRLHNCQUFPO0FBQ2pCLENBQUM7QUFHTSxNQUFNLG1CQUFtQixzQkFBTyxTQUFTO0NBQzlDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBR0QsTUFBTSxlQUFlO0NBQ25CLFFBQVEsc0JBQU8sU0FBUyxZQUFZO0NBQ3BDLFVBQVU7QUFDWjtBQUVPLE1BQU0sb0JBQW9CLHNCQUFPLE1BQU07Q0FDNUMsc0JBQU8sT0FBTztFQUNaLEdBQUc7RUFDSCxNQUFNLHNCQUFPLFFBQVEsZUFBZTtFQUNwQyxPQUFPO0NBQ1QsQ0FBQztDQUNELHNCQUFPLE9BQU87RUFBRSxHQUFHO0VBQWMsTUFBTSxzQkFBTyxRQUFRLGFBQWE7RUFBRyxPQUFPO0NBQWUsQ0FBQztDQUM3RixzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxXQUFXO0VBQ2hDLFNBQVMsc0JBQU8sU0FBUztHQUN2QjtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7RUFDRixDQUFDO0VBQ0QsT0FBTyxzQkFBTztDQUNoQixDQUFDO0NBQ0Qsc0JBQU8sT0FBTztFQUNaLEdBQUc7RUFDSCxNQUFNLHNCQUFPLFFBQVEsZ0JBQWdCO0VBQ3JDLE9BQU8sc0JBQU8sU0FBUyxDQUFDLFNBQVMsUUFBUSxDQUFDO0NBQzVDLENBQUM7Q0FDRCxzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxnQkFBZ0I7RUFDckMsT0FBTztDQUNULENBQUM7Q0FDRCxzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxnQkFBZ0I7RUFDckMsT0FBTztDQUNULENBQUM7Q0FDRCxzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxhQUFhO0VBQ2xDLFVBQVUsc0JBQU8sT0FBTyxNQUFNLHNCQUFPLFVBQVU7R0FBRSxTQUFTLENBQUM7R0FBSSxTQUFTO0VBQUcsQ0FBQyxDQUFDO0VBQzdFLFdBQVcsc0JBQU8sT0FBTyxNQUFNLHNCQUFPLFVBQVU7R0FBRSxTQUFTLENBQUM7R0FBSyxTQUFTO0VBQUksQ0FBQyxDQUFDO0NBQ2xGLENBQUM7Q0FDRCxzQkFBTyxPQUFPO0VBQUUsR0FBRztFQUFjLE1BQU0sc0JBQU8sUUFBUSxlQUFlO0NBQUUsQ0FBQztDQUN4RSxzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxlQUFlO0VBQ3BDLE9BQU87RUFDUCxZQUFZO0VBQ1osVUFBVSxzQkFBTyxTQUFTO0dBQUM7R0FBUztHQUFVO0VBQU8sQ0FBQztDQUN4RCxDQUFDO0NBQ0Qsc0JBQU8sT0FBTztFQUFFLEdBQUc7RUFBYyxNQUFNLHNCQUFPLFFBQVEsU0FBUztFQUFHLEtBQUs7Q0FBc0IsQ0FBQztDQUM5RixzQkFBTyxPQUFPO0VBQ1osR0FBRztFQUNILE1BQU0sc0JBQU8sUUFBUSxXQUFXO0VBQ2hDLE9BQU87Q0FDVCxDQUFDO0NBQ0Qsc0JBQU8sT0FBTztFQUNaLEdBQUc7RUFDSCxNQUFNLHNCQUFPLFFBQVEsY0FBYztFQUNuQyxPQUFPO0NBQ1QsQ0FBQztDQUNELHNCQUFPLE9BQU87RUFBRSxHQUFHO0VBQWMsTUFBTSxzQkFBTyxRQUFRLE9BQU87Q0FBRSxDQUFDO0NBQ2hFLHNCQUFPLE9BQU87RUFDWixHQUFHO0VBQ0gsTUFBTSxzQkFBTyxRQUFRLFVBQVU7RUFDL0IsT0FBTztFQUNQLFNBQVMsc0JBQU8sTUFBTSxDQUFDLHNCQUFPLFFBQVEsc0JBQU8sT0FBTyxzQkFBTyxRQUFRLHNCQUFPLE9BQU8sQ0FBQyxDQUFDO0NBQ3JGLENBQUM7QUFDSCxDQUFDO0FBSU0sTUFBTSxvQkFBb0Isc0JBQU8sT0FBTyxZQUFZO0FBR3BELE1BQU0sbUNBQW1DLHNCQUFPLFlBQXdDLENBQUMsQ0FDOUYsOEJBQ0E7Q0FDRSxRQUFROztDQUVSLFdBQVcsc0JBQU8sU0FBUyxzQkFBTyxNQUFNO0NBQ3hDLFFBQVEsc0JBQU87Q0FDZixPQUFPLHNCQUFPLFNBQVMsc0JBQU8sT0FBTyxDQUFDO0FBQ3hDLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixPQUFPLEdBQUcsS0FBSyxhQUFhLGVBQWUsS0FBSyxTQUFTLG1CQUFtQixLQUFLO0NBQ25GO0FBQ0Y7QUFFTyxNQUFNLHVDQUF1QyxzQkFBTyxZQUE0QyxDQUFDLENBQ3RHLGtDQUNBO0NBQ0UsUUFBUTtDQUNSLFVBQVU7Q0FDVixRQUFRLHNCQUFPO0FBQ2pCLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixPQUFPLEdBQUcsS0FBSyxTQUFTLG1DQUFtQyxLQUFLLE9BQU8sSUFBSSxLQUFLO0NBQ2xGO0FBQ0Y7QUFFTyxNQUFNLDRCQUE0QixzQkFBTyxZQUFpQyxDQUFDLENBQ2hGLHVCQUNBO0NBQ0UsUUFBUTtDQUNSLFVBQVU7QUFDWixDQUNGLENBQUMsQ0FBQztDQUNBLElBQWEsVUFBa0I7RUFDN0IsT0FBTyxVQUFVLEtBQUssU0FBUyx5QkFBeUIsS0FBSyxPQUFPO0NBQ3RFO0FBQ0Y7QUFFTyxNQUFNLHdCQUF3QixzQkFBTyxZQUE2QixDQUFDLENBQUMsbUJBQW1CO0NBQzVGLFFBQVE7Q0FDUixVQUFVO0NBQ1YsUUFBUSxzQkFBTyxTQUFTO0VBQUM7RUFBYztFQUFXO0NBQWUsQ0FBQztDQUNsRSxhQUFhLHNCQUFPLFNBQVMsc0JBQU8sT0FBTyxNQUFNLHNCQUFPLFlBQVksR0FBSyxDQUFDLENBQUM7Q0FDM0UsT0FBTyxzQkFBTyxPQUFPO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0NBQ0QsSUFBYSxVQUFrQjtFQUM3QixNQUFNLGNBQWM7R0FDbEIsWUFBWTtHQUNaLFNBQVM7R0FDVCxlQUNFO0VBQ0osRUFBRSxLQUFLO0VBQ1AsTUFBTSxVQUFVLFVBQVUsS0FBSyxTQUFTLG1CQUFtQjtFQUMzRCxPQUFPLEtBQUssY0FBYyxHQUFHLFFBQVEsTUFBTSxLQUFLLGdCQUFnQjtDQUNsRTtBQUNGO0FBRU8sTUFBTSw2QkFBNkIsc0JBQU8sWUFBa0MsQ0FBQyxDQUNsRix3QkFDQTtDQUNFLFdBQVcsc0JBQU87Q0FDbEIsUUFBUSxzQkFBTyxTQUFTO0VBQ3RCO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Q0FDRixDQUFDO0NBQ0QsVUFBVSxzQkFBTyxTQUFTLHNCQUFPLE1BQU07Q0FDdkMsT0FBTyxzQkFBTyxPQUFPO0FBQ3ZCLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixNQUFNLGNBQWM7R0FDbEIsZ0JBQWdCLDRCQUE0QixLQUFLLGFBQWEsWUFBWSxLQUFLLGVBQWUsS0FBSyxTQUFTLEdBQUc7R0FDL0csZ0JBQWdCO0dBQ2hCLGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsY0FBYztFQUNoQixFQUFFLEtBQUs7RUFDUCxPQUFPLFVBQVUsS0FBSyxVQUFVLFdBQVc7Q0FDN0M7QUFDRjtBQUVPLE1BQU0scUNBQXFDLHNCQUFPLFlBQTBDLENBQUMsQ0FDbEcsZ0NBQ0E7Q0FDRSxXQUFXLHNCQUFPO0NBQ2xCLFVBQVU7Q0FDVixRQUFRLHNCQUFPLFNBQVMsQ0FBQyxlQUFlLGdCQUFnQixDQUFDO0FBQzNELENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixPQUFPLEtBQUssV0FBVyxtQkFDbkIsVUFBVSxLQUFLLFVBQVUsOEVBQ3pCLFVBQVUsS0FBSyxVQUFVLHVCQUF1QixLQUFLLFNBQVM7Q0FDcEU7QUFDRjtBQUVPLE1BQU0sY0FBYyxzQkFBTyxNQUFNO0NBQ3RDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFHTSxNQUFNLHVCQUF1QixzQkFBTyxPQUFPO0NBQ2hELGNBQWM7Q0FDZCxPQUFPLHNCQUFPLE1BQU0saUJBQWlCO0NBQ3JDLFNBQVMsc0JBQU8sTUFBTSxhQUFhO0NBQ25DLE1BQU0sc0JBQU8sTUFBTSxzQkFBTyxPQUFPO0VBQUUsUUFBUTtFQUFjLFVBQVU7Q0FBUyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUdNLE1BQU0sc0JBQXNCLHNCQUFPLE9BQU87Q0FDL0MsVUFBVSxzQkFBTyxTQUNmLFNBQVMsU0FBUyxFQUNoQixhQUNFLHFJQUNKLENBQUMsQ0FDSDtDQUNBLFVBQVUsc0JBQU8sU0FDZixlQUFlLFNBQVMsRUFDdEIsYUFBYSxzRUFDZixDQUFDLENBQ0g7Q0FDQSxRQUFRLHNCQUFPLFNBQ2IsYUFBYSxTQUFTLEVBQUUsYUFBYSxtREFBbUQsQ0FBQyxDQUMzRjtBQUNGLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDVixhQUNFLDJKQUNKLENBQUM7QUFHTSxNQUFNLHVCQUF1QixzQkFBTyxPQUFPO0NBQ2hELFFBQVE7Q0FDUixhQUFhLHNCQUFPLE9BQU87RUFDekIsU0FBUyxzQkFBTztFQUNoQixZQUFZLHNCQUFPLE1BQU0sc0JBQU8sTUFBTTtDQUN4QyxDQUFDO0NBQ0QsWUFBWSxzQkFBTztBQUNyQixDQUFDO0FBR00sTUFBTSx3QkFBd0Isc0JBQU8sT0FBTztDQUNqRCxVQUFVLHNCQUFPLFNBQ2YsU0FBUyxTQUFTLEVBQ2hCLGFBQ0UsdUZBQ0osQ0FBQyxDQUNIO0NBQ0EsUUFBUSxzQkFBTyxTQUFTLFlBQVk7QUFDdEMsQ0FBQztBQUdNLE1BQU0sNkJBQTZCLHNCQUFPLE9BQU87Q0FDdEQsUUFBUTtDQUNSLFlBQVksc0JBQU8sT0FBTztFQUN4QixVQUFVLHNCQUFPLFFBQVEsV0FBVztFQUNwQyxNQUFNLHNCQUFPO0VBQ2IsT0FBTyxzQkFBTztFQUNkLFFBQVEsc0JBQU87Q0FDakIsQ0FBQztBQUNILENBQUM7QUFHTSxNQUFNLHVCQUF1QixzQkFBTyxPQUFPO0NBQ2hELFVBQVUsc0JBQU8sU0FDZixTQUFTLFNBQVMsRUFDaEIsYUFBYSw4REFDZixDQUFDLENBQ0g7Q0FDQSxRQUFRLHNCQUFPLFNBQVMsWUFBWTtDQUNwQyxVQUFVLHNCQUFPLFNBQ2Ysc0JBQU8sUUFBUSxTQUFTLEVBQ3RCLGFBQWEsK0RBQ2YsQ0FBQyxDQUNIO0FBQ0YsQ0FBQztBQUdNLE1BQU0sbUNBQW1DLHNCQUFPLFlBQXdDLENBQUMsQ0FDOUYsOEJBQ0E7Q0FDRSxRQUFRLHNCQUFPO0NBQ2YsT0FBTyxzQkFBTyxTQUFTLHNCQUFPLE9BQU8sQ0FBQztBQUN4QyxDQUNGLENBQUMsQ0FBQztDQUNBLElBQWEsVUFBa0I7RUFDN0IsT0FBTyxLQUFLO0NBQ2Q7QUFDRjtBQUVPLE1BQU0sa0JBQWtCLHNCQUFPLE1BQU07Q0FDMUM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBR00sU0FBUyx5QkFBeUIsTUFBYyxNQUFxQztDQUMxRixJQUFJLENBQUMsTUFBTSxPQUFPLGNBQWMsS0FBSztDQUNyQyxNQUFNLFdBQ0osS0FBSyxrQkFDTCxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUUsY0FBYyxHQUFHLE1BQU0sRUFBRSxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUMvRixPQUFPLFlBQVksQ0FBQyxLQUFLLGtCQUFrQixTQUFTLEtBQUssZUFBZSxJQUNwRSxZQUFZLEtBQUssUUFBUSxTQUFTLE1BQU0sS0FBSyxnQkFBZ0IsS0FDN0QsY0FBYyxLQUFLLEdBQUcsS0FBSyxnQkFBZ0I7QUFDakQiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImRldmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBFZmZlY3QgZnJvbSBcImVmZmVjdC9FZmZlY3RcIjtcbmltcG9ydCAqIGFzIFNjaGVtYSBmcm9tIFwiZWZmZWN0L1NjaGVtYVwiO1xuaW1wb3J0ICogYXMgU2NoZW1hVHJhbnNmb3JtYXRpb24gZnJvbSBcImVmZmVjdC9TY2hlbWFUcmFuc2Zvcm1hdGlvblwiO1xuXG5pbXBvcnQgeyBUaHJlYWRJZCwgVHJpbW1lZE5vbkVtcHR5U3RyaW5nLCBUcmltbWVkU3RyaW5nIH0gZnJvbSBcIi4vYmFzZVNjaGVtYXMudHNcIjtcblxuZXhwb3J0IGNvbnN0IERldmljZVBsYXRmb3JtID0gU2NoZW1hLkxpdGVyYWxzKFtcImlvc1wiLCBcImFuZHJvaWRcIl0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlUGxhdGZvcm0gPSB0eXBlb2YgRGV2aWNlUGxhdGZvcm0uVHlwZTtcblxuZXhwb3J0IGNvbnN0IERldmljZUhvc3RJZCA9IFRyaW1tZWROb25FbXB0eVN0cmluZy5jaGVjayhTY2hlbWEuaXNNYXhMZW5ndGgoMTI4KSk7XG5leHBvcnQgdHlwZSBEZXZpY2VIb3N0SWQgPSB0eXBlb2YgRGV2aWNlSG9zdElkLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBMT0NBTF9ERVZJQ0VfSE9TVF9JRCA9IFwibG9jYWxcIiBhcyBEZXZpY2VIb3N0SWQ7XG5leHBvcnQgY29uc3QgTE9DQUxfREVWSUNFX0hPU1RfTEFCRUwgPSBcIlRoaXMgbWFjaGluZVwiO1xuXG5jb25zdCBDb25maWd1cmVkRGV2aWNlSG9zdElkID0gRGV2aWNlSG9zdElkLmNoZWNrKFxuICBTY2hlbWEuaXNQYXR0ZXJuKC9eW2EtekEtWjAtOV1bYS16QS1aMC05Xy1dKiQvKSxcbiAgU2NoZW1hLm1ha2VGaWx0ZXIoKGlkKSA9PiBpZCAhPT0gXCJsb2NhbFwiIHx8IFwiVGhlIGxvY2FsIGhvc3QgaWQgaXMgcmVzZXJ2ZWQuXCIpLFxuKTtcblxuZXhwb3J0IGNvbnN0IFNzaERldmljZUhvc3RDb25maWcgPSBTY2hlbWEuU3RydWN0KHtcbiAgLy8gSG9zdHMgc2F2ZWQgYmVmb3JlIEVBUyBob3N0cyBleGlzdGVkIGNhcnJ5IG5vIGtpbmQuXG4gIGtpbmQ6IFNjaGVtYS5MaXRlcmFsKFwic3NoXCIpLnBpcGUoU2NoZW1hLndpdGhEZWNvZGluZ0RlZmF1bHRLZXkoRWZmZWN0LnN1Y2NlZWQoXCJzc2hcIiBhcyBjb25zdCkpKSxcbiAgaWQ6IENvbmZpZ3VyZWREZXZpY2VIb3N0SWQsXG4gIGxhYmVsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHRhcmdldDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLmNoZWNrKFNjaGVtYS5pc1BhdHRlcm4oL15bXlxccy1dW15cXHNdKiQvKSksXG4gIGlkZW50aXR5RmlsZTogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWROb25FbXB0eVN0cmluZyksXG4gIHBvcnQ6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0JldHdlZW4oeyBtaW5pbXVtOiAxLCBtYXhpbXVtOiA2NTUzNSB9KSkpLFxufSk7XG5leHBvcnQgdHlwZSBTc2hEZXZpY2VIb3N0Q29uZmlnID0gdHlwZW9mIFNzaERldmljZUhvc3RDb25maWcuVHlwZTtcblxuLyoqXG4gKiBDbG91ZCBzaW11bGF0b3JzIGZyb20gRUFTIFNpbXVsYXRvci4gU2Vzc2lvbnMgYmlsbCB0aGUgRXhwbyBhY2NvdW50IHVudGlsXG4gKiB0aGV5IHN0b3AsIHNvIGV2ZXJ5IG9uZSBpcyBib3VuZGVkLiBUaGUgRXhwbyBjcmVkZW50aWFsIGlzIG5vdCBzdG9yZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVhc0RldmljZUhvc3RDb25maWcgPSBTY2hlbWEuU3RydWN0KHtcbiAga2luZDogU2NoZW1hLkxpdGVyYWwoXCJlYXNcIiksXG4gIGlkOiBDb25maWd1cmVkRGV2aWNlSG9zdElkLFxuICBsYWJlbDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICAvKiogRUFTIHByb2plY3QgdGhhdCBzZXNzaW9ucyBydW4gdW5kZXIsIHdoZW4gdGhlIHByb2plY3QncyBhcHAgY29uZmlnIGRvZXMgbm90IG5hbWUgb25lLiAqL1xuICBhcHBJZDogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWROb25FbXB0eVN0cmluZyksXG4gIC8qKlxuICAgKiBFeHBvIGFjY2VzcyB0b2tlbiwga2VwdCBpbiB0aGUgc2VjcmV0IHN0b3JlLiBXaGVuIGVtcHR5IHRoZSBzZXJ2ZXIgdXNlc1xuICAgKiBFWFBPX1RPS0VOLCB0aGVuIHRoZSBgZWFzIGxvZ2luYCBzZXNzaW9uLiBUaGlzIGlzIGBzZWNyZXRTZXR0aW5nYCBmcm9tXG4gICAqIHNldHRpbmdzLnRzLCB3aGljaCBpbXBvcnRzIHRoaXMgbW9kdWxlLlxuICAgKi9cbiAgYWNjZXNzVG9rZW46IFRyaW1tZWRTdHJpbmcucGlwZShcbiAgICBTY2hlbWEud2l0aERlY29kaW5nRGVmYXVsdEtleShFZmZlY3Quc3VjY2VlZChcIlwiKSksXG4gICAgU2NoZW1hLmFubm90YXRlS2V5KHsgc2V0dGluZ3NTZWNyZXQ6IHRydWUgfSksXG4gICksXG4gIC8qKiBFQVMgYWxsb3dzIGF0IG1vc3QgNDAgbWludXRlcyBvbiBmcmVlIGFjY291bnRzIGFuZCAxMTUgb24gcGFpZCBvbmVzLiAqL1xuICBtYXhTZXNzaW9uTWludXRlczogU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNCZXR3ZWVuKHsgbWluaW11bTogMSwgbWF4aW11bTogMTE1IH0pKS5waXBlKFxuICAgIFNjaGVtYS53aXRoRGVjb2RpbmdEZWZhdWx0S2V5KEVmZmVjdC5zdWNjZWVkKDMwKSksXG4gICksXG4gIGlkbGVNaW51dGVzOiBTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0JldHdlZW4oeyBtaW5pbXVtOiAxLCBtYXhpbXVtOiA2MCB9KSkucGlwZShcbiAgICBTY2hlbWEud2l0aERlY29kaW5nRGVmYXVsdEtleShFZmZlY3Quc3VjY2VlZCgxMCkpLFxuICApLFxuICBtYXhDb25jdXJyZW50U2Vzc2lvbnM6IFNjaGVtYS5JbnQuY2hlY2soU2NoZW1hLmlzQmV0d2Vlbih7IG1pbmltdW06IDEsIG1heGltdW06IDIwIH0pKS5waXBlKFxuICAgIFNjaGVtYS53aXRoRGVjb2RpbmdEZWZhdWx0S2V5KEVmZmVjdC5zdWNjZWVkKDIpKSxcbiAgKSxcbn0pLmNoZWNrKFxuICAvLyBFQVMgcmVxdWlyZXMgdGhlIGlkbGUgbGltaXQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBzZXNzaW9uIGxpbWl0LlxuICBTY2hlbWEubWFrZUZpbHRlcihcbiAgICAoaG9zdDogeyByZWFkb25seSBpZGxlTWludXRlczogbnVtYmVyOyByZWFkb25seSBtYXhTZXNzaW9uTWludXRlczogbnVtYmVyIH0pID0+XG4gICAgICBob3N0LmlkbGVNaW51dGVzIDwgaG9zdC5tYXhTZXNzaW9uTWludXRlcyB8fFxuICAgICAgXCJJZGxlIG1pbnV0ZXMgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2Vzc2lvbiBtaW51dGVzLlwiLFxuICApLFxuKTtcbmV4cG9ydCB0eXBlIEVhc0RldmljZUhvc3RDb25maWcgPSB0eXBlb2YgRWFzRGV2aWNlSG9zdENvbmZpZy5UeXBlO1xuXG5leHBvcnQgdHlwZSBEZXZpY2VIb3N0Q29uZmlnID0gU3NoRGV2aWNlSG9zdENvbmZpZyB8IEVhc0RldmljZUhvc3RDb25maWc7XG5cbmNvbnN0IHVuaXF1ZUhvc3RJZHMgPSBTY2hlbWEubWFrZUZpbHRlcihcbiAgKGhvc3RzOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgaWQ6IHN0cmluZyB9PikgPT5cbiAgICBuZXcgU2V0KGhvc3RzLm1hcCgoaG9zdCkgPT4gaG9zdC5pZCkpLnNpemUgPT09IGhvc3RzLmxlbmd0aCB8fFxuICAgIFwiRGV2aWNlIGhvc3QgaWRzIG11c3QgYmUgdW5pcXVlLlwiLFxuKTtcblxuZXhwb3J0IGNvbnN0IFNzaERldmljZUhvc3RDb25maWdzID0gU2NoZW1hLkFycmF5KFNzaERldmljZUhvc3RDb25maWcpLmNoZWNrKHVuaXF1ZUhvc3RJZHMpO1xuXG4vKipcbiAqIEtlcHQgYXBhcnQgZnJvbSB0aGUgU1NIIGhvc3RzIGluIHNldHRpbmdzOiBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZyb20gYmVmb3JlXG4gKiBFQVMgaG9zdHMgZGVjb2RlIGBkZXZpY2VIb3N0c2AgYXMgU1NIIGhvc3RzIGFuZCB3b3VsZCByZWplY3QgdGhlIHdob2xlIGZpbGVcbiAqIG9yIHNuYXBzaG90IG92ZXIgb25lIEVBUyBlbnRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVhc0RldmljZUhvc3RDb25maWdzID0gU2NoZW1hLkFycmF5KEVhc0RldmljZUhvc3RDb25maWcpLmNoZWNrKHVuaXF1ZUhvc3RJZHMpO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlRWFzQWNjb3VudElucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC8qKiBBIHNhdmVkIEVBUyBob3N0IHdob3NlIHN0b3JlZCB0b2tlbiBpcyBjaGVja2VkIHdoZW4gbm8gbmV3IHRva2VuIGlzIGdpdmVuLiAqL1xuICBob3N0SWQ6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VIb3N0SWQpLFxuICBhY2Nlc3NUb2tlbjogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWRTdHJpbmcpLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VFYXNBY2NvdW50SW5wdXQgPSB0eXBlb2YgRGV2aWNlRWFzQWNjb3VudElucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VFYXNBY2NvdW50ID0gU2NoZW1hLlN0cnVjdCh7XG4gIHNpZ25lZEluQXM6IFNjaGVtYS5TdHJpbmcsXG4gIGNyZWRlbnRpYWxTb3VyY2U6IFNjaGVtYS5MaXRlcmFscyhbXCJzZXR0aW5nc1wiLCBcImVudlwiLCBcImVhcy1sb2dpblwiXSksXG4gIGFwcHM6IFNjaGVtYS5BcnJheShTY2hlbWEuU3RydWN0KHsgaWQ6IFNjaGVtYS5TdHJpbmcsIGZ1bGxOYW1lOiBTY2hlbWEuU3RyaW5nIH0pKSxcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlRWFzQWNjb3VudCA9IHR5cGVvZiBEZXZpY2VFYXNBY2NvdW50LlR5cGU7XG5cbi8qKiBDaGVja2luZyBhbiBFeHBvIGNyZWRlbnRpYWwgZmFpbGVkOyBubyBkZXZpY2UgaG9zdCBpcyBpbnZvbHZlZCB5ZXQuICovXG5leHBvcnQgY2xhc3MgRGV2aWNlRWFzQWNjb3VudEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPERldmljZUVhc0FjY291bnRFcnJvcj4oKShcbiAgXCJEZXZpY2VFYXNBY2NvdW50RXJyb3JcIixcbiAgLy8gTm8gY2F1c2U6IHRoaXMgZXJyb3IgcmVhY2hlcyB0aGUgYnJvd3NlciwgYW5kIHRoZSByZWFzb24gYWxyZWFkeSBzYXlzIHdoYXQgRXhwbyBhbnN3ZXJlZC5cbiAgeyByZWFzb246IFNjaGVtYS5TdHJpbmcgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlYXNvbjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRGV2aWNlSWQgPSBUcmltbWVkTm9uRW1wdHlTdHJpbmcuY2hlY2soU2NoZW1hLmlzTWF4TGVuZ3RoKDI1NikpO1xuZXhwb3J0IHR5cGUgRGV2aWNlSWQgPSB0eXBlb2YgRGV2aWNlSWQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IERldmljZVN1bW1hcnkgPSBTY2hlbWEuU3RydWN0KHtcbiAgaG9zdElkOiBEZXZpY2VIb3N0SWQsXG4gIGlkOiBEZXZpY2VJZCxcbiAgcGxhdGZvcm06IERldmljZVBsYXRmb3JtLFxuICBuYW1lOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHZlcnNpb246IFNjaGVtYS5TdHJpbmcsXG4gIGJvb3RlZDogU2NoZW1hLkJvb2xlYW4sXG4gIHBoeXNpY2FsOiBTY2hlbWEuQm9vbGVhbixcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlU3VtbWFyeSA9IHR5cGVvZiBEZXZpY2VTdW1tYXJ5LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VQbGF0Zm9ybUF2YWlsYWJpbGl0eSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBwbGF0Zm9ybTogRGV2aWNlUGxhdGZvcm0sXG4gIGF2YWlsYWJsZTogU2NoZW1hLkJvb2xlYW4sXG4gIHJlYXNvbjogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcpLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VQbGF0Zm9ybUF2YWlsYWJpbGl0eSA9IHR5cGVvZiBEZXZpY2VQbGF0Zm9ybUF2YWlsYWJpbGl0eS5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlVG9vbFZlcnNpb24gPSBTY2hlbWEuU3RydWN0KHtcbiAgcmVxdWlyZWRWZXJzaW9uOiBTY2hlbWEuU3RyaW5nLFxuICBpbnN0YWxsZWRWZXJzaW9uczogU2NoZW1hLkFycmF5KFNjaGVtYS5TdHJpbmcpLFxuICBydW5uaW5nVmVyc2lvbjogU2NoZW1hLk51bGxPcihTY2hlbWEuU3RyaW5nKSxcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlVG9vbFZlcnNpb24gPSB0eXBlb2YgRGV2aWNlVG9vbFZlcnNpb24uVHlwZTtcblxuZXhwb3J0IGNvbnN0IERldmljZVRvb2xWZXJzaW9ucyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBodWI6IERldmljZVRvb2xWZXJzaW9uLFxuICBhZ2VudDogRGV2aWNlVG9vbFZlcnNpb24sXG59KTtcbmV4cG9ydCB0eXBlIERldmljZVRvb2xWZXJzaW9ucyA9IHR5cGVvZiBEZXZpY2VUb29sVmVyc2lvbnMuVHlwZTtcblxuY29uc3QgZGV2aWNlSG9zdFN1bW1hcnlGaWVsZHMgPSB7XG4gIGlkOiBEZXZpY2VIb3N0SWQsXG4gIGxhYmVsOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHBsYXRmb3JtczogU2NoZW1hLkFycmF5KERldmljZVBsYXRmb3JtQXZhaWxhYmlsaXR5KSxcbiAgdG9vbHM6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VUb29sVmVyc2lvbnMpLFxuICB0b29sSW5zcGVjdGlvbkVycm9yOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG4gIGh1Ykluc3RhbGxlZDogU2NoZW1hLkJvb2xlYW4sXG4gIGFnZW50RGV2aWNlSW5zdGFsbGVkOiBTY2hlbWEuQm9vbGVhbixcbn07XG5jb25zdCBNYWNoaW5lRGV2aWNlSG9zdFN1bW1hcnkgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uZGV2aWNlSG9zdFN1bW1hcnlGaWVsZHMsXG4gIGtpbmQ6IFNjaGVtYS5MaXRlcmFscyhbXCJsb2NhbFwiLCBcInNzaFwiXSksXG59KTtcbmNvbnN0IEVhc0RldmljZUhvc3RTdW1tYXJ5ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLmRldmljZUhvc3RTdW1tYXJ5RmllbGRzLFxuICBraW5kOiBTY2hlbWEuTGl0ZXJhbChcImVhc1wiKSxcbn0pO1xuZXhwb3J0IGNvbnN0IERldmljZUhvc3RTdW1tYXJ5ID0gU2NoZW1hLlVuaW9uKFtNYWNoaW5lRGV2aWNlSG9zdFN1bW1hcnksIEVhc0RldmljZUhvc3RTdW1tYXJ5XSk7XG5leHBvcnQgdHlwZSBEZXZpY2VIb3N0U3VtbWFyeSA9IHR5cGVvZiBEZXZpY2VIb3N0U3VtbWFyeS5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlSG9zdFN0YXR1cyA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJpZGxlXCIsXG4gIFwiaW5zdGFsbGluZ1wiLFxuICBcInN0YXJ0aW5nXCIsXG4gIFwicmVhZHlcIixcbiAgXCJmYWlsZWRcIixcbl0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlSG9zdFN0YXR1cyA9IHR5cGVvZiBEZXZpY2VIb3N0U3RhdHVzLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VTZXNzaW9uID0gU2NoZW1hLlN0cnVjdCh7XG4gIHRocmVhZElkOiBUaHJlYWRJZCxcbiAgaG9zdElkOiBEZXZpY2VIb3N0SWQsXG4gIGRldmljZUlkOiBEZXZpY2VJZCxcbiAgcGxhdGZvcm06IERldmljZVBsYXRmb3JtLFxuICBvcGVuZWRBdDogU2NoZW1hLlN0cmluZyxcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlU2Vzc2lvbiA9IHR5cGVvZiBEZXZpY2VTZXNzaW9uLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VIb3N0U3RhdHVzZXMgPSBTY2hlbWEuUmVjb3JkKFxuICBEZXZpY2VIb3N0SWQsXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIHN0YXR1czogRGV2aWNlSG9zdFN0YXR1cyxcbiAgICBkZXRhaWw6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuU3RyaW5nKSxcbiAgICBhbmRyb2lkRGlzY292ZXJ5SW5jb21wbGV0ZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgfSksXG4pO1xuXG5jb25zdCBkZXZpY2VTZXJ2aWNlU3RhdGVGaWVsZHMgPSB7XG4gIHN1cHBvcnRzSG9zdFJldHJ5OiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxuICBzdXBwb3J0c1Rvb2xVcGRhdGU6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIHN1cHBvcnRzVG9vbEluc3BlY3Rpb246IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIC8qKiBTZXJ2ZXJzIGZyb20gYmVmb3JlIEVBUyBob3N0cyBpZ25vcmUgYGVhc0RldmljZUhvc3RzYCwgc28gY2xpZW50cyBvZmZlciB0aGVtIG9ubHkgd2hlbiBzZXQuICovXG4gIHN1cHBvcnRzRWFzSG9zdHM6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIGhvc3RTdGF0dXM6IERldmljZUhvc3RTdGF0dXMsXG4gIGhvc3RTdGF0dXNEZXRhaWw6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuU3RyaW5nKSxcbiAgaG9zdFN0YXR1c2VzOiBEZXZpY2VIb3N0U3RhdHVzZXMsXG4gIGRldmljZXM6IFNjaGVtYS5BcnJheShEZXZpY2VTdW1tYXJ5KSxcbiAgc2Vzc2lvbnM6IFNjaGVtYS5BcnJheShEZXZpY2VTZXNzaW9uKSxcbiAgYm9vdGluZ0RldmljZXM6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuQXJyYXkoU2NoZW1hLlN0cnVjdCh7IC4uLkRldmljZVN1bW1hcnkuZmllbGRzLCB0aHJlYWRJZDogVGhyZWFkSWQgfSkpLFxuICApLFxuICBvbmJvYXJkaW5nQ29tcGxldGVkOiBTY2hlbWEuQm9vbGVhbixcbiAgYWdlbnRBY2Nlc3NFbmFibGVkOiBTY2hlbWEuQm9vbGVhbixcbiAgaHViQmFzZVBhdGg6IFNjaGVtYS5TdHJpbmcsXG4gIHJldmlzaW9uOiBTY2hlbWEuSW50LFxufTtcblxuLyoqXG4gKiBFQVMgaG9zdCBzdW1tYXJpZXMgdHJhdmVsIGFzIGBlYXNIb3N0c2A6IGNsaWVudHMgZnJvbSBiZWZvcmUgRUFTIGhvc3RzXG4gKiBkZWNvZGUgYGhvc3RzYCB3aXRoIGEgYGxvY2FsIHwgc3NoYCBraW5kIGFuZCB3b3VsZCByZWplY3QgdGhlIHdob2xlIHN0YXRlLlxuICogRGVjb2RlZCwgZXZlcnkgaG9zdCBpcyBpbiBgaG9zdHNgLlxuICovXG5jb25zdCBEZXZpY2VTZXJ2aWNlU3RhdGVXaXJlID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLmRldmljZVNlcnZpY2VTdGF0ZUZpZWxkcyxcbiAgaG9zdHM6IFNjaGVtYS5BcnJheShNYWNoaW5lRGV2aWNlSG9zdFN1bW1hcnkpLFxuICBlYXNIb3N0czogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5BcnJheShFYXNEZXZpY2VIb3N0U3VtbWFyeSkpLFxufSk7XG5jb25zdCBEZXZpY2VTZXJ2aWNlU3RhdGVEZWNvZGVkID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLmRldmljZVNlcnZpY2VTdGF0ZUZpZWxkcyxcbiAgaG9zdHM6IFNjaGVtYS5BcnJheShEZXZpY2VIb3N0U3VtbWFyeSksXG59KTtcblxuZXhwb3J0IGNvbnN0IERldmljZVNlcnZpY2VTdGF0ZSA9IERldmljZVNlcnZpY2VTdGF0ZVdpcmUucGlwZShcbiAgU2NoZW1hLmRlY29kZVRvKFxuICAgIFNjaGVtYS50b1R5cGUoRGV2aWNlU2VydmljZVN0YXRlRGVjb2RlZCksXG4gICAgU2NoZW1hVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtPFxuICAgICAgdHlwZW9mIERldmljZVNlcnZpY2VTdGF0ZURlY29kZWQuVHlwZSxcbiAgICAgIHR5cGVvZiBEZXZpY2VTZXJ2aWNlU3RhdGVXaXJlLlR5cGVcbiAgICA+KHtcbiAgICAgIGRlY29kZTogKHsgZWFzSG9zdHMsIC4uLnN0YXRlIH0pID0+ICh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBob3N0czogWy4uLnN0YXRlLmhvc3RzLCAuLi4oZWFzSG9zdHMgPz8gW10pXSxcbiAgICAgIH0pLFxuICAgICAgZW5jb2RlOiAoc3RhdGUpID0+ICh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBob3N0czogc3RhdGUuaG9zdHMuZmlsdGVyKFxuICAgICAgICAgIChob3N0KTogaG9zdCBpcyB0eXBlb2YgTWFjaGluZURldmljZUhvc3RTdW1tYXJ5LlR5cGUgPT4gaG9zdC5raW5kICE9PSBcImVhc1wiLFxuICAgICAgICApLFxuICAgICAgICBlYXNIb3N0czogc3RhdGUuaG9zdHMuZmlsdGVyKFxuICAgICAgICAgIChob3N0KTogaG9zdCBpcyB0eXBlb2YgRWFzRGV2aWNlSG9zdFN1bW1hcnkuVHlwZSA9PiBob3N0LmtpbmQgPT09IFwiZWFzXCIsXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgKSxcbik7XG5leHBvcnQgdHlwZSBEZXZpY2VTZXJ2aWNlU3RhdGUgPSB0eXBlb2YgRGV2aWNlU2VydmljZVN0YXRlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VMaXN0SW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgdXBkYXRlVG9vbDogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5MaXRlcmFscyhbXCJodWJcIiwgXCJhZ2VudFwiXSkpLFxuICBpbnNwZWN0T25seTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgcmV0cnlIb3N0SWQ6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VIb3N0SWQpLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VMaXN0SW5wdXQgPSB0eXBlb2YgRGV2aWNlTGlzdElucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VDb25maWd1cmVJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBlbmFibGVkOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxuICBhZ2VudEFjY2Vzc0VuYWJsZWQ6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIG9uYm9hcmRpbmdDb21wbGV0ZWQ6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG59KTtcbmV4cG9ydCB0eXBlIERldmljZUNvbmZpZ3VyZUlucHV0ID0gdHlwZW9mIERldmljZUNvbmZpZ3VyZUlucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VPcGVuSW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICBob3N0SWQ6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VIb3N0SWQpLFxuICBkZXZpY2VJZDogRGV2aWNlSWQsXG4gIHBsYXRmb3JtOiBEZXZpY2VQbGF0Zm9ybSxcbiAgLyoqIEJvb3QgdGhlIHNpbXVsYXRvciBvciBlbXVsYXRvciB3aGVuIGl0IGlzIG5vdCBydW5uaW5nLiBEZWZhdWx0cyB0byB0cnVlLiAqL1xuICBib290OiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VPcGVuSW5wdXQgPSB0eXBlb2YgRGV2aWNlT3BlbklucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VDbG9zZUlucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIGhvc3RJZDogU2NoZW1hLm9wdGlvbmFsKERldmljZUhvc3RJZCksXG4gIHRocmVhZElkOiBUaHJlYWRJZCxcbiAgLyoqIE9taXQgdG8gY2xvc2UgZXZlcnkgZGV2aWNlIHNlc3Npb24gZm9yIHRoZSB0aHJlYWQuICovXG4gIGRldmljZUlkOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlSWQpLFxuICAvKiogQWxzbyBzaHV0IHRoZSBzaW11bGF0b3Igb3IgZW11bGF0b3IgZG93bi4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHNodXRkb3duOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VDbG9zZUlucHV0ID0gdHlwZW9mIERldmljZUNsb3NlSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IERldmljZVNodXRkb3duSW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgaG9zdElkOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlSG9zdElkKSxcbiAgZGV2aWNlSWQ6IERldmljZUlkLFxuICBwbGF0Zm9ybTogRGV2aWNlUGxhdGZvcm0sXG59KTtcbmV4cG9ydCB0eXBlIERldmljZVNodXRkb3duSW5wdXQgPSB0eXBlb2YgRGV2aWNlU2h1dGRvd25JbnB1dC5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlQXBwZWFyYW5jZSA9IFNjaGVtYS5MaXRlcmFscyhbXCJsaWdodFwiLCBcImRhcmtcIl0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlQXBwZWFyYW5jZSA9IHR5cGVvZiBEZXZpY2VBcHBlYXJhbmNlLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VUZXh0U2l6ZSA9IFNjaGVtYS5MaXRlcmFscyhbXCJzbWFsbFwiLCBcImRlZmF1bHRcIiwgXCJsYXJnZVwiLCBcImV4dHJhLWxhcmdlXCJdKTtcbmV4cG9ydCB0eXBlIERldmljZVRleHRTaXplID0gdHlwZW9mIERldmljZVRleHRTaXplLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VDb2xvckZpbHRlciA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwibm9uZVwiLFxuICBcImdyYXlzY2FsZVwiLFxuICBcInJlZC1ncmVlblwiLFxuICBcImdyZWVuLXJlZFwiLFxuICBcImJsdWUteWVsbG93XCIsXG5dKTtcbmV4cG9ydCB0eXBlIERldmljZUNvbG9yRmlsdGVyID0gdHlwZW9mIERldmljZUNvbG9yRmlsdGVyLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VPcmllbnRhdGlvbiA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwicG9ydHJhaXRcIixcbiAgXCJsYW5kc2NhcGVfbGVmdFwiLFxuICBcInBvcnRyYWl0X3Vwc2lkZV9kb3duXCIsXG4gIFwibGFuZHNjYXBlX3JpZ2h0XCIsXG5dKTtcbmV4cG9ydCB0eXBlIERldmljZU9yaWVudGF0aW9uID0gdHlwZW9mIERldmljZU9yaWVudGF0aW9uLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VTZXR0aW5ncyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBhcHBlYXJhbmNlOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlQXBwZWFyYW5jZSksXG4gIHRleHRTaXplOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlVGV4dFNpemUpLFxuICByZWR1Y2VNb3Rpb246IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIGluY3JlYXNlQ29udHJhc3Q6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIHJlZHVjZVRyYW5zcGFyZW5jeTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgc2hvd0JvcmRlcnM6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuQm9vbGVhbiksXG4gIHZvaWNlT3ZlcjogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgbGlxdWlkR2xhc3M6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuTGl0ZXJhbHMoW1wiY2xlYXJcIiwgXCJ0aW50ZWRcIl0pKSxcbiAgY29sb3JGaWx0ZXI6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VDb2xvckZpbHRlciksXG4gIG5ldHdvcmtFbmFibGVkOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxuICBsb2NhdGlvbjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5OdWxsT3IoU2NoZW1hLlN0cnVjdCh7IGxhdGl0dWRlOiBTY2hlbWEuTnVtYmVyLCBsb25naXR1ZGU6IFNjaGVtYS5OdW1iZXIgfSkpLFxuICApLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VTZXR0aW5ncyA9IHR5cGVvZiBEZXZpY2VTZXR0aW5ncy5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlRm9yZWdyb3VuZEFwcCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBpZDogU2NoZW1hLlN0cmluZyxcbiAgbmFtZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcpLFxuICB2ZXJzaW9uOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG59KTtcbmV4cG9ydCB0eXBlIERldmljZUZvcmVncm91bmRBcHAgPSB0eXBlb2YgRGV2aWNlRm9yZWdyb3VuZEFwcC5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlRGV0YWlsID0gU2NoZW1hLlN0cnVjdCh7XG4gIGhvc3RJZDogRGV2aWNlSG9zdElkLFxuICBkZXZpY2VJZDogRGV2aWNlSWQsXG4gIHNldHRpbmdzOiBEZXZpY2VTZXR0aW5ncyxcbiAgZm9yZWdyb3VuZEFwcDogU2NoZW1hLk51bGxPcihEZXZpY2VGb3JlZ3JvdW5kQXBwKSxcbiAgcmVhZEF0OiBTY2hlbWEuU3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VEZXRhaWwgPSB0eXBlb2YgRGV2aWNlRGV0YWlsLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VQZXJtaXNzaW9uID0gU2NoZW1hLkxpdGVyYWxzKFtcbiAgXCJjYW1lcmFcIixcbiAgXCJtaWNyb3Bob25lXCIsXG4gIFwicGhvdG9zXCIsXG4gIFwiY29udGFjdHNcIixcbiAgXCJjYWxlbmRhclwiLFxuICBcInJlbWluZGVyc1wiLFxuICBcImxvY2F0aW9uXCIsXG4gIFwibm90aWZpY2F0aW9uc1wiLFxuICBcIm1vdGlvblwiLFxuICBcIm1lZGlhLWxpYnJhcnlcIixcbiAgXCJmYWNlaWRcIixcbl0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlUGVybWlzc2lvbiA9IHR5cGVvZiBEZXZpY2VQZXJtaXNzaW9uLlR5cGU7XG5cbmNvbnN0IERldmljZVRhcmdldCA9IHtcbiAgaG9zdElkOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlSG9zdElkKSxcbiAgZGV2aWNlSWQ6IERldmljZUlkLFxufTtcblxuZXhwb3J0IGNvbnN0IERldmljZUFjdGlvbklucHV0ID0gU2NoZW1hLlVuaW9uKFtcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgLi4uRGV2aWNlVGFyZ2V0LFxuICAgIHR5cGU6IFNjaGVtYS5MaXRlcmFsKFwic2V0QXBwZWFyYW5jZVwiKSxcbiAgICB2YWx1ZTogRGV2aWNlQXBwZWFyYW5jZSxcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3QoeyAuLi5EZXZpY2VUYXJnZXQsIHR5cGU6IFNjaGVtYS5MaXRlcmFsKFwic2V0VGV4dFNpemVcIiksIHZhbHVlOiBEZXZpY2VUZXh0U2l6ZSB9KSxcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgLi4uRGV2aWNlVGFyZ2V0LFxuICAgIHR5cGU6IFNjaGVtYS5MaXRlcmFsKFwic2V0VG9nZ2xlXCIpLFxuICAgIHNldHRpbmc6IFNjaGVtYS5MaXRlcmFscyhbXG4gICAgICBcInJlZHVjZU1vdGlvblwiLFxuICAgICAgXCJpbmNyZWFzZUNvbnRyYXN0XCIsXG4gICAgICBcInJlZHVjZVRyYW5zcGFyZW5jeVwiLFxuICAgICAgXCJzaG93Qm9yZGVyc1wiLFxuICAgICAgXCJ2b2ljZU92ZXJcIixcbiAgICAgIFwibmV0d29ya0VuYWJsZWRcIixcbiAgICBdKSxcbiAgICB2YWx1ZTogU2NoZW1hLkJvb2xlYW4sXG4gIH0pLFxuICBTY2hlbWEuU3RydWN0KHtcbiAgICAuLi5EZXZpY2VUYXJnZXQsXG4gICAgdHlwZTogU2NoZW1hLkxpdGVyYWwoXCJzZXRMaXF1aWRHbGFzc1wiKSxcbiAgICB2YWx1ZTogU2NoZW1hLkxpdGVyYWxzKFtcImNsZWFyXCIsIFwidGludGVkXCJdKSxcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIC4uLkRldmljZVRhcmdldCxcbiAgICB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcInNldENvbG9yRmlsdGVyXCIpLFxuICAgIHZhbHVlOiBEZXZpY2VDb2xvckZpbHRlcixcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIC4uLkRldmljZVRhcmdldCxcbiAgICB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcInNldE9yaWVudGF0aW9uXCIpLFxuICAgIHZhbHVlOiBEZXZpY2VPcmllbnRhdGlvbixcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIC4uLkRldmljZVRhcmdldCxcbiAgICB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcInNldExvY2F0aW9uXCIpLFxuICAgIGxhdGl0dWRlOiBTY2hlbWEuTnVtYmVyLmNoZWNrKFNjaGVtYS5pc0JldHdlZW4oeyBtaW5pbXVtOiAtOTAsIG1heGltdW06IDkwIH0pKSxcbiAgICBsb25naXR1ZGU6IFNjaGVtYS5OdW1iZXIuY2hlY2soU2NoZW1hLmlzQmV0d2Vlbih7IG1pbmltdW06IC0xODAsIG1heGltdW06IDE4MCB9KSksXG4gIH0pLFxuICBTY2hlbWEuU3RydWN0KHsgLi4uRGV2aWNlVGFyZ2V0LCB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcImNsZWFyTG9jYXRpb25cIikgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIC4uLkRldmljZVRhcmdldCxcbiAgICB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcInNldFBlcm1pc3Npb25cIiksXG4gICAgYXBwSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgICBwZXJtaXNzaW9uOiBEZXZpY2VQZXJtaXNzaW9uLFxuICAgIGRlY2lzaW9uOiBTY2hlbWEuTGl0ZXJhbHMoW1wiZ3JhbnRcIiwgXCJyZXZva2VcIiwgXCJyZXNldFwiXSksXG4gIH0pLFxuICBTY2hlbWEuU3RydWN0KHsgLi4uRGV2aWNlVGFyZ2V0LCB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcIm9wZW5VcmxcIiksIHVybDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nIH0pLFxuICBTY2hlbWEuU3RydWN0KHtcbiAgICAuLi5EZXZpY2VUYXJnZXQsXG4gICAgdHlwZTogU2NoZW1hLkxpdGVyYWwoXCJsYXVuY2hBcHBcIiksXG4gICAgYXBwSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIC4uLkRldmljZVRhcmdldCxcbiAgICB0eXBlOiBTY2hlbWEuTGl0ZXJhbChcInRlcm1pbmF0ZUFwcFwiKSxcbiAgICBhcHBJZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICB9KSxcbiAgU2NoZW1hLlN0cnVjdCh7IC4uLkRldmljZVRhcmdldCwgdHlwZTogU2NoZW1hLkxpdGVyYWwoXCJzaGFrZVwiKSB9KSxcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgLi4uRGV2aWNlVGFyZ2V0LFxuICAgIHR5cGU6IFNjaGVtYS5MaXRlcmFsKFwic2VuZFB1c2hcIiksXG4gICAgYXBwSWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgICBwYXlsb2FkOiBTY2hlbWEuVW5pb24oW1NjaGVtYS5TdHJpbmcsIFNjaGVtYS5SZWNvcmQoU2NoZW1hLlN0cmluZywgU2NoZW1hLlVua25vd24pXSksXG4gIH0pLFxuXSk7XG5leHBvcnQgdHlwZSBEZXZpY2VBY3Rpb25JbnB1dCA9IHR5cGVvZiBEZXZpY2VBY3Rpb25JbnB1dC5UeXBlO1xuZXhwb3J0IHR5cGUgRGV2aWNlQWN0aW9uVHlwZSA9IERldmljZUFjdGlvbklucHV0W1widHlwZVwiXTtcblxuZXhwb3J0IGNvbnN0IERldmljZURldGFpbElucHV0ID0gU2NoZW1hLlN0cnVjdChEZXZpY2VUYXJnZXQpO1xuZXhwb3J0IHR5cGUgRGV2aWNlRGV0YWlsSW5wdXQgPSB0eXBlb2YgRGV2aWNlRGV0YWlsSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNsYXNzIERldmljZUhvc3RVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPERldmljZUhvc3RVbmF2YWlsYWJsZUVycm9yPigpKFxuICBcIkRldmljZUhvc3RVbmF2YWlsYWJsZUVycm9yXCIsXG4gIHtcbiAgICBob3N0SWQ6IERldmljZUhvc3RJZCxcbiAgICAvKiogVGhlIGhvc3QncyBuYW1lIGluIFNldHRpbmdzLCB3aGljaCB0aGUgbWVzc2FnZSBzaG93cyBpbnN0ZWFkIG9mIGl0cyBpZC4gKi9cbiAgICBob3N0TGFiZWw6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuU3RyaW5nKSxcbiAgICByZWFzb246IFNjaGVtYS5TdHJpbmcsXG4gICAgY2F1c2U6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuRGVmZWN0KCkpLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaG9zdExhYmVsID8/IGBEZXZpY2UgaG9zdCAke3RoaXMuaG9zdElkfWB9IGlzIHVuYXZhaWxhYmxlOiAke3RoaXMucmVhc29ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERldmljZVBsYXRmb3JtVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxEZXZpY2VQbGF0Zm9ybVVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiRGV2aWNlUGxhdGZvcm1VbmF2YWlsYWJsZUVycm9yXCIsXG4gIHtcbiAgICBob3N0SWQ6IERldmljZUhvc3RJZCxcbiAgICBwbGF0Zm9ybTogRGV2aWNlUGxhdGZvcm0sXG4gICAgcmVhc29uOiBTY2hlbWEuU3RyaW5nLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucGxhdGZvcm19IGRldmljZXMgYXJlIHVuYXZhaWxhYmxlIG9uIGhvc3QgJHt0aGlzLmhvc3RJZH06ICR7dGhpcy5yZWFzb259YDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGV2aWNlTm90Rm91bmRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxEZXZpY2VOb3RGb3VuZEVycm9yPigpKFxuICBcIkRldmljZU5vdEZvdW5kRXJyb3JcIixcbiAge1xuICAgIGhvc3RJZDogRGV2aWNlSG9zdElkLFxuICAgIGRldmljZUlkOiBEZXZpY2VJZCxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRGV2aWNlICR7dGhpcy5kZXZpY2VJZH0gd2FzIG5vdCBmb3VuZCBvbiBob3N0ICR7dGhpcy5ob3N0SWR9LmA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERldmljZUJvb3RFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxEZXZpY2VCb290RXJyb3I+KCkoXCJEZXZpY2VCb290RXJyb3JcIiwge1xuICBob3N0SWQ6IERldmljZUhvc3RJZCxcbiAgZGV2aWNlSWQ6IERldmljZUlkLFxuICByZWFzb246IFNjaGVtYS5MaXRlcmFscyhbXCJkaXNrX3NwYWNlXCIsIFwidGltZW91dFwiLCBcImxhdW5jaF9mYWlsZWRcIl0pLFxuICBkaWFnbm9zdGljczogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcuY2hlY2soU2NoZW1hLmlzTWF4TGVuZ3RoKDJfMDAwKSkpLFxuICBjYXVzZTogU2NoZW1hLkRlZmVjdCgpLFxufSkge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlza19zcGFjZTogXCJUaGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgZGlzayBzcGFjZSBvbiB0aGUgZW52aXJvbm1lbnQgc2VydmVyLlwiLFxuICAgICAgdGltZW91dDogXCJUaGUgZGV2aWNlIGRpZCBub3QgYmVjb21lIHJlYWR5IGluIHRpbWUuXCIsXG4gICAgICBsYXVuY2hfZmFpbGVkOlxuICAgICAgICBcIlRoZSBzaW11bGF0b3Igb3IgZW11bGF0b3IgY291bGQgbm90IHN0YXJ0LiBDaGVjayBpdHMgY29uZmlndXJhdGlvbiBvbiB0aGUgZW52aXJvbm1lbnQgc2VydmVyLlwiLFxuICAgIH1bdGhpcy5yZWFzb25dO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgRGV2aWNlICR7dGhpcy5kZXZpY2VJZH0gZmFpbGVkIHRvIGJvb3Q6ICR7ZXhwbGFuYXRpb259YDtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljcyA/IGAke3N1bW1hcnl9XFxuXFxuJHt0aGlzLmRpYWdub3N0aWNzfWAgOiBzdW1tYXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXZpY2VPcGVyYXRpb25FcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxEZXZpY2VPcGVyYXRpb25FcnJvcj4oKShcbiAgXCJEZXZpY2VPcGVyYXRpb25FcnJvclwiLFxuICB7XG4gICAgb3BlcmF0aW9uOiBTY2hlbWEuU3RyaW5nLFxuICAgIHJlYXNvbjogU2NoZW1hLkxpdGVyYWxzKFtcbiAgICAgIFwiY29tbWFuZF9mYWlsZWRcIixcbiAgICAgIFwicmVxdWVzdF9mYWlsZWRcIixcbiAgICAgIFwiaW52YWxpZF9wYXlsb2FkXCIsXG4gICAgICBcInNldHRpbmdzX2ZhaWxlZFwiLFxuICAgICAgXCJodWJfcmVqZWN0ZWRcIixcbiAgICBdKSxcbiAgICBleGl0Q29kZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5OdW1iZXIpLFxuICAgIGNhdXNlOiBTY2hlbWEuRGVmZWN0KCksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IHtcbiAgICAgIGNvbW1hbmRfZmFpbGVkOiBgVGhlIGRldmljZSBjb21tYW5kIGZhaWxlZCR7dGhpcy5leGl0Q29kZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgKGV4aXQgY29kZSAke3RoaXMuZXhpdENvZGV9KWB9LmAsXG4gICAgICByZXF1ZXN0X2ZhaWxlZDogXCJDb3VsZCBub3QgY29tbXVuaWNhdGUgd2l0aCBkZXZpY2Ugc3VwcG9ydC4gVHJ5IHJlZnJlc2hpbmcgZGV2aWNlcy5cIixcbiAgICAgIGludmFsaWRfcGF5bG9hZDogXCJUaGUgZGV2aWNlIHJlcXVlc3QgY291bGQgbm90IGJlIGVuY29kZWQuXCIsXG4gICAgICBzZXR0aW5nc19mYWlsZWQ6IFwiQ291bGQgbm90IHJlYWQgb3Igc2F2ZSBkZXZpY2Ugc2V0dGluZ3MuXCIsXG4gICAgICBodWJfcmVqZWN0ZWQ6IFwiVGhlIGRldmljZSBodWIgY291bGQgbm90IGNvbXBsZXRlIHRoZSByZXF1ZXN0LlwiLFxuICAgIH1bdGhpcy5yZWFzb25dO1xuICAgIHJldHVybiBgRGV2aWNlICR7dGhpcy5vcGVyYXRpb259IGZhaWxlZDogJHtleHBsYW5hdGlvbn1gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXZpY2VBY3Rpb25VbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPERldmljZUFjdGlvblVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiRGV2aWNlQWN0aW9uVW5hdmFpbGFibGVFcnJvclwiLFxuICB7XG4gICAgb3BlcmF0aW9uOiBTY2hlbWEuU3RyaW5nLFxuICAgIHBsYXRmb3JtOiBEZXZpY2VQbGF0Zm9ybSxcbiAgICByZWFzb246IFNjaGVtYS5MaXRlcmFscyhbXCJ1bnN1cHBvcnRlZFwiLCBcImhlbHBlcl9taXNzaW5nXCJdKSxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlYXNvbiA9PT0gXCJoZWxwZXJfbWlzc2luZ1wiXG4gICAgICA/IGBEZXZpY2UgJHt0aGlzLm9wZXJhdGlvbn0gcmVxdWlyZXMgYSBoZWxwZXIgbWlzc2luZyBmcm9tIHRoaXMgaW5zdGFsbC4gU2V0IHVwIGRldmljZSBzdXBwb3J0IGFnYWluLmBcbiAgICAgIDogYERldmljZSAke3RoaXMub3BlcmF0aW9ufSBpcyBub3Qgc3VwcG9ydGVkIG9uICR7dGhpcy5wbGF0Zm9ybX0uYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRGV2aWNlRXJyb3IgPSBTY2hlbWEuVW5pb24oW1xuICBEZXZpY2VIb3N0VW5hdmFpbGFibGVFcnJvcixcbiAgRGV2aWNlUGxhdGZvcm1VbmF2YWlsYWJsZUVycm9yLFxuICBEZXZpY2VOb3RGb3VuZEVycm9yLFxuICBEZXZpY2VCb290RXJyb3IsXG4gIERldmljZU9wZXJhdGlvbkVycm9yLFxuICBEZXZpY2VBY3Rpb25VbmF2YWlsYWJsZUVycm9yLFxuXSk7XG5leHBvcnQgdHlwZSBEZXZpY2VFcnJvciA9IHR5cGVvZiBEZXZpY2VFcnJvci5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlVG9vbExpc3RSZXN1bHQgPSBTY2hlbWEuU3RydWN0KHtcbiAgaG9zdFN0YXR1c2VzOiBEZXZpY2VIb3N0U3RhdHVzZXMsXG4gIGhvc3RzOiBTY2hlbWEuQXJyYXkoRGV2aWNlSG9zdFN1bW1hcnkpLFxuICBkZXZpY2VzOiBTY2hlbWEuQXJyYXkoRGV2aWNlU3VtbWFyeSksXG4gIG9wZW46IFNjaGVtYS5BcnJheShTY2hlbWEuU3RydWN0KHsgaG9zdElkOiBEZXZpY2VIb3N0SWQsIGRldmljZUlkOiBEZXZpY2VJZCB9KSksXG59KTtcbmV4cG9ydCB0eXBlIERldmljZVRvb2xMaXN0UmVzdWx0ID0gdHlwZW9mIERldmljZVRvb2xMaXN0UmVzdWx0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VUb29sT3BlbklucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIGRldmljZUlkOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgRGV2aWNlSWQuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2ltdWxhdG9yIHVkaWQgb3IgZW11bGF0b3Igc2VyaWFsIGZyb20gZGV2aWNlX2xpc3QuIE9taXQgdG8gdXNlIHRoZSBib290ZWQgZGV2aWNlIGZvciB0aGUgcGxhdGZvcm0sIG9yIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgb25lLlwiLFxuICAgIH0pLFxuICApLFxuICBwbGF0Zm9ybTogU2NoZW1hLm9wdGlvbmFsKFxuICAgIERldmljZVBsYXRmb3JtLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcXVpcmVkIHdoZW4gZGV2aWNlSWQgaXMgb21pdHRlZCBhbmQgYm90aCBwbGF0Zm9ybXMgYXJlIGF2YWlsYWJsZS5cIixcbiAgICB9KSxcbiAgKSxcbiAgaG9zdElkOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgRGV2aWNlSG9zdElkLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFwiRGV2aWNlIGhvc3QgZnJvbSBkZXZpY2VfbGlzdC4gRGVmYXVsdHMgdG8gbG9jYWwuXCIgfSksXG4gICksXG59KS5hbm5vdGF0ZSh7XG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiQm9vdHMgdGhlIGRldmljZSBpZiBuZWVkZWQsIHN0YXJ0cyBpdHMgbGl2ZSBzdHJlYW0sIGFuZCBvcGVucyB0aGUgRGV2aWNlIHBhbmVsIHNvIHRoZSB1c2VyIGNhbiB3YXRjaC4gUmV0dXJucyBob3cgdG8gZHJpdmUgaXQgd2l0aCB0aGUgYWdlbnQtZGV2aWNlIENMSS5cIixcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlVG9vbE9wZW5JbnB1dCA9IHR5cGVvZiBEZXZpY2VUb29sT3BlbklucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VUb29sT3BlblJlc3VsdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBkZXZpY2U6IERldmljZVN1bW1hcnksXG4gIGFnZW50RGV2aWNlOiBTY2hlbWEuU3RydWN0KHtcbiAgICBjb21tYW5kOiBTY2hlbWEuU3RyaW5nLFxuICAgIHRhcmdldEFyZ3M6IFNjaGVtYS5BcnJheShTY2hlbWEuU3RyaW5nKSxcbiAgfSksXG4gIHF1aWNrU3RhcnQ6IFNjaGVtYS5TdHJpbmcsXG59KTtcbmV4cG9ydCB0eXBlIERldmljZVRvb2xPcGVuUmVzdWx0ID0gdHlwZW9mIERldmljZVRvb2xPcGVuUmVzdWx0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBEZXZpY2VUb29sVGFyZ2V0SW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlSWQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBEZXZpY2VJZC5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEZXZpY2UgZnJvbSBkZXZpY2VfbGlzdC4gT21pdCB0byB1c2UgdGhlIGRldmljZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBpbiB0aGlzIHRocmVhZC5cIixcbiAgICB9KSxcbiAgKSxcbiAgaG9zdElkOiBTY2hlbWEub3B0aW9uYWwoRGV2aWNlSG9zdElkKSxcbn0pO1xuZXhwb3J0IHR5cGUgRGV2aWNlVG9vbFRhcmdldElucHV0ID0gdHlwZW9mIERldmljZVRvb2xUYXJnZXRJbnB1dC5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlVG9vbFNjcmVlbnNob3RSZXN1bHQgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlOiBEZXZpY2VTdW1tYXJ5LFxuICBzY3JlZW5zaG90OiBTY2hlbWEuU3RydWN0KHtcbiAgICBtaW1lVHlwZTogU2NoZW1hLkxpdGVyYWwoXCJpbWFnZS9wbmdcIiksXG4gICAgZGF0YTogU2NoZW1hLlN0cmluZyxcbiAgICB3aWR0aDogU2NoZW1hLkludCxcbiAgICBoZWlnaHQ6IFNjaGVtYS5JbnQsXG4gIH0pLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VUb29sU2NyZWVuc2hvdFJlc3VsdCA9IHR5cGVvZiBEZXZpY2VUb29sU2NyZWVuc2hvdFJlc3VsdC5UeXBlO1xuXG5leHBvcnQgY29uc3QgRGV2aWNlVG9vbENsb3NlSW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgZGV2aWNlSWQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBEZXZpY2VJZC5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJEZXZpY2UgdG8gY2xvc2UuIE9taXQgdG8gY2xvc2UgZXZlcnkgZGV2aWNlIGluIHRoaXMgdGhyZWFkLlwiLFxuICAgIH0pLFxuICApLFxuICBob3N0SWQ6IFNjaGVtYS5vcHRpb25hbChEZXZpY2VIb3N0SWQpLFxuICBzaHV0ZG93bjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFsc28gcG93ZXIgdGhlIHNpbXVsYXRvciBvciBlbXVsYXRvciBvZmYuIERlZmF1bHRzIHRvIGZhbHNlLlwiLFxuICAgIH0pLFxuICApLFxufSk7XG5leHBvcnQgdHlwZSBEZXZpY2VUb29sQ2xvc2VJbnB1dCA9IHR5cGVvZiBEZXZpY2VUb29sQ2xvc2VJbnB1dC5UeXBlO1xuXG5leHBvcnQgY2xhc3MgRGV2aWNlVG9vbFVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8RGV2aWNlVG9vbFVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiRGV2aWNlVG9vbFVuYXZhaWxhYmxlRXJyb3JcIixcbiAge1xuICAgIHJlYXNvbjogU2NoZW1hLlN0cmluZyxcbiAgICBjYXVzZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5EZWZlY3QoKSksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWFzb247XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IERldmljZVRvb2xFcnJvciA9IFNjaGVtYS5VbmlvbihbXG4gIERldmljZVRvb2xVbmF2YWlsYWJsZUVycm9yLFxuICBEZXZpY2VIb3N0VW5hdmFpbGFibGVFcnJvcixcbiAgRGV2aWNlUGxhdGZvcm1VbmF2YWlsYWJsZUVycm9yLFxuICBEZXZpY2VOb3RGb3VuZEVycm9yLFxuICBEZXZpY2VCb290RXJyb3IsXG4gIERldmljZU9wZXJhdGlvbkVycm9yLFxuICBEZXZpY2VBY3Rpb25VbmF2YWlsYWJsZUVycm9yLFxuXSk7XG5leHBvcnQgdHlwZSBEZXZpY2VUb29sRXJyb3IgPSB0eXBlb2YgRGV2aWNlVG9vbEVycm9yLlR5cGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXZpY2VUb29sSW5zdGFsbE1lc3NhZ2UobmFtZTogc3RyaW5nLCB0b29sOiBEZXZpY2VUb29sVmVyc2lvbiB8IHVuZGVmaW5lZCkge1xuICBpZiAoIXRvb2wpIHJldHVybiBgSW5zdGFsbGluZyAke25hbWV94oCmYDtcbiAgY29uc3QgcHJldmlvdXMgPVxuICAgIHRvb2wucnVubmluZ1ZlcnNpb24gPz9cbiAgICBbLi4udG9vbC5pbnN0YWxsZWRWZXJzaW9uc10uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsIFwiZW5cIiwgeyBudW1lcmljOiB0cnVlIH0pKS5hdCgtMSk7XG4gIHJldHVybiBwcmV2aW91cyAmJiAhdG9vbC5pbnN0YWxsZWRWZXJzaW9ucy5pbmNsdWRlcyh0b29sLnJlcXVpcmVkVmVyc2lvbilcbiAgICA/IGBVcGRhdGluZyAke25hbWV9IGZyb20gJHtwcmV2aW91c30gdG8gJHt0b29sLnJlcXVpcmVkVmVyc2lvbn3igKZgXG4gICAgOiBgSW5zdGFsbGluZyAke25hbWV9ICR7dG9vbC5yZXF1aXJlZFZlcnNpb2594oCmYDtcbn1cbiJdLCJmaWxlIjoiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL2RldmljZS50cyJ9

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9kZXZpY2UudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvZGV2aWNlLnRzIix7InVybHMiOiI2IiwiaWRzIjoiNyJ9LFsiOCIsIjkiLCIxMCIsIjExIl0sW10sWyI4IiwiOSIsIjEwIiwiMTEiXSx7fSwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FZmZlY3QuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVtYS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU2NoZW1hVHJhbnNmb3JtYXRpb24uanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvYmFzZVNjaGVtYXMudHMiXQ==