Heartbeat

This commit is contained in:
Stephen 2025-03-27 03:39:51 -04:00
parent e19fa94cba
commit 98c8eda180
12 changed files with 3054 additions and 98 deletions

View file

@ -442,6 +442,10 @@
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/StikJIT/idevice",
);
MACOSX_DEPLOYMENT_TARGET = 15.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.stik.StikJIT;
@ -484,6 +488,10 @@
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/StikJIT/idevice",
);
MACOSX_DEPLOYMENT_TARGET = 15.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.stik.StikJIT;

View file

@ -5,40 +5,3 @@
// Created by Stephen on 3/27/25.
//
import SwiftUI
import em_proxy
// Debug View Model that calls the Swift bindings on startup.
class DebugViewModel: ObservableObject {
@Published var status: String = "Initializing..."
@Published var logs: [String] = []
init() {
startProxy()
}
func startProxy() {
let port = 62078
let bindAddr = "127.0.0.1:\(port)"
DispatchQueue.global(qos: .background).async {
DispatchQueue.main.async {
self.status = "Starting em_proxy..."
self.logs.append("Starting em_proxy on port \(port)...")
}
// Call the Swift binding that wraps the heartbeat functionality.
let result = start_emotional_damage(bindAddr)
DispatchQueue.main.async {
if result == 0 {
self.status = "em_proxy started successfully on port \(port)"
self.logs.append("em_proxy started successfully on port \(port).")
} else {
self.status = "Failed to start em_proxy"
self.logs.append("Failed to start em_proxy.")
}
}
}
}
}

View file

@ -1,3 +1,6 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#include "idevice.h"
#include "heartbeat.h"

View file

@ -6,12 +6,41 @@
//
import SwiftUI
import em_proxy
@main
struct StikJITApp: App {
struct HeartbeatApp: App {
var body: some Scene {
WindowGroup {
MainTabView()
HomeView()
.onAppear {
startProxy()
startHeartbeatInBackground()
}
}
}
func startHeartbeatInBackground() {
DispatchQueue.global(qos: .background).async {
startHeartbeat()
}
}
func startProxy() {
let port = 51820
let bindAddr = "127.0.0.1:\(port)"
DispatchQueue.global(qos: .background).async {
let result = start_emotional_damage(bindAddr)
DispatchQueue.main.async {
if result == 0 {
print("DEBUG: em_proxy started successfully on port \(port)")
print("DEBUG: em_proxy started successfully on port \(port).")
} else {
print("DEBUG: Failed to start em_proxy")
print("DEBUG: Failed to start em_proxy.")
}
}
}
}
}

View file

@ -7,70 +7,26 @@
import SwiftUI
// Debug View displaying status and logs.
struct DebugView: View {
@StateObject private var viewModel = DebugViewModel()
var body: some View {
VStack(spacing: 15) {
Text("StikJIT Debug Panel")
.font(.title)
VStack {
Spacer()
Text("Welcome to StikJIT")
.font(.largeTitle)
.bold()
.foregroundColor(.primary)
.padding(.top)
HStack {
Circle()
.fill(viewModel.status.contains("successfully") ? Color.green : viewModel.status.contains("Failed") ? Color.red : Color.yellow)
.frame(width: 14, height: 14)
Text(viewModel.status)
.font(.headline)
.foregroundColor(.primary)
}
.padding(.bottom, 5)
Divider()
.background(Color.secondary.opacity(0.3))
ScrollView {
VStack(alignment: .leading, spacing: 5) {
ForEach(viewModel.logs, id: \.self) { log in
Text(log)
.font(.system(.body, design: .monospaced))
.foregroundColor(.secondary)
.padding(.horizontal)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
}
.frame(maxHeight: 300)
.background(RoundedRectangle(cornerRadius: 10).fill(Color(.systemGray6).opacity(0.5)))
.padding()
Button(action: {
viewModel.startProxy()
}) {
Label("Restart Proxy", systemImage: "arrow.clockwise")
.font(.headline)
.foregroundColor(.white)
.padding()
.frame(maxWidth: .infinity)
.background(Color.blue)
.cornerRadius(10)
}
.buttonStyle(PlainButtonStyle())
.padding(.horizontal)
.padding()
Text("Use the Debug tab to monitor the logs.")
.font(.body)
.foregroundColor(.secondary)
.padding()
Spacer()
}
.padding()
.frame(width: 420, height: 500)
.background(
FancyBlurView()
.cornerRadius(15)
.shadow(radius: 10)
)
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(.systemBackground))
}
}
#Preview {
DebugView()
}

View file

@ -0,0 +1,99 @@
// Jackson Coxson
// heartbeat.c
#include "idevice.h"
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/_types/_u_int64_t.h>
#include <CoreFoundation/CoreFoundation.h>
#include <limits.h>
void startHeartbeat() {
printf("DEBUG: Initializing logger...\n");
idevice_init_logger(Debug, Disabled, NULL);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
if (inet_pton(AF_INET, "10.7.0.2", &addr.sin_addr) <= 0) {
fprintf(stderr, "DEBUG: Error converting IP address.\n");
return;
}
printf("DEBUG: Socket address created for IP 10.7.0.2 on port %d.\n", LOCKDOWN_PORT);
printf("DEBUG: Searching the app bundle for pairing_file.plist...\n");
CFURLRef pairingFileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
CFSTR("pairing_file"),
CFSTR("plist"),
NULL);
if (pairingFileURL == NULL) {
fprintf(stderr, "DEBUG: Pairing file not found in the app bundle.\n");
return;
}
char pairingFilePath[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(pairingFileURL, TRUE, (UInt8 *)pairingFilePath, PATH_MAX)) {
fprintf(stderr, "DEBUG: Error converting pairing file URL to file system representation.\n");
CFRelease(pairingFileURL);
return;
}
CFRelease(pairingFileURL);
printf("DEBUG: Pairing file found at path: %s\n", pairingFilePath);
printf("DEBUG: Reading pairing file...\n");
IdevicePairingFile *pairing_file = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing_file);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to read pairing file: %d\n", err);
return;
}
printf("DEBUG: Pairing file read successfully.\n");
printf("DEBUG: Creating TCP provider...\n");
TcpProviderHandle *provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing_file,
"ExampleProvider", &provider);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to create TCP provider: %d\n", err);
idevice_pairing_file_free(pairing_file);
return;
}
printf("DEBUG: TCP provider created successfully.\n");
printf("DEBUG: Connecting to installation proxy...\n");
HeartbeatClientHandle *client = NULL;
err = heartbeat_connect_tcp(provider, &client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to connect to installation proxy: %d\n", err);
tcp_provider_free(provider);
return;
}
tcp_provider_free(provider);
printf("DEBUG: Connected to installation proxy successfully.\n");
u_int64_t current_interval = 15;
while (1) {
u_int64_t new_interval = 0;
printf("DEBUG: Sending heartbeat with current interval: %llu seconds...\n", current_interval);
err = heartbeat_get_marco(client, current_interval, &new_interval);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to get marco: %d\n", err);
heartbeat_client_free(client);
return;
}
printf("DEBUG: Received new interval: %llu seconds.\n", new_interval);
current_interval = new_interval + 5;
printf("DEBUG: Sending polo reply...\n");
err = heartbeat_send_polo(client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to send polo: %d\n", err);
heartbeat_client_free(client);
return;
}
printf("DEBUG: Polo reply sent successfully.\n");
}
}

View file

@ -0,0 +1,14 @@
//
// heartbeat.h
// StikJIT
//
// Created by Stephen on 3/27/25.
//
// heartbeat.h
#ifndef HEARTBEAT_H
#define HEARTBEAT_H
void startHeartbeat();
#endif /* HEARTBEAT_H */

1631
StikJIT/idevice/idevice.h Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DeviceCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN1akNDQWFLZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQUxpZjNCS2VWUHlZSC85LzNKL2ZJeUdNSUdWbHNvWGJtWmJLYml1OGJo
TFpnRkRjbEhtME1LODRNRk9iCkJFUW9NRkNlRFUwQWV1VHZzNlkrMERqQWlEbzJTTXZw
TnpkbVlGZWtRL1JzWUtSN3VJSGJRc1h0bWJSU0FLRlgKdUpsZUNyMjdKeFpUSXNGT3FE
bzRZNmdXWWptSVVXSm1qbXRtVXFoMTVYSFVTWFVOYnUwMVhRS0lqRFBScXRVaQpIakMr
N0J4ZXVvNzBySlgwTldTcXdnSjQxNWEyRnNITUQyRW9FM2NIalNXU0dSWFFUazVKZkFH
NHlJV1VLeVJOClZGNTVybDU5bjR3Q083SlR5U0sveHVCR09RWFNzVnFkUUY4NVE2ZFpi
aDZNNHpTaDB4T3BYanNKVURFZUlLaUMKNC9IUmIxOEE1ZXBrVnlibURPcmhJa09TWGJr
Q0F3RUFBYU0vTUQwd0RBWURWUjBUQVFIL0JBSXdBREFkQmdOVgpIUTRFRmdRVWFJNU9t
aHBaL2JpeVA1N3d0KzBhVE1rODhUWXdEZ1lEVlIwUEFRSC9CQVFEQWdXZ01BMEdDU3FH
ClNJYjNEUUVCQlFVQUE0SUJBUUEzV3NyTU93QWhDUDZkSVRGMG5YR09adUJnSnVrRkFs
TWR1Zm8wL2ZIT2tVdE0KY2xJYU1WK05naFVUMGZVQWY2YlpnQUFyNW1xU0dkVDlxUFlw
dFh3eU9FVFI5d2NMWTlZQWFCamtnbkJUWllTSwo2eGRZa3hZRHJOQ3lnZCtvR05CUXBT
ME1BQ0lpWm9sNUNZZmgzK2d6UFJjUUZKeXVkaTNTVlJUaWRUSDNGV2lxCmpYT25kekpM
RVBnZTZaUDJjZWZjMXI0anFaM3JHd1FabjlWWWxxTnFwUGk5aTNWSjNacTMrcnlsYWNT
LzRMdHIKUGxtZnljQ0xWakF2djZxU3NPc1l3dGp3YllVRG52UDM0V0xnK2tMbFBOemlU
cEV3NmxGdXdXRndXUVNSSUNHOApPV0QzeEliczB2RmtramdjaDhVTUVuUlZMRmNpWUV5
bzJoN1F4MXpzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
</data>
<key>HostPrivateKey</key>
<data>
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcw
QkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQys5dENJa3pDLzZ6VXgKZ29YUGxCb3NH
a1kzUThxbkVwSU1LczRIRU9aanM5RXAra1BoT3BxbWEzWGtmc2lvM1VFY2RVOUoybDM1
YXB4RApseC83MGRSN2lNMFFmSU5aSXFiSHBHT3JaeGxuVjBxcysvNkNGbTM5ME9keUpW
K2ptSnBZbFU3aXh0N3A0bWRyCjZLdGVLTGpDMW56VzFOVFdDL0dWNitZTk5PUDV5MThp
dE9sOGt0YnBacTFtSjNCQURyaWdqOW1hQVpmbXFreWUKcmR6RDl1REFqUVdad2ZoZVIx
U2piS0QwdGs5ZWpxZCtxdkdsMEd6OE56YUJDYXI0Qk9FTXcvSFl2eVhhS1Nwagp4L3Zo
T2pkM0Y4S2xIcXZodWFOcVhCc3UrSlkzdVRzVzdIV3RwRGo4QlFCT2dpTks3UytlMnJ5
ZytmR0FpZXV6ClVSbHJZSzhEQWdNQkFBRUNnZ0VBUSttczBkVmUwZklKRWRsMFV4VTls
WSttaHdMeDhDYlhqOEl0VVMvK2IxakUKdXlRSXZmSEVqQWpOZlh4bFNrQ2Raa3lGN1NM
ZXB0UDJUTWRURlpCUys3ZjBEYmZxVW1uVFhFNm5MNDdUNXYrUgpUQ0cyS25kbG1JMlJz
Zk4rcHNTZnAzODU5Y1o2QWoyRlFFZ1hvYjNqcjA3dVNNeWFBS0Z3d2p1SnJncXdST1lr
Ckw5ZTkxdnl2Rm9VWVlPWHpnRTE0dWxnK2NTSEdRTFh6bStDeEVEWWxUaEJ1Mi9HQUJ5
RWZwUEtXN0pWS1ZUQ1YKdm0xSnI1Z0s5eVhYL1hEKzN5ZlBnd0RvZ3VNV3NNRFRURSti
Q3BERVB2b3BxRVUxMEgrNldtRW1hbkZlVElLSwpIeElpaEoyOFhmWDBUNVd4QldTWFlK
NGRETTVpdWMwYkZ6dzVvQVFsS1FLQmdRRG9zamxBSUNmWmZOVU43OGg1CjJheFFyZlhw
MmpzL0xEc1pGUzlib0V0VjVjOW1yb0FWR1BpaXJIZ2VNUUMxWkNMaDRLek9ObC9wYXlq
TVhkUnAKS0p6OGhtNTNtc1JkbVZ3OFo4WUozckFUanh6blRKMWN5c01QRGN3UC9zK3NG
cFkybXk0b2hENFFvQ2FsMzc1QwpGelp5VHR5aUU3NjhwbG9wWHJQZmJpNE8xd0tCZ1FE
U0ZxNGFUNGMwNFJKL1NuUTVDVGhMTWF1MTcrZE9DU0dZCjJvLzl5T3RmN1dlMHhjeHdK
SEV2MXFqOHlDcWM4eFd1Yzcram84cVkzTGNKYVN6WEM3WGtlTXdXRDVhZFNVQ2MKVnhO
WEFScFR0ZWxBOXB1VTBYWnNBWDJCV0hrTFhpb3BPb0h6SnVuMnR4NWYvdHluRFg2UFRJ
YjgzOUJabDFSeQpQbVB5aVdBM3RRS0JnRHpNQy85QUo0bEFmMTREejBwZTRCRzRVZThH
c01JaHFWTTFZTWs4eVZJcEdCWkk4M2dQCnJTNjdoeXJFUE40bnlxRmZsV2JQZUNIQmVN
aGtuNUhXSmFZbzdZWGNidi9SaVBMVFhqL0g2aE5DS2hnWXdXaTAKSldDeWh5V0t1dkhJ
ZVBqTmRMTHJVbGYvci9sWXl4bnpmS3REQll4blFrZUI0ejY1MnA4KzUxUERBb0dCQUtH
UwpNNytrWGhWNjYyRGQvOWhGa1BlemNaMXdyWEZFY0lRL3d2R283ZXhPaHExdVdiWDlN
TmRidlliNjRscm1VRXhrClZJUWpXWktLWEhKdVlyL1lEOEZ3YlhTaDlIRnVmclE5KzIr
ME4yMGR3QS9vR09zdzFHUm9HUCs2N1F5akZNVzAKYTNCM0F3UnMvSDFUWXB0UE00QTlt
S3N0N2V5WkI2YjgrSnowcmZ6cEFvR0FkaGYyOFNuZVFzOEkzM0ZHRXdFcwpJellJWStI
Q2ZjU2UrU2k0UWZuSmtqWW96NS95ZlJpK3MrUE9tdWxXMXVxM0pMdGlSNGsydlpUWXl5
OUt5L1lXCjJwUHhJOURuY0VhUlBTYW5tb0FBck1uYlVER1hsT2JOakJEWldOSTVhenUr
ZzZ6bE91UkYzRE5wUC9CTm54WWgKdUpXenI1Y1VqMlI3bURMTFRCMFFCcjg9Ci0tLS0t
RU5EIFBSSVZBVEUgS0VZLS0tLS0K
</data>
<key>HostCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNtekNDQVlPZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQUw3MjBJaVRNTC9yTlRHQ2hjK1VHaXdhUmpkRHlxY1NrZ3dxemdjUTVt
T3owU242UStFNm1xWnJkZVIrCnlLamRRUngxVDBuYVhmbHFuRU9YSC92UjFIdUl6UkI4
ZzFraXBzZWtZNnRuR1dkWFNxejcvb0lXYmYzUTUzSWwKWDZPWW1saVZUdUxHM3VuaVoy
dm9xMTRvdU1MV2ZOYlUxTllMOFpYcjVnMDA0L25MWHlLMDZYeVMxdWxtcldZbgpjRUFP
dUtDUDJab0JsK2FxVEo2dDNNUDI0TUNOQlpuQitGNUhWS05zb1BTMlQxNk9wMzZxOGFY
UWJQdzNOb0VKCnF2Z0U0UXpEOGRpL0pkb3BLbVBIKytFNk4zY1h3cVVlcStHNW8ycGNH
eTc0bGplNU94YnNkYTJrT1B3RkFFNkMKSTBydEw1N2F2S0Q1OFlDSjY3TlJHV3RncndN
Q0F3RUFBYU1nTUI0d0RBWURWUjBUQVFIL0JBSXdBREFPQmdOVgpIUThCQWY4RUJBTUNC
YUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUZBbkEyUjFObGF2bVZGQm51ZnAyb0lM
CitOYXcrYXZpcmJBYVBnRHR4MXNTNzRsNFQ2eTdOWDFsdlFxY1Nqa01Salp6TmEvQUdX
VkNiaVovNUZCZjF4eWIKbmcrSjliL3VKWVpBRVBXaUEyanlVZlZ2UnI1aVVDdHdGZFBY
VmZuU2hOcXpxSjZuUEw5V1FoWm40dy9LdXJFRQovNU1kTnkxWnh1YytmczZHUzd1K3Ey
ZHpnQUJiYjN1NFIwRU1rL1pWV2pwKzRsaVZYd29UbVhyY2Z5OThqZWNsClY5RHF4V0ZJ
Q1BvTkdZbHcrT0R2TDdieFNERzhKaHBZOHJOVFNYYU1rUmJPNS91M0RnY0hWY2haNjVD
czlIRVEKem1IQXV5TGttdUE1Mzd1dVFvTHlYVUkrZmtHZGNmRjNwZ1VveUhzaFQ3ZlJx
QzhuTW9aWlNjdDVtc244a0RBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
</data>
<key>RootPrivateKey</key>
<data>
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcw
QkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRRE1kQmJTTkZtbURKUXMKb1U1ZVFQRFEy
NVhBN3RkUVdnaG9obUN0NU54UUUvR21rUjhNODNWUHg0WmMvSlZyUFJ0QUE5Rms0TzBE
VnFnYgpkNTJHZmVaa0xjWFlVVi9aWU9MQW5JbTM1bGJCNjVlRGIvb21sT2txOE95c21I
SS9SbmczWDZBQVVYWENsK3NQCkxjT3BYaFdHRzhBRzNONDk2cHN6c2hIN2R4dG1wTU9B
bHBVZHdaeVhXaVVDMFdsd3p0RXB5YXFvWWxOdS9GUVIKRkNEZ0l3Rlc4Ny8xSVZWYlEx
dVlOL1l1MXVENytrT2ZPRHNlUnkrc1JwQ2NGVWI2U1R5aFdmQnhic1ZUQ3puVwpwZ21Q
M284SFFaM2RGMzlHa1BIZTJJQnBXc1l2bEdoUFNqaVVibm03a1FXeGhrZ3ZNSE1yUmt5
a2U1TTY1U3EwCjJNWW5IdUFiQWdNQkFBRUNnZ0VCQUtTeGZ4Q2xDdkl2Zjh6VHc0VTVX
c05qbnlaalB4NkM1L01MRENZSURWQ1UKUUR5aytoWThwMnMwbG8raEI5dnl4Vml6dXFG
QWJxd1p5aUVXSWRhTTVHSWVYUmo3cy9JdmtYa0dvQWw3aXJkNwpSL21nNGlqaUcxRno4
YksydXBFdCt2amdGc3NxMDJtRlp0dzdTVG5OaUJrWGtYLzF1ekMxSTRCcEdRTXYxdXEr
CnErZnRRTktsQVd1TUJxclJCajNDd01nME5udzJtdnU4aUhhQXVCRU1mL1pKd1JyVVdV
UEhxMzFBQml1U0c3NXUKOWZ0SkIwaVZ3RVY0S21vQ0h3MVhGbTFUZjlPZ3h3Nnl5SUFN
YXNsdkdtN0NPM1lpYWdZUzFmYnJqWDVwUWJ4aQpjTWNnNHhKdUhicTQ5MWxTZCtNOVFt
dVRDdEtETkZyWVRGMHhMVVMwV0VFQ2dZRUEvcld5SkhXVWMwNDZGUFNJCktQSU1LRTFR
ZlV6SFlQeWRSV1BQUmxFeVg1MW9SbURGZnpsaDBUVSs5QlRJOFNKNmVGbFBMMktZTS9C
cjI0VTQKZUIwbHNHbS9EeWt6anBIZG1TVHZYbmN3Q1ZCTEQ4N1JUampiK015ZVV2TEln
QlVzYUJhODZJS2VpdXgxQUhWTgpFM0E0VEZmRzJ2dXFsYk85Mno3ajFnK3NyejhDZ1lF
QXpYMDR2RHBJdzBGZy9pT0NBSWUzaUdwUllaSjVSeWsxCmFVakprdm10b1VqWE5BbjBl
RlFUV3ZUdndqclZkTjdxemZwT1hOZlN5U3VBS2M4bVVTeTJ3SE4wVlRPK3lnNmEKQlhk
MTFJbmZiQ2owa003dkxTdjdOWGJ0c1pYT2NUYm1QOSsweTAwZlErc2Y5NlYyVE9NRng1
VmN6eFl2ZjFkZwpPWVFERmV6L2RDVUNnWUJzSVZxRkc5MXZyZS8rWVdsRWFLMDhsc1hx
eTZPQXl2MUJMZ1FhaC9Ib29YeFpGRkFECm1LcXNFL3lyeGY4Z1QxREtzcTlwSUdRWStL
SHhTWGNWbHRvZk1HVkozR1hreW92V3JkVm90eFNQZjZTK0MwRFUKQWxOd0pmMjRuUlQ5
T3YvbEdISU9DeFdmU0k3TEtRRVZsWGh4QUhxTkVIWDBvNStmNmV6elBTaEVKUUtCZ1FD
MgovR09oZW1XQk9wOGNzSkg3MXQ5ZzR3eEZUeUlnZEZuVHY3V0E1RVh4OGVOeHU4dXZ1
MjdnK0d6cEVXc3ovNjRvCmJsV0o1OGNVelYvNzJ6UEw1WDE0TTFmTTU1OW1YMHBZdytC
eHU3VHhwQ2JsTE9GZjRHSjdZY1NZOTBZM0d5USsKalA5NmF0c0VxRVIzU3lqbG51UnVy
bHRQTGZwdDgya0V6c0hRckpOdTRRS0JnSDIwNXMwaEpaMkk0YS9JWE5aawo3N1d5YXlu
R2Y0YTFMUkw1bmJHOWl1TkJlT3FGVGJRQ3hIbVFmQ0daZ01vajZta2RMeTRNZHhXN05C
U0JrRzdZCmQ3SVNPbUx4QzRsSU85Rnp6eEpheDZKR3FIcWFkSDBTVzcydjlQTUJOTXFi
UXdYeWc3RUNMVTlPaThWNVZQR20KcHh4cG8vMytWMVgrY003dDdHRVBSNDM3Ci0tLS0t
RU5EIFBSSVZBVEUgS0VZLS0tLS0K
</data>
<key>RootCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqakNDQVhhZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQU14MEZ0STBXYVlNbEN5aFRsNUE4TkRibGNEdTExQmFDR2lHWUszazNG
QVQ4YWFSSHd6emRVL0hobHo4CmxXczlHMEFEMFdUZzdRTldxQnQzbllaOTVtUXR4ZGhS
WDlsZzRzQ2NpYmZtVnNIcmw0TnYraWFVNlNydzdLeVkKY2o5R2VEZGZvQUJSZGNLWDZ3
OHR3NmxlRllZYndBYmMzajNxbXpPeUVmdDNHMmFrdzRDV2xSM0JuSmRhSlFMUgphWERP
MFNuSnFxaGlVMjc4VkJFVUlPQWpBVmJ6di9VaFZWdERXNWczOWk3VzRQdjZRNTg0T3g1
SEw2eEdrSndWClJ2cEpQS0ZaOEhGdXhWTUxPZGFtQ1kvZWp3ZEJuZDBYZjBhUThkN1ln
R2xheGkrVWFFOUtPSlJ1ZWJ1UkJiR0cKU0M4d2N5dEdUS1I3a3pybEtyVFl4aWNlNEJz
Q0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTgpCZ2txaGtpRzl3MEJB
UVVGQUFPQ0FRRUFDdTRUQi9vWnJHQStUS0M4a0YvWU9QcjVyTEpnQkRaaVVVNnNqQ0d6
Ckk5QzV5dXZnSHc0bXlISnNoVjFaNDQxeDl6RDN2OGZvVTRuRldtbkhGa3h4TG9zaDNi
Zk5mM09ObVB5dkV0amgKMEhWQU5ydUozVXg4YzZtNmdRQjlpMGk4UkVJcUs2RWFwOXJz
bDkwN3ZSTityTFZmWGFuSU9BQzU5RUV4WnpiMwplYWF4S0YwM1czcUJFZUlyUEUxT3hQ
eUFpSi9Ic29nRU1JYVo4SlJjaCtmSGJWeGFXcmxwSnlGNExGdWROYituCnEzdGx3QUVO
NkV3Wk02VFkwSUlXdzg4aElYdEtZdXlCWldLcHloWjkxcUJoUDZWKzhaMHFMallGbWtV
U29PQ2UKajBVeTBGNVMwMWQzbVJGR1YvZzBpakR2dmoyMm9acXM0dzQvei9vREN0YWtx
Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
</data>
<key>SystemBUID</key>
<string>A805572C-254B-4E89-8834-69AC330F8C0F</string>
<key>HostID</key>
<string>B8908445-96B8-A598-2E42-37EE5108C1FC</string>
<key>EscrowBag</key>
<data>
dBHuB7agDgAU1p2P7o2d/XQw2stjvTNo4Q2oXTHRVp8=
</data>
<key>WiFiMACAddress</key>
<string>c4:c1:7d:ab:e1:9b</string>
<key>UDID</key>
<string>00008130-0011356808A1401C</string>
</dict>
</plist>

1094
StikJIT/idevice/plist.h Normal file

File diff suppressed because it is too large Load diff