tpm-tools-1.3.9.2/0000775000175000017510000000000013750245421013102 5ustar deboradeboratpm-tools-1.3.9.2/Makefile.am0000664000175000017510000000214113735320450015133 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # SUBDIRS = m4 \ include \ lib \ src \ po \ man ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = LICENSE test/tpm_changeownerauth01.sh tpm-tools-1.3.9.2/lib/0000775000175000017510000000000013736475721013664 5ustar deboradeboratpm-tools-1.3.9.2/lib/Makefile.am0000664000175000017510000000607213735320450015710 0ustar deboradebora# Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005, 2006 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # Gettext support localedir = $(datadir)/locale # Libraries to build lib_LTLIBRARIES = libtpm_unseal.la noinst_LTLIBRARIES = libtpm_tspi.la \ libtpm_utils.la # # Common build flags (with gettext support) AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX -DLOCALEDIR=\"$(localedir)\" if TSS_LIB_IS_12 AM_CPPFLAGS += -DTSS_LIB_IS_12 endif # # Utility library libtpm_utils_la_SOURCES = tpm_utils.c \ tpm_log.c # # TSPI interface library libtpm_tspi_la_SOURCES = tpm_tspi.c libtpm_tspi_la_LIBADD = libtpm_utils.la -ldl @INTLLIBS@ # # PKCS#11 interface library if P11_SUPPORT noinst_LTLIBRARIES += libtpm_pkcs11.la libtpm_pkcs11_la_SOURCES= tpm_pkcs11.c libtpm_pkcs11_la_LIBADD = libtpm_utils.la @INTLLIBS@ endif # # Installed Libraries # # Libtool -version-info flag usage rules # This flag accepts an argument of the form current[:revision[:age]]. # So, passing -version-info 3:12:1 sets current to 3, revision to 12, and age to 1. # If either revision or age are omitted, they default to 0. Also note that age must # be less than or equal to the current interface number. # Here are a set of rules to help you update your library version information: # 1. Start with version information of 0:0:0 for each libtool library. # 2. Update the version information only immediately before a public release of your # software. More frequent updates are unnecessary, and only guarantee that the # current interface number gets larger faster. # 3. If the library source code has changed at all since the last update, then # increment revision (c:r:a becomes c:r+1:a). # 4. If any interfaces have been added, removed, or changed since the last update, # increment current, and set revision to 0. # 5. If any interfaces have been added since the last public release, then increment age. # 6. If any interfaces have been removed since the last public release, then set age to 0. # # Unseal library - for addition to existing apps, counter part of seal cmd libtpm_unseal_la_SOURCES = tpm_unseal.c libtpm_unseal_la_LDFLAGS = -shared -version-info 1:0:0 libtpm_unseal_la_LIBADD = -ltspi libtpm_tspi.la -lcrypto @INTLLIBS@ tpm-tools-1.3.9.2/lib/tpm_tspi.c0000664000175000017510000004050613735320450015657 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" TSS_UUID SRK_UUID = TSS_UUID_SRK; extern TSS_HCONTEXT hContext; const char *mapUnknown = "Unknown"; const char *usageSigning = "Signing"; const char *usageStorage = "Storage"; const char *usageIdentity = "Identity"; const char *usageAuthChange = "AuthChange"; const char *usageBind = "Bind"; const char *usageLegacy = "Legacy"; const int flagMax = 7; const char *flagMap[] = { "!VOLATILE, !MIGRATABLE, !REDIRECTION", "!VOLATILE, !MIGRATABLE, REDIRECTION", "!VOLATILE, MIGRATABLE, !REDIRECTION", "!VOLATILE, MIGRATABLE, REDIRECTION", " VOLATILE, !MIGRATABLE, !REDIRECTION", " VOLATILE, !MIGRATABLE, REDIRECTION", " VOLATILE, MIGRATABLE, !REDIRECTION", " VOLATILE, MIGRATABLE, REDIRECTION", }; const char *authUsageNever = "Never"; const char *authUsageAlways = "Always"; const char *algRsa = "RSA"; const char *algDes = "DES"; const char *alg3Des = "3DES"; const char *algSha = "SHA"; const char *algHmac = "HMAC"; const char *algAes = "AES"; const char *encNone = "None"; const char *encRsaPkcs15 = "RSAESPKCSv15"; const char *encRsaOaepSha1Mgf1 = "RSAESOAEP_SHA1_MGF1"; const char *sigNone = "None"; const char *sigRsaPkcs15Sha1 = "RSASSAPKCS1v15_SHA1"; const char *sigRsaPkcs15Der = "RSASSAPKCS1v15_DER"; const char *displayKeyUsageMap(UINT32 a_uiData) { switch (a_uiData) { case TSS_KEYUSAGE_SIGN: return usageSigning; case TSS_KEYUSAGE_STORAGE: return usageStorage; case TSS_KEYUSAGE_IDENTITY: return usageIdentity; case TSS_KEYUSAGE_AUTHCHANGE: return usageAuthChange; case TSS_KEYUSAGE_BIND: return usageBind; case TSS_KEYUSAGE_LEGACY: return usageLegacy; } return mapUnknown; } const char *displayKeyFlagsMap(UINT32 a_uiFlags) { int iPos = a_uiFlags & flagMax; return flagMap[iPos]; } const char *displayAuthUsageMap(UINT32 a_uiData) { switch (a_uiData) { case TPM_AUTH_NEVER: return authUsageNever; case TPM_AUTH_ALWAYS: return authUsageAlways; } return mapUnknown; } const char *displayAlgorithmMap(UINT32 a_uiData) { switch (a_uiData) { case TSS_ALG_RSA: return algRsa; case TSS_ALG_DES: return algDes; case TSS_ALG_3DES: return alg3Des; case TSS_ALG_SHA: return algSha; case TSS_ALG_HMAC: return algHmac; case TSS_ALG_AES: return algAes; } return mapUnknown; } const char *displayEncSchemeMap(UINT32 a_uiData) { switch (a_uiData) { case TSS_ES_NONE: return encNone; case TSS_ES_RSAESPKCSV15: return encRsaPkcs15; case TSS_ES_RSAESOAEP_SHA1_MGF1: return encRsaOaepSha1Mgf1; } return mapUnknown; } const char *displaySigSchemeMap(UINT32 a_uiData) { switch (a_uiData) { case TSS_SS_NONE: return sigNone; case TSS_SS_RSASSAPKCS1V15_SHA1: return sigRsaPkcs15Sha1; case TSS_SS_RSASSAPKCS1V15_DER: return sigRsaPkcs15Der; } return mapUnknown; } TSS_RESULT displayKey(TSS_HKEY a_hKey) { TSS_RESULT result; UINT32 uiAttr, uiAttrSize; BYTE *pAttr; UINT32 uiAlg; result = getAttribData(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_VERSION, &uiAttrSize, &pAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Version: ")); logHex(uiAttrSize, pAttr); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_USAGE, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Usage: 0x%04x (%s)\n"), uiAttr, displayKeyUsageMap(uiAttr)); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_KEYFLAGS, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Flags: 0x%08x (%s)\n"), uiAttr, displayKeyFlagsMap(uiAttr)); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_AUTHUSAGE, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" AuthUsage: 0x%02x (%s)\n"), uiAttr, displayAuthUsageMap(uiAttr)); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_ALGORITHM, &uiAlg); if (result != TSS_SUCCESS) return result; logMsg(_(" Algorithm: 0x%08x (%s)\n"), uiAlg, displayAlgorithmMap(uiAlg)); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_ENCSCHEME, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Encryption Scheme: 0x%08x (%s)\n"), uiAttr, displayEncSchemeMap(uiAttr)); result = getAttribUint32(a_hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_SIGSCHEME, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Signature Scheme: 0x%08x (%s)\n"), uiAttr, displaySigSchemeMap(uiAttr)); if (uiAlg == TSS_ALG_RSA) { result = getAttribUint32(a_hKey, TSS_TSPATTRIB_RSAKEY_INFO, TSS_TSPATTRIB_KEYINFO_RSA_KEYSIZE, &uiAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Key Size: %d bits\n"), uiAttr); } result = getAttribData(a_hKey, TSS_TSPATTRIB_RSAKEY_INFO, TSS_TSPATTRIB_KEYINFO_RSA_MODULUS, &uiAttrSize, &pAttr); if (result != TSS_SUCCESS) return result; logMsg(_(" Public Key:")); logHex(uiAttrSize, pAttr); return result; } /* * Not always reliable as this depends on the TSS system.data being intact */ BOOL isTpmOwned(TSS_HCONTEXT hContext) { TSS_HKEY hSrk; BOOL iRc = FALSE; if (keyGetKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSrk) != TSS_SUCCESS) goto out; iRc = TRUE; out: return iRc; } void tspiDebug(const char *a_szName, TSS_RESULT a_iResult) { logDebug(_("%s success\n"), a_szName); } void tspiError(const char *a_szName, TSS_RESULT a_iResult) { logError(_("%s failed: 0x%08x - layer=%s, code=%04x (%d), %s\n"), a_szName, a_iResult, Trspi_Error_Layer(a_iResult), Trspi_Error_Code(a_iResult), Trspi_Error_Code(a_iResult), Trspi_Error_String(a_iResult)); } void tspiResult(const char *a_szName, TSS_RESULT a_tResult) { if (a_tResult == TSS_SUCCESS) tspiDebug(a_szName, a_tResult); else tspiError(a_szName, a_tResult); } BOOL mapTssBool(TSS_BOOL a_bValue) { BOOL bRc; bRc = a_bValue ? TRUE : FALSE; return bRc; } TSS_RESULT contextCreate(TSS_HCONTEXT * a_hContext) { TSS_RESULT result = Tspi_Context_Create(a_hContext); tspiResult("Tspi_Context_Create", result); return result; } TSS_RESULT contextClose(TSS_HCONTEXT a_hContext) { TSS_RESULT result = Tspi_Context_FreeMemory(a_hContext, NULL); tspiResult("Tspi_Context_FreeMemory", result); result = Tspi_Context_Close(a_hContext); tspiResult("Tspi_Context_Close", result); return result; } TSS_RESULT contextConnect(TSS_HCONTEXT a_hContext) { TSS_RESULT result = Tspi_Context_Connect(a_hContext, NULL); tspiResult("Tspi_Context_Connect", result); return result; } TSS_RESULT contextCreateObject(TSS_HCONTEXT a_hContext, TSS_FLAG a_fType, TSS_FLAG a_fAttrs, TSS_HOBJECT * a_hObject) { TSS_RESULT result = Tspi_Context_CreateObject(a_hContext, a_fType, a_fAttrs, a_hObject); tspiResult("Tspi_Context_CreateObject", result); return result; } TSS_RESULT contextCloseObject(TSS_HCONTEXT a_hContext, TSS_HOBJECT a_hObject) { TSS_RESULT result = Tspi_Context_CloseObject(a_hContext, a_hObject); tspiResult("Tspi_Context_CloseObject", result); return result; } TSS_RESULT contextGetTpm(TSS_HCONTEXT a_hContext, TSS_HTPM * a_hTpm) { TSS_RESULT result = Tspi_Context_GetTpmObject(a_hContext, a_hTpm); tspiResult("Tspi_Context_GetTpmObject", result); return result; } TSS_RESULT policyGet(TSS_HOBJECT a_hObject, TSS_HPOLICY * a_hPolicy) { TSS_RESULT result = Tspi_GetPolicyObject(a_hObject, TSS_POLICY_USAGE, a_hPolicy); tspiResult("Tspi_GetPolicyObject", result); return result; } TSS_RESULT policyAssign(TSS_HPOLICY a_hPolicy, TSS_HOBJECT a_hObject) { TSS_RESULT result = Tspi_Policy_AssignToObject(a_hPolicy, a_hObject); tspiResult("Tspi_Policy_AssignToObject", result); return result; } TSS_RESULT policySetSecret(TSS_HPOLICY a_hPolicy, UINT32 a_uiSecretLen, BYTE * a_chSecret) { TSS_RESULT result; BYTE wellKnown[] = TSS_WELL_KNOWN_SECRET; //If secret is TSS_WELL_KNOWN_SECRET, change secret mode to TSS_SECRET_MODE_SHA1 if (a_chSecret && a_uiSecretLen == sizeof(wellKnown) && !memcmp(a_chSecret, (BYTE *)wellKnown, sizeof(wellKnown))) result = Tspi_Policy_SetSecret(a_hPolicy, TSS_SECRET_MODE_SHA1, a_uiSecretLen, a_chSecret); else result = Tspi_Policy_SetSecret(a_hPolicy, TSS_SECRET_MODE_PLAIN, a_uiSecretLen, a_chSecret); tspiResult("Tspi_Policy_SetSecret", result); return result; } TSS_RESULT policyFlushSecret(TSS_HPOLICY a_hPolicy) { TSS_RESULT result = Tspi_Policy_FlushSecret(a_hPolicy); tspiResult("Tspi_Policy_FlushSecret", result); return result; } TSS_RESULT tpmGetPubEk(TSS_HTPM a_hTpm, TSS_BOOL a_fOwner, TSS_VALIDATION * a_pValData, TSS_HKEY * a_phEPubKey) { TSS_RESULT result = Tspi_TPM_GetPubEndorsementKey(a_hTpm, a_fOwner, a_pValData, a_phEPubKey); tspiResult("Tspi_TPM_GetPubEndorsementKey", result); return result; } TSS_RESULT tpmSetStatus(TSS_HTPM a_hTpm, TSS_FLAG a_fStatus, TSS_BOOL a_bValue) { TSS_RESULT result = Tspi_TPM_SetStatus(a_hTpm, a_fStatus, a_bValue); tspiResult("Tspi_TPM_SetStatus", result); return result; } TSS_RESULT tpmGetStatus(TSS_HTPM a_hTpm, TSS_FLAG a_fStatus, TSS_BOOL * a_bValue) { TSS_RESULT result = Tspi_TPM_GetStatus(a_hTpm, a_fStatus, a_bValue); tspiResult("Tspi_TPM_GetStatus", result); return result; } TSS_RESULT tpmGetRandom(TSS_HTPM a_hTpm, UINT32 a_length, BYTE ** a_data) { TSS_RESULT result = Tspi_TPM_GetRandom(a_hTpm, a_length, a_data); tspiResult("Tspi_TPM_GetRandom", result); return result; } TSS_RESULT keyLoadKey(TSS_HKEY a_hKey, TSS_HKEY a_hWrapKey) { TSS_RESULT result = Tspi_Key_LoadKey(a_hKey, a_hWrapKey); tspiResult("Tspi_Key_LoadKey", result); return result; } TSS_RESULT keyLoadKeyByUUID(TSS_HCONTEXT a_hContext, TSS_FLAG a_fStoreType, TSS_UUID a_uKeyId, TSS_HKEY * a_hKey) { TSS_RESULT result = Tspi_Context_LoadKeyByUUID(a_hContext, a_fStoreType, a_uKeyId, a_hKey); tspiResult("Tspi_Context_LoadKeyByUUID", result); return result; } TSS_RESULT keyGetPubKey(TSS_HKEY a_hKey, UINT32 * a_uiKeyLen, BYTE ** a_pKey) { TSS_RESULT result = Tspi_Key_GetPubKey(a_hKey, a_uiKeyLen, a_pKey); tspiResult("Tspi_Key_GetPubKey", result); return result; } TSS_RESULT keyGetKeyByUUID(TSS_HCONTEXT a_hContext, TSS_FLAG a_fStoreType, TSS_UUID a_uKeyId, TSS_HKEY * a_hKey) { TSS_RESULT result = Tspi_Context_GetKeyByUUID(a_hContext, a_fStoreType, a_uKeyId, a_hKey); tspiResult("Tspi_Context_GetKeyByUUID", result); return result; } TSS_RESULT getAttribData(TSS_HOBJECT a_hObject, TSS_FLAG a_fAttr, TSS_FLAG a_fSubAttr, UINT32 * a_uiSize, BYTE ** a_pData) { TSS_RESULT result = Tspi_GetAttribData(a_hObject, a_fAttr, a_fSubAttr, a_uiSize, a_pData); tspiResult("Tspi_GetAttribData", result); return result; } TSS_RESULT getAttribUint32(TSS_HOBJECT a_hObject, TSS_FLAG a_fAttr, TSS_FLAG a_fSubAttr, UINT32 * a_uiData) { TSS_RESULT result = Tspi_GetAttribUint32(a_hObject, a_fAttr, a_fSubAttr, a_uiData); tspiResult("Tspi_GetAttribUint32", result); return result; } TSS_RESULT getCapability(TSS_HTPM a_hTpm, TSS_FLAG a_fCapArea, UINT32 a_uiSubCapLen, BYTE * a_pSubCap, UINT32 * a_uiResultLen, BYTE ** a_pResult) { TSS_RESULT result = Tspi_TPM_GetCapability(a_hTpm, a_fCapArea, a_uiSubCapLen, a_pSubCap, a_uiResultLen, a_pResult); tspiResult("Tspi_TPM_GetCapability", result); return result; } TSS_RESULT keyCreateKey(TSS_HKEY a_hKey, TSS_HKEY a_hWrapKey, TSS_HPCRS a_hPcrs) { TSS_RESULT result = Tspi_Key_CreateKey(a_hKey, a_hWrapKey, a_hPcrs); tspiResult("Tspi_Key_CreateKey", result); return result; } TSS_RESULT dataSeal(TSS_HENCDATA a_hEncdata, TSS_HKEY a_hKey, UINT32 a_len, BYTE * a_data, TSS_HPCRS a_hPcrs) { TSS_RESULT result = Tspi_Data_Seal(a_hEncdata, a_hKey, a_len, a_data, a_hPcrs); tspiResult("Tspi_Data_Seal", result); return result; } TSS_RESULT tpmPcrRead(TSS_HTPM a_hTpm, UINT32 a_Idx, UINT32 *a_PcrSize, BYTE **a_PcrValue) { TSS_RESULT result = Tspi_TPM_PcrRead(a_hTpm, a_Idx, a_PcrSize, a_PcrValue); tspiResult("Tspi_TPM_PcrRead", result); return result; } TSS_RESULT pcrcompositeSetPcrValue(TSS_HPCRS a_hPcrs, UINT32 a_Idx, UINT32 a_PcrSize, BYTE *a_PcrValue) { TSS_RESULT result = Tspi_PcrComposite_SetPcrValue(a_hPcrs, a_Idx, a_PcrSize, a_PcrValue); tspiResult("Tspi_PcrComposite_SetPcrValue", result); return result; } #ifdef TSS_LIB_IS_12 /* * These getPasswd functions will wrap calls to the other functions and check to see if the TSS * library's context tells us to remove the NULL terminating chars from the end of the password * when unicode is on. */ char * getPasswd12(const char *a_pszPrompt, int* a_iLen, BOOL a_bConfirm) { return _getPasswd12( a_pszPrompt, a_iLen, a_bConfirm, useUnicode); } char *_getPasswd12(const char *a_pszPrompt, int* a_iLen, BOOL a_bConfirm, BOOL a_bUseUnicode) { UINT32 status; char *passwd; passwd = _getPasswd(a_pszPrompt, a_iLen, a_bConfirm, a_bUseUnicode); if (passwd && a_bUseUnicode) { /* If we're running against a 1.2 TSS, it will include the null terminating * characters based on the TSS_TSPATTRIB_SECRET_HASH_MODE attribute of the * context. If this is set to TSS_TSPATTRIB_HASH_MODE_NOT_NULL, we need to * trim the two zeros off the end of the unicode string returned by * Trspi_Native_To_UNICODE. */ if (getAttribUint32(hContext, TSS_TSPATTRIB_SECRET_HASH_MODE, TSS_TSPATTRIB_SECRET_HASH_MODE_POPUP, &status)) goto out; if (status == TSS_TSPATTRIB_HASH_MODE_NOT_NULL) *a_iLen -= sizeof(TSS_UNICODE); } out: return passwd; } TSS_RESULT unloadVersionInfo(UINT64 *offset, BYTE *blob, TPM_CAP_VERSION_INFO *v) { TSS_RESULT result = Trspi_UnloadBlob_CAP_VERSION_INFO(offset, blob, v); tspiResult("Trspi_UnloadBlob_CAP_VERSION_INFO", result); return result; } TSS_RESULT pcrcompositeSetPcrLocality(TSS_HPCRS a_hPcrs, UINT32 localityValue) { TSS_RESULT result = Tspi_PcrComposite_SetPcrLocality(a_hPcrs, localityValue); tspiResult("Tspi_PcrComposite_SetPcrLocality", result); return result; } TSS_RESULT NVDefineSpace(TSS_HNVSTORE hNVStore, TSS_HPCRS hReadPcrComposite , TSS_HPCRS hWritePcrComposite) { TSS_RESULT result = Tspi_NV_DefineSpace(hNVStore, hReadPcrComposite, hWritePcrComposite); tspiResult("Tspi_NV_DefineSpace", result); return result; } TSS_RESULT NVReleaseSpace(TSS_HNVSTORE hNVStore) { TSS_RESULT result = Tspi_NV_ReleaseSpace(hNVStore); tspiResult("Tspi_NV_ReleaseSpace", result); return result; } TSS_RESULT NVWriteValue(TSS_HNVSTORE hNVStore, UINT32 offset, UINT32 ulDataLength, BYTE *rgbDataToWrite) { TSS_RESULT result = Tspi_NV_WriteValue(hNVStore, offset, ulDataLength, rgbDataToWrite); tspiResult("Tspi_NV_WriteValue", result); return result; } TSS_RESULT NVReadValue(TSS_HNVSTORE hNVStore, UINT32 offset, UINT32 *ulDataLength, BYTE **rgbDataRead) { TSS_RESULT result = Tspi_NV_ReadValue(hNVStore, offset, ulDataLength, rgbDataRead); tspiResult("Tspi_NV_ReadValue", result); return result; } TSS_RESULT unloadNVDataPublic(UINT64 *offset, BYTE *blob, UINT32 blob_len, TPM_NV_DATA_PUBLIC *v) { UINT64 off = *offset; TSS_RESULT result; result = Trspi_UnloadBlob_NV_DATA_PUBLIC(&off, blob, NULL); if (result == TSS_SUCCESS) { if (off > blob_len) return TSS_E_BAD_PARAMETER; result = Trspi_UnloadBlob_NV_DATA_PUBLIC(offset, blob, v); } tspiResult("Trspi_UnloadBlob_NV_DATA_PUBLIC", result); return result; } #endif tpm-tools-1.3.9.2/lib/tpm_unseal.c0000664000175000017510000003031613735320450016165 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_seal.h" #include "tpm_unseal.h" #include #include #include #include #include #include #include #include #include enum tspi_errors { ETSPICTXCREAT = 0, ETSPICTXCNCT, ETSPICTXCO, ETSPICTXLKBU, ETSPICTXLKBB, ETSPISETAD, ETSPIGETPO, ETSPIPOLSS, ETSPIDATU, ETSPIPOLATO, }; TSS_HCONTEXT hContext = 0; #define TSPI_FUNCTION_NAME_MAX 30 char tspi_error_strings[][TSPI_FUNCTION_NAME_MAX]= { "Tspi_Context_Create", "Tspi_Context_Connect", "Tspi_Context_CreateObject", "Tspi_Context_LoadKeyByUUID", "Tspi_Context_LoadKeyByBlob", "Tspi_SetAttribData", "Tspi_GetPolicyObject", "Tspi_Policy_SetSecret", "Tspi_Data_Unseal", "Tspi_Policy_AssignToObject", }; #define TSSKEY_DEFAULT_SIZE 768 #define EVPKEY_DEFAULT_SIZE 512 int tpm_errno; int tpmUnsealFile( char* fname, unsigned char** tss_data, int* tss_size, BOOL srkWellKnown ) { int rc, rcLen=0, tssLen=0, evpLen=0; BYTE* rcPtr; char data[EVP_CIPHER_block_size(EVP_aes_256_cbc()) * 16]; BYTE *tssKeyData = NULL; int tssKeyDataSize = 0; BYTE *evpKeyData = NULL; int evpKeyDataSize = 0; struct stat stats; TSS_HENCDATA hEncdata; TSS_HKEY hSrk, hKey; TSS_HPOLICY hPolicy; UINT32 symKeyLen; BYTE *symKey; BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; char *srkSecret = NULL; int srkSecretLen; unsigned char* res_data = NULL; int res_size = 0; BIO *bdata = NULL, *b64 = NULL, *bmem = NULL; int bioRc; if ( tss_data == NULL || tss_size == NULL ) { rc = TPMSEAL_STD_ERROR; tpm_errno = EINVAL; goto out; } *tss_data = NULL; *tss_size = 0; /* Test for file existence */ if ((rc = stat(fname, &stats))) { tpm_errno = errno; goto out; } /* Create an input file BIO */ if((bdata = BIO_new_file(fname, "r")) == NULL ) { tpm_errno = errno; rc = TPMSEAL_STD_ERROR; goto out; } /* Test file header for TSS */ BIO_gets(bdata, data, sizeof(data)); if (strncmp(data, TPMSEAL_HDR_STRING, strlen(TPMSEAL_HDR_STRING)) != 0) { rc = TPMSEAL_FILE_ERROR; tpm_errno = ENOTSSHDR; goto out; } /* Looking for TSS Key Header */ BIO_gets(bdata, data, sizeof(data)); if (strncmp(data, TPMSEAL_TSS_STRING, strlen(TPMSEAL_TSS_STRING)) != 0) { rc = TPMSEAL_FILE_ERROR; tpm_errno = EWRONGTSSTAG; goto out; } /* Create a memory BIO to hold the base64 TSS key */ if ((bmem = BIO_new(BIO_s_mem())) == NULL) { tpm_errno = EAGAIN; rc = TPMSEAL_STD_ERROR; goto out; } BIO_set_mem_eof_return(bmem, 0); /* Read the base64 TSS key into the memory BIO */ while ((rcLen = BIO_gets(bdata, data, sizeof(data))) > 0) { /* Look for EVP Key Header (end of key) */ if (strncmp(data, TPMSEAL_EVP_STRING, strlen(TPMSEAL_EVP_STRING)) == 0) break; if (BIO_write(bmem, data, rcLen) <= 0) { tpm_errno = EIO; rc = TPMSEAL_STD_ERROR; goto out; } } if (strncmp(data, TPMSEAL_EVP_STRING, strlen(TPMSEAL_EVP_STRING)) != 0 ) { tpm_errno = EWRONGEVPTAG; rc = TPMSEAL_FILE_ERROR; goto out; } /* Create a base64 BIO to decode the TSS key */ if ((b64 = BIO_new(BIO_f_base64())) == NULL) { tpm_errno = EAGAIN; rc = TPMSEAL_STD_ERROR; goto out; } /* Decode the TSS key */ bmem = BIO_push( b64, bmem ); while ((rcLen = BIO_read(bmem, data, sizeof(data))) > 0) { if ((tssLen + rcLen) > tssKeyDataSize) { tssKeyDataSize += TSSKEY_DEFAULT_SIZE; rcPtr = realloc( tssKeyData, tssKeyDataSize); if ( rcPtr == NULL ) { tpm_errno = ENOMEM; rc = TPMSEAL_STD_ERROR; goto out; } tssKeyData = rcPtr; } memcpy(tssKeyData + tssLen, data, rcLen); tssLen += rcLen; } bmem = BIO_pop(b64); BIO_free(b64); b64 = NULL; bioRc = BIO_reset(bmem); if (bioRc != 1) { tpm_errno = EIO; rc = TPMSEAL_STD_ERROR; goto out; } /* Check for EVP Key Type Header */ BIO_gets(bdata, data, sizeof(data)); if (strncmp(data, TPMSEAL_KEYTYPE_SYM, strlen(TPMSEAL_KEYTYPE_SYM)) != 0 ) { rc = TPMSEAL_FILE_ERROR; tpm_errno = EWRONGKEYTYPE; goto out; } /* Make sure it's a supported cipher (currently only AES 256 CBC) */ if (strncmp(data + strlen(TPMSEAL_KEYTYPE_SYM), TPMSEAL_CIPHER_AES256CBC, strlen(TPMSEAL_CIPHER_AES256CBC)) != 0) { rc = TPMSEAL_FILE_ERROR; tpm_errno = EWRONGKEYTYPE; goto out; } /* Read the base64 Symmetric key into the memory BIO */ while ((rcLen = BIO_gets(bdata, data, sizeof(data))) > 0) { /* Look for Encrypted Data Header (end of key) */ if (strncmp(data, TPMSEAL_ENC_STRING, strlen(TPMSEAL_ENC_STRING)) == 0) break; if (BIO_write(bmem, data, rcLen) <= 0) { tpm_errno = EIO; rc = TPMSEAL_STD_ERROR; goto out; } } if (strncmp(data, TPMSEAL_ENC_STRING, strlen(TPMSEAL_ENC_STRING)) != 0 ) { tpm_errno = EWRONGDATTAG; rc = TPMSEAL_FILE_ERROR; goto out; } /* Create a base64 BIO to decode the Symmetric key */ if ((b64 = BIO_new(BIO_f_base64())) == NULL) { tpm_errno = EAGAIN; rc = TPMSEAL_STD_ERROR; goto out; } /* Decode the Symmetric key */ bmem = BIO_push( b64, bmem ); while ((rcLen = BIO_read(bmem, data, sizeof(data))) > 0) { if ((evpLen + rcLen) > evpKeyDataSize) { evpKeyDataSize += EVPKEY_DEFAULT_SIZE; rcPtr = realloc( evpKeyData, evpKeyDataSize); if ( rcPtr == NULL ) { tpm_errno = ENOMEM; rc = TPMSEAL_STD_ERROR; goto out; } evpKeyData = rcPtr; } memcpy(evpKeyData + evpLen, data, rcLen); evpLen += rcLen; } bmem = BIO_pop(b64); BIO_free(b64); b64 = NULL; bioRc = BIO_reset(bmem); if (bioRc != 1) { tpm_errno = EIO; rc = TPMSEAL_STD_ERROR; goto out; } /* Read the base64 encrypted data into the memory BIO */ while ((rcLen = BIO_gets(bdata, data, sizeof(data))) > 0) { /* Look for TSS Footer (end of data) */ if (strncmp(data, TPMSEAL_FTR_STRING, strlen(TPMSEAL_FTR_STRING)) == 0) break; if (BIO_write(bmem, data, rcLen) <= 0) { tpm_errno = EIO; rc = TPMSEAL_STD_ERROR; goto out; } } if (strncmp(data, TPMSEAL_FTR_STRING, strlen(TPMSEAL_FTR_STRING)) != 0 ) { tpm_errno = ENOTSSFTR; rc = TPMSEAL_FILE_ERROR; goto out; } /* Unseal */ if ((rc=Tspi_Context_Create(&hContext)) != TSS_SUCCESS) { tpm_errno = ETSPICTXCREAT; goto out; } if (!srkWellKnown) { /* Prompt for SRK password */ srkSecret = GETPASSWD(_("Enter SRK password: "), &srkSecretLen, FALSE); if (!srkSecret) goto out; } if ((rc=Tspi_Context_Connect(hContext, NULL)) != TSS_SUCCESS) { tpm_errno = ETSPICTXCNCT; goto tss_out; } if ((rc=Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_ENCDATA, TSS_ENCDATA_SEAL, &hEncdata)) != TSS_SUCCESS) { tpm_errno = ETSPICTXCO; goto tss_out; } if ((rc=Tspi_SetAttribData(hEncdata, TSS_TSPATTRIB_ENCDATA_BLOB, TSS_TSPATTRIB_ENCDATABLOB_BLOB, evpLen, evpKeyData)) != TSS_SUCCESS) { tpm_errno = ETSPISETAD; goto tss_out; } if ((rc=Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hPolicy)) != TSS_SUCCESS) { tpm_errno = ETSPICTXCO; goto tss_out; } if ((rc=Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_PLAIN, strlen(TPMSEAL_SECRET), (BYTE *)TPMSEAL_SECRET)) != TSS_SUCCESS) { tpm_errno = ETSPIPOLSS; goto tss_out; } if ((rc=Tspi_Policy_AssignToObject(hPolicy, hEncdata)) != TSS_SUCCESS) { tpm_errno = ETSPIPOLATO; goto tss_out; } if ((rc=Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSrk)) != TSS_SUCCESS) { tpm_errno = ETSPICTXLKBU; goto tss_out; } /* Don't create a new policy for the SRK's secret, just use the context's * default policy */ if ((rc=Tspi_GetPolicyObject(hSrk, TSS_POLICY_USAGE, &hPolicy)) != TSS_SUCCESS){ tpm_errno = ETSPIGETPO; goto tss_out; } if (srkWellKnown) rc = Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_SHA1, sizeof(wellKnown), (BYTE *) wellKnown); else rc = Tspi_Policy_SetSecret(hPolicy,TSS_SECRET_MODE_PLAIN, srkSecretLen, (BYTE *) srkSecret); if (rc != TSS_SUCCESS) { tpm_errno = ETSPIPOLSS; goto tss_out; } /* Failure point if trying to unseal data on a differnt TPM */ if ((rc=Tspi_Context_LoadKeyByBlob(hContext, hSrk, tssLen, tssKeyData, &hKey)) != TSS_SUCCESS) { tpm_errno = ETSPICTXLKBB; goto tss_out; } if ((rc=Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hPolicy)) != TSS_SUCCESS) { tpm_errno = ETSPICTXCO; goto tss_out; } if ((rc=Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_PLAIN, strlen(TPMSEAL_SECRET), (BYTE *)TPMSEAL_SECRET)) != TSS_SUCCESS) { tpm_errno = ETSPIPOLSS; goto tss_out; } if ((rc=Tspi_Policy_AssignToObject(hPolicy, hKey)) != TSS_SUCCESS) { tpm_errno = ETSPIPOLATO; goto tss_out; } if ((rc=Tspi_Data_Unseal(hEncdata, hKey, &symKeyLen, &symKey)) != TSS_SUCCESS) { tpm_errno = ETSPIDATU; goto tss_out; } /* Malloc a block of storage to hold the decrypted data Using the size of the mem BIO is more than enough (plus an extra cipher block size) */ res_data = malloc(BIO_pending(bmem) + EVP_CIPHER_block_size(EVP_aes_256_cbc())); if ( res_data == NULL ) { rc = TPMSEAL_STD_ERROR; tpm_errno = ENOMEM; goto tss_out; } /* Decode and decrypt the encrypted data */ EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit(ctx, EVP_aes_256_cbc(), symKey, (unsigned char *)TPMSEAL_IV); /* Create a base64 BIO to decode the encrypted data */ if ((b64 = BIO_new(BIO_f_base64())) == NULL) { tpm_errno = EAGAIN; rc = TPMSEAL_STD_ERROR; goto tss_out; } bmem = BIO_push( b64, bmem ); while ((rcLen = BIO_read(bmem, data, sizeof(data))) > 0) { EVP_DecryptUpdate(ctx, res_data+res_size, &rcLen, (unsigned char *)data, rcLen); res_size += rcLen; } EVP_DecryptFinal(ctx, res_data+res_size, &rcLen); res_size += rcLen; bmem = BIO_pop(b64); BIO_free(b64); b64 = NULL; /* a BIO_reset failure shouldn't have an affect at this point */ BIO_reset(bmem); tss_out: Tspi_Context_Close(hContext); out: if (srkSecret) shredPasswd(srkSecret); if ( bdata ) BIO_free(bdata); if ( b64 ) BIO_free(b64); if ( bmem ) { BIO_set_close(bmem, BIO_CLOSE); BIO_free(bmem); } if ( evpKeyData ) free(evpKeyData); if ( tssKeyData ) free(tssKeyData); if ( rc == 0 ) { *tss_data = res_data; *tss_size = res_size; } else free(res_data); return rc; } void tpmUnsealShred(unsigned char* data, int size) { if ( data != NULL ) { __memset( data, 0, size); free(data); } } char tpm_error_buf[512]; char * tpmUnsealStrerror(int rc) { switch(rc) { case 0: return "Success"; case TPMSEAL_STD_ERROR: return strerror(tpm_errno); case TPMSEAL_FILE_ERROR: switch(tpm_errno) { case ENOTSSHDR: return _("No TSS header present"); case ENOTSSFTR: return _("No TSS footer present"); case EWRONGTSSTAG: return _("Wrong TSS tag"); case EWRONGEVPTAG: return _("Wrong EVP tag"); case EWRONGDATTAG: return _("Wrong DATA tag"); case EWRONGKEYTYPE: return _("Not a Symmetric EVP Key"); case EBADSEEK: return _("Unable to move to desired file position"); } default: snprintf(tpm_error_buf, sizeof(tpm_error_buf), "%s: 0x%08x - layer=%s, code=%04x (%d), %s", tspi_error_strings[tpm_errno], rc, Trspi_Error_Layer(rc), Trspi_Error_Code(rc), Trspi_Error_Code(rc), Trspi_Error_String(rc)); return tpm_error_buf; } return ""; } tpm-tools-1.3.9.2/lib/tpm_log.c0000664000175000017510000000744313735320450015464 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_utils.h" int iLogLevel = LOG_LEVEL_ERROR; int logHex(int a_iLen, void *a_pData) { int i, iByte; char *pData = a_pData; for (i = 0; i < a_iLen; i++) { if ((i % 32) == 0) { if (a_iLen > 32) { logMsg("\n\t"); } } else if ((i % 4) == 0) { logMsg(" "); } iByte = pData[i]; iByte &= 0x000000ff; logMsg("%02x", iByte); } logMsg("\n"); return a_iLen; } int logMsg(const char *a_szFormat, ...) { int iCount; va_list vaArgs; va_start(vaArgs, a_szFormat); iCount = logIt(stdout, a_szFormat, vaArgs); va_end(vaArgs); return iCount; } int logDebug(const char *a_szFormat, ...) { int iCount; va_list vaArgs; if (iLogLevel < LOG_LEVEL_DEBUG) return 0; va_start(vaArgs, a_szFormat); iCount = logProcess(stdout, a_szFormat, vaArgs); va_end(vaArgs); return iCount; } int logInfo(const char *a_szFormat, ...) { int iCount; va_list vaArgs; if (iLogLevel < LOG_LEVEL_INFO) return 0; va_start(vaArgs, a_szFormat); iCount = logProcess(stdout, a_szFormat, vaArgs); va_end(vaArgs); return iCount; } int logError(const char *a_szFormat, ...) { int iCount; va_list vaArgs; if (iLogLevel < LOG_LEVEL_ERROR) return 0; va_start(vaArgs, a_szFormat); iCount = logProcess(stderr, a_szFormat, vaArgs); va_end(vaArgs); return iCount; } int logProcess(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs) { return logIt(a_sStream, a_szFormat, a_vaArgs); } int logIt(FILE * a_sStream, const char *a_szFormat, va_list a_vaArgs) { return vfprintf(a_sStream, a_szFormat, a_vaArgs); } void logSuccess(const char *a_cmd) { logInfo(_("%s succeeded\n"), a_cmd); } void logCmdOption(const char *aOption, const char *aDescr) { logMsg("\t%s\n\t\t%s\n", aOption, aDescr); } void logGenericOptions() { char *lOpt = NULL; lOpt = malloc(16+strlen(LOG_NONE)+strlen(LOG_ERROR)+ strlen(LOG_INFO)+strlen(LOG_DEBUG)); if ( lOpt ) sprintf( lOpt, "-l, --log [%s|%s|%s|%s]", LOG_NONE, LOG_ERROR, LOG_INFO, LOG_DEBUG ); logCmdOption("-h, --help", _("Display command usage info.")); logCmdOption("-v, --version", _("Display command version info.")); logCmdOption( lOpt, _("Set logging level.")); free ( lOpt ); } void logUnicodeCmdOption() { logCmdOption("-u, --unicode", _("Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes")); } void logOwnerPassCmdOption() { logCmdOption("-o, --pwdo", _("Owner password")); } void logNVIndexCmdOption() { logCmdOption("-i, --index", _("Index of the NVRAM area")); } void logCmdHelp(const char *aCmd) { logMsg(_("Usage: %s [options]\n"), aCmd); logGenericOptions(); } void logCmdHelpEx(const char *aCmd, char *aArgs[], char *aArgDescs[]) { int i; logMsg(_("Usage: %s [options]"), aCmd); for (i = 0; aArgs[i]; i++) logMsg(" %s", aArgs[i]); logMsg("\n"); for (i = 0; aArgDescs[i]; i++) logMsg("%s\n", aArgDescs[i]); logGenericOptions(); } char *logBool(BOOL aValue) { return aValue ? _("true") : _("false"); } tpm-tools-1.3.9.2/lib/tpm_pkcs11.c0000664000175000017510000010200613735320450015774 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include /* * Global variables */ char * g_pszSoLib = TPM_OPENCRYPTOKI_SO; void * g_pSoLib = NULL; // Handle of libopencryptoki library CK_FUNCTION_LIST_PTR g_pFcnList = NULL; // Function List BOOL g_bInit = FALSE; // Indicates if C_Initialize has been called BOOL g_bTokenOpen = FALSE; // Indicates if the token has been opened CK_SLOT_ID g_tSlotId; // Slot ID of the TPM token CK_TOKEN_INFO g_tToken; // TPM token information void pkcsDebug( const char *a_pszName, CK_RV a_tResult ) { logDebug( _("%s success\n"), a_pszName ); } void pkcsError( const char *a_pszName, CK_RV a_tResult ) { logError( _("%s failed: 0x%08x (%ld)\n"), a_pszName, a_tResult, a_tResult ); } void pkcsResult( const char *a_pszName, CK_RV a_tResult ) { if ( a_tResult == CKR_OK ) pkcsDebug( a_pszName, a_tResult ); else pkcsError( a_pszName, a_tResult ); } void pkcsResultException( const char *a_pszName, CK_RV a_tResult, CK_RV a_tExcept ) { if ( ( a_tResult == CKR_OK ) || ( a_tResult == a_tExcept ) ) pkcsDebug( a_pszName, a_tResult ); else pkcsError( a_pszName, a_tResult ); } /* * pkcsSlotInfo * Display some information about the slot. */ void pkcsSlotInfo(CK_SLOT_INFO *a_ptSlotInfo ) { char szSlotDesc[ sizeof( a_ptSlotInfo->slotDescription ) + 1 ]; char szSlotMfr[ sizeof( a_ptSlotInfo->manufacturerID ) + 1 ]; __memset( szSlotDesc, 0, sizeof( szSlotDesc ) ); __memset( szSlotMfr, 0, sizeof( szSlotMfr ) ); strncpy( szSlotDesc, (char *)a_ptSlotInfo->slotDescription, sizeof( a_ptSlotInfo->slotDescription ) ); strncpy( szSlotMfr, (char *)a_ptSlotInfo->manufacturerID, sizeof( a_ptSlotInfo->manufacturerID ) ); logDebug( _("Slot description: %s\n"), szSlotDesc ); logDebug( _("Slot manufacturer: %s\n"), szSlotMfr ); if ( a_ptSlotInfo->flags & CKF_TOKEN_PRESENT ) logDebug( _("Token is present\n") ); else logDebug( _("Token is not present\n") ); } /* * pkcsTokenInfo * Display some information about the token. */ void pkcsTokenInfo(CK_TOKEN_INFO *a_ptTokenInfo ) { char szTokenLabel[ sizeof( a_ptTokenInfo->label ) + 1 ]; char szTokenMfr[ sizeof( a_ptTokenInfo->manufacturerID ) + 1 ]; char szTokenModel[ sizeof( a_ptTokenInfo->model ) + 1 ]; __memset( szTokenLabel, 0, sizeof( szTokenLabel ) ); __memset( szTokenMfr, 0, sizeof( szTokenMfr ) ); __memset( szTokenModel, 0, sizeof( szTokenModel ) ); strncpy( szTokenLabel, (char *)a_ptTokenInfo->label, sizeof( a_ptTokenInfo->label ) ); strncpy( szTokenMfr, (char *)a_ptTokenInfo->manufacturerID, sizeof( a_ptTokenInfo->manufacturerID ) ); strncpy( szTokenModel, (char *)a_ptTokenInfo->model, sizeof( a_ptTokenInfo->model ) ); logDebug( _("Token Label: %s\n"), szTokenLabel ); logDebug( _("Token manufacturer: %s\n"), szTokenMfr ); logDebug( _("Token model: %s\n"), szTokenModel ); if ( a_ptTokenInfo->flags & CKF_TOKEN_INITIALIZED ) logDebug( _("Token is initialized\n") ); else logDebug( _("Token is not initialized\n") ); } /* * openToken * Iterate through the available slots and tokens looking * for the TPM token and "opening" it if it is found. */ CK_RV openToken( char *a_pszTokenLabel ) { CK_C_GetFunctionList fGetFunctionList; unsigned int i; CK_RV rv; CK_ULONG ulSlots; CK_SLOT_ID *ptSlots = NULL; CK_SLOT_INFO tSlotInfo; CK_TOKEN_INFO tTokenInfo; char szTokenLabel[ sizeof( tTokenInfo.label ) ]; char *pszTokenLabel; // Load the PKCS#11 library g_pSoLib = dlopen( g_pszSoLib, RTLD_NOW ); if ( !g_pSoLib ) { logError( _("The PKCS#11 library cannot be loaded: %s\n"), dlerror( ) ); rv = CKR_GENERAL_ERROR; goto out; } fGetFunctionList = (CK_C_GetFunctionList)dlsym( g_pSoLib, "C_GetFunctionList" ); if ( !fGetFunctionList ) { logError( _("Unable to find the C_GetFunctionList function: %s\n"), dlerror( ) ); rv = CKR_GENERAL_ERROR; goto out; } rv = fGetFunctionList( &g_pFcnList ); pkcsResult( "C_GetFunctionList", rv ); if ( rv != CKR_OK ) goto out; // Set the name of the TPM token __memset( szTokenLabel, ' ', sizeof( szTokenLabel ) ); if ( a_pszTokenLabel ) { if ( strlen( a_pszTokenLabel ) > sizeof( szTokenLabel ) ) { logError( _("The token label cannot be greater than %ld characters\n"), sizeof( szTokenLabel ) ); rv = CKR_GENERAL_ERROR; goto out; } pszTokenLabel = a_pszTokenLabel; } else pszTokenLabel = TPM_TOKEN_LABEL; strncpy( szTokenLabel, pszTokenLabel, strlen( pszTokenLabel ) ); // Initialize the PKCS#11 library rv = g_pFcnList->C_Initialize( NULL ); pkcsResult( "C_Initialize", rv ); if ( rv != CKR_OK ) goto out; g_bInit = TRUE; // Determine the number of slots that are present rv = g_pFcnList->C_GetSlotList( FALSE, NULL, &ulSlots ); pkcsResult( "C_GetSlotList", rv ); if ( rv != CKR_OK ) goto out; if ( ulSlots == 0 ) { logError( _("No PKCS#11 slots present\n") ); rv = CKR_TOKEN_NOT_PRESENT; goto out; } // Allocate a buffer to hold the slot ids logDebug( _("Slots present: %ld\n"), ulSlots ); ptSlots = (CK_SLOT_ID_PTR)calloc( 1, sizeof( CK_SLOT_ID ) * ulSlots ); if ( !ptSlots ) { logError( _("Unable to obtain memory for PKCS#11 slot IDs\n") ); rv = CKR_HOST_MEMORY; goto out; } // Retrieve the list of slot ids that are present rv = g_pFcnList->C_GetSlotList( FALSE, ptSlots, &ulSlots ); pkcsResult( "C_GetSlotList", rv ); if ( rv != CKR_OK ) goto out; // Iterate through the slots looking for the TPM token for ( i = 0; i < ulSlots; i++ ) { // Obtain information about the slot logDebug( _("Retrieving slot information for SlotID %ld\n"), ptSlots[ i ] ); rv = g_pFcnList->C_GetSlotInfo( ptSlots[ i ], &tSlotInfo ); pkcsResult( "C_GetSlotInfo", rv ); if ( rv != CKR_OK ) goto out; pkcsSlotInfo( &tSlotInfo ); if ( tSlotInfo.flags & CKF_TOKEN_PRESENT ) { // The slot token is present, obtain information about the token logDebug( _("Retrieving token information for SlotID %ld\n"), ptSlots[ i ] ); rv = g_pFcnList->C_GetTokenInfo( ptSlots[ i ], &tTokenInfo ); pkcsResult( "C_GetTokenInfo", rv ); if ( rv != CKR_OK ) goto out; pkcsTokenInfo( &tTokenInfo ); // Check for the TPM token if ( !strncmp( (char *)tTokenInfo.label, szTokenLabel, sizeof( szTokenLabel ) ) ) { g_bTokenOpen = TRUE; g_tSlotId = ptSlots[ i ]; g_tToken = tTokenInfo; break; } } } if ( !g_bTokenOpen ) { logError( _("PKCS#11 TPM Token is not present\n") ); rv = CKR_TOKEN_NOT_PRESENT; } out: if (rv != CKR_OK) free(ptSlots); if ( !g_bTokenOpen && g_bInit ) { g_pFcnList->C_Finalize( NULL ); g_bInit = FALSE; } if ( !g_bTokenOpen && g_pSoLib ) { dlclose( g_pSoLib ); g_pSoLib = NULL; } return rv; } /* * closeToken * "Close" the TPM token. */ CK_RV closeToken( ) { CK_RV rv = CKR_OK; // Tear down the PKCS#11 environment if ( g_bInit ) { rv = g_pFcnList->C_Finalize( NULL ); pkcsResult( "C_Finalize", rv ); } // Unload the PKCS#11 library if ( g_pSoLib ) dlclose( g_pSoLib ); g_bTokenOpen = FALSE; g_bInit = FALSE; g_pSoLib = NULL; return rv; } /* * initToken * Invoke the PKCS#11 C_InitToken API. */ CK_RV initToken( char *a_pszPin ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_InitToken( g_tSlotId, (CK_CHAR *)a_pszPin, strlen( a_pszPin ), g_tToken.label ); pkcsResult( "C_InitToken", rv ); return rv; } /* * openTokenSession * Invoke the PKCS#11 C_OpenSession API. */ CK_RV openTokenSession( CK_FLAGS a_tType, CK_SESSION_HANDLE *a_phSession ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; a_tType |= CKF_SERIAL_SESSION; // This flag must always be set rv = g_pFcnList->C_OpenSession( g_tSlotId, a_tType, NULL, NULL, a_phSession ); pkcsResult( "C_OpenSession", rv ); return rv; } /* * closeTokenSession * Invoke the PKCS#11 C_CloseSession API. */ CK_RV closeTokenSession( CK_SESSION_HANDLE a_hSession ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_CloseSession( a_hSession ); pkcsResult( "C_CloseSession", rv ); return rv; } /* * closeAllTokenSessions * Invoke the PKCS#11 C_CloseAllSessions API. */ CK_RV closeAllTokenSessions( ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_CloseAllSessions( g_tSlotId ); pkcsResult( "C_CloseAllSessions", rv ); return rv; } /* * loginToken * Invoke the PKCS#11 C_Login API for the specified user type. */ CK_RV loginToken( CK_SESSION_HANDLE a_hSession, CK_USER_TYPE a_tType, char *a_pszPin ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_Login( a_hSession, a_tType, (CK_CHAR *)a_pszPin, strlen( a_pszPin ) ); pkcsResult( "C_Login", rv ); return rv; } /* * Invoke the PKCS#11 C_InitPin API. */ CK_RV initPin( CK_SESSION_HANDLE a_hSession, char *a_pszPin ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_InitPIN( a_hSession, (CK_CHAR *)a_pszPin, strlen( a_pszPin ) ); pkcsResult( "C_InitPIN", rv ); return rv; } /* * setPin * Invoke the PKCS#11 C_SetPIN API. */ CK_RV setPin( CK_SESSION_HANDLE a_hSession, char *a_pszOldPin, char *a_pszNewPin ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_SetPIN( a_hSession, (CK_CHAR *)a_pszOldPin, strlen( a_pszOldPin ), (CK_CHAR *)a_pszNewPin, strlen( a_pszNewPin ) ); pkcsResult( "C_SetPIN", rv ); return rv; } /* * generateKey * Invoke the PKCS#11 C_GenerateKey API to generate a key * for the specified mechanism with the specified attributes. */ CK_RV generateKey( CK_SESSION_HANDLE a_hSession, CK_MECHANISM *a_ptMechanism, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE *a_phObject ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_GenerateKey( a_hSession, a_ptMechanism, a_ptAttrList, a_ulAttrCount, a_phObject ); pkcsResult( "C_GenerateKey", rv ); return rv; } /* * createObject * Invoke the PKCS#11 C_CreateObject API to create an object * with the specified attributes. */ CK_RV createObject( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE *a_phObject ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_CreateObject( a_hSession, a_ptAttrList, a_ulAttrCount, a_phObject ); pkcsResult( "C_CreateObject", rv ); return rv; } /* * destroyObject * Invoke the PKCS#11 C_DestroyObject API. */ CK_RV destroyObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_DestroyObject( a_hSession, a_hObject ); pkcsResult( "C_DestroyObject", rv ); return rv; } /* * getObjectAttributes * Invoke the PKCS#11 C_GetAttributeValue API to retrieve * the specified attributes. */ CK_RV getObjectAttributes( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount ) { CK_RV rv; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; rv = g_pFcnList->C_GetAttributeValue( a_hSession, a_hObject, a_ptAttrList, a_ulAttrCount ); pkcsResultException( "C_GetAttributeValue", rv, CKR_ATTRIBUTE_TYPE_INVALID ); return rv; } /* * findObjects * Return a list of object handles for all objects that * match the specified attributes. */ CK_RV findObjects( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE **a_phObjList, CK_ULONG *a_pulObjCount ) { CK_RV rv, rv_temp; CK_ULONG ulCount = 0; CK_ULONG ulCurCount = 0; CK_ULONG ulMaxCount = 0; CK_OBJECT_HANDLE *phObjList = NULL; *a_phObjList = NULL; *a_pulObjCount = 0; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; // Initialize the find operation rv = g_pFcnList->C_FindObjectsInit( a_hSession, a_ptAttrList, a_ulAttrCount ); pkcsResult( "C_FindObjectsInit", rv ); if ( rv != CKR_OK ) goto out; // Iterate until all object handles have been returned do { // Allocate (or increase) the object handle list buffer CK_OBJECT_HANDLE *phTemp = phObjList; ulMaxCount += TPM_FIND_MAX; phObjList = (CK_OBJECT_HANDLE *)calloc( sizeof( CK_OBJECT_HANDLE ), ulMaxCount ); if ( !phObjList ) { logError( _("Unable to obtain memory for object handle list\n") ); rv = CKR_HOST_MEMORY; goto done; } // Copy the list of object handles if ( phTemp ) { memcpy( phObjList, phTemp, ulCurCount * sizeof( CK_OBJECT_HANDLE ) ); free( phTemp ); } // Find the matching objects rv = g_pFcnList->C_FindObjects( a_hSession, phObjList + ulCurCount, TPM_FIND_MAX, &ulCount ); pkcsResult( "C_FindObjects", rv ); if ( rv != CKR_OK ) goto done; ulCurCount += ulCount; } while ( ulCurCount == ulMaxCount ); *a_phObjList = phObjList; *a_pulObjCount = ulCurCount; done: // Terminate the find operation rv_temp = g_pFcnList->C_FindObjectsFinal( a_hSession ); pkcsResult( "C_FindObjectsFinal", rv_temp ); out: if ( ( rv != CKR_OK ) && phObjList ) free( phObjList ); return rv; } /* * displayByteArray * Format a byte array for display. */ void displayByteArray( const char *a_pszLabel, CK_ATTRIBUTE *a_ptAttr, int a_bExtended ) { const char *pszPre = ( a_bExtended ) ? "\t" : ""; const char *pszPost = ( a_bExtended ) ? "\n" : ""; logMsg( "%s%s'", pszPre, a_pszLabel ); if ( a_ptAttr->ulValueLen ) logHex( a_ptAttr->ulValueLen, a_ptAttr->pValue ); else logMsg( "(null)" ); logMsg( "'%s", pszPost ); } /* * displayCertObject * Format a certificate object for display. */ CK_RV displayCertObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, int a_bExtended ) { CK_RV rv; CK_OBJECT_CLASS tClass; CK_BBOOL bToken; CK_BBOOL bPrivate; CK_BBOOL bModifiable; CK_CHAR *pszLabel = NULL; CK_CERTIFICATE_TYPE tType; CK_BBOOL bTrusted; CK_ATTRIBUTE tCertList[] = { { CKA_CLASS, &tClass, sizeof( tClass ) }, { CKA_TOKEN, &bToken, sizeof( bToken ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bModifiable, sizeof( bModifiable ) }, { CKA_LABEL, NULL, 0 }, { CKA_CERTIFICATE_TYPE, &tType, sizeof( tType ) }, { CKA_TRUSTED, &bTrusted, sizeof( bTrusted ) }, }; CK_ATTRIBUTE tX509List[] = { { CKA_SUBJECT, NULL, 0 }, { CKA_ID, NULL, 0 }, { CKA_ISSUER, NULL, 0 }, { CKA_SERIAL_NUMBER, NULL, 0 }, { CKA_VALUE, NULL, 0 }, }; CK_ATTRIBUTE tX509AttrList[] = { { CKA_OWNER, NULL, 0 }, { CKA_AC_ISSUER, NULL, 0 }, { CKA_SERIAL_NUMBER, NULL, 0 }, { CKA_ATTR_TYPES, NULL, 0 }, { CKA_VALUE, NULL, 0 }, }; CK_ULONG ulCertCount = sizeof( tCertList ) / sizeof( CK_ATTRIBUTE ); CK_ULONG ulX509Count = sizeof( tX509List ) / sizeof( CK_ATTRIBUTE ); CK_ULONG ulX509AttrCount = sizeof( tX509AttrList ) / sizeof( CK_ATTRIBUTE ); CK_ATTRIBUTE *ptAttrList; CK_ULONG ulAttrCount; // Retrieve the common certificate attributes rv = getObjectAttributes( a_hSession, a_hObject, tCertList, ulCertCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; // Allocate storage for the object label (extra byte for null // terminated string) if ( tCertList[ 4 ].ulValueLen > 0 ) { pszLabel = tCertList[ 4 ].pValue = calloc( 1, tCertList[ 4 ].ulValueLen + 1 ); rv = getObjectAttributes( a_hSession, a_hObject, tCertList, ulCertCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; } // Determine the attributes to retrieve based on the certficate type switch ( tType ) { case CKC_X_509: ptAttrList = tX509List; ulAttrCount = ulX509Count; break; case CKC_X_509_ATTR_CERT: ptAttrList = tX509AttrList; ulAttrCount = ulX509AttrCount; break; default: ptAttrList = NULL; ulAttrCount = 0; } if ( ptAttrList ) { CK_ULONG ulMalloc; // Retrieve the specific certificate type attributes (for obtaining // the attribute lengths) rv = getObjectAttributes( a_hSession, a_hObject, ptAttrList, ulAttrCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; for ( ulMalloc = 0; ulMalloc < ulAttrCount; ulMalloc++ ) { // Allocate the storage (with an extra byte for null terminated // strings - just in case) if ( ptAttrList[ ulMalloc ].ulValueLen > 0 ) ptAttrList[ ulMalloc ].pValue = calloc( 1, ptAttrList[ ulMalloc ].ulValueLen ); } // Now retrieve all the specific certificate type attributes rv = getObjectAttributes( a_hSession, a_hObject, ptAttrList, ulAttrCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; } if ( a_bExtended ) { logMsg( _("Certificate Object\n") ); switch ( tType ) { case CKC_X_509: logMsg( _("\tX509 Certificate\n") ); break; case CKC_X_509_ATTR_CERT: logMsg( _("\tX509 Attribute Certificate\n") ); break; default: logMsg( _("\tUnknown Certificate Type (%08x)\n"), tType ); } if ( tCertList[ 1 ].ulValueLen > 0 ) logMsg( _("\tToken Object: %s\n"), bToken ? _("true") : _("false") ); if ( tCertList[ 2 ].ulValueLen > 0 ) logMsg( _("\tPrivate Object: %s\n"), bPrivate ? _("true") : _("false") ); if ( tCertList[ 3 ].ulValueLen > 0 ) logMsg( _("\tModifiable Object: %s\n"), bModifiable ? _("true") : _("false") ); if ( tCertList[ 4 ].ulValueLen > 0 ) logMsg( _("\tLabel: '%s'\n"), pszLabel ); if ( tCertList[ 5 ].ulValueLen > 0 ) logMsg( _("\tTrusted: %s\n"), bTrusted ? _("true") : _("false") ); // Display the attributes based on the certficate type switch ( tType ) { case CKC_X_509: if ( tX509List[ 0 ].ulValueLen > 0 ) displayByteArray( _("Subject: "), &tX509List[ 0 ], a_bExtended ); if ( tX509List[ 1 ].ulValueLen > 0 ) { logMsg( _("\tId: '%s' ("), tX509List[ 1 ].pValue ); displayByteArray( "", &tX509List[ 1 ], FALSE ); logMsg( ")\n" ); } if ( tX509List[ 2 ].ulValueLen > 0 ) displayByteArray( _("Issuer: "), &tX509List[ 2 ], a_bExtended ); if ( tX509List[ 3 ].ulValueLen > 0 ) displayByteArray( _("Serial Number: "), &tX509List[ 3 ], a_bExtended ); if ( tX509List[ 4 ].ulValueLen > 0 ) displayByteArray( _("Value: "), &tX509List[ 4 ], a_bExtended ); break; case CKC_X_509_ATTR_CERT: if ( tX509AttrList[ 0 ].ulValueLen > 0 ) displayByteArray( _("Owner: "), &tX509AttrList[ 0 ], a_bExtended ); if ( tX509AttrList[ 1 ].ulValueLen > 0 ) displayByteArray( _("Issuer: "), &tX509AttrList[ 1 ], a_bExtended ); if ( tX509AttrList[ 2 ].ulValueLen > 0 ) displayByteArray( _("Serial Number: "), &tX509AttrList[ 2 ], a_bExtended ); if ( tX509AttrList[ 3 ].ulValueLen > 0 ) displayByteArray( _("Attribute Types: "), &tX509AttrList[ 3 ], a_bExtended ); if ( tX509AttrList[ 4 ].ulValueLen > 0 ) displayByteArray( _("Value: "), &tX509AttrList[ 4 ], a_bExtended ); break; } } else { // Display the attributes based on the certficate type logMsg( _("Certificate: ") ); switch ( tType ) { case CKC_X_509: logMsg( _("Type: X509 Public Key") ); break; case CKC_X_509_ATTR_CERT: logMsg( _("Type: X509 Attribute") ); break; default: logMsg( _("Unknown Type (%08x)"), tType ); } if ( tCertList[ 4 ].ulValueLen > 0 ) logMsg( _(", Label: '%s'"), pszLabel ); logMsg( "\n" ); } return rv; } /* * displayAsymKeyObject * Format an asymmetric key object for display. */ CK_RV displayAsymKeyObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, int a_bExtended ) { CK_RV rv; CK_OBJECT_CLASS tClass; CK_BBOOL bToken; CK_BBOOL bPrivate; CK_BBOOL bModifiable; CK_CHAR *pszLabel = NULL; CK_KEY_TYPE tType; CK_CHAR *pszId = NULL; CK_ATTRIBUTE tKeyList[] = { { CKA_CLASS, &tClass, sizeof( tClass ) }, { CKA_TOKEN, &bToken, sizeof( bToken ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bModifiable, sizeof( bModifiable ) }, { CKA_LABEL, NULL, 0 }, { CKA_KEY_TYPE, &tType, sizeof( tType ) }, { CKA_SUBJECT, NULL, 0 }, { CKA_ID, NULL, 0 }, }; CK_ULONG ulKeyCount = sizeof( tKeyList ) / sizeof( CK_ATTRIBUTE ); // Retrieve the common key attributes rv = getObjectAttributes( a_hSession, a_hObject, tKeyList, ulKeyCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; // Allocate storage for the object id if ( ( tKeyList[ 4 ].ulValueLen > 0 ) || ( tKeyList[ 6 ].ulValueLen > 0 ) || ( tKeyList[ 7 ].ulValueLen > 0 ) ) { if ( tKeyList[ 4 ].ulValueLen > 0 ) pszLabel = tKeyList[ 4 ].pValue = calloc( 1, tKeyList[ 4 ].ulValueLen + 1 ); if ( tKeyList[ 6 ].ulValueLen > 0 ) tKeyList[ 6 ].pValue = calloc( 1, tKeyList[ 6 ].ulValueLen + 1 ); if ( tKeyList[ 7 ].ulValueLen > 0 ) pszId = tKeyList[ 7 ].pValue = calloc( 1, tKeyList[ 7 ].ulValueLen + 1 ); rv = getObjectAttributes( a_hSession, a_hObject, tKeyList, ulKeyCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; } if ( a_bExtended ) { logMsg( _("Key Object\n") ); switch ( tClass ) { case CKO_PUBLIC_KEY: logMsg( _("\tPublic Key\n") ); break; case CKO_PRIVATE_KEY: logMsg( _("\tPrivate Key\n") ); break; } if ( tKeyList[ 1 ].ulValueLen > 0 ) logMsg( _("\tToken Object: %s\n"), bToken ? _("true") : _("false") ); if ( tKeyList[ 2 ].ulValueLen > 0 ) logMsg( _("\tPrivate Object: %s\n"), bPrivate ? _("true") : _("false") ); if ( tKeyList[ 3 ].ulValueLen > 0 ) logMsg( _("\tModifiable Object: %s\n"), bModifiable ? _("true") : _("false") ); if ( tKeyList[ 4 ].ulValueLen > 0 ) logMsg( _("\tLabel: '%s'\n"), pszLabel ); if ( tKeyList[ 5 ].ulValueLen > 0 ) logMsg( _("\tType: %ld\n"), tType ); if ( tKeyList[ 6 ].ulValueLen > 0 ) displayByteArray( _("Subject: "), &tKeyList[ 6 ], a_bExtended ); if ( tKeyList[ 7 ].ulValueLen > 0 ) { logMsg( _("\tId: '%s' ("), pszId ); displayByteArray( "", &tKeyList[ 7 ], FALSE ); logMsg( ")\n" ); } } else { switch ( tClass ) { case CKO_PUBLIC_KEY: logMsg( _("Public Key: ") ); break; case CKO_PRIVATE_KEY: logMsg( _("Private Key: ") ); break; } if ( tKeyList[ 5 ].ulValueLen > 0 ) logMsg( _("Type: %ld"), tType ); if ( tKeyList[ 4 ].ulValueLen > 0 ) logMsg( _(", Label: '%s'"), pszLabel ); logMsg( "\n" ); } return rv; } /* * displaySymKeyObject * Format a symmetric key object for display. */ CK_RV displaySymKeyObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, int a_bExtended ) { CK_RV rv; CK_OBJECT_CLASS tClass; CK_BBOOL bToken; CK_BBOOL bPrivate; CK_BBOOL bModifiable; CK_CHAR *pszLabel = NULL; CK_KEY_TYPE tType; CK_ATTRIBUTE tKeyList[] = { { CKA_CLASS, &tClass, sizeof( tClass ) }, { CKA_TOKEN, &bToken, sizeof( bToken ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bModifiable, sizeof( bModifiable ) }, { CKA_LABEL, NULL, 0 }, { CKA_KEY_TYPE, &tType, sizeof( tType ) }, }; CK_ULONG ulKeyCount = sizeof( tKeyList ) / sizeof( CK_ATTRIBUTE ); // Retrieve the common key attributes rv = getObjectAttributes( a_hSession, a_hObject, tKeyList, ulKeyCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; // Allocate storage for the object id if ( tKeyList[ 4 ].ulValueLen > 0 ) { pszLabel = tKeyList[ 4 ].pValue = calloc( 1, tKeyList[ 4 ].ulValueLen + 1 ); rv = getObjectAttributes( a_hSession, a_hObject, tKeyList, ulKeyCount ); if ( ( rv != CKR_OK ) && ( rv != CKR_ATTRIBUTE_TYPE_INVALID ) ) return rv; } if ( a_bExtended ) { logMsg( _("Key Object\n") ); switch ( tClass ) { case CKO_SECRET_KEY: logMsg( _("\tSecret Key\n") ); break; } if ( tKeyList[ 1 ].ulValueLen > 0 ) logMsg( _("\tToken Object: %s\n"), bToken ? _("true") : _("false") ); if ( tKeyList[ 2 ].ulValueLen > 0 ) logMsg( _("\tPrivate Object: %s\n"), bPrivate ? _("true") : _("false") ); if ( tKeyList[ 3 ].ulValueLen > 0 ) logMsg( _("\tModifiable Object: %s\n"), bModifiable ? _("true") : _("false") ); if ( tKeyList[ 4 ].ulValueLen > 0 ) logMsg( _("\tLabel: '%s'\n"), pszLabel ); if ( tKeyList[ 5 ].ulValueLen > 0 ) logMsg( _("\tType: %ld\n"), tType ); } else { switch ( tClass ) { case CKO_SECRET_KEY: logMsg( _("Secret Key: ") ); break; } if ( tKeyList[ 5 ].ulValueLen > 0 ) logMsg( _("Type: %ld"), tType ); if ( tKeyList[ 4 ].ulValueLen > 0 ) logMsg( _(", Label: '%s'"), pszLabel ); logMsg( "\n" ); } return rv; } /* * displayObject * Format and display objects. */ CK_RV displayObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, int a_bExtended ) { CK_RV rv; CK_OBJECT_CLASS tClass; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tClass, sizeof( tClass ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); // Retrieve the class attribute of the object rv = getObjectAttributes( a_hSession, a_hObject, tAttr, ulAttrCount ); if ( rv != CKR_OK ) return rv; // Use the object class to determine how to format it for display switch ( tClass ) { case CKO_DATA: logMsg( _("Data object\n") ); break; case CKO_CERTIFICATE: displayCertObject( a_hSession, a_hObject, a_bExtended ); break; case CKO_PUBLIC_KEY: case CKO_PRIVATE_KEY: displayAsymKeyObject( a_hSession, a_hObject, a_bExtended ); break; case CKO_SECRET_KEY: displaySymKeyObject( a_hSession, a_hObject, a_bExtended ); break; case CKO_HW_FEATURE: case CKO_DOMAIN_PARAMETERS: default: logMsg( _("Object class=%ld\n"), tClass ); break; } return rv; } /* * checkKey * Check that the key object attributes match the key class * and key type specified. */ CK_RV checkKey( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_OBJECT_CLASS a_tKeyClass, CK_KEY_TYPE a_tKeyType ) { CK_RV rv; CK_OBJECT_CLASS tClass; CK_KEY_TYPE tType; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tClass, sizeof( tClass ) }, { CKA_KEY_TYPE, &tType, sizeof( tType ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); // Retrieve the class attribute and key type attribute of the object rv = getObjectAttributes( a_hSession, a_hObject, tAttr, ulAttrCount ); if ( rv != CKR_OK ) return rv; if ( tClass != a_tKeyClass ) return CKR_GENERAL_ERROR; if ( tType != a_tKeyType ) return CKR_GENERAL_ERROR; return CKR_OK; } /* * encryptData * Use a callback mechanism to encrypt some data. */ CK_RV encryptData( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_MECHANISM *a_ptMechanism, TokenCryptGet a_fGet, TokenCryptPut a_fPut ) { CK_RV rv; CK_BBOOL bCancel = FALSE; CK_BYTE *pbInData = NULL; CK_ULONG ulInDataLen = 0; CK_BBOOL bContinue = TRUE; CK_BYTE *pbBuffer = NULL; CK_ULONG ulBufferLen = 0; CK_ULONG ulOutDataLen = 0; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; // Check the key rv = checkKey( a_hSession, a_hObject, CKO_SECRET_KEY, CKK_AES ); if ( rv != CKR_OK ) goto out; // Initialize the encryption operation rv = g_pFcnList->C_EncryptInit( a_hSession, a_ptMechanism, a_hObject ); pkcsResult( "C_EncryptInit", rv ); if ( rv != CKR_OK ) goto out; while ( bContinue ) { // Retrieve some data to encrypt if ( a_fGet( &pbInData, &ulInDataLen, &bContinue, TRUE ) == -1 ) { bCancel = TRUE; goto out; } // Check the output buffer size needed rv = g_pFcnList->C_EncryptUpdate( a_hSession, pbInData, ulInDataLen, NULL, &ulOutDataLen ); pkcsResult( "C_EncryptUpdate", rv ); if ( rv != CKR_OK ) goto out; // Check if a larger buffer is needed if ( ulOutDataLen > ulBufferLen ) { free( pbBuffer ); ulBufferLen = ulOutDataLen; pbBuffer = calloc( 1, ulBufferLen ); if ( !pbBuffer ) { logError( _("Unable to obtain memory for the encrypted data buffer\n") ); rv = CKR_HOST_MEMORY; goto out; } } // Encrypt the input data rv = g_pFcnList->C_EncryptUpdate( a_hSession, pbInData, ulInDataLen, pbBuffer, &ulOutDataLen ); pkcsResult( "C_EncryptUpdate", rv ); if ( rv != CKR_OK ) goto out; if ( ulOutDataLen > 0 ) { if ( a_fPut( pbBuffer, ulOutDataLen, bContinue, TRUE ) == -1 ) { bCancel = TRUE; goto out; } } } out: // For AES any remaining data will cause an error, so provide // a buffer which will not be filled in anyway ulOutDataLen = ulBufferLen; rv = g_pFcnList->C_EncryptFinal( a_hSession, pbBuffer, &ulOutDataLen ); pkcsResult( "C_EncryptFinal", rv ); free( pbBuffer ); if ( bCancel ) rv = CKR_FUNCTION_CANCELED; return rv; } /* * decryptData * Use a callback mechanism to decrypt some data. */ CK_RV decryptData( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_MECHANISM *a_ptMechanism, TokenCryptGet a_fGet, TokenCryptPut a_fPut ) { CK_RV rv; CK_BBOOL bCancel = FALSE; CK_BYTE *pbInData = NULL; CK_ULONG ulInDataLen = 0; CK_BBOOL bContinue = TRUE; CK_BYTE *pbBuffer = NULL; CK_ULONG ulBufferLen = 0; CK_ULONG ulOutDataLen = 0; if ( !g_bTokenOpen ) return CKR_GENERAL_ERROR; // Check the key rv = checkKey( a_hSession, a_hObject, CKO_SECRET_KEY, CKK_AES ); if ( rv != CKR_OK ) goto out; // Initialize the decryption operation rv = g_pFcnList->C_DecryptInit( a_hSession, a_ptMechanism, a_hObject ); pkcsResult( "C_DecryptInit", rv ); if ( rv != CKR_OK ) goto out; while ( bContinue ) { // Retrieve some data to encrypt if ( a_fGet( &pbInData, &ulInDataLen, &bContinue, FALSE ) == -1 ) { bCancel = TRUE; goto out; } // Check the output buffer size needed rv = g_pFcnList->C_DecryptUpdate( a_hSession, pbInData, ulInDataLen, NULL, &ulOutDataLen ); pkcsResult( "C_DecryptUpdate", rv ); if ( rv != CKR_OK ) goto out; // Check if a larger buffer is needed if ( ulOutDataLen > ulBufferLen ) { free( pbBuffer ); ulBufferLen = ulOutDataLen; pbBuffer = calloc( 1, ulBufferLen ); if ( !pbBuffer ) { logError( _("Unable to obtain memory for the encrypted data buffer\n") ); rv = CKR_HOST_MEMORY; goto out; } } // Decrypt the input data rv = g_pFcnList->C_DecryptUpdate( a_hSession, pbInData, ulInDataLen, pbBuffer, &ulOutDataLen ); pkcsResult( "C_DecryptUpdate", rv ); if ( rv != CKR_OK ) goto out; if ( a_fPut( pbBuffer, ulOutDataLen, bContinue, FALSE ) == -1 ) { bCancel = TRUE; goto out; } } out: // For AES any remaining data will cause an error, so provide // a buffer which will not be filled in anyway rv = g_pFcnList->C_DecryptFinal( a_hSession, pbBuffer, &ulOutDataLen ); pkcsResult( "C_DecryptFinal", rv ); free( pbBuffer ); if ( bCancel ) rv = CKR_FUNCTION_CANCELED; return rv; } /* * isTokenInitialized * Returns an indicator as to whether the TPM token has been initialized. */ BOOL isTokenInitialized( ) { if ( g_bTokenOpen && ( g_tToken.flags & CKF_TOKEN_INITIALIZED ) ) return TRUE; return FALSE; } /* * getMinPinLen * Returns the the minimum PIN length that the TPM token accepts. */ int getMinPinLen( ) { if ( !g_bTokenOpen ) return 0; return (int)g_tToken.ulMinPinLen; } /* * getMaxPinLen * Returns the the maximum PIN length that the TPM token accepts. */ int getMaxPinLen( ) { if ( !g_bTokenOpen ) return 0; return (int)g_tToken.ulMaxPinLen; } tpm-tools-1.3.9.2/lib/tpm_utils.c0000664000175000017510000001473313736475721016060 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "config.h" #include #include #include #include #include "tpm_tspi.h" #include "tpm_utils.h" BOOL useUnicode = FALSE; static const struct option sGenLongOpts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { "log", required_argument, NULL, 'l' }, { "unicode", no_argument, NULL, 'u' }, }; static const char *pszGenShortOpts = "hvl:u"; void initIntlSys( ) { setlocale( LC_ALL, "" ); bindtextdomain( PACKAGE, LOCALEDIR ); textdomain( PACKAGE ); } int genericOptHandler( int a_iNumArgs, char **a_pszArgs, const char *a_pszShortOpts, struct option *a_sLongOpts, int a_iNumOpts, CmdOptParser a_tCmdOptParser, CmdHelpFunction a_tCmdHelpFunction ) { CmdHelpFunction tCmdHelp = ( a_tCmdHelpFunction ) ? a_tCmdHelpFunction : logCmdHelp; char szShortOpts[strlen( pszGenShortOpts ) + ( ( a_pszShortOpts == NULL ) ? 0 : strlen( a_pszShortOpts ) ) + 1]; int iNumGenLongOpts = sizeof( sGenLongOpts ) / sizeof( struct option ); struct option sLongOpts[iNumGenLongOpts + a_iNumOpts + 1]; int iOpt; int rc; strcpy( szShortOpts, pszGenShortOpts); if ( a_pszShortOpts ) strcat( szShortOpts, a_pszShortOpts ); __memset( sLongOpts, 0, sizeof( sLongOpts ) ); memcpy( sLongOpts, sGenLongOpts, sizeof( sGenLongOpts ) ); if ( a_sLongOpts ) { memcpy( sLongOpts + iNumGenLongOpts, a_sLongOpts, a_iNumOpts * sizeof( struct option ) ); } while ( ( iOpt = getopt_long( a_iNumArgs, a_pszArgs, szShortOpts, sLongOpts, NULL ) ) != -1 ) { switch ( iOpt ) { case 'h': tCmdHelp( a_pszArgs[0] ); return -1; case 'v': logMsg( _("%s version: %s\n"), a_pszArgs[0], CMD_VERSION ); return -1; case 'l': if ( !optarg ) { tCmdHelp( a_pszArgs[0] ); return -1; } if ( strcmp( optarg, LOG_NONE ) == 0 ) iLogLevel = LOG_LEVEL_NONE; else if ( strcmp( optarg, LOG_ERROR ) == 0 ) iLogLevel = LOG_LEVEL_ERROR; else if ( strcmp( optarg, LOG_INFO ) == 0 ) iLogLevel = LOG_LEVEL_INFO; else if ( strcmp( optarg, LOG_DEBUG ) == 0 ) iLogLevel = LOG_LEVEL_DEBUG; else { logMsg( _("Valid log levels are: %s, %s, %s, %s\n"), LOG_NONE, LOG_ERROR, LOG_INFO, LOG_DEBUG ); tCmdHelp( a_pszArgs[0] ); return -1; } break; case 'u': useUnicode = TRUE; break; case '?': tCmdHelp( a_pszArgs[0] ); return -1; default: if ( !a_tCmdOptParser ) return -1; rc = a_tCmdOptParser( iOpt, optarg ); if ( rc != 0 ) return rc; break; } } return 0; } void * __memset(void *s, int c, size_t n) { memset(s, c, n); asm volatile("" ::: "memory"); return s; } /* * This function should be called when you are done with a password * the above getPasswd function to properly clean up. */ void shredPasswd( char *a_pszPasswd ) { if ( a_pszPasswd ) { __memset( a_pszPasswd, 0, strlen( a_pszPasswd ) ); free( a_pszPasswd ); } } /* * You must free the memory passed back to you when you are finished. * Loop will always terminate by the second pass. * Safest use of getpass is to zero the memory as soon as possible. */ char *getPlainPasswd(const char *a_pszPrompt, BOOL a_bConfirm) { int len; return _getPasswd(a_pszPrompt, &len, a_bConfirm, FALSE); } #ifndef TSS_LIB_IS_12 char *getPasswd(const char *a_pszPrompt, int* a_iLen, BOOL a_bConfirm) { return _getPasswd( a_pszPrompt, a_iLen, a_bConfirm, useUnicode); } #endif char *_getPasswd(const char *a_pszPrompt, int* a_iLen, BOOL a_bConfirm, BOOL a_bUseUnicode) { char *pszPrompt = (char *)a_pszPrompt; char *pszPasswd = NULL; char *pszRetPasswd = NULL; do { // Get password value from user - this is a static buffer // and should never be freed pszPasswd = getpass( pszPrompt ); if (!pszPasswd && pszRetPasswd) { shredPasswd( pszRetPasswd ); return NULL; } // If this is confirmation pass check for match if ( pszRetPasswd ) { // Matched work complete if ( strcmp( pszPasswd, pszRetPasswd ) == 0) goto out; // No match clean-up logMsg( _("Passwords didn't match\n") ); // pszPasswd will be cleaned up at out label shredPasswd( pszRetPasswd ); pszRetPasswd = NULL; goto out; } // Save this passwd for next pass and/or return val pszRetPasswd = strdup( pszPasswd ); if ( !pszRetPasswd ) goto out; pszPrompt = _("Confirm password: "); } while (a_bConfirm); out: if (pszRetPasswd) { *a_iLen = strlen(pszRetPasswd); if (a_bUseUnicode) { shredPasswd(pszRetPasswd); pszRetPasswd = (char *)Trspi_Native_To_UNICODE((BYTE *)pszPasswd, (unsigned int *)a_iLen); } } // pszPasswd is a static buffer, just clear it if ( pszPasswd ) __memset( pszPasswd, 0, strlen( pszPasswd ) ); return pszRetPasswd; } /* * You must free the memory passed back to you when you are finished. */ char *getReply( const char *a_pszPrompt, int a_iMaxLen ) { char *pszReply = NULL; int iReplyLen = a_iMaxLen + 2; // Room for newline and trailing zero if ( iReplyLen <= 0 ) goto out; pszReply = (char *)calloc( iReplyLen, 1 ); if ( !pszReply ) goto out; logMsg( "%s", a_pszPrompt ); pszReply = fgets( pszReply, iReplyLen, stdin ); if ( !pszReply ) goto out; // Be certain that a complete line was read if ( ( pszReply[ a_iMaxLen ] != '\n' ) && ( pszReply[ a_iMaxLen ] != '\0' ) ) { free( pszReply ); pszReply = NULL; goto out; } for ( iReplyLen -= 1; iReplyLen >= 0; iReplyLen-- ) { if ( pszReply[ iReplyLen ] == '\0' ) continue; if ( pszReply[ iReplyLen ] == '\n' ) pszReply[ iReplyLen ] = '\0'; break; } out: return pszReply; } tpm-tools-1.3.9.2/test/0000775000175000017510000000000013735320450014060 5ustar deboradeboratpm-tools-1.3.9.2/test/tpm_changeownerauth01.sh0000775000175000017510000001554013735320450020627 0ustar deboradebora#!/usr/bin/expect -f ######################################################################## # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2007 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # # Program: tpm_changeownerauth01.sh # Purpose: Test transitions between plain text, unicode and well-known # for Owner and SRK passwords, using tpm_changeownerauth from tpm-tools # package. # Pre-Conditions: Owner and SRK password must be set to a plain text # password before running this test. # # Author: Ramon Brandão # Date: Nov/07 # ######################################################################## set timeout -1 set options {"-s" "-o"} # States if the current owner password is the Well Known secret set wnOpt "" # States if the crrent owner password is a Unicode one set isU "" #Prompts for the owner and SRK Passwords send_user "Enter the current Owner Password: " expect_user -re "(.*)\n" set ownerPasswd $expect_out(1,string) send_user "Enter the current SRK Password: " expect_user -re "(.*)\n" set SRKPasswd $expect_out(1,string) # Start of changeauth tests foreach opt $options { if {$opt == "-s"} { send_user "\n\n#############################################################\n" send_user "####### Testing tpm_changeownerauth for SRK password:########\n" send_user "#############################################################\n\n" } else { send_user "\n\n###############################################################\n" send_user "####### Testing tpm_changeownerauth for OWNER password:########\n" send_user "###############################################################\n\n" } # Plaintext -> Unicode puts stdout "Test 1) tpm_changeownerauth \"$opt\": Changing password from PLAINTEXT to UNICODE:" spawn tpm_changeownerauth $opt -n -l debug sleep 1 expect "Enter owner password" { exp_send "$ownerPasswd\r" if {$opt == "-s"} { expect "Enter new SRK" { exp_send "$SRKPasswd\r" expect "Confirm" { exp_send "$SRKPasswd\r" } } } else { expect "Enter new owner" { exp_send "$ownerPasswd\r" expect "Confirm" { exp_send "$ownerPasswd\r" set isU "-g" } } } expect { "ngeAuth success" { expect "Tspi_Context_Close success" { send_user "PLAINTEXT to UNICODE auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "PLAINTEXT to UNICODE auth change FAILED. \n\n" } } } } sleep 4 # Unicode -> plaintext puts stdout "Test 2) tpm_changeownerauth \"$opt\": Changing password from UNICODE to PLAINTEXT:" spawn tpm_changeownerauth $opt $isU -l debug sleep 1 expect "Enter owner password" { exp_send "$ownerPasswd\r" if {$opt == "-s"} { expect "Enter new SRK" { exp_send "$SRKPasswd\r" expect "Confirm" { exp_send "$SRKPasswd\r" } } } else { expect "Enter new owner" { exp_send "$ownerPasswd\r" expect "Confirm" { exp_send "$ownerPasswd\r" set isU "" } } } expect { "ngeAuth success" { expect "Tspi_Context_Close success" { send_user "UNICODE to PLAINTEXT auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "UNICODE to PLAINTEXT auth change FAILED. \n\n" } } } } sleep 4 # Plaintext -> Well Known puts stdout "Test 3) tpm_changeownerauth \"$opt\": Changing password from PLAINTEXT to WELL KNOWN:" spawn tpm_changeownerauth $opt -r -l debug sleep 1 expect "Enter owner password" { exp_send "$ownerPasswd\r" if {$opt == "-o"} { set wnOpt "-z" } expect { "ngeAuth success" { expect "Tspi_Context_Close success" { send_user "PLAINTEXT to WELL KNOWN auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "PLAINTEXT to WELL KNOWN auth change FAILED. \n\n" } } } } sleep 4 # Well Known -> Unicode puts stdout "Test 4) tpm_changeownerauth \"$opt\": Changing password from WELL KNOWN to UNICODE:" spawn tpm_changeownerauth $opt $wnOpt -n -l debug sleep 1 if {$wnOpt != "-z"} { expect "Enter owner password" {exp_send "$ownerPasswd\r"} } if {$opt == "-s"} { expect "Enter new SRK" { exp_send "$SRKPasswd\r" expect "Confirm" { exp_send "$SRKPasswd\r" } } } else { expect "Enter new owner" { exp_send "$ownerPasswd\r" expect "Confirm" { exp_send "$ownerPasswd\r" set wnOpt "" set isU "-g" } } } expect { "ngeAuth success" { expect "Tspi_Context_Close success" { send_user "WELL KNOWN to UNICODE auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "WELL KNOWN to UNICODE auth change FAILED. \n\n" } } } sleep 4 # Unicode -> Well Known puts stdout "Test 5) tpm_changeownerauth \"$opt\": Changing password from UNICODE to WELL KNOWN:" spawn tpm_changeownerauth $opt $isU -r -l debug sleep 1 if {$wnOpt != "-z"} { expect "Enter owner password" {exp_send "$ownerPasswd\r"} } if {$opt == "-o"} { set wnOpt "-z" } expect { "ngeAuth success" { expect "Tspi_Context_Close success" { send_user "UNICODE to WELL KNOWN auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "UNICODE to WELL KNOWN auth change FAILED. \n\n" } } } sleep 4 # Well Known -> Plain - return to the starting state puts stdout "Test 6) tpm_changeownerauth \"$opt\": Changing password from WELL KNOWN to PLAIN:" spawn tpm_changeownerauth $opt $wnOpt -l debug sleep 1 if {$wnOpt != "-z"} { expect "Enter owner password" {exp_send "$ownerPasswd\r"} } if {$opt == "-s" } { expect "Enter new SRK" { exp_send "$SRKPasswd\r" expect "Confirm" { exp_send "$SRKPasswd\r" } } } else { expect "Enter new owner" { exp_send "$ownerPasswd\r" expect "Confirm" { exp_send "$ownerPasswd\r" } } } expect { "ngeAuth succes" { expect "Tspi_Context_Close success" { send_user "WELL KNOWN to PLAIN auth change SUCCEED. \n\n" } } "*Auth*ailed" { expect "Tspi_Context_Close success" { send_user "WELL KNOWN to PLAIN auth change FAILED. \n\n" } } } sleep 4 } tpm-tools-1.3.9.2/README0000664000175000017510000000270113735320450013761 0ustar deboradebora tpm-tools Copyright (C) 2005, 2006 International Business Machines Corporation All Rights Reserved. DESCRIPTION ----------- tpm-tools is an open-source package designed to enable user and application enablement of Trusted Computing using a Trusted Platform Module (TPM), similar to a smart card environment. Trusted Computing is a set of specifications set forth by the Trusted Computing Group (TCG). For more information on the TCG and Trusted Computing please visit the Trusted Computing Group website at: http://www.trustedcomputinggroup.org. The tpm-tools package contains commands to allow the platform administrator the ability to manage and diagnose the platform's TPM. Additionally, the package contains commands to utilize some of the capabilities available in the TPM PKCS#11 interface implemented in the openCryptoki project. The tpm-tools package is released under the Common Public License. BUILD REQUIREMENTS ----- ------------ Packages needed to build: automake autoconf libtool gettext gettext-devel trousers trousers-devel optional (for PKCS#11 support - tpmtoken commands) openssl-0.9.7 or newer openssl-devel-0.9.7 or newer opencryptoki-2.2.0 or newer BUILDING tpm-tools -------- --------- $ sh ./bootstrap.sh $ ./configure $ make # make install By default the build will place everything in /usr/local. Issue ./configure --help to see how to install to a different location. tpm-tools-1.3.9.2/cleanup.sh0000775000175000017510000000252113735320450015067 0ustar deboradebora#! /bin/sh # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # cleanup.sh set -x if [ -f Makefile ] ; then make -k clean fi rm ABOUT-NLS rm config.rpath rm mkinstalldirs rm -rf m4/ rm -rf po/ rm aclocal.m4 rm -rf autom4te.cache rm compile rm config.* rm configure rm depcomp rm install-sh rm ltmain.sh rm missing rm libtool find . -name Makefile -exec rm {} \; find . -name Makefile.in -exec rm {} \; find . -depth -name .deps -exec rm -rf {} \; tpm-tools-1.3.9.2/LICENSE0000664000175000017510000002653513735320450014121 0ustar deboradeboraCommon Public License Version 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. tpm-tools-1.3.9.2/configure.ac0000664000175000017510000001076313750245421015377 0ustar deboradebora# # configure.in # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005, 2006 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # AC_INIT(tpm-tools, 1.3.9.2, trousers-tech@lists.sf.net) AC_PREREQ(2.12)dnl AC_CONFIG_SRCDIR(Makefile.am) AM_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([foreign 1.6]) DEBUG="" AC_MSG_CHECKING([for debug-enabled build]) AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [create a debug build that outputs debug messages]), [if test "$enableval" = "yes"; then DEBUG="yes" AC_MSG_RESULT([yes]) else DEBUG="no" AC_MSG_RESULT([no]) fi], [DEBUG="no" AC_MSG_RESULT([no])]) # If the user has not set CFLAGS, do something appropriate test_CFLAGS=${CFLAGS+set} if test "$test_CFLAGS" != set; then if test "$DEBUG" == "yes"; then CFLAGS="-O0 -g -DDEBUG" else CFLAGS="-g -O2" fi elif test "$DEBUG" == "yes"; then CFLAGS="$CFLAGS -O0 -g -DDEBUG" fi AC_PROG_CC AC_PROG_INSTALL AC_PROG_LIBTOOL AC_CHECK_PROGS(COPY, cp) AC_CHECK_PROGS(ECHO, echo) AC_CHECK_PROGS(MKDIR, mkdir) AC_CHECK_PROGS(RM, rm) AM_GNU_GETTEXT_VERSION([0.15]) AM_GNU_GETTEXT([external]) # Arch specific stuff case $target in *ppc64* | *powerpc64* | *x86_64* | *s390x*) CFLAGS="$CFLAGS -m64" ;; *) ;; esac # Non-standard OpenSSL location AC_MSG_CHECKING([Non-standard OpenSSL location]) AC_ARG_WITH(openssl, AC_HELP_STRING([--with-openssl=PATH], [Location of openssl libs/includes]), [OPENSSL_INCLUDE_DIR="$withval/include" OPENSSL_LIB_DIR="$withval/lib" if test ! -d $OPENSSL_INCLUDE_DIR -o ! -d $OPENSSL_LIB_DIR; then AC_MSG_ERROR([$OPENSSL_INCLUDE_DIR or $OPENSSL_LIB_DIR doen't exist!]) else AC_MSG_RESULT([yes]) CFLAGS="$CFLAGS -L$OPENSSL_LIB_DIR -I$OPENSSL_INCLUDE_DIR" AC_SUBST([OPENSSL_LIB_DIR]) fi], [AC_MSG_RESULT([no]) AC_SUBST([OPENSSL_LIB_DIR], []) ] ) AC_CHECK_LIB(tspi, Tspi_Context_Create, [TSS_LIB="1"], [AC_MSG_ERROR([tss lib not found: libtspi.so])]) AC_CHECK_LIB(tspi, Tspi_TPM_SetOperatorAuth, [TSS_12="1"], [TSS_12="0"]) if test "$TSS_12" = "1"; then AM_CONDITIONAL(TSS_LIB_IS_12, true) AC_MSG_NOTICE([Configuring tpm-tools for TSS 1.2]) else AM_CONDITIONAL(TSS_LIB_IS_12, false) AC_MSG_NOTICE([Configuring tpm-tools for TSS 1.1]) fi AC_CHECK_HEADER(trousers/tss.h, [TSS_INC="1"], [AC_MSG_ERROR([tss header not found: trousers/tss.h])]) AC_CHECK_LIB(crypto, PEM_read_X509, [OPENSSL_LIB="1"], [AC_MSG_ERROR([openssl lib not found: libcrypto.so])]) AC_CHECK_HEADER(openssl/evp.h, [OPENSSL_INC="1"], [AC_MSG_ERROR([openssl header not found: openssl/evp.h])]) OPENCRYPTOKI="0" AC_ARG_ENABLE(pkcs11_support, AC_HELP_STRING([--disable-pkcs11-support], [don't build data_mgmt commands [[default=no]]]), [disable_pkcs11_support="yes" AC_MSG_RESULT([*** Not building data_mgmt at user request ***])],) if test "x$disable_pkcs11_support" != "xyes"; then AC_CHECK_HEADER(opencryptoki/pkcs11.h, [OPENCRYPTOKI_INC="1"], [OPENCRYPTOKI_INC="0"]) if test "$OPENCRYPTOKI_INC" = "1"; then OPENCRYPTOKI="1" fi fi AM_CONDITIONAL([P11_SUPPORT], [test "$OPENCRYPTOKI" = "1"]) AC_HEADER_STDC AC_C_CONST AC_C_INLINE AC_SYS_LONG_FILE_NAMES AC_TYPE_MODE_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SIGNAL AC_TYPE_UID_T CFLAGS="$CFLAGS -Wall -Wreturn-type -Wsign-compare" AC_CONFIG_FILES(Makefile \ po/Makefile.in \ m4/Makefile \ include/Makefile \ lib/Makefile \ src/Makefile \ src/tpm_mgmt/Makefile \ src/cmds/Makefile \ src/data_mgmt/Makefile \ dist/tpm-tools.spec \ man/Makefile \ man/man1/Makefile \ man/man3/Makefile \ man/man8/Makefile) AC_OUTPUT echo "CFLAGS=$CFLAGS" echo "LDFLAGS=$LDFLAGS" tpm-tools-1.3.9.2/.git/0000775000175000017510000000000013750252470013745 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/0000775000175000017510000000000013735320450014706 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/refs/0000775000175000017510000000000013735320450015645 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/refs/heads/0000775000175000017510000000000013750245026016733 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/refs/heads/schmidt-openssl0000664000175000017510000000111313737530004021764 0ustar deboradebora0000000000000000000000000000000000000000 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602137643 -0700 branch: Created from HEAD b7c185af74871f9cfb693f431e29c38239a71edd af2721fce36de31b35460bbc1caff74a84bc035e Debora Velarde Babb 1602137741 -0700 am: Fix build with OpenSSL 1.1 due to EVP_PKEY being an opaque struct af2721fce36de31b35460bbc1caff74a84bc035e 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1602138116 -0700 am: Fix build with OpenSSL 1.1 due to RSA being an opaque struct tpm-tools-1.3.9.2/.git/logs/refs/heads/new-release0000664000175000017510000000053013750245165021067 0ustar deboradebora0000000000000000000000000000000000000000 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1604405782 -0800 branch: Created from HEAD 49b9a942d6e905d1ba50de6329e5da03fe453d01 bf43837575c5f7d31865562dce7778eae970052e Debora Velarde Babb 1604405856 -0800 commit: Bumped version to 1.3.9.2 tpm-tools-1.3.9.2/.git/logs/refs/heads/no-opt0000664000175000017510000000053513736475612020107 0ustar deboradebora0000000000000000000000000000000000000000 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601862421 -0700 branch: Created from HEAD 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1601862538 -0700 am: tpm-tools: don't use __no_optimize tpm-tools-1.3.9.2/.git/logs/refs/heads/pcrs_sealing_data0000664000175000017510000000105413735320730022317 0ustar deboradebora0000000000000000000000000000000000000000 bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601544585 -0700 branch: Created from HEAD bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 af719b7766d3648a704bc34842ea928c77a3b0c5 Debora Velarde Babb 1601544628 -0700 am: Support using PCRs 15-23 for sealing data af719b7766d3648a704bc34842ea928c77a3b0c5 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601544651 -0700 commit (amend): Support using PCRs 15-23 for sealing data tpm-tools-1.3.9.2/.git/logs/refs/heads/master0000664000175000017510000000176313750245421020157 0ustar deboradebora0000000000000000000000000000000000000000 bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601544488 -0700 clone: from ssh://dvelarde@git.code.sf.net/p/trousers/tpm-tools bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601851157 -0700 pull: Fast-forward 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1601862609 -0700 pull: Fast-forward 33186568f4d7e867ca528220b3f2d3aed7cef77f b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602129192 -0700 pull: Fast-forward b7c185af74871f9cfb693f431e29c38239a71edd 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1602147305 -0700 pull: Fast-forward 49b9a942d6e905d1ba50de6329e5da03fe453d01 bf43837575c5f7d31865562dce7778eae970052e Debora Velarde Babb 1604406033 -0800 pull: Fast-forward tpm-tools-1.3.9.2/.git/logs/refs/heads/tpm-version0000664000175000017510000000107213737510322021140 0ustar deboradebora0000000000000000000000000000000000000000 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602129232 -0700 branch: Created from HEAD b7c185af74871f9cfb693f431e29c38239a71edd cfcc6cd32a5a984b2b667c59db2d0b7a5a90c09d Debora Velarde Babb 1602129502 -0700 am: tpm-tools: corrupt output of tpm_version command cfcc6cd32a5a984b2b667c59db2d0b7a5a90c09d b67b3d406b963531ad8a3a3c45ada534a2102ac4 Debora Velarde Babb 1602129932 -0700 commit (amend): tpm-tools: corrupt output of tpm_version command tpm-tools-1.3.9.2/.git/logs/refs/heads/manpage-cleanup0000664000175000017510000000130713737442113021715 0ustar deboradebora0000000000000000000000000000000000000000 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1602110017 -0700 branch: Created from HEAD 33186568f4d7e867ca528220b3f2d3aed7cef77f d051ec1fd25d86f5d1baaa7c986ccafc759844f8 Debora Velarde Babb 1602110167 -0700 am: tpm-tools: manpage cleanup d051ec1fd25d86f5d1baaa7c986ccafc759844f8 af9bfb533fc5a376494b7537959e4f00348e9ea7 Debora Velarde Babb 1602110479 -0700 commit (amend): tpm-tools: manpage cleanup af9bfb533fc5a376494b7537959e4f00348e9ea7 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602110526 -0700 commit (amend): tpm-tools: manpage cleanup tpm-tools-1.3.9.2/.git/logs/refs/remotes/0000775000175000017510000000000013735320450017323 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/refs/remotes/origin/0000775000175000017510000000000013735321205020611 5ustar deboradeboratpm-tools-1.3.9.2/.git/logs/refs/remotes/origin/master0000664000175000017510000000142113750245344022033 0ustar deboradeborabdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601544837 -0700 update by push 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1601862592 -0700 update by push 33186568f4d7e867ca528220b3f2d3aed7cef77f b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602128655 -0700 update by push b7c185af74871f9cfb693f431e29c38239a71edd 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1602147244 -0700 update by push 49b9a942d6e905d1ba50de6329e5da03fe453d01 bf43837575c5f7d31865562dce7778eae970052e Debora Velarde Babb 1604405988 -0800 update by push tpm-tools-1.3.9.2/.git/logs/refs/remotes/origin/HEAD0000664000175000017510000000031613735320450021236 0ustar deboradebora0000000000000000000000000000000000000000 bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601544488 -0700 clone: from ssh://dvelarde@git.code.sf.net/p/trousers/tpm-tools tpm-tools-1.3.9.2/.git/logs/HEAD0000664000175000017510000001427113750245421015340 0ustar deboradebora0000000000000000000000000000000000000000 bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601544488 -0700 clone: from ssh://dvelarde@git.code.sf.net/p/trousers/tpm-tools bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601544585 -0700 checkout: moving from master to pcrs_sealing_data bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 af719b7766d3648a704bc34842ea928c77a3b0c5 Debora Velarde Babb 1601544628 -0700 am: Support using PCRs 15-23 for sealing data af719b7766d3648a704bc34842ea928c77a3b0c5 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601544651 -0700 commit (amend): Support using PCRs 15-23 for sealing data 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 Debora Velarde Babb 1601851150 -0700 checkout: moving from pcrs_sealing_data to master bdf9f1bc8f63cd6fc370c2deb58d03ac55079e84 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601851157 -0700 pull: Fast-forward 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601862421 -0700 checkout: moving from master to no-opt 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1601862538 -0700 am: tpm-tools: don't use __no_optimize 33186568f4d7e867ca528220b3f2d3aed7cef77f 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e Debora Velarde Babb 1601862601 -0700 checkout: moving from no-opt to master 4486c91a1d1367b3db2e8b799ff5fb27553c7b8e 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1601862609 -0700 pull: Fast-forward 33186568f4d7e867ca528220b3f2d3aed7cef77f 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1602110017 -0700 checkout: moving from master to manpage-cleanup 33186568f4d7e867ca528220b3f2d3aed7cef77f d051ec1fd25d86f5d1baaa7c986ccafc759844f8 Debora Velarde Babb 1602110167 -0700 am: tpm-tools: manpage cleanup d051ec1fd25d86f5d1baaa7c986ccafc759844f8 af9bfb533fc5a376494b7537959e4f00348e9ea7 Debora Velarde Babb 1602110479 -0700 commit (amend): tpm-tools: manpage cleanup af9bfb533fc5a376494b7537959e4f00348e9ea7 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602110526 -0700 commit (amend): tpm-tools: manpage cleanup b7c185af74871f9cfb693f431e29c38239a71edd 33186568f4d7e867ca528220b3f2d3aed7cef77f Debora Velarde Babb 1602129184 -0700 checkout: moving from manpage-cleanup to master 33186568f4d7e867ca528220b3f2d3aed7cef77f b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602129192 -0700 pull: Fast-forward b7c185af74871f9cfb693f431e29c38239a71edd b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602129232 -0700 checkout: moving from master to tpm-version b7c185af74871f9cfb693f431e29c38239a71edd cfcc6cd32a5a984b2b667c59db2d0b7a5a90c09d Debora Velarde Babb 1602129502 -0700 am: tpm-tools: corrupt output of tpm_version command cfcc6cd32a5a984b2b667c59db2d0b7a5a90c09d b67b3d406b963531ad8a3a3c45ada534a2102ac4 Debora Velarde Babb 1602129932 -0700 commit (amend): tpm-tools: corrupt output of tpm_version command b67b3d406b963531ad8a3a3c45ada534a2102ac4 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602130454 -0700 checkout: moving from tpm-version to master b7c185af74871f9cfb693f431e29c38239a71edd b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602137390 -0700 checkout: moving from master to schmidt-openssl b7c185af74871f9cfb693f431e29c38239a71edd 672421195c97aed6d0fb0c317815a437d10d5e1d Debora Velarde Babb 1602137526 -0700 am: Fix build with OpenSSL 1.1 due to EVP_PKEY being an opaque struct 672421195c97aed6d0fb0c317815a437d10d5e1d 7edf8b692796d68dbe7de3f5e7239ad4089d4936 Debora Velarde Babb 1602137526 -0700 am: Fix build with OpenSSL 1.1 due to RSA being an opaque struct 7edf8b692796d68dbe7de3f5e7239ad4089d4936 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602137563 -0700 am: updating HEAD b7c185af74871f9cfb693f431e29c38239a71edd b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602137625 -0700 checkout: moving from schmidt-openssl to master b7c185af74871f9cfb693f431e29c38239a71edd b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602137643 -0700 checkout: moving from master to schmidt-openssl b7c185af74871f9cfb693f431e29c38239a71edd af2721fce36de31b35460bbc1caff74a84bc035e Debora Velarde Babb 1602137741 -0700 am: Fix build with OpenSSL 1.1 due to EVP_PKEY being an opaque struct af2721fce36de31b35460bbc1caff74a84bc035e 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1602138116 -0700 am: Fix build with OpenSSL 1.1 due to RSA being an opaque struct 49b9a942d6e905d1ba50de6329e5da03fe453d01 b7c185af74871f9cfb693f431e29c38239a71edd Debora Velarde Babb 1602147295 -0700 checkout: moving from schmidt-openssl to master b7c185af74871f9cfb693f431e29c38239a71edd 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1602147305 -0700 pull: Fast-forward 49b9a942d6e905d1ba50de6329e5da03fe453d01 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1604405782 -0800 checkout: moving from master to new-release 49b9a942d6e905d1ba50de6329e5da03fe453d01 bf43837575c5f7d31865562dce7778eae970052e Debora Velarde Babb 1604405856 -0800 commit: Bumped version to 1.3.9.2 bf43837575c5f7d31865562dce7778eae970052e 49b9a942d6e905d1ba50de6329e5da03fe453d01 Debora Velarde Babb 1604406023 -0800 checkout: moving from new-release to master 49b9a942d6e905d1ba50de6329e5da03fe453d01 bf43837575c5f7d31865562dce7778eae970052e Debora Velarde Babb 1604406033 -0800 pull: Fast-forward tpm-tools-1.3.9.2/.git/index0000664000175000017510000002344013750245421015000 0ustar deboradeboraDIRCo_u¡(+îÏ*_u¡(+îÏ*ýæ&¤èéy·8 Ž…ÖHe´ Ÿ˜2Ë®ÜÖ· .gitignore_u¡(+þ[_u¡(+þ[ýæ'¤èé-]É™ ~¤]»dø{úÎmv]–À†LICENSE_u¡(+þ[_u¡(+þ[ýæ(¤èéaxÈgoÎÒ?ÝzsnЦ»}€;õ Makefile.am_u¡(+þ[_u¡(+þ[ýæ)¤èéÁä`§K=V_UÖôROú‰²Rñü-README_u¡(+þ[_u¡(+þ[ýæ*¤èéºÇ¾œ ¯mÖK\žª¨x1ܺþ€é bootstrap.sh_u¡(+þ[_u¡(+þ[ýæ+íèéQdùPéÌ(ó-¡ófFwÔŒ DÎ cleanup.sh_¡K#c…_¡K#c…ýæà¤èéóÎá$üL™“{Û“Ðm1NÐÿé configure.ac_u¡(+þ[_u¡(+þ[ýæ-¤èéÇ;/2 ˜u{ÊÿÈ2ÝÀp˨óÛdist/tpm-tools-nopkcs11.spec_u¡(+þ[_u¡(+þ[ýæ.¤èé €&Âá§Q¡'¬ ªžRM›üdist/tpm-tools.spec.in_u¡(+þ[_u¡(+þ[ýæ/¤èéd é÷Û*KXF’ë·–KÂ8ÈLìøOinclude/Makefile.am_u¡(+þ[_u¡(+þ[ýæ0¤èé'¦ÈèEÐûuÈç¾vpœæ~Þäinclude/tpm_pkcs11.h_u¡(+þ[_u¡(+þ[ýæ1¤èéV“.(z«„œtÀ=”3Å¿Vèñ¡§“include/tpm_seal.h_u¡(+þ[_u¡(+þ[ýæ2¤èéçѨmÆ–Ý ôçc 6v¾»øc:include/tpm_tspi.h_u¡(+þ[_u¡(+þ[ýæ3¤èéÐX¬ÿŽ © NˆKù÷ì ä­I«include/tpm_unseal.h_z{Ñ)t1_z{Ñ)t1ýæ4¤èéÖ¼uÔ˜¤»Oü€\#4´çh^ÚÄinclude/tpm_utils.h_u¡(, SŒ_u¡(, SŒýæ5¤èé :f’){1™-„äö! {D©€Ülib/Makefile.am_u¡(, SŒ_u¡(, SŒýæ6¤èé#åõCëX’÷Øš°— ýjûO lib/tpm_log.c_u¡(, SŒ_u¡(, SŒýæ7¤èé„A„ Y™>ÕÁ«ŠÏŽá3å#¿ˆlib/tpm_pkcs11.c_u¡(, SŒ_u¡(, SŒýæ8¤èéAF‘JéGÂ]8Ìî!yÁY–ÎpnIlib/tpm_tspi.c_u¡(, SŒ_u¡(, SŒýæ9¤èé0ÎJ­òÁ»MϰJäîïÊÒ{]ˆlib/tpm_unseal.c_z{Ñ8¶b_z{Ñ8¶býæ–¤èéÛ0 Žж˜Û›ÇÒÀŸØ#ªlib/tpm_utils.c_u¡(, SŒ_u¡(, SŒýæ;¤èéì¶}åóÏu˜ 7Aµú vü§man/Makefile.am_~(2ÿ[~_~(2ÿ[~ýæ<¤èéÇø366EÁfh»'¶iñgÏ›-man/man1/Makefile.am_u¡(,•¼_u¡(,•¼ýæ=¤èé?“öù$òKÓŽ<̳+ŒpW£Ìþúman/man1/tpm_sealdata.1_~(3­_~(3­ýæ ¤èé€èñ,9,þª™vÅi”{ˆ~ ƒman/man1/tpm_unsealdata.1_u¡(,•¼_u¡(,•¼ýæ>¤èé \6ðÇ?ä^HŬ#§F‡man/man1/tpm_version.1_u¡(,•¼_u¡(,•¼ýæ?¤èé Vª¤üv>^ÃÁ´,Ñ?'LÅH|@:Äman/man1/tpmtoken_import.1_u¡(,•¼_u¡(,•¼ýæ@¤èé·ÄűëU0†O¶â:“Ïפ•Î’man/man1/tpmtoken_init.1_u¡(,•¼_u¡(,•¼ýæA¤èé!G0'ÅÚÝwXšýTÐÓb|)Ð.ôman/man1/tpmtoken_objects.1_u¡(,•¼_u¡(,•¼ýæB¤èéˆ+M­ú¥øR2ÂøÎèáéö<man/man1/tpmtoken_protect.1_u¡(,•¼_u¡(,•¼ýæC¤èéÍÒf™²ŠgÜyPtûµ:tîEÃman/man1/tpmtoken_setpasswd.1_u¡(,•¼_u¡(,•¼ýæD¤èé:ƒ¼8“Ç蹚×7fù¬c¢Ì×man/man3/Makefile.am_u¡(,•¼_u¡(,•¼ýæE¤èé•ÚHüù³ ìiph e‚=¸man/man3/tpmUnsealFile.3_u¡(,•¼_u¡(,•¼ýæF¤èéÿ¥ >y¤Ô®väðëþËä––man/man3/tpmUnsealShred.3_u¡(,•¼_u¡(,•¼ýæG¤èéÿ¥ >y¤Ô®väðëþËä––man/man3/tpmUnsealStrerror.3_~(3­_~(3­ýæM¤èéŽHzL„25òÌÁ€ÓCã–°gºädman/man8/Makefile.am_u¡(,•¼_u¡(,•¼ýæI¤èé N˜²—Ï/ª}´òx•Z±x+ÅúLman/man8/tpm_changeownerauth.8_u¡(,•¼_u¡(,•¼ýæJ¤èéCÝX³Œ³x5žHñ¬èÕ€?ncßman/man8/tpm_clear.8_u¡(,+×î_u¡(,+×îýæK¤èé¡rU$X±~ƒèÓB'c—ÿ‰×man/man8/tpm_createek.8_u¡(,+×î_u¡(,+×îýæL¤èé)^¡èvš¿Ø~ºÜ*G¼¦µ0­mman/man8/tpm_getpubek.8_~(3­_~(3­ý枤èé ÿì¦@]Èñ`~–ýq ]man/man8/tpm_nvdefine.8_u¡(,+×î_u¡(,+×îýæN¤èé ÔÆßyVR$l©ÅÌ“O";ÑŠšdóman/man8/tpm_nvdefine.pod_u¡(,+×î_u¡(,+×îýæO¤èé ˆ¯B–¼ØØºâ^ÜŽtªÛ·Çman/man8/tpm_nvinfo.8_u¡(,+×î_u¡(,+×îýæP¤èéçrO[çÇa©“N$Æu‰Oý*[?žman/man8/tpm_nvinfo.pod_u¡(,+×î_u¡(,+×îýæQ¤èéIÒÙ$‰‡2Ù}˜\YýNûüfFman/man8/tpm_nvread.8_u¡(,+×î_u¡(,+×îýæR¤èé 1ÿÁRK¿wøžwèÃŽ±xÆman/man8/tpm_nvread.pod_u¡(,+×î_u¡(,+×îýæS¤è鿃¢¦÷Õ‡RXÈ›ŽZBPÕ“¨™×man/man8/tpm_nvrelease.8_u¡(,+×î_u¡(,+×îýæT¤èézÖ*= ?Þ”†í&H­e̤³man/man8/tpm_nvrelease.pod_u¡(,+×î_u¡(,+×îýæU¤èéz4ÅÍûIüœYÆý–Z¨KM 8ù²âman/man8/tpm_nvwrite.8_u¡(,+×î_u¡(,+×îýæV¤èé Ñ…PeÆ„·,0¢o£Ëêcåªman/man8/tpm_nvwrite.pod_u¡(,+×î_u¡(,+×îýæW¤èéß#¡6®ù¿.ã÷:µ8+çÖ<[man/man8/tpm_resetdalock.8_u¡(,;_u¡(,;ýæX¤èéH6 a¦,ýµë7|¬<õ²î›Öman/man8/tpm_restrictpubek.8_~(3ßÜ_~(3ßÜý桤èéºy5·¼hã‹w¡'ßoŽÿSz²ãman/man8/tpm_restrictsrk.8_u¡(,;_u¡(,;ýæY¤èéÅpGuƒÐo‚¶…³±¿©0ø>man/man8/tpm_revokeek.8_u¡(,;_u¡(,;ýæZ¤è铜}ÓG¹E¦ÎT;WÐÅ+—èà¯man/man8/tpm_selftest.8_u¡(,;_u¡(,;ýæ[¤èé Õ»ž°úôûwØÿágB ¸1'man/man8/tpm_setactive.8_u¡(,;_u¡(,;ýæ\¤èé 13k÷‘÷Ìì€ór€úÑ5ä@±man/man8/tpm_setclearable.8_u¡(,;_u¡(,;ýæ]¤èé {º §q³mþôZšò5ÍZÕ%‹·man/man8/tpm_setenable.8_u¡(,;_u¡(,;ýæ^¤èé‹òÆžòJϹã£MGšaY‰ ˆÈman/man8/tpm_setoperatorauth.8_u¡(,;_u¡(,;ýæ_¤èé]·euÁPœ|˜/Èœá¡ãÈǪman/man8/tpm_setownable.8_~(3ßÜ_~(3ßÜý柤èé ä–gÅÂ2¯9f:$ =©ùxman/man8/tpm_setpresence.8_u¡(,;_u¡(,;ýæa¤èé¬oÜšÊQƒSbʇ.dO‹½;„man/man8/tpm_takeownership.8_u¡(,;_u¡(,;ýæb¤èéåIôÄhÀÁ#èÜAPÌù - po_/LINGUAS_u¡(,J\O_u¡(,J\Oýæc¤èé ëfŹ]ÛA ª4¸·¶'`a8Êg po_/Makevars_u¡(,J\O_u¡(,J\Oýæd¤èéÂuy1è‘ Øír:ˆË~Ú€¼po_/POTFILES.in_u¡(,J\O_u¡(,J\Oýæe¤èéWä-GvêçËdIàϹgLX—Ðgpo_/tpm-tools.pot_u¡(,J\O_u¡(,J\Oýæf¤èé~ÆÂ÷^àÆB,¯·€¤KÁ)TUsrc/Makefile.am_u¡(,J\O_u¡(,J\Oýæg¤èé`'üžõ'ð†Juk»Š?Î)|9ðsrc/cmds/Makefile.am_u¡(,J\O_u¡(,J\Oýæh¤èé(ˆö< ï‰°jç†~Eñ|"!0dsrc/cmds/tpm_sealdata.c_u¡(,J\O_u¡(,J\Oýæi¤èé œ !+D{$q—’á÷ÍÐÖ²\_src/cmds/tpm_unsealdata.c_~Óé8¾x_~Óé8¾xýæj¤èé&”WaйL?YÝ`D€|䦣å;src/data_mgmt/Makefile.am_u¡(,J\O_u¡(,J\Oýæk¤èé±Ý£4?šîŸÌù¯¤zÈùAiwrsrc/data_mgmt/data_common.h_~ÓéH¨_~ÓéH¨ý泤èépåS%C÷ÓB8^í´‰äÆï[ƒ­®Fsrc/data_mgmt/data_import.c_u¡(,Yž€_u¡(,Yž€ýæm¤èéYÕ´&Ûô´¿ëÉÍ[šl"³¬âsrc/data_mgmt/data_import.h_u¡(,Yž€_u¡(,Yž€ýæn¤èéu¼È. ¡1о “¾êòç¥Ì&í src/data_mgmt/data_init.c_u¡(,Yž€_u¡(,Yž€ýæo¤èéÌ3l ɥ߄„d¿ø9Ü©–csrc/data_mgmt/data_init.h_u¡(,Yž€_u¡(,Yž€ýæp¤èéˆ_óÄñên>cÔu'é‹ÍgÞ¦Üasrc/data_mgmt/data_object.c_u¡(,Yž€_u¡(,Yž€ýæq¤èéëçܸ9_B®¿ß)uotnˆ Þsrc/data_mgmt/data_object.h_u¡(,Yž€_u¡(,Yž€ýær¤èée©v |²†L¸ù¢tÏhÝ Éûþ9src/data_mgmt/data_passwd.c_u¡(,Yž€_u¡(,Yž€ýæs¤èé¶¡ÿs ó×c•Ü8g{hv0÷Ùsrc/data_mgmt/data_passwd.h_u¡(,Yž€_u¡(,Yž€ýæt¤èé/AEJŒ.„]/ðI¬v…+šÈ%Ùâ £src/data_mgmt/data_protect.c_u¡(,Yž€_u¡(,Yž€ýæu¤èéùPF̵M5©¨´|ÈúK‚6W†#½src/data_mgmt/data_protect.h_~ÓéH¨_~ÓéH¨ý滤èéÇ*`ýô’{õܵÇÐUš…üw`–Ðsrc/data_mgmt/openssl_compat.h_u¡(,Yž€_u¡(,Yž€ýæv¤èé ã|¤|’÷ÜâØÂßÝKqõÏ–gásrc/tpm_mgmt/Makefile.am_u¡(,hà±_u¡(,hà±ýæw¤èé2O…1m^øYdËënZ ÆÄpsrc/tpm_mgmt/tpm_activate.c_u¡(,hà±_u¡(,hà±ýæx¤èé®é ý)«ùc´]וœQ•µá src/tpm_mgmt/tpm_changeauth.c_u¡(,hà±_u¡(,hà±ýæy¤èé –Ç²†üåv]ôšFÇÈH«ú4"ïÕsrc/tpm_mgmt/tpm_clear.c_u¡(,hà±_u¡(,hà±ýæz¤èé¯Djxyn CX>´Ó}Í72 ‹src/tpm_mgmt/tpm_clearable.c_u¡(,hà±_u¡(,hà±ýæ{¤èé ç<+UQGàf’›ZÕV§&¦},"src/tpm_mgmt/tpm_createek.c_u¡(,hà±_u¡(,hà±ýæ|¤èéãùM@“s3°²t¸$¾¿2ô(src/tpm_mgmt/tpm_enable.c_u¡(,hà±_u¡(,hà±ýæ}¤èé ÊîAî })¤ehYlPúj-Jsrc/tpm_mgmt/tpm_getpubek.c_u¡(,hà±_u¡(,hà±ýæ~¤èé—Vxº´x ¢þBºôŸÇ˜^£3src/tpm_mgmt/tpm_nvcommon.c_u¡(,hà±_u¡(,hà±ýæ¤èé1¯Ä˜·Ÿäı²"Ÿés%4€³©øsrc/tpm_mgmt/tpm_nvcommon.h_zO.¡˜ß_zO.¡˜ßýæ¤èé-K(g±ÔãBÙËA„e :#Ü]src/tpm_mgmt/tpm_nvdefine.c_u¡(,x"â_u¡(,x"âýæ¤èéÚ‰dh½0bˆ ¨ÄlCmÈ?¿Îsrc/tpm_mgmt/tpm_nvinfo.c_u¡(,x"â_u¡(,x"âý悤è鯒ðGÌdϼò.ôë­-s²úsrc/tpm_mgmt/tpm_nvread.c_u¡(,x"â_u¡(,x"âý惤èéò[$/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- tpm-tools-1.3.9.2/.git/hooks/post-update.sample0000775000175000017510000000027513735320432020544 0ustar deboradebora#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info tpm-tools-1.3.9.2/.git/hooks/pre-rebase.sample0000775000175000017510000001152713735320432020326 0ustar deboradebora#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". tpm-tools-1.3.9.2/.git/hooks/pre-applypatch.sample0000775000175000017510000000061613735320432021227 0ustar deboradebora#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : tpm-tools-1.3.9.2/.git/hooks/commit-msg.sample0000775000175000017510000000160013735320432020344 0ustar deboradebora#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } tpm-tools-1.3.9.2/.git/hooks/pre-push.sample0000664000175000017510000000250413735320432020034 0ustar deboradebora#!/bin/sh # An example hook script to verify what is about to be pushed. Called by "git # push" after it has checked the remote status, but before anything has been # pushed. If this script exits with a non-zero status nothing will be pushed. # # This hook is called with the following parameters: # # $1 -- Name of the remote to which the push is being done # $2 -- URL to which the push is being done # # If pushing without using a named remote those arguments will be equal. # # Information about the commits which are being pushed is supplied as lines to # the standard input in the form: # # # # This sample shows how to prevent push of commits where the log message starts # with "WIP" (work in progress). remote="$1" url="$2" z40=0000000000000000000000000000000000000000 IFS=' ' while read local_ref local_sha remote_ref remote_sha do if [ "$local_sha" = $z40 ] then # Handle delete else if [ "$remote_sha" = $z40 ] then # New branch, examine all commits range="$local_sha" else # Update to existing branch, examine new commits range="$remote_sha..$local_sha" fi # Check for WIP commit commit=`git rev-list -n 1 --grep '^WIP' "$range"` if [ -n "$commit" ] then echo "Found WIP commit in $local_ref, not pushing" exit 1 fi fi done exit 0 tpm-tools-1.3.9.2/.git/hooks/applypatch-msg.sample0000775000175000017510000000070413735320432021225 0ustar deboradebora#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : tpm-tools-1.3.9.2/.git/hooks/update.sample0000775000175000017510000000703313735320432017560 0ustar deboradebora#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 tpm-tools-1.3.9.2/.git/hooks/prepare-commit-msg.sample0000775000175000017510000000232713735320432022007 0ustar deboradebora#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" tpm-tools-1.3.9.2/.git/COMMIT_EDITMSG0000664000175000017510000000053713750245165016044 0ustar deboradeboraBumped version to 1.3.9.2 Signed-off-by: Debora Velarde Babb # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch new-release # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: configure.ac # tpm-tools-1.3.9.2/.git/branches/0000775000175000017510000000000013735320432015527 5ustar deboradeboratpm-tools-1.3.9.2/.git/ORIG_HEAD0000664000175000017510000000005113750252470015205 0ustar deboradeborabf43837575c5f7d31865562dce7778eae970052e tpm-tools-1.3.9.2/.git/objects/0000775000175000017510000000000013750245165015401 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/d0/0000775000175000017510000000000013737441327015707 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/d0/51ec1fd25d86f5d1baaa7c986ccafc759844f80000444000175000017510000000044213737441327023360 0ustar deboradeboraxMNÃ0FYûsDŽSÇIU¡‚X±­ÄíqkHìÈv½=i)]³œ7úÞü˜8M¾ÀFȇ’ˆ@4’í0p¡¬ê-\o™A·¼çˆrzÐV"›1Q(жMßÉ®w«¨ï”A)z!¸n°-’U†œRŽáRN1Á+¥t†Cð%Óˆ˜`÷‘‹}"{ÂR›8=B#7«V¶=‡Š+ÎÙJ×= %x!ÂÛO–െ½ÂýèÃò]{=Ý,MÛNÝ,¬ÌSUbó& 3 ÌH–™]zï‰rIÞ”œ>ƒ… [B&-„õf˜|Î>ÿò¹fOÖÞiœ‹!C‰×lø²ä| »,S™×! ÕŒü1­¢s•>oÿùöÚõ‘ tpm-tools-1.3.9.2/.git/objects/eb/0000775000175000017510000000000013737526666016004 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/eb/e9efa37b41db4fec7b85b3cd5beb047b9238fb0000444000175000017510000000071113737526666023577 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•á ŸØáþëγÙóÿe/hà¼YQ‘“™ÄÐ÷³bûÜ0–¿ ün s ªbwÏŸ‘ÍMÌc¨w™z©è‘k¡¹:¿od¹§jÇ ‘-Èg¸™qDzã¶Õ~ÕõûnX«ýóD¶¸(™álíååÛ3nè9u²þ£ïÑú)µY/ ²%©@‡ (Ç‹J]Ñöþ!K†öG³7,.5Q'Éùtpm-tools-1.3.9.2/.git/objects/cd/0000775000175000017510000000000013737526666016004 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/cd/7dd3a7b768d82dc4cac97ff14dc57f947d6ae80000444000175000017510000000022413737526666023467 0ustar deboradeborax+)JMU041d040031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ç$õåNWÊ$sÚ…op É_³Š¥«"’X’Ÿ›ž[ =yIÖŠ¥¾Æ>¯kÍØ/µÊN ¢¦¤ ¢¤ÝŸyǹõ…SÞž¶~°>¤ëÆ1AkÛæ9Àtpm-tools-1.3.9.2/.git/objects/94/0000775000175000017510000000000013737526666015652 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/94/57618ab94c3f59dd601744807c19e4a6a3e53b0000444000175000017510000000156313737526666022657 0ustar deboradeborax}”ÝnÛ8…÷ÖzŠÚ‹Häx‹] T±F€IF €@Q´Å†"’²á}úJ¶ÛÙÍE¢ É33ß2*‡ÑçOw|ð>Àœ¼°5Ì'•çþï~Ò’A(¹åDÀ„m™P5Ó Ö`qa©ù†K\«‚7¸Ó2-‰å £½ÆCc¸dÆ` Zº/ܯk¥Û}>DJ»¨fIJò=„óþø›Í@4ÃÃõ—®Æ×ðçÝÝ_7î÷ß§Ùᘵ×y?{ ÄNÍ@Ì Ó[Vø'ýc[µVM*×áZ3F­íK¹‡½j€ šÜXÍóÆ" DC¥¡R_ïû p¡‘òsðTeŽ$Ǫª”„¨É§0ã”IÀ`j1eK¥×A:oÞ㨨aË´A’0:Ê„nk¹"Ö•‹æÕ÷u¯Fä‚ïÏÿ_ÿ¯mÀeÛH‰#(ýí8òÌ4†­qÓ'A0ð#LŸ–«‚Å3üâ8X¤Ï÷x– Wq¸:=^Õ‚cÃHXi÷ØL/3ŸÆã'<<„³0}v}=†ébš$ð¸Œ!€(ˆÓp¼š1D«8Z&S AÏP¯ò>íukXÁ,á¼ÅðŒ>,SP’-C¿)ã8*@€â8y¿+ܧ%BÉMÛ/Vó:V÷À× •½9йB„[Îv.ƒíJkë/Ãán·ó‘¹4è&e¾Ò›!N›3¤µùw~]Ö®|/ç2‹âå÷8˜'ƒ¯[WV½0™q¼ÒƒÁ/o0xfkbÌ®8‹«ü7£ÖœEÑ%¼·çxS,nö<©¸46{š“iœÀ×AA,Éh;æ~ mæ6Ô霆°¸“@WÁI¨«ô4Ôå>ÆZBF¸œ5A=¯½Õ‡ò†£•kA6Æ æÙ8ŠgÁw‡è6üxeUM ®¯‡\RÑàëv;ÉfábõÓóf“`2àÖnc+Õn$ß¼®š4šCê Á»Ô¾±üŸöQÄ¡ª*|C¼òd¹ŠÇÓÄåîØ9Pô\Š–Dn´„”..µz£{ÁƒÞê…bÇð!²—j‡ñ8×:xö_Zí—j]¼ë;m§ {}ÒF²7f´Ÿ×Hšê}mÕ9G̽än>Ý#yø°Öç>B9Œõþ¥ñO»tpm-tools-1.3.9.2/.git/objects/b8/0000775000175000017510000000000013737507136015716 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/b8/bfae7ae21eada285552fec7a62ca96b55b08be0000444000175000017510000000071013737507136023474 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•á ŸØáþëγÙóÿe/hà¼YQ‘“™ÄÐ÷³bûÜ0–¿ ün s ªbwÏŸ‘ÍMÌc¨w™z©è‘k¡¹:¿od¹§jÇ ‘-Èg¸™qDzã¶Õ~ÕõûnX«ýóD¶¸(™¡<šqþ醡Á nß²ß×}™Ö÷» "[’ t¸€r¼Ø©Ômï²dhßy4{ÃâRñ¹È tpm-tools-1.3.9.2/.git/objects/bf/0000775000175000017510000000000013750245165015770 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/bf/43837575c5f7d31865562dce7778eae970052e0000444000175000017510000000030113750245165022647 0ustar deboradeborax¥ÎMJ1@a×9E] Cåw:""ƒ7ܧRÕ˜t†˜½½ƒ7·ßâñJo­Npæt7‡ø¢ñ'Þ˜ ZJXØn„+Ç 'c™¼‰Ô5Ù'øD)'o9JÂÀ†r@–èl’ÀÝ&>8F£ò1ßû€g¡>2¼Ê%8g"xà_|ºÔýøÒ•š.½=‚‰è=†5DXpET7½½Nù_Ev†Oµï0;ítÒV©—ú¶ /}Ûú¾ÿìúç€e`tpm-tools-1.3.9.2/.git/objects/d4/0000775000175000017510000000000013737526666015725 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/d4/d2052bc6ea2f085d47bb86dccf2afa85a2b7a30000444000175000017510000001716613737526666023431 0ustar deboradeboraxí]ûoG’¾_¥¿¢íIQ,Û‡6ö*Ц®%’ )'†#r$Íš/Ïr´Þüï÷}UÝÓ=áD)>'9,á‡4ÓêzWuwñl<;3Oÿö×ï¾û¯ƒ½m³gú—±iN“EÍ‹ø*Ïæqjfçfí4¹H¦xSŸb“dh¹ˆÓi´HfxÊîGË,™ÆYfN¢á%BÓt>K¥É#Ó™¥l›™aG‹xdήMóè„=ƒv&Jcü>¿Æt— ³Sß5O?þkq¶|*v®ž­6›.‡ÈL7Îâô*=Bkvè_úy:»H£ ržÆ±Éf狘û¹¹ž-Í0šš4%Ù"MΖ ¬wa¢éè`–šÉl”œ_s<[NGÀÑ\L2‡«úl2™MMgy6N†æ8ÆÓ,6få“ìRÏ!°þpñÏMœ`°Ô\Åi\™'nD;ƾ;Ñ‚@‚2s"t—EÓk3Vó®ëë×42ÉT@¿™ñFÅŠ>&@ÜYl–Y|¾ïsl ÀüØìÿÐ>í›Zë­ù±ÖíÖZý·ÏÑxq9Ã[ðŠ•Læã«&Óhº¸øá¤Ñ­ÿ€.µ£æq³ÿ–‹xÙì·½žyÙîššéÔºýfýô¸Ö5Ón§Ýk<2¦² ¡çBðË(^DÉ8sk~ fl<2—ÑU Jã `"3g9œV*ÈϦ²8Ìïyå¹IÎÍt¶ØwãK€ª«$þÈÁì{¹XÌŸ|üøñÐ:Í@§aüh–^€ÈÙÁp>~òèñ£ùåœloÿ%™ÇKHÕÃQ´ˆ@"DåÑåÃò‹¡°_ø7_Ì'ƒùûaöäÉ£ËïKÏ— bƒçÙb4NΊm—SpúHžâsˆ®¼jzíÓn½ô½ˆà¹bß8M§³Ò²òl|fQ±±{ñË_·þÍÕW¿›Ç“êQ6-­ÞM_Í«»l¾ØÞVÕ÷ ººí*J“èlgB˜áe”š½‹Á<û×ËdcMëôøøùÖÖÁiŸý3Bf„Zæœ ¦Ñ$Þz5GÒ¯ª×(ž.’ód(ʱºwÿryÓœ 4ØN¦ 4ºœYmÃ/kǽ†BiŸÎØl1kœúno¡§åS膧­µäd¾€ÍÇ×áÂú³÷ø:ôÑ8:‹Çf1³*d´m'â €±¶X¤Ù›hœŒ<˜Ûõ׃£·ý†T/{K…Õd÷NþѨ÷!dN#_Eãe̾ÇíÖ+=ÓŽÇ€ìÐ<~^·‰9õãèq›/ª†<Õ1/ËqsÄñäS5h wo•50èqí¨q|˸ìhG–q-Σ4‹ëÑx| ßSŸÓIgCZUZjØ!cé8´&@4ßQ½]`*žÜ¡h–ö|•^ü a“F¹6"¯£Q-½0»æÓööV?¼4;F{ËSaálcyËôŸA%O¥ÉA2ÚÞÚF°‚_'_?ÃÏ[Ð¥;æAaB>ÞJãÅ2šoŸ<Çì[["}¹Á–sÀùœíÎàT¼—. À)æ!º»V¹óã%~„–%Ðòl&/1ˆÂ÷þîð)ïš Á¦Ž`cé„j–q Mï ÒðRæ8„ÿd…kow=päsDzˆq<½Ç'Ñ{E²%¿¸6ËsÙë¥CÓïž6ViÕžŽ¯-ÒÌñµœÃÄâN˜Û!Y†“"×ì›~ûu£5h‹Z¼n¼g›EüÿÕWä(‘’M:×Ý>zÙλì[ÉÅ¢Ï7f’.u®yxg)OtððóÁÔ)å,ÇÉuŽjêòU¹+¤&ã§'ŠË\]W2Çb¡ÊsJXÄÊZUZXßÜŽfw+!zOˆTköúÝfëÕÃ$}Ä)ud®E‹©~µcçu½÷—'OT»²©F£5N9á”ætý|VYê4ôþ¹2uÀ°`Õ;ÙîšæœAÕT¾˜€ƒòîÄu¤¡ ¬8#kFD($ÑM³ý›üUxFí¶V­­öšÃRðÊkY¶bðÈñA4Í>2òTÅ6>O¬„ZŸM‡Îe]Ý‚ÉȺô2,çPŒéô÷g€®Q‰w&&£Ü€†>„JòžXd¼»²2/ŽG:¤E–¹Ï±¡è]"À÷Ãó„Œ'ÏÞ?›>›/ž]SÒ¡¬—p«Ý}Œ`ŒmßýÌÖŸ(ŸÐI„åá>|Ó˱ú J/€¤)hBݧ£a~ ¢9ëÆÆÓ ±ã{«£Îƒ†"7û>l F¹±ñ"h,ä¯àÚ¶úÈ,'­åÄ! Ê’ųs®üá®9‡ø…2‚m¢ÛE<ÓdLÿ1ŽSqù„Úên‘¸DgH¿ý`–}"-CgvZ)°7¢tÄ>söCø{†–³àýÉk2tÖ÷‡ô@ Ž0ØUèIv±cí8uä Ñí"›@ýºU˜Ëªd.àiL%ÒÇy%­ý,?süJsJ²ñ i¸•mÑŒ"Á÷½8JáBS_©6ÉóDÙr®ùÑ!’‚‘„Eäâ€:»¨€å¬Bø©Y$ʇÔTÝjo§½XW@ºcà(öi¶[¤j^Àä`ü²‡ÐJ!”ø\” ;Õú0G§ŒßäM°`˜·¾‡®ü0üOv©Ï–ßr|¢í0“õÕt{Ô9—ŠéõÊ“±Ór¬½d>«¯0~÷L•^ðëÑQ»}lÌY?]Æõ^·ù÷b˜Ø9²NçÑr¼0™Ò×›TéàeñB[rÔbøäЬþº6Wtß|%SA¤¬ëÌ»¹cSï#˜žç¡2 ‚_§ôؾùÂ6mÂññ¬4¡Á: -Ç¤Š¯OÂUi^£` ¿X‘ŽÂ#ìðÎT þ 8, ½¡gX†(gŒ@µÉˆ·À@B[î@OëÃña‘ú|“ª5È"£>ÌÛ-) §q¸“Ÿ‹( àŽáà‡PÝAû5Hò?P°Ï$zÏ}áe<|_©éÝV(#j/¤t‘Q§Wl©Rs:NÕZQw—i ÛÆTÁÈ7ϑӇç­,*JxÅ)ü'íŽ)Àcq¢˜àІêÉL ØY½Þ¬ZH¥â Ð[­Í*'Xó&½É¤Š)°ÐÆeÒ i6PYͲi–Çzk`Í»`²¢¶Ýsü cäµ U‘W¬x© ˜ý ¹,äß1"—ƒá̓N·}ÒaýMþ®å7 Æ òÀQãc\!擊)F®MrU.S ¤gÅÄ‘§(yÐÚ3ø±¸öÝÀ¯Ùº˜ã°W")*™±Øø{ÈÂ+¹ezãÜkÂæ†c~œQ¿Ma­Œ÷m'öR슣±!os´­lž‚þô-}\r$§‹(Ï2 >à!Gì Èáðç´,öAÞúßÿ–Þ[’Y&È_ ˆ†Bfå$}ãÚàµÚh õÃNª 毜Žÿà¯$Bèì" ² b ÉÍ¿ãh(0ÛGny¡ºc@“ëµQ 6ž]7ª|¾4Ûx†¤?Øgs¤Õˆ¹J¯‰OXRnj™ììt'^EUÃtO%Uåßݦ¦¤ÏŠJeC‰ÆžvwÆl«ñ¦3è0'½7ÇÔùFÆÎ§rm% !ªg’@¢jãâ ­¢XR™[u¤lÙª„·@sË4h»o¦U‡[ ŒÀ軑¦3$ Ô„KüÝî £.A¸5ìÁAŠÙV'V'[;¹IÌ™ß%IÁN³EV’þ.oÀß¡¼uÍúøv ºtÔÅ/§YrÁŒ¯lòCxdÀÀ ,¬¢öiU[³…™âA–as˜”ë€uÆØ„óœR8šÅÙôkl£iBY^vH‹€°#ÿjôÇÍ#ЬÎ*Æ‹w\ÞA;Êöƒð–ïÕmÔzíV©#»t­ö ×¯u9r«áí (ÔDÞÞˆ´49òpNYÅÔ³›¬Ù3#Ö[øÖRMh<θ³Býû Žq e®eS)[Âë!fâÓy§Ýs™}ËÙØ?Ì%Tì 2HÖ¾¯ /¢t(l%tF–Y[°2Öh™…"§¼r#‰ˆU4–¹(Ä'zp®u0òysƶQj1—Ó ƒ3øCƒ9YYì;åï¸ï‘ƒ.,æè7Üåò9²ûãðký§@! "éß ¼^é|õ•Ѝ$øÎ‡ãYFKµ ›ÛD\Á,H¨EíBUFÃ`S0L±ý4 f¶ž•õx¶ ûW0¡d« Ä·[aMå» Þš@ºÅ£"ˆóÂÍÁæËf½Öo úo;È’-„îj;hVë™ü_Ç'R´š¯Ë•GFü!Cû’ÎdH«Ù;CøC ºäÓ&)K¸*¢ l¡õòdNàËHèêªsíX@Ýï Tû¹š8P)¤©‹ù? Ø©‹ý‡¼ WÓæ6Ž ÁÉC+="ZD±¿ÃÏèiZô@Jå}±çŽúN¢ä§·Ê~kY,§Ã}VÇŠwEÖ„! ãæ5d7hÕN$c¾7obsY(|œO·U뵞 š­~ãU£ °‡™hŒ]ž¼…¯‡¦öCƒ`zŒ)‘ ÂÃFÔ4öȳÈùðU½‘4ÓÉ9€DÎÅÞTÐiùò¹iÂíÌœqwÒÕk8*Ÿá˜ÕÇN:Q+¶~SÝ@”×ôÁCðf¸p‡½…N·ùf s8Dù Ü“Òè'í0nµ£céÅ’ ‹lœ¡‘cNvG‚'ŽtOÂ= á.›ÖÍQÛÏ‘?*Áõ9·I°Û,;)½Þi£ë6—Ükt›µãAëôäh]“7µãS IÃÛ»h’—"¹…‡æ¶ØñVy˶K1kkì¥|ø ûVt€”£å´*¿Ï&òZ)ô¸nYµøÌÚsÀÝt ¥#ë:ÛÕ.h1J û|Gÿ¹äÒo)4ª—’§Šb…{©€k¼zÌáôýþžg]Ëíç¶@€‚*¹‘^7TÈU2Q%|¯/D‰"OŒÐ†9HJ’üW¥Æø™°¶ñtˆû-#{–Ì]XŽ¡5l‡Æq^N ]!eÖ/Î5ÿÂëâNu!ä±§¶·¼13??šãP¶lsçâ¡.µYŽ¥‘%±s*Ší¾+•ÓyµYa¸øÅ¦Op°[Ѥ0œE·Õ{Ög$"Ê„´¢Ý#U›\•*ÍQÁÝ^BëiPÛm3ç f%cê3˜©¸áM äÎ[yÇ™…©VÞäˆæëê˜z4ãê9„ºÒî`9}é’ò—=$=8â]kßs‡ú>n´Ø’5QVÁ÷džBüJw¥¤[¯§¨ä(˜tûß0©ÕÔÈT•¤`²›EÈùÀ”L¶iæÚžRõön–®æö#§a Öó ô/‡&’„^I@Kÿ½9»ÁÝÐì“æ˜ùÈ?ïðÿ2Ål ¶Ùè½@’@äë)@=F<æQ\ý2ÿ¤ƒOcÏTB ¤á))ºò¼4Ƶ¡xÃæºœïW v”Ãɵ/–ŸÐÿ“ž®Î}Ã=õJ¥jãøŽINæ”Køß:-©4¼ï,Ï Z¥*ÅVÊ{’—–Õ@sãÄôÿ׸)[5†ê6ÝTZ=KX„xã4˜Sl`¡ëÕ ¾=èœ7ëLWÂ0o­¹S*»ÑÈ#~œÚëÕ´U1uêbh´úÄPCƒ8DÛ ƒ@ÒBP WÝİñœ5hNnJ¬©N@rôn â>ORX!±ú>¯ÆÝLÀ~æºG‘•´ÇÍ ufc¾q ùàFVÈù@Z¬àFº#mÿ„-SÕúJŠJõu¼CR 3åžT›ª ßc-q=L*Y ÖÆt^£,©7V7²^®åŽ?¢¨¦ï²ížVÐ 8þÉaÚ˜yœh“ÀTÔö³Þ^¬e7Ò—VŸ¨aù¡ü©Z°ñ°ÝMŸk•Š÷ØõV…íã‘Ê1vÄMpHÕÿ­w³n3†ú†Ý”›z•ò™˜'¶+ã‰{¦š¢8j ¬œ]/b9òLÇëÛï§š”á½h¹€}hªÛÅHòõ{:0íöR+š¹Ýž—NIàM¾ÀwܪÙãþÉçþfÃ#02ÆÏß²{+I ×E]8ƒ ºO‚Ü(¹Å]‚üØ-ixLÅ’<Å’n°;ÀËIP¥·åAö”æü(ë¢ýY7,BUaQîW»pD(ú—7Ýΰè¸ëNF£Uï¾íô¡°6¸Mòû/ßÞ¥í Û¨·Ñ}„Ñýõ÷5ìÖ:›¶ÅfÒéñi6þP„Ãý ËäŸ:íV£…õaïH¤¤â*Ëý}´@¿ØÍJÝØ˜âH²y• ÁDy¯à¤qÒîGkVBG»÷r†úI8ȈË)Jáæ±ÖC²‡PèTQ ·­·· ›Î¦OÑQ²ËªÀ€ÑaïˆÕ[˜Òªyf+8öŠž¿=éÉp… Ï Ù(`(/ÁÎ]²šåTøõg oU~Í›$[ A¡kR²a>sƒ G¹»§c·ßÙŽi>PJ™¬³w¸¬O‚Ò.Îo²ŸsßîÃMí>øv£ÉüÉMMù>lýá–Ö‚ÖɇÉàò=ÇCû;ZroçGм€yðVVxû!x+Ø/¼Ï'ÚMÊÝŠŒN>æax³÷9[ò€/‘ÅP^s +¯Áî}%ƒ”³Vð]y×ÉÇ ²…¦C¸à)Üø‡Õð0ÀàWŸ¨£*8³43ZèÕ¿•©óõù¹%¸ÄŒvï8`~]êp˜s:)×öb ìE .°Ë…¾;È^µâƒ×mwbß„ˆ9nÙù¬ ÕF³<Ó¨9ÆàpI)øä%Õ£%y÷Íùñ31¢ç2!£O†ƒC dtøò+ ê> ¨s¯pƒ3(‚x€Y‰u2ÃZt£Ó†¸¾¢K¸ü-ˆ,ôe7”¥ß‚;Üö³ÅF›¶0Vã—E¡ú¥ÊVTÑc²Ô¦Ä¦-w† ªzl3š*â+PáΚ«×e}f95–ò Šm…ÐØVL«ËÈÕ‡zÖÖB>… ½½a*!—‚ÎvùMi˶Pœ;ý£—Úõ>î.Ú²ohôž\ÃCCP=îâ. ­j:¹ FÈËpZ kzîB†„Wxð†ðð| 9à¶¿–ýÜ×L:ôµÃ…WÕ¦²c?p>a`Ñ¥RÁ–9Pÿ㌫E+²Æ‡«`,9@x+ (¬àÇ $uT‡å#p†(/ƒÁª $èuYTV8i¢ØRë•­|±òt,2VÊ%lP-AšÜµXBpÆE¯xò"f~DqÅîyA²µvvÔ\ìæ0î(ÌqÛ™+‡”!÷/ù- b¥@#ïhceüƔ˴^¦8R2ÿ|9rwÃ._E-·° „·m´¢4*ÊõÁöªíqw§•u€]Ûå†b-HioOPäu]KE M­¨-°É¥unk;¨[°|ðŽJ…KXË~¸CËÊX€´Â‹Ê=JÌ"WãDêr[›`zи‡ÞÚêIÝ-û˜Ï Z¶D]òäo$¾Ó£‰âX½k샻€Û~Ñj͹óÊ8o®%7Ñå4Çcü½˜¥(ñ=Ñ~¢hÇ3^¦×óÅÌÖí” ‹:úK%HuDµ(K+®õà°ŒüÔ±+&Û¶mÓ3@,¿[—A~öŠöÆ­)Œ_¬7 å¾jÑ*>“ÖÂà©„Û¦ÀïÁɶ(Ô¾’ÓªaXøZ¹—"ü ±~`[¢=.oÚЕ\uÎÂPR—i‹¥%¨PÔ‹aµî|ÅÛwÐrÛpƒœñ³á¢à<þ_¯CNñ¹âU…eܛԊ’{/®ˆ\„Û®R÷³,f¶(b½tt™ &Sì«Í…¯Îè*øZ:Óz*,è‹äÆ>|íä i|5@Z 0XµùµÅYö7C1/<Á÷%hfj’µÒqŸøã,E¿ø~üVM0jXàÛI” -ÍŽ­ð û$,V¸/LŠA$iXŸ¿Î ¶^Fõ>G^c8|ÂS÷š£¨*¥#µ.ƒ³š€Â®n$Âå7#Px]͆(«Óa‰ÁÊ×Í/Hž o ×X<äcs]꤂p€Ú‚YÕv)A ƒ°n´ÅÔ¥Tcv‰’êN›y}biêá\RÐG´Qnü{ƾõ>ÕgûîªY?^žÙo{¡ú Zªïƒg”9¨Pâ!øÑ=#ˆGÅ+’9¯—,üYñ^aRû-*â1“ý‡ã8šòëgä‰p3Ñ&Ž£†ïõ“(×\¯£¨6–@b±¹-¦UÑëe ÕÌ_Tuôëq´XÒÿ+ŠÄ#tpm-tools-1.3.9.2/.git/objects/80/0000775000175000017510000000000013737441327015633 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/80/e8f12c392cfeaa9976c569947b887e0a838d130000444000175000017510000000132513737441327022745 0ustar deboradeborax}TïoÚH¼Ïþ+FV¥‚T¯QÔ;©W]IÜ…ÂÎUU]E <°uË®µ»Qåï[Chªû‚ö‡gÞ0oöÍ•™£×ÿóêQĸ6õÞVëÒ£sÝEÿ¢÷†Ú“ÕÒWFK…Aã*MÎáN.ʰbˆ­mï#¦ˆÄ’•`²¬™;Z`$æ6Õ "«#¡ W‘˜N£b5(ŠW½b5k·Bàu€ÿKÖW ®éj¹ tv%iì ©_{4ŽÀ Ý'ZWC\mÛ†p\äÀ5l¹F•ó¨ò à†V²Qt‡,¿™ÜçÏä?NÉw¤TòŸ6»Ö¨{~Iy–=|IG£‡ÛñäËø!K¯giŽNÿ?ÈÌ÷ž\ÜÔ§àÕÒ¹±K¯¦áL*m<æ„ÚšMíY×ÊØŸ?¥—š:L†Nœ¥)>Œ²ÉYÞžkïôºm:8†÷í ®†óËî‘a–N'³|8þ„Áý'ÎýŒx,±¢fͪ ÞykxfX—´¿ÿ(žN8ÓØ±Ò5ñð±ÿ›!tpm-tools-1.3.9.2/.git/objects/0e/0000775000175000017510000000000013737441327015710 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/0e/ecc2a6405dc8038ff160017e96fd0f710a5d1f0000444000175000017510000000635213737441327023113 0ustar deboradeboraxÅYmsÚH¾ÏüŠ.ráØÂ@œ[¯w“ZÛ1uŽMIö*ÚM  ‹¤Qôbì\.¿ýžî‘„l°“ÚÝ»sÅ13ÝÓÝÓï=Œ}=¦ý½½ïÿÒtêt˜¥:pSoâúþ5ÍU¨b7US_S_O^º!ušÇÔåÐ "_Ñãf{o«†óüKÃÔ §n<¥(Vn0öÕl?ý“~jÍ©¢aDàôZÅ"*%‘;QÔX.THKE7´RÊEÍ~‚y3J©™DÔ|r)«WµfSh½3­çjî…t©â1®Pª®ÒZs–R÷M­Îð«ÈqþÚ.aY§ãpºáÈ=Adm(HQ¢ȵpcw’ª˜ÒØ œt˜Ôźšª™B×I{áÛl'÷×ÔnV:YÜI®u?¹ýÌbj%¹N•¤€›Ôº¹äðƒÊªûþÆÊâ•5Žךʿ­ÏNCÎç’”€+!ÐrÒ`ôþ}¹#Ë*ˆå¹ã8™¸‘¢,4aSú¢n•ÇÍbМík%ô ¨‘$¨`톅XçsQóáGÈá~d‘Yü°ò±k±ËˆÛô"ŠN(FH8Dá»is@êpYÅòý2!B¤©º""TáÅ:„`SÇìkÆŸ½Ô ÑníÐB¹€òrÈË$'jbb[ClázÃ{ìÚÂ@HL7þaÄ‹ùék¥qÕ^Ìh¢³8A(_ëŒÅ\¸HŽ(Ö•à %¤t–FYÊXÀögLBòR ÜŸe>ÍO” žT¼\Qïc¼4 +à€3¢“:Nø“Ö±è@™8ÊcúŽZæ3sÄgÖŸ!¹'\˜ø²$ ÑËõôsãÁV4ÝÉ„ÚÍ'´¿¿Ûêì¶öiø²÷£q‡WÝç´×ìl1Á:(7† ƒ,ÄÿCVHqm¬Ï‘ŒÛø½Dò’L¹qšäÂãü,›ÎÔ1I5,Ç9D’ŒGK^Hª1ðà´¸1ÜëÁkj?8¡æãÊò-93TV#ÿŠeßhBªÕ-²F;³~àÔ³ì»N¶µõ¨Ù~ º$Àïo'UYÀíá ̰b­óY\61uÊ…ò¿õ¶V•æûêâ·ê•hÅú })ÅØ½ãº ë|8à<ˆ ãºËìÑþn»e£F=8ݲ$éúg@²UÒû{ϼ9s!Ÿ+ RÞ>Óní¶Û£ß6œÁenŸaÙ¶¬ È_Ö iTš`Ëú²áÄîÚ‰›Wÿä4¿z®bCqJqÏÆÔõ’kÝò· ·5¦•‚wp—m·Íª>ªQùãkËùÔÛf'Y¼Êõ $ƒ#´÷ ±W³1æÎP;Ü\¯qÞv–@œ*+ËÕ¾Ëu«ñãPè¼upé©â Ì;+¶ëW!:Eí]ñŒ¦Âsi}±rB'åÌ:NcqcB²sS²#›Ž ÓB¤£âp»Ãg¹àU)‚pGOÁ×}+šl·{hÚXã‚?^Z=+{ÔÙ} ¥¨™Œ Év‡wò+ð™Ç»Or}–.˜”']ôIŒÌ\`ï‰3"Ûs}StXÀKØqôÇEâüvÉåT²Ú¥ÔÇu÷}ôC5YÎì‹3Å]Xà2¼¿ ¯˜¨h/°~ãkáo•Hž˜X._/Q•íg\ P8e£XNâTÜÝbÓãK“õ à 7ü¼xý¬ý9µj.= ('Oû”$åB“[~†G‰µášóÕ¶ø”ÍÛ‹ë›=@[ãh•YØžÚ:ë¯vØN+Æl؃7èÁ[Nÿ¨¨¨]êô' KO™X­Ùû…FÜ‘P=‚wá¥5h Ñ)ÝÜ£z§…$ØúÿÐ Žú/ SŸ;Wjƒé ¹¼qGº$‚ëÐ?³$õf˜ÙNPò¡¿t¯M%ðÅu„M ?¢ãA‘ÿ `Púðšô_ áö$U“º;t~S=ÉX.Ñ0/&8wJ˜‹B´ÅÃSªŸ¾<®×ªW1ûÜ_ô‡½¡Ñ©tbT_í:Ùóê1zËzÑõ.·èýufè˜ÅÑñ°;è à&µ€5‚8oZ\É¥P-‰œ¿¾yr1Ë‘›JûÉÃ[hz?qm=“y.¬%Þ'ÌA#t¨Ü· ÁƒZ¥¿»ô¸ñÅ~¤b(.‘2]€ÞD£;Õ>qQçP×m5ÔÙï×.–˜ôÉÍ€òH-‘†8T|دÑãbÂÞHZW'ù6V*¬åì‘Y õÈM’¥Æ»@kcÀCwÊÒs-„':€ýaTLÁ¸&R‘øÖa‰w‰Ô#\h¦}$žø :Æ™dQ¤c¼\àí¡×§:lìØ<(Ûø£ü6©ÓžF­7Õh ¨^;ò’ȇŒ…@Yï‡UfÊ*©]jx1`¥¯ܶsè:ͰFÕ7T}=§·¡ÕgL:þÌÌ?OÕ8›³;Þglûžõ?B/s¼\*¿z‘̰Ì̵NpÛΡõÚ+¼ª°†òñÕy¯{qtÌKbc.œ¸ ƒ‹¯B™ž”d|q£ÈÏ,©‰¥«$#áÁd¬¯89”ê¾6RŠ78öRù¾c±\¨¶-ˆ‚gÐŒä.aòŠ¡ Dž¸è“Š5JI§…®ñ‰mÙÚ"Ž0¸—ÁŒiŽUÕöÉ4uS÷+òÓ¶¾EÓF´h9ÕÐ5Ld ‰bÆq…évë– á„m3þfäGš¨¢4*T1Œj‡åºˆê©ÇM,]†7»‚ºrå¥ïˆÆÞG"3|Zx‰E˜‡èr«I=¤z$º"u %•tÅ•ðØ«IN`{™L”9.jª°"“^%w²8lÙ‚fÕ¦n©8÷‡¢8÷Å­­ÊûÏP¢»A‰nq?ë­DÏ(Q^0ÖƒPÛX]¼J>rܱMÖ4ÕœÒm)@‹A y¨VüFˆÂ:ñxv˜cìÁ¶.ž[®ðÞrcžŠ‘—Äi¬Ö•eüw¤Ù>v3{ƒnDl]µ[-t;³( R©VÂ% ùx+W'öPq`åÕØ’G#³]õºÄ(Œküº¾´muñ§ÿ¶ÊLqãh’ÄëòjÛ€ÅI½Öï$÷' bÅIÓc:´/‰h~¤^4›°®Ÿzü…^àU‚¦¾ä¹4<—Lw' ¶-°o⹌ñ¨_ø Ï™á9ó|4­ÁÓÁ¶ p½vDéº\_Ó·—ò.÷¼yûªõ#æҿ­_8È2«ÏøBÞÙUöQµ=ñä+›<=þ—ƒêfLQ/Å»i-ÒhDùm÷ï(–Ž­f(MÉzŽ‘¶WÇÞ'3·¬¼.çñfÐqs³‘‰ëµ7¹Ký>.ýþ]÷0 ·ˆ׉ÌEøâ(A×¥*.¹ûý;¥ÎAdþ Í‹7çǃ»-d5whYß)ð ºAæ¯Ò~qvñüðìì¢û÷M&\Aëèe81ˆÓæ™Î;ù`úÀµÊ„o³RÏdµßæäwøæ3N³¨ÁÈÃÑ»îÙñá\+‰ Öà»á¨®yUÎBq†4uHr«—ä¤|T„`nä‡Û,–ÒXdÕß+£Øâ>!o ¬T'9'±ÏIï>1‹Dü‡Ä<:>éoŒOÒ€¿UÄû ÎyÖ ¡go?Ee‚A… \l“0“°/]?ã*‡Mß>•q=Kþ—ICµæ/D&çq‹–-4O.•i½dÞÓ#óbÚ2^ ¸¹^•‹§xj<«—!úyQ ð–Á¼ŠÝ/æÇáñ1ž /n¾|¬v+Ïì}pëÆ>¾Ë*W$¶Övc4_nµõ&6Ï»fÓp÷/£Þù zþêÅ­·œÛ°âÑŸ0+Kóñ^A¸ñO[þüìã})i&ølÂ_9ϾÛOŸÕþÜ|£tpm-tools-1.3.9.2/.git/objects/77/0000775000175000017510000000000013737507136015642 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/77/5b019fcbf13155530046f66bef7ef4968efb860000444000175000017510000000022413737507136023010 0ustar deboradeborax+)JMU041d040031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ç$õåNWÊ$sÚ…op É_³Š¥«"’X’Ÿ›ž[ÂðY\o½rq¯ÌŒïóˆ0?‰õqŒ†¨))È…(é¬á³ì^÷â¹ÃÛŸ™Z‹¸Ÿè¤ü7^tpm-tools-1.3.9.2/.git/objects/b6/0000775000175000017510000000000013737510322015703 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/b6/7b3d406b963531ad8a3a3c45ada534a2102ac40000444000175000017510000000120613737510322022770 0ustar deboradeborax•“ÑoÓ0Æyö_qo}€FIº¶I5¡›Ð¤ Mb°:Û—ÄØ‘ílëÏ9í`ã¾4ï¾Þ÷»ÏÊ ƒ‰Päuõ*z"•l¶HeA¨±¬ÖëuÙÚâ¦TXoäz-óJ’Ñ“ ·ª¨ÖØlOªmÑÔª‘›zÕœ¬ *kµªÊUÛ‚´8ÅÎy¸Æ;ƒ>’Ñ’‡Ó¡=>ž…)P¦é-ë“Uµª«M¯ó"Ï…šçŒ\~NÒy„¯Ô£×ïQJ8ÕóË³ÞØé13rȸžU6yY”u½*a™oYEÄqXFçú°弟ÆnŠãÄ_ ðá{Å8˧ÀV ñîÞ -ÅhlûoÓCGüdm:‹Áâ™ÆâI$7U77“ŠâƒÂDŒû”Ó´Køôåê ä>þ=¹½¹f¯V3ºËs`æÇ¹øÆ…`d¿‡ÉjjŒ% #²4ŒÞØÈ¿ÙIˆš¼ÁXE€–«ã`,r>çÚäÔ4L—{y:ƒÛŽÓv°zNDÊcèÒàÁ ÄÊx5 !"ë‡ñÅàLï€xøÌ`ãݘÜ]ž q—p&Œ÷ +g#ÀN}$ÃßÏp‡Û €ãHÈó[‘ž­áÈëèH1ÖlØd2š­¾³I…ü.em&­§q‘,ó½À8ÏelŠ ‡W2>¿Ïà⇱çÕ1‡›ÚÁáswñá[ž’7óäymK<Àhøo^:=lÝqÙÄ ºw û§ý8ù“³“tüuìOÁÁq, ‡`dnéR¦0¿À¨Í@vv²›¼Šy5áyâ$¥ £“ ñÙ´œ©¥kš¥Üïþãâ‰ß@µ{tpm-tools-1.3.9.2/.git/objects/78/0000775000175000017510000000000013737507136015643 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/78/b78e809fa07d1e8b0b428e118e1687970cd2b00000444000175000017510000000504213737507136022720 0ustar deboradeboraxXasÚH½¯ð+zJ"¼DàìÝ~°ã­Âo¨³Á8{®\ŠÒfWH*ia·òßïõŒFœ8[ç.[šéé~ýúuQ² Ÿ»g?ý£sÚ¤Sš­ c©¤ѵ؈(IEFIH /Æ™\ÊoúI HæX©D{J&xÊÛ¯Š\Æ"ÏéÎóWü–fi’é%.Ý'¯ÍÉÏ„§D@‹ ¯îxgmy™ÀÿéÇ­9ý½ívÿuxZuoþúi½(¢ ›Èi"r‘mDàb5o˜­à}š%ËÌ[s a&åI¨¶8û‚vIA¾S&™«L. …xyqÐI2Z' wlÏŠ8B °Xç«~²^'1Ý‹Hút+}ç‚<œÊOò•žM þzð$$Œe´Y¬èÌZ,m´ 8žb'‘™”m±!/ÞQT«­ß vS@2Ö®¯fü«ˆh+ÜBP‘‹°ˆÚlÐoÃÙûñÃŒz£Gú­7™ôF³Ç ,V«oÁcJ®ÓH": ™y±ÚÁ}¶p7˜ôßcKïjx;œ=r7ÃÙh0ÒÍxB=ºïMfÃþÃmoB÷“ûñtàM‘ Á¾h¨Ó¾By2ÊmÌÈ`Ç¢€VÞF “¾ yäƒYÓ¯Õ`FI¼ÔÁáü=W.H†'ªmí0KÕFŠ-W¼w¥TzÞél·[°Æ9òä 7É–Piwü4:s»nºJÙáNó…Œý¨@Q½Ëwy'WžrW¿=U»Tä‡c¡Pdª#ãÃç¹ "¹À³F£Óaˆº$>KU³YÄàvp°ñD¥ë¹ÊSé®NšÍæl:¿ïG³Áf´ê'¨öÏŠ.©{Ñlv:(ª@W”øS" •‚ *@J¬¹ô³…2®Ù¢Š õ,` fY^*LbƘk;šLˆ8˜û^ bn8-·)c…b=|Úü«I§œû}ÊÍ&@Þ+J"íò%EêLg׃Éd~3¼ŒÆ­ ^’S.yGݱI"Èa–dÎÉÓ='zj#½9c#_šøGÆ ‚†ÁTYYb~²‹m‰;ÆœR”Õ:eÜœÊ<¼¤ÑÃí­õæ¢ô±<ܺWm~Þ+ÀŸIЮ̳N[™1B—~aˆÞ:ìNœ8a«M‡pY‡BãQX:óŒÚÞ±™ç}Õ¥‘Ф`r@ㄸX¡{±Öx:p¤LˆÉåE)ÑäÍUÝ(#‡²ÛÄyœ‘hǬN|Ó¥Š0„yƒ„¾d[`7Òk‚÷± K¹Ÿä¬\¥Q0}¡¸Måe§ô*ï)ÙÒô5 ± \à¬3ÐŒ  ~i–‚Èk±ÎåŸUyÀZ°åÍ™M B>.Z¹2òB;¨„õ› s²â4ŽgÞŸ˜DYnßH€Ç=`•laÓ…x»ÇÝVW(dŸ«¬M¯rÕ²Zæš…-Ë…ec\s…÷ L–á–\¹¹šsìô#éz㢵ïßÕØcXPu&ÌxÇý™pÔIìÒ ‹ÙÂóÿà –BA`—tÖíbTQH©ãe ©XÔ œÎÏÞ6ÁWÆãçb® s¥hhH'ƒéÃí 0Vˆ4ò¼ß»ŸL¦Ãñh>ÝŒí2ŒÃ„·êü`ž ’l.ƒ¬/I蔣 /r1'}Ðï‡×­Ï>U›NÁHS¼Z±¹ü®Ló`Ø=³šlyÎÞâ*£YfÊ¿†è åÞBFRí\d­Ñ9¥k™{ ´¾(Yâ ¦#ÓÉJû—±4h½Y«>„Ã%lÄ0: i+^£Ñá*áÑ™{F@ 1ÿu€þ”A±1Áre®Ù G¦ÀSÞ±{¸*øF1¾!Ày¾n [ Ùñ`ÊuÍJ§Ù`µãŸ}[»À,¿˜É‚j ·#‡Y)KH7z3?6ÕÄvÜʘ`¼Ìâ6gÀ“—iz0—BêË­hN†% äu‡ùØÖ4Zuº|èݶ úÈéo­”_öðC¯RC6Ì@6&£ZfJØç›¨èò•yÀ[™¹Nâ× wVÆS##ç¸%5´Ítù;÷õµð0h?Í=Ë:`]ç¡’‹b0¿ê]ÏïÆ×Ö8Rþð(ã?á "Ôª ýàa|^–¿‚Þ5¡~:&ƒm:y™Ÿ´ÙcÔ…6ph;¼9R!íJ%DVÊ£L±#yh®ÆL-*\̣ijÊËUë¼2ÚT¦ ¬µi°6@dëè4ÐË\±Gv{äF>ˆ°bx>îÞ9ó/?™Xdž?ÄKûg|•ô6‰ x8„ ÄOz²À‡ÚfR¡C— ¼/ ¢ä@§JMBë´¢T>ÁLn®õ˜ÓV-¼ºf‘aÄä._:s焘P‡·ô¡üìÀ€ÿ7>iéœÕWöW2µËÎ-K^®V…{ø‹7sQ”Kê®”»kï÷$k×å×­^ɯžßž‰ÍÝ·-ð[6ò$€i*ðE†?nUî½\Úágr¬Ô ŸØàã$r"6’¿ÒCÿS# >–bå#Œ¹i#4¼¶¾¼Ì­ ›Y-$\$‡òkE†ÒŸ‚ ¦lõT•Æí*bY?§2§¼ò½øü«ÇÙ©ŸŠ€ †.èoû¦ÃþÒdux¢çÍ ´ ›Zþž?§¿´—ßg晪°ëX™dèon6TBUe“ÅÞJˆ†ÀŽiP"ž `‰[Æýd|?¿ënzýÙÃd0H•ó:f kÑ«ú”ÇYþ lv0™=V`O×ņj+Ï8êNÿ?0w^\„7|uÉð ²€Š6ú0föduÆÊiáûø4ìØ¹ä1ÒPIíy³a§Sýe£0ëK±¨œÕa]ßæõ½Æpåpoô²¥ß¶#v¶Ü|ü¤'l~•a}y&Ï%R cMw9bUž“—"™ôÇ©zO¸ÊãÂÇöð{…E'3¿ø_f8g.óyjæÏlNwoÒßÿlåc÷“yg>±O_šÿ§ZÌtpm-tools-1.3.9.2/.git/objects/b7/0000775000175000017510000000000013737442113015706 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/b7/c185af74871f9cfb693f431e29c38239a71edd0000444000175000017510000000045313737442113023065 0ustar deboradeboraxAnà E»æsXGQ•T]u©Ûj€!¡µÁ\5·¯“¦YgÉGïÍÌ7q}µªŸJ"QKÞ7}ÏEg»¶×Â)ëÈôºáŠ#Ê^è^[‰lÂD¡@ÓÔª•­rkÛ‘j;ƒR(!¸nœ° ’í ¹®s çrŠ Þ(¥3‚/™ÄÛÏü÷Ø%²',•‰ã3Ôr½he£8¬xÇ9[ÒeÏB ^IÇ„ð¾àɼ Ö°µ×p7ø0ÿT^7KËE]s)Ú›…•i\•‡¼ÄG3†yb—¿D¹$oJN_€ÁÂ%›C&,„åf}Î>ÿù\±½µ÷4NÅÇ¡Ä+¾-9è.ËT¦eCcûk)dWú¼y°vðǰѹ+õxìáþ¤Êtpm-tools-1.3.9.2/.git/objects/67/0000775000175000017510000000000013737526666015652 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/67/2421195c97aed6d0fb0c317815a437d10d5e1d0000444000175000017510000000102213737526666022675 0ustar deboradeborax•’_kÛ0Å÷¬Oqߺ2âXqǦ”2Ö½lc…ŒŽ1FПk[Ô–TINƾû®³´Œ½íA ®}Ïù{¥Ü0˜Î_¥€(±ÂF¥\r-— ªRnV²Pz%QæËRV‹bÓHæE@›@–ŠoV¢)—›’7•jäº*šeÁqQ©b³(*QrÔš‰1u.À'£:ÑÃVuƒÑ ®†øçvPw"eÊ ×ÀIlU­Š¼‚79ÏsFU¢LàJÜc/‚Fx+¤„+}*ÞôÆŽO™‘ÃYe/xQ®k˜å%©°÷æ ähz “:øìÑn·gôˆÜÞßíî>Ü~‰Æ¶ ,8/é[LaT‰±¯ÿ6¦Ïš0}<)×L‹$vfð.P¤š êź Á…4lèX5yxg씌ܥ ¾ÇD,Gìâç§xgÀ½ßù<îbúuÁØ„iª^´øÿ€(ޱfw÷Æö¢q6‚k u&‚vj¦ýűm1&Ô0F¢¡¦gÏÝ„ðz2š]O×ˉP[Œ%@²Ê“¤ú+ƒ-ñãK?I‘‘u‡çžŒO%èm)²w1Ùc}RÃÇÑìE?Q™ø7ˆwFŸX.3Ʀˆ]J>ÖóùápÈí1Æ>s¡S°8§qÐN³|®ÂÑ'7‰tVʺ4ôŒmMkQÏ\ÓÌä±þ§Å~£^,tpm-tools-1.3.9.2/.git/objects/af/0000775000175000017510000000000013737527215015773 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/af/719b7766d3648a704bc34842ea928c77a3b0c50000444000175000017510000000036513735320664022716 0ustar deboradeborax•ŽÁJÄ0E]÷+Þ^Z’¦IÓaA]‰ Qqÿ’÷Ò N›!MAÿÞ þ€Ë{¹œ{|Z–X@)}S23ÐÄ›^ORX4£“Fç 1E6H%ìD#ÊæŠ™×ŽÂ¤ó6åɯFá{b§- …^k1Nl‡÷rNÞã’ài?ãá9®RÞàXjÛ]þâ)~Æ.Ä;ÚôvR÷p+”ÿ•-œá‘]Ê|ÁL ÷èëk-O•³uÑ-]ÝWŠRCEA+ÆJiÞöë5åû×^^·zÕö ª lŒ0aÁ:óÊÔ¦Z÷}ø}óØXmÔtpm-tools-1.3.9.2/.git/objects/af/2721fce36de31b35460bbc1caff74a84bc035e0000444000175000017510000000102213737527215023312 0ustar deboradeborax•’_kÛ0Å÷¬Oqߺ2âXqRǦ”2Ö½lcŒŽ1FПk[Ô–TINƾû®³´Œ½íA ®}Ïù{¥Ü0˜kÎ_¥€(±ÂF¥\r-— ªR®W²Pz%QæËRV‹bÝHæE@›@–НW¢)—ë’7•jäUU4Ë‚ã¢RÅzQT¢ä¨5cê\€OFu¢‡­ê£\ñÏí6 îDÊ”n€“تZyoržçŒªD™0À;”.¸Ç^ðVH ×úT¼íŸ2#‡³ÊU¾àEY.9Ìò’TØ{ór4½†ƒI|öh·ÛÀ3zDHîî7»Í‡»o ÑØ„çÅ#}‹)Œ*1öõ߯ÔáY³¦'åši‘ÄÎ ÞŠTåª^\Õ€!¸PƒÆ€ «&‘»±Ô÷˜ˆåè‘]¼àüâ̸÷;ÿ€Ç]L¿.ûBƒ°#MÕ‹¿óÅ1Ö `poÜa!g#¸Rg"h§ÆaÚ_ÛcB c$jzöÜM¯'£ÙÍt½œ5±…ÁX$Û©AײÎÓ-,Qž×!ä5•ŒíÝÁ“)‚µ…:mî|Îëþ‡°$¥Ytpm-tools-1.3.9.2/.git/objects/2a/0000775000175000017510000000000013737526666015720 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/2a/60fdf4927bf5dcb5c7d0559a85fc77601a96d00000444000175000017510000000103513737526666023145 0ustar deboradeboraxS]oÚ0Ý+ùWâ¥Ö„0imW êZ@°íÕ ñ ±šØ‰mJQµÿ¾ë„°µe¥yrÎý8çÜk¯rµ‚¨ßÿò)ô=ðá­E éF&V(i Uf%Êåò®! "HTQÆV¬D.ì.€alƒ’„s„T«âÒ5ʬ-ÍenŃ50&”^‡Br| ʬ ©Ì'l”År¦;à\È5#Æm¬ùEË“#s­™ULå5{Dmœ6GK6CT…5ñH•;-Ö™=Èî÷¢¯.w¤¤Ei ä"!=¤zCZ´«2]PiýÓúÝç¹Ú%bmÉ9Ún_2j£ ÷ÉAf‹¼žG‹Ü© =¯+RâJ±Ù|<¥a²Ñì~>øÁ¾{]Â…Äc!WmÁ¯ñb9™MÙôçýp¼ eôž¢^Ôsß#I¾¡ \\SÛ »ñ¨jb ɹ)Å ç$õåNWÊ$sÚ…op É_³Š¥«"’X’Ÿ›ž[Âc ØqíqùMF·½ÎE)oÎçܶ‡¨))È…(i÷gÞqn}á”·§­Ÿ¬éºqLÐá:tpm-tools-1.3.9.2/.git/objects/44/0000775000175000017510000000000013735320730015623 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/44/86c91a1d1367b3db2e8b799ff5fb27553c7b8e0000444000175000017510000000037313735320730023063 0ustar deboradeborax•ŽAOÄ …=÷WÌÝ´R(l6f£žŒ£Æ;0C—¸- ¥‰þ{‰ñäIóòæ{ŸOó #®J&4dHõÒp¦­8:¯¬¨L-oV›i)à0˜À×A *x12ß#9©‘ ë¥d£!=4v/ç”á5Î ö³]"<ÆCÊKM»ËÏyŠï± ñ¸T½8—=\3ÁXã¿e e¸'—²…7ºØŒ·Ö98ÖÕž*gÿ袛»Ú¯Ÿ%9´l¬”æe_×” ì[\&xº{ÞêTÛ ¨2°‘­€ Ð[«qZÛBë>ÿ±ÿýúwãæ w‚tpm-tools-1.3.9.2/.git/objects/96/0000775000175000017510000000000013737441327015642 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/96/670e06c5c23205af39663a240a3d04a9f919780000444000175000017510000000260113737441327022465 0ustar deboradeborax­WaoÛ6ÝgýŠƒQ )P i‹ý°sR£5–؆ånꢠeZ*“IÅsÑ¿w¤äHIÚAÃ0%òîÝÝ»wôºÔkzqvöò—x5  ]L‘åŽN.žÐóÓÓ3š('®ÐJ”t^ÛBIkéJ¤9ÿÂSiãßG0ÅIIN0–Ôk+S>ÅkÅÅ–ÅIÅJÒYÏçÑj{¾Z=z¶Ú.ü2ŽÃñŠÿ)+Rø´•H%ìs©h/)ê±£ÚJ‚…'­Y[Q|víWŠb 'ÁÖÄÛº,¬£ÂÉ]ƒDÒj¥NâG¯{AŒ ^D±,ý¿&s0°¿yîm-ßÑÀU»OVºÊH+U*ôŠœ¤!^h°œ_!3Jdr'•C2üYÔJCºe'Š“w4]£[/VCJs¡2Il¢ÊÖ'¤õOÖ ‡hC@å •Yojü=Í“IbCeç:âó»Žçôfóåd6¥Q8ýfœ\,&þ „*ݶ]‘¨»³äréÔ‚ c°-mK‘YìÊ„ÙÚ]ø1Ñ2/,áç6r+êÒÑZæâº@LBmH”V“HSP®X—’® á73q†«!' ¶ 銉ÓBþSK˹ Ñ@ °à%ì¦Êè]à[ø`Çz¯¤¡JX»×fãQÁ‚†7šzÄ\§½¶6åæ™.§o--¥0?6¦´ûž•R§Ÿ;FxyOZà Z\=ÐÑsæ{»o­á3=`±Ti¦»MÇ£(K½ï¹ä UŽýšêݵÃäFgÊö 6޹ÞögHç5"¹q·Eù<%PqTù>»N›óýÿ‰/•÷ ‰E5|p„=o? ðAN»!B†e±•®ØÉá7Ésªæ»î]gÈkYÓÎ…bº†Zâ:UÒ`“P®<´]’Õš*hÐ×T«V-ÃìÁBi_”% ‡Ÿ ÃÂ~·+ù øQ•âàßöÜ[ØF3ƒfF¦Ò‹M­JžRl¨éäƒìèkNV€WlW(»>lð+À ¢øI#¬ƒ[âÒïܾp¹7¾L.>Í[]ž7sFóI 1]†7ÌÁ­§-Ž\–ÖÑ›&š¦[7¦j«1¸ÂÉáu÷ rh!q÷m^Ý:]vO—:Ã’>(à«4F›¯ìëëF®ëìc”HîÞ,ó…r•7 ê®™Z©ÞHñ…Z& ½ŸN.foÆ„‰¨}îYW[5õ)Eˆ„Ñ'MTU‰!Æbm3ûc#•®êŠÖú_‰ÖDÏõ:¦í¨ôÑÂÏ#¿)-G;¢kç(èÑÈK;ª((@b³¹Á‹Ö`Gʱƒ™´ wž›Ô¤]Ë­¸àN_oˆõ!n¨€']Ó·Ñ%ÔÞƒ9šöc·}£ó¡SAØ[­R+W á0Yó±°žØG ¾ÞûvÄXïjz¿ä¬g¸¯ìL}?B~Žñ®‚÷Aß§œïEûöŸãã>‰nbQš¶µý ¹þ.¦è.X©VÎè’)G½îÚ—á~šã3/®FÓñtÙ)Ö¡Ké ™Ñè»9S蔦­ùŠæÛ¼½ŸIê6³çH⣻ᗮ·½,Ëág…ëžF£1ƒ«Ð /ÏOi}ðÞ-}‘FCAþÞíN¸QÛ«$+Ë_°J°UJdj¤{ò:‰Ñƒ›1ˆ.ƒœ=–-¤ªoe—óA2Óè2™õ.Ä7Š|ò VssM”D'¯zÏþ ]³xÞzŸ|óé¾H-߸°¯°Ïg‹ådú–Î߿ŞQAˆ·çïà&§±Cÿý{‰?<6¶º6)ÆLâ_Ž{ý€þÊÝtpm-tools-1.3.9.2/.git/objects/33/0000775000175000017510000000000013736475612015634 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/33/186568f4d7e867ca528220b3f2d3aed7cef77f0000444000175000017510000000047313736475612023075 0ustar deboradeboraxPËNÃ0äì¯Ø§T‰Ó¼ª Uˆ××h×Þ4¦±9®Dùz ­àÔÛÎh«QÞZ¡Ê»»˜¡m”–R"å‡v@–UWK,»r½n4Q:¥¢œÄŒ]„õº­UW`¡‹²n¨Ô$¹¥¦ë†¡H6UUª†ZxŠ£ðÌ!œaïL\xB °}_.`XWÊÛ(ªªk꼓%dy“ç"±éÏÈž˜|@xKö ‘¶ú‡ÜMÆ>V†ì5¥Î‹¶–UÙ^SDœm½Ÿ– hïî#œ†¾w¾÷s4Ö|²/#ïfTG<0 h¦Ð9¯FVG¿Ûk¸@}J&/úÞ²]8±q°ŽIò§`¯©àb!©}Úƒ0ÃA·DF½bo)<óÃÑysãlÿ]·O%¾„m­»tpm-tools-1.3.9.2/.git/objects/83/0000775000175000017510000000000013737441327015636 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/83/51f55eb5834d4355096a42160cacee43c2e8270000444000175000017510000000152413737441327022624 0ustar deboradeborax+)JMU0447d040031QðMÌNMËÌIÕKÌeð¨òi12ýtæ`ÃeçÇÓ¤6¤ïz’UVRŸœ‘˜—žš_ž—Z”XZ’¡gÁ0cÓt¡óú«jå·|ª˜µ±Bûè/d 9©‰E@ew#6÷l®0çÁüq Û‹« öyÉ÷‘•¥&–¤¦fUÉ…NP‰ØX×üⲓ$›zòôÿבT¦§–”&UjÆ-|Q6kÿº]w´Ü÷,Ûj°6WIe^Y Ð[y©@3ùÞZæ{‚¹ÿccÝ´¿ü…\±òØTä§0»_¤’³òè™Éþ‚JÖ»f¥|FQ›™—–4“§c½Sý´=7nìzw§¯dÕmŽíÇ1ÕL,ò~~q݈ª:5ªt×òÂ͹ÿ¾D °Ïúdz6êªj÷vT¥ùÀìZ’˲ŸŽ1Íûäu~çãžî³ê#;¹:N i(‡¾=µtÂÁ€953ôOÌy¸ð±Ø‰ã«PÕ€b0/äèié|lG±®·L³Rá²eYùS²Iq °œÅ™@åùwf lž›tª]/Å¿¾·{¯u ]Þ?tpm-tools-1.3.9.2/.git/objects/21/0000775000175000017510000000000013737441327015626 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/21/509399027d769b2f8dfec9b3080aa592b9bd5a0000444000175000017510000000071013737441327022773 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•á ŸØáþëγÙóÿe/hà¼YQ‘“™ÄÐ÷³bûÜ0–¿ ün s ªbwÏŸ‘ÍMÌc¨w™z©è‘k¡¹:¿od¹§jÇ ‘-Èg¸™qDzã¶Õ~ÕõûnX«ýóD¶¸(™áæSq]½óö¬g*èXõM.{f0D¶$èpåx±S©+ÚÞ?dÉоóhö†Å¥Ó«Çtpm-tools-1.3.9.2/.git/objects/c1/0000775000175000017510000000000013736475612015712 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/c1/3a0e16c38fd73043e16b076ffe6ba08009d9710000444000175000017510000000032213736475612022751 0ustar deboradeborax+)JMU026a040031QðMÌNMËÌIÕKÌeà|ùý¶–w„Û¤×Û§y²8áóæ‡?TYIAn|Avr±¡¡^ò/\/ü.=ñ|_YÜœgÌu÷ž4"©+NM̪š¬§QµºeNÉÛ)ÆG÷‡½ø¸pùd$U%Å™@UWä›v—ó‹ìód3Ʋ}»$[!©*̓šv!bÍÿ>…•Ü~ÂÞ?¿¿á|²Ös5²º’Ìœb qõ{J¯ÌàX²ÛÿOCŒ²É–çq·ŽOf½tpm-tools-1.3.9.2/.git/objects/7f/0000775000175000017510000000000013737441327015720 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/7f/bc75d49808a4bb4ffc805c2334b4e7685edac40000444000175000017510000000275013736475612023225 0ustar deboradeborax¥Wmoâ8¾¯Ë¯ðu¿„ AÛÕ½ötд.D «juŠLbÀºÄŽleý=Ρ°·{Ú~X‘ñÌ33ϼػHä‚|øå·_è]¶È%™­ñ7œ&äŽmY"3¦ˆ\ƒƒ±â+.p2”1#\CÓ0%¨áRk>Øh.˜Öä‰Fkû ª*“*Wé’‰TVW“H1jXL{â ž¬eCPÅðíánmˆ3l“›««Ÿ:öߟ}Ö-ÄyŸý$!S ¤É”i¦¶,îBÛÌÖÈ!Sr¥hjÓY*ƈ–K³C·d/7$¢‚(sm_l ²6„Џ'IeÌ—{‹ÙFÄàÉ’FR]16”i*™l ˆÏ#&4#^­D¯s ,XhRpK˜"[¦4#×b‰Ñ!ˆÀ¡Æ‰úd–Ö¶¢bOp[›~)ÙCN1á"}bãP‘ÑŽƒ¸#Í–›¤c±AùèÍÇóé^ÈÇþtÚÍ^n¡lÖ§è˜ЧY‘˜TT˜=·Oîtø“þÀó½Ù‹MâÞ›Ü ÷ã)é“I:ó†s¿?%“ùt2Ü.!Ê6,ÀyB—y9Ð513”'ºÊùÔ,‰Éšn*1Ž ”D诊ӳ 9™‰«<9ø?ôÊ-áK"¤éT8¶K@Õ–³7ÖvmLö{¯·Ûíº UhÔ)b]©V=´‚mÝ‹²äº{ÕÍÖ™ ¸×j½çKôÑ’„álòÎgž„­÷a–ÞH­²ÕuGýï†#?€DDÉ£ùGÂ\˜¤»þ³)”MX.«}-Vm²bưWS}×>Ga%"…jë=K4«Ï53IëDhº•TûÉíZ‘Ä;–)åÂÉhô]±R £¥ª§jíÛç4’2‹s1 ̦å³"ÄίXó¡MÌå‰ÔȨÊM{½ª£yŒçÓ¡Ûð1ˆÖ¢ƒñد°5 «ð ­û¾¨L'ÿ"W'Z³éü d?ˆóc® þ*Àbøt>»ÓÀHóoÒþÕp«3ÄYøã‡p4¹Meû;t.„ìâP"«é»Ï®ÿFñ6°Üéã|ü,¦”TgÁŽ ®À¼Ñýø*Œ‹¥<‹u¬s„uçæoÀXÌ›ÕY°cƒyi‘(†=0 Ã= … í"Nùg;«Ô”WF:N%w.ÆWí¶­XsŠŽlëjn%±HÂ0e)æÌ)¾uÇö‰:DÃQhˆÀŒ´Ì>c6,{ä\Óxœ™ U¸ïÚvÐØé8¢wÊïhM¹´’¾Z€T¹Ÿä‘%ÙýFDùíRá”vðaZ¹6Ç“ÁàöÚÉ¥ÖÙŠ ¦x¸2¦œ"†6)|"“ë’†™þœKZïÞ•Õ)‚.Ùó`×Àtç „±ÞD¦¼ÿ ô|¬ì\«áìU“žÁW3O~áó'jÁf®Ù\ðï±£°¿>¯`5Îáƒ;›ôƒàãÝ»fäuߎy•ý}àñ„Âÿ‘í×Ãù¯`ªq*b9¤ð½Ô/Ž¨Ï§o ¼ëv)æ+o”<ý£Îš²,Ù%Tÿ‰¾¢rp…â±w5÷åÊ·¯óÛV)Í[Oµ²0—¶¹zd¯õØå­Tlôï5Ô—ŠOzu&œ{©RŠïv» Ý;».¿YÛâþfe×^_×®¢ÆFøÿ†ƒg¤ïæ=…g £é›%g‹P¥²¥!žÞØ…á–ÚÓÈË3ß T¬CK|°‰ŠÈNY¹9‹–f±Žð€?“66ÎdsÇt¤lè5LYúZóô¡^ÆÀ+–tmYnÀ3îÏ„jw¥‹ž:—VµÐë}þéï·"·þô·¼˜H02qÊ-úL“ ;Êk¼Ã5b‡ê ™ž=<š_O«©ÿðéÏrtpm-tools-1.3.9.2/.git/objects/7f/449fcba515c4d6556d2c91f7b104de5e253e050000444000175000017510000000021113737441327023037 0ustar deboradeborax+)JMU046b040031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró ô,ŽlyòçÁ«—npŸJL~m}ø0\Ú˜A??l†l£é–p¶nÑôwÜ'JáÒ Í_ã¶6û:‡rf9‰ñ¬yç|è…:¾û5½tpm-tools-1.3.9.2/.git/objects/8e/0000775000175000017510000000000013737507136015721 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/8e/117c0e398baee8e740edf938692aa20b11e42c0000444000175000017510000000152713737507136023130 0ustar deboradeborax+)JMU0441d040031QðMÌNMËÌIÕKÌe¨YR3éûG’27Ý¿ë]øõü´ô‡Pe%¹ñ‰É%™e‰%©zÉ þl­†¹q‡wDÎK9ý:/Š÷Ø‘$•ɉy驉¥%@µ/e¹ÿÊh®þ™¼%VøúÔ9S·>T@V›“šXTv|SÛŸ§e±_f¹?á±ú—‰Òû«èÊ“€MfpÉb–«¨ÌãqްÛr¹ö¬¹O7²Ò¢T +S³*ŸÛh‡º?H›4»7êjØrµeµ:JH*Só &rüôu˜ÌQl¼aSÉ•}ûÙŒ¾h ©KO-)(M›xê¤ã»µšKR3X#szeéz!©Ì+KÎÏÍÍÏÚV±kK…È!ÎEÿäœv}™|FÜbcl*3Ö‘ž±}þ“#7)ÍY¬jÒ°yå•)À(ÊùÜ[#}ã•ÇN7O;¶ð§r Y1)߉EQ™™—–T×™’!µ×@Ž#©cÁŠ#9ι'ì÷ŸCQ ¢ ºIÜϤœßóIï‹ØëµBü|ºÅ›~¡©FO1Èêh›¼=1©×ærìüº*Ú¼æëbáJ¥åE™à´¡mtÄ$MèÔnç¬[Ò÷§mY}ùÌO$…ùå°@Ÿûƒ}… ×µÖ³þìÞ›bÿVüD ’‚¢ÔâÔ¼ Õ,÷îœÝ˜¤'•ûgI´Ó‘E^"‚Ô”ÉÅOyүР·`bÝ–Êî“RVAte)‰9ùÉ ”Áû–9rR¸ÒÔú'’³?úÞ§q9Æf–e&ãýõÓWo«¦el:tl‡ÛãwÏ’ íïk¢š V^\2;§oAاE+¬g3÷èœóñùWï­¢¸,?’>ŸÊU?öÕIdÅòûu1 Ü'{umT§æ¤•]4S íš^£)«Àæ'kÙE²Óµ—†\ GQY’_Z”X’_Ív»¬º›JâVÍØ~óÎS.?“Pï:¹IÈJ‹JJ €&G‰oòwÞ'õ%fjQ‡îÃè—a·üÅ– `œ¥gd‚”WÌwú5gÍ}Ñ[ŸD°$QV.Nr@R^T˜ NÿO“WIÛqÛHu¹º(Gëëfé jÂo~Èðtpm-tools-1.3.9.2/.git/objects/e5/0000775000175000017510000000000013737507136015716 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/e5/63a8c466b8db3225a727150885eb831bd026130000444000175000017510000000510613737507136022540 0ustar deboradeboraxXasÚH½¯ð+zJ"¼DàÜ]êÊŽ· c|¦Î6.ÀÙseS”F0!©¤„ÝÊ¿×3!pâl?¸liº§ûõë7­™GÉœÞuÿõîoã&Ót)hK%½ˆ.ÅZDI*2JBRx1ÊäBÆxÓOA2ÇJ%²ØS2ÁS6¿(r‹<§[Ï_ò_Xš¥I¦—¸tŸd¼6'?žÍ·4¼¸eËÚ:ò2ÿÓ-¶[*rú-zÛíþs·j+6þön½(¢1»Èi,r‘­Eàb5L—ˆ>Í’Eæ­8‘0‚ò$Tì}FÛ¤ ß‹)ÌU&ç…B¾Š¼8è$­’@†[öƒgE!†X¬r‹U?Y­’˜î‹y$}º‘¾ˆsAvå'ùR'Ï.=ù3Î2Z‹,Vtb=–>Ú„Oq¨LÊ€¶Ø‘o)ª•é÷’ÝåŒuèK”À+2ÚH7Tä",¢6ûôëpz=z˜Rïî‘~íǽ»éã«e‚·àŠq%Wi$‘̼Xm>{¸Œû×0é] o†ÓGNâj8½L&t5Sî{ãé°ÿpÓÓýÃø~4¸D”h°ƒoêr€/PžŒr›ó#*˜#°( ¥·¨¤/$@ù`–Åô›N5˜Q/trØÇ•3’!ʼnj[?Ì@µ–bÃÎÛ.•JO;ÍfãÖ8G|á&Ù¢*0 òŽŸF'n×M—)Üi¾±hª÷ù6ïäÊSîò—ƒ§j›Š|ÿq,šLud¼ÿ‹Üö Tºš©<•îò¨ÙlN'“Ùut7üwJË~‚nÿ¢èœºgÍf§ƒ¦ $pE[€/p%2ð±P)Ø ¤ÄŠ[?ÛR(#áUdèT1ËòRa«0Æ]›8xðÐTBÄÁÌ÷R¸3³Ài¹M+4ëþÓæŸM"„8áÚïJnŒ9x¯(‰tÈç©3™^ÆãÙÕðfp7jñ’œrÉ{궈]A³$sŽžÚi+Õ8GzsÂN¾6ñ Œ@ ƒé²²Åüd%(›=Œ8¦(«Uʸ9U0xxNw776`˜‹2Ærs^eü|T€?“ ]Y=nf]¶²b„.ý½u8œ8qÂV›öá²…&¢° æ™ø´¿C7ÏǪ[9"¡IÁä2€Æ q³B÷b!­ñ´HYS˳&J¢É›«ºQfe·…ó¸"Ñ–Yøæ”*Âî :ú’m56¤×ïà Kù<ÉY¹J§`ú\;q›þÒËŽéTÞQ²¥ék \àª3ph8üÒ,‘Wb•Ë?ºrµ`Ë›[¤|Ø$´*reä1„v9ºK v>ôo&4@ÌÉŠÓØžyd e¹}%ŸËdŸ>(ÄæŸ¶º‹˜@!Ǽßemz•«– Ð2×,lY.,8ãž+tº_á²L°äÊÍÕŒs§ŸI÷7­}ÿ¾¾Àn‮3i†8ˆ·|þ/Î:‰]ºb1›{þgNb!vA'Ý.F…’:^6—ŠE ÊS×]=´S%» äœp±¸€UÄçU"oLìœÇÿ“cŠ¾Ò ´é´ž U¾ÿ>Tð§™î¦S|VðXÕËåB|>,K9üg6LŸlj ¾¿§I¡–æOçš ‡{ Åv 'û0œrK´•÷ õ×eŠ«¨O_N1Ur~xùqÄ'påõoÝ׺Cž4?Ö‚–¨ÏHÆ¡LY*YÆj-«)ÕýßµÀž:1/«„«–Ó~€>åVÁ3:(%z—%‚޽YþG°j4ô‘=½¿¥å4]5ûéßßR!'żï¥xrñ8ÐqZý_­ÀŒ\DêFÄ»EæþçÝåØŒ|¬áÐT³é‹êëQÞye烡âÆä¡ßÇx×j6º‰uï›&qŒùÁù+¦3 ÐÁÞÿ iVöNû¹¬›2ÄL¤ã¼^̆“ÙÉÛfãOÄÊx¼ûÄ0œ††t<˜<ÜLc…H Ïú½ûÙ‡Áx2Ý͆wW#;Î ã0aS] ÆA’Ídð‘…* ræáE.®úýð²õóɧÊèŒDé­ôs_˜Sˆa÷d̲´á}ƒoŠ]ÍzUfA‘ñk¨JîÍe$ÕÖEÕcº”¹7Ç% |Ëi¥Çìut¸ÅWÝNzm¬§^ ä 1ÕCÚˆ×è=|“xtâžhã{áu€vÌ ý…¹2×èÙ+ð”w¾9|3j xþnÁ±ƒS“'\žÌk^:ÍË&ÿìÎÇ3üÇ:Žá.¨Æy;ÛqšµÙ´„àðÄ`ÑF£ýÏD&ÛƒY|^ð$ænšì ¸PÒrÓhXb ^{¨;ÌǶ¦ЪÓåCï¦MZ>ÙÁ[ëí׆?üÐ«Ô Ã”ÍÉŒ,fÜØÕ›¨èòÁÂ$[¹¹Lâ× ¿Œ§F:GÍ!©Im3¦þÎÂJx˜ØŸÖž·e°¡ótÊM1˜]ô.g·£Ëk)x&rLœˆjUÐqðT?+Û‚_AïP¿ SÁ6½ÌÚ1úB;Øw‹½hTH‡R ‘•r+Óì(Ni㦖¾ð£Ä³ÊË]ë¼2m*K„ÖšÚœÔ6ATë`7ÐË|ƒÂFŸd˜ŸäZnVX1<gYÎ|篨L,Š2Ï÷ñ‚A‡ý”¿I½u"ž2¡ú4# n0h“I…£¾äB`»<6ˆ’*5 g°¥ò †{ƒtíŒ9nÕÒ«kVALnó…3sŽˆ)uxKÊû ìô·ø¨¥kV_Ù_ÊÔ.;µ,y¹\îþ/6æ¦(—ÔC)ÿvWÞïI֮˯[½’1^=ož‰õí÷=ð[vò$I*pµÃ·dUøD/—…x/˜+õÂ'>¸%DŽÅZòuqÄù?uêc)V>q˜›c„†—6–—¹ua+«…„›dB~Í©ÈPú°Á´m£^ªÒ¹]E,ë§TÖ”W^‹/?ðzXú®Hjè†þ~l:í¯MV‡'ªqÚ|J˰©Eà¯iðsúK;ù}fž©»Ž•)†¾¼³¥ ª(«˜,öVB4vLƒñO|dÜG÷³ÛÞÝÃU¯?}Æ©r~ÃBÇ t-zUŸò¸Ê?@ÝÆÓÇJìîºÙÐmå§ÓÿÌ­!Ä |†Ë\È:ÚpèGÀ˜Ù“Õ+'…ïãŽÙ±s/Èc¤¡’ÚÓfÃN§úФ0ëK±¨œÕá]_ è!{…áÊá³ÑË~ÛŽØÙbýñ“ž°ùU†õåž<—H5ŒU4Ùæ|W¯<'/D,2éRu»Ü àË‘ýá÷ ‹“ÌœüÕ /v W.óyjæû:§»séïÆöò±ûɼ3÷MÓ׿ÿ-ñrYtpm-tools-1.3.9.2/.git/objects/79/0000775000175000017510000000000013737441327015643 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/79/35b7bc68e38b77a127df6f8eff537ab218e3030000444000175000017510000000173113737441327023071 0ustar deboradeborax•UmkGîçýè ¾Ãrq  µl‘Ç’ÐÉ % eï4Ò-^í»{Rüã;s/²¬”Ђ·/óÌ33ÏÌfÚfÐ÷öê—dÁ-÷N­‹½›3¸¼è¿ƒ‘ èŒ Ê©aPyeÐ{¸—yÁ_dâJëêsA"Y"¤XZes6IæD¢V IK‘„7"™NÅb5X,^õ«Y½L’Ƽdó?Ñ•“O_Ê¡·+ÐÀ!—æ×•G „³Ö—¼ÙÖ+‰'' Ö¨Æú¤|pÓ2AX,L/yõþ÷×ÀlˆÄk‘ ®ô5šBÄÄ">¹¬±æ! åæo‡>8•ï#¸‚ˆ“_ôãË·@4ŸÞSjŒ\ãM ló¾x¹ 1œ‰$ýãëû¡89€E C‚Ì”VaÁ‚Ìs.ï¦*°F˜Yà÷5^”þ5žLÓQJ,ä´HŠ=\ˆdð£÷Ù¾Àd:MÆðU4Ö·Ãôf6ª÷ ©Õ ;*±£ê‡††2Tì v…å:ýŒc0/”úqK\ÉJȰ[eH³©=Ź•JËL#ìT(êË,›x7þ˜…-Yf‰¨m‰É@kBeW+Ò"T&(]cØAÇÞsÒ!9#‡¥³›’¢YfÕ\*¥÷Ö-‰ñç]mž9œ×vÿ­LìHMäŸJzpÉ‘ÒífósV;¢Å†t³Ô°Aèâ¯SLân²%µ¶;&ÊíÞü=P2`S…Šîï¿åšZ~KÊ#+æ§%µ’¥ž±¦^w$5MƒCÂs霢˜lÒÓ¼éô¸ ÷çïuIkq«|©åþmåYÊʬ,upco ·èгCCæ;:Kr¥ïº•»LC£éæ çô3¡Â£BйÃpvN ñÓF8MÓw£©õLã9J‡C¸þ”N^LÃg-öú„JmÅ32ÈG¬A|¡X㽫ö,÷ËfÙbΆÓÉl>€ÁÃÔ³zš)±ÖËoÁYzèœëÿ?4=c>ñ¶r9’¸ÖHoWx/þý'—Ëtpm-tools-1.3.9.2/.git/objects/50/0000775000175000017510000000000013736475612015633 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/50/8ef978b79d5604fd000f46209c707a5dbb9f900000444000175000017510000000032313736475612022723 0ustar deboradeborax+)JMU026f040031QðMÌNMËÌIÕKÌeH›Ä¢Ym8S·åÉ7E¦j—• w ÊJ rãsòÓõ’ž~u~1éû QÉY|¦+üÍúíIQAvr±¡!Pc oäL»«Wwï{ÈhüTy}’º’â‚L ª‰^/ÝñÇZœy§Xy0rÚ¹‚ŠÃQlOÈaìº" ‡é ²_Š»p*;±;ð’4ön¦)ìM… öÂXLÂ7¼#>X›xˆÜ_Lí«Z8™„èLo|ÏMÏqƒÄ6¤ÒJ2fã‰ìÏÿR¸˜ÅâÖøJhŽŠGE@ƒ’’’8™ˆZ&Fvp'|xÕÞgìܦðV}ŒcÆp…E3Ž»qÅ4q‡S¿B¼áqÕ°ÎÚ–¨¶ÞŠ«j·[mYo_bs:ñ±"Yy“È÷`<ÛAzõ‰Ãy½[;Iõ¸ÑlXoɈӆժ÷zâ´ÝUÑ©v­Fí¢YíŠÎE·ÓîÕw…èáXà bïÐ!âeশç'Úæ·8ÁŠù1¶o]œ¤ãza ‘¥}šË”é‡Áˆƒüy¬¼ÞPaZÑ|(Jàª[Ïó”hÇiííÍf³]¸5HpNŽ»Æ£=„…A²çDþÁîþn4ŽHá½zãO‘U?&éÀ wÇ?e–Ü8––|o⥠m›ï+¦Ñ¤Ÿ&‘·;..­NSòÍÊrpëp˜Ò“$E–:ˆçÄ0Æ RÜzï/õÃãv»©û‰›šKT(“ûž%ÞG×%Õ`piûS7)QøÞòÇŠ(Ë,¯•Á  ŸñŸ±XrºBMTœ¤ÕY~ð}Í·ž\ <@›¼„®€{ݰdpb ^ã}ʾ9_зŠY´I`8Š '÷k™|”٤͟ë'.9zéñiµÙããe&&kAhž,ùán®Lv»£ X´.šMÒò>™Kœmæ¬kʲ•z]©ëH¾™§ÆâUÙžÑs^ƒ±¤NOP¹Q[JTÜäVµPܹ«ˆÎ’®ÝßèÞ-R‘æ Ý//Pì÷ÞS |4Ý8LD‰.š«z³Ùÿ¹Õ¾jõ{õZ·n• ô<.j(qVç\°\¢èRTäU=>’Ì™ò®ä··’eMÚW¬õ•M:F³½àŸ9_\ªI2 ã±°uÙ »m-ׄ¸rýÍz½‡‚¬ë\‚a<çX܉‰A˜,èÕ©uq!LEGg2gC˦á‹.CQBD£ùÀàÞÄMʹ¢f$jö5¢fÀC_$jH¢t-v ´CH=@@,a( ÄPš´h(±ó±ž_¹Kn3W±iïæŽc~œøßƒ…Þ¬ÿÀ@Zs># ‡G¨² Ȳ’Nèz‡q ¨ödìĶ]qÆêá’£w§[ñ:Þ›½×äÆÉ|êUw’Žç½¼ êl4l®!ˆÅbÿààððéÓgÏž?ñâ»ï¾ÿþ‡ªÕããZíä¤^?=ÕÏÙth°¸Á£uÙ«Öù´Ñ¬‹mÙüÜÖøS­·.{V»‹ÁmûæWÀix&Î=±=ÖèZdV¹$³k GRŽ ’pCÏði¡1Á†Š@ !ŸídÜgO\¿xþ¾‚Fßo¼àúé!¾%h±“€pì ZòÜ(ÌÆi¥GC7–† Gr†-Œ ºô…xôøØ§âq‚ú‘-›¬Å\8ÃKºJB»OÕ5yO @£Ba"YÑtÓ—Ï|-R[Z’j0b&H^( ž)^ŠR…cˆa#´xF²·â-º·Õ—ÙÖ—ª¢¹Á@ñ“8̘b·fhŸešç Q"‚£ø2X2“xS}‚—ÈÑ"? Àz49¥¬+±þä•8ÔXƒZÿWò`åAã±8D—ïÌÉ®å*vn½Ûßš?¤Xö ‹@TŠiBi3K…(!Y/øsYª8â>A(ø-…“vþ+v¾ÒšÎr÷ÏHJÿŒBŸ±%SQµCWCÁN]™; ªÉU™,íã×kVßzÛ©÷‰XöY0ò‹ú=`Fìh´NÛýÞY»k™-&ï¸#‚ÞE­†qÔ ƒäKRÆaš… ºÜž›vœ˜{ Œ)=ü?JÓŠ(¿µúeö)œ­X#Wä-D­ yñ¹¯¸ü/%ËåÑŠö_ì-æõ­ÜµØ„¤"† …º€©eìðÕCEn‚«³ÄmSz}*2²Ë­¥J4U0ñ:Y‘¦’ 0#lU¬©$ž{ ÕLSh¦ ×Éj* ç°¨)è/&ÜÜ›Øþªà •ý`*[SÔîLes+‰+Jp®ÊšjªåÊyT5Õjµ†êNQQ¨¨mêÏYûOŸU‚qÒý¦§¾=RI’_ãA “:€šéj¢éœ÷›íZÿ—z·-~7_Û­zæ›u…gTô•‚šÈ:ëÖ³ûNÛ]ºãH§Fú½»„ºM,ಹ˜ÚzÒé /U|7CâWBÖ úPÙxòŽ’£è(<²â£ÙÑðèîã(Š“2‰ dãŲØã±¾/äm¥”†› E?<Ÿ*Îo©f|ò–uˆñÜ|—QRþQfþ(÷­ˆC¯&SLµñ~éÖï¸NpµØŒì´“#F éJ£qʆô<¹²Ò€oZëwøIý ÞÏݼÿÝçEGÜà…טŸœ¸7ÓQ©8g’P•ýðxÿûŒ‡¥…&(  –3ydî.yrš4 4¥‡ö?Lñ¼vSÜo†hî»uÌÙèl\b»€Ò´rkÑU”j­K¹®¹Éo˜KŒ÷0U(J³3MyÒ\‘h  û¯ëV§Úë]P?Y§¹j"£'G¢ˆ¼Ù4*+ÂÉ ½Ô3BÓ¾d¦¼²ýÈ&Å)^Îápþ3{9úÑ‚L˜¤}ÊÓu/dÏ\ûß—ÌðS%-6EŒ&pŠ%:7u|oäy.Gâ‚(ÉXŠ7âGõJ¢`\ª^Ä()b&U"î1‚aŤFtÑ)´"OY¦¸BÅsV¹˜Rg@ÆWK¸x`«Ö©ñWú/öûgÕÞY¿Yoåh±‚ÀrݘãGL-õÉ!õôY:”.Ô5q(CÚdÆg* cMià}O,j êïÅYŒG-B ésN4ꪔéÑô=gŠ£Ùl@Yvpòsÿ¢W}]'“ùÆÛÌàæÜÓX R j…3Amü‰nZ¾g+Ì—LPB ÕëqšebúÐAm8Èpâk]Å´áô­B:+w]Lg•ø!­ÛI/Ÿ•I–SåÝ\ yzXÒ •g‰™ÕëT-«Û86 @=ÜWTÈ‹”EáýðæW}o}•ôN½{Þèõí–5 £¢ˆ)À„þNªVµ×ø…“rçò &~™üìÛŸ®|+/3geÚ({Õm 7HS–¨=ùSέ<†£¹ÕÒðZ ?,yò$“˜Ë[®½÷Ù‘½²1€óKfj9…G÷,þGE"§deÐÐ2Xá©Эì:äa6MOçð ¾ÎAi4A«Nç¢núÉY«œ5ÑÔ•O‡t‚H.¥Ëɘ§{Ĺ³-c)æÅK‡ŠSþ`Qà 1z…BÞ¸h1-)œ2—iV*=A\jÖë“÷üÿE&«ý-Bó>­Mí´¿)8YÜbt d~ÛðÔ3 ’ê%¬‚(€CúA\IïA‡Ë·Ty Uý[¨mü>ze`;ý°”hÅÖãd‹PZ…¿ÒÏœ$Ü^LyŸejÛÊ;*¼ 1]&>šÛ«õ£.ÚAŸÙi4 &$‘“´¹¢56܈÷+õ¤©F1%³·"Æ3 X⾨ðCä©(ùZ­ËwˆŸûö"Ûqç e>\ÍVó Yô… ‚à<QoÚ›òÉ㧨þùápæÝ½ð¤7ê4Xø J§ežª øÒQáŸ@Çx#be£`&<«E_’aP.{+Š#ŒÌõÍHS öjúu‹â½D¾DjnÓ…­ó‘<£™ü|*žxtpm-tools-1.3.9.2/.git/objects/info/0000775000175000017510000000000013735320432016326 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/87/0000775000175000017510000000000013736475612015645 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/87/cd222ab0daf8fae25962a393447dbb2a32cb0b0000444000175000017510000000071113736475612023237 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•á ŸØáþëγÙóÿe/hà¼YQ‘“™ÄÐ÷³bûÜ0–¿ ün s ªbwÏŸ‘ÍMÌc˜ìzC³^ðç¾_¯››¶îY¿CÏVý D¶ ?žáfÆéiŒÛTsøU×ï»ub­öÏkÙâ¢d†›LÅuõ~ÌÛ³ž© cÕ7¹ì™ÁÙ’T Ã”ãÅN¥®h{ÿ%CûΣÙ—’†Èÿtpm-tools-1.3.9.2/.git/objects/87/4f03b8ceaf7194edcb3be550af548ad8c6113b0000444000175000017510000000152713735320664023265 0ustar deboradeborax+)JMU0441d040031QðMÌNMËÌIÕKÌe¨YR3éûG’27Ý¿ë]øõü´ô‡Pe%¹ñ‰É%™e‰%©zÉ þl­†¹q‡wDÎK9ý:/Š÷Ø‘$•ɉy驉¥%@µ/e¹ÿÊh®þ™¼%VøúÔ9S·>T@V›“šXTv|SÛŸ§e±_f¹?á±ú—‰Òû«èÊ“€MfpÉb–«¨ÌãqްÛr¹ö¬¹O7²Ò¢T +S³*ŸÛh‡º?H›4»7êjØrµeµ:JH*Só &rüôu˜ÌQl¼aSÉ•}ûÙŒ¾h ©KO-)(M›xê¤ã»µšKR3X#szeéz!©Ì+KÎÏÍÍÏÚV±kK…È!ÎEÿäœv}™|FÜbcl*3Ö‘ž±}þ“#7)ÍY¬jÒ°yå•)À(ÊùÜ[#}ã•ÇN7O;¶ð§r Y1)߉EQ™™—–T×™’!µ×@Ž#©cÁŠ#9ι'ì÷ŸCQ ¢ ºIÜϤœßóIï‹ØëµBü|ºÅ›~¡©FO1Èêh›¼=1©×ærìüº*Ú¼æëbáJ¥åE™à´¡mtÄ$MèÔnç¬[Ò÷§mY}ùÌO$…ùå°@Ÿûƒ}… ×µÖ³þìÞ›bÿVüD ’‚¢ÔâÔ¼ Õ,÷îœÝ˜¤'•ûgI´Ó‘E^"‚Ô”ÉÅOyүР·`bÝ–Êî“RVAte)‰9ùÉ ”Áû–9rR¸ÒÔú'’³?úÞ§q9Æf–e&ãýõÓWo«¦el:tl‡ÛãwÏ’ íïk¢š V^\2;§oAاE+¬g3÷èœóñùWï­¢¸,?’>ŸÊU?öÕIdÅòûu1 Ü'{umT§æ¤•]4S íš^£)«Àæ'kÙE²Óµ—†\ GQY’_Z”X’_Ív»¬º›JâVÍØ~óÎS.?“Pï:¹IÈJ‹JJ €&G‰oòwÞ'õ%fjQ‡îÃè—a·üÅ– `œ¥gd‚”WÌwú5gÍ}Ñ[ŸD°$QV.Nr@R^T˜ Nÿ’ÛEB<ù'®ït{æÝ?µpqÈnXZÉtpm-tools-1.3.9.2/.git/objects/53/0000775000175000017510000000000013737526666015645 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/53/2543f7d342385e90edb489e4c6ef5b83adae460000444000175000017510000001737313737526666023110 0ustar deboradeboraxí]ms7’¾¯Ò¯€uU‰¤(–í«­ÚµW{EѴóDªHʉ+•š‘#iÖ|ó )GëÍ¿çé˜áP¦´>oöjU‰EÍFw£ß4/Ƴ óìzòô?÷·Í¾\'¦=Mi<6/“›d<›'™™]š^t³ô*âMs6JLš£å"ɦñ"á)»/ótšä¹9‡×ü„¦Ù|–I“Çæl–±mn†Y/’‘¹¸5íãSö Ú™8Kð÷üÃ]/ÌnsÏ<{òäåÑŠ¡Ø¹~´Æxlz‘›^’'ÙM2zŒÖì0¸öólv•ÅNä2K“Ï.1ö s;[ša<5Y2JóE–^,˜ïÂÄÓÑá,3“Ù(½¼%<[NG ÉZLrG«æl2™MÍÙòbœÍI:L¦ybbŒÊ'ùµLž 0ÿpò/L’Xfn’,­ÌSÑÂ80À`7^IpfN‚îP<½5cPµèºn²~N#“Nõk°3ú˜‚p‰YæÉår|@Ø €ù±=ø¡{>0Î;óc£×ktï^ ñâz†·•Næã³%³xº¸ú„pÚê5@—Æqû¤=xÇI¼j:­~ß¼êöLÜ5zƒvóü¤Ñ3gç½³n¿õؘ>Øj@=A/…—Q²ˆÓqîæüÌØxd®ã›œ&)ÀÄfÉr4­*ÄϦW29Œïeå…I/Ít¶8pp(% ÕMš|$ðû^/ó燇?~| ²Nsði˜<žeW‡ŠA~8œŸ>~òx~='‡ÛÛÿ™N‡ã%VÕÎ(^Ĉˆ¥òøz§úb(bÅþÍŸóI4?ÌŸ>}|ý—Êóå‚TÁãày¾Ó‹rÛå’>’g£äK×D¯;çQ¿{Þk¶‚¾WÉ2Wî›dÙtVCfž³<.7v/~ýÓ?­só_õïæÉ¤þEœO+³w%7óú.@›/üävl—TžÇBþmU‹¯¡'¡÷nâ,/ÆI.L^Ç™Ù¿Šæùß^¥ãÄsd:ç''/¶¶M÷â¯ÉëI8i.Ù`O’í W{$ýêz’é"½L‡¢8ë{n±fïsÛétFWÑ…ÕDìðªqÒo)–öéL‘ÍçÉ£&™ïö:\~JÝðô°3£ÌX\óñm8±Áì=´A‰úh_$c³˜Yõ2Ú¶qàØX,²ümÇç-èÙ]ó¨4 oeÉb™MÍ÷O_`ô­-Y}Å:‚­-çD&ÀóÛ]Àáx/]À€sŒCr9q# ¬JçÇk|„¥°l&/Dñ{üTö̆è‰Ð€F°¿tˆB½È8”¦÷Eix-cÁ·²‹ko=r”s'2‰q2ý,Oã÷JdË~q{†犲×KGfÐ;o­òª;ß:%Z晓+j9G‰Å½(!2¶K¶ 'e©90ƒî›V'êŠZ‰Þ´ÞA²Í#,EüþæJ”¬’M:7[½zÙÎ{ì[+Å¢Ï7’u®Ù¹Mò®':ø|8uJ9/hr[šº|•Î[¿a%Ùeµˆ¿Ôæ-óøª¢k^¦ù|ßzFš@‰À ›¨‹/†ñf†õ\꾋.5ÒœŒD[lo©nÁŠ…ZÉ~ö „ ôèe’åñö–k>ü‚©ì¼jŸ´vÐÞ>—–ö]´»ÓVÛK±9kÅ’aG¯ß0ï“[çÏÿô¾ˆ&NÄä&Ngiª)ô€®’±öü`?Ã5'¢×+(„o¶·Æ³+Ìö‡d0ëâÑ7A;@Ñ·ß5;ß§æûïÓ‘8‚Æ¥3¤&ã§'ÊÓ\W:ÃW‡b¡ÊsJX–•µª´°¾…Íwöj1zOŒTkö½vçõNˆ’>â©:2·¢ÅT¿Ú`òìM³ÿŸOŸªveS8FkœrÀ)Íéúñ¬²Ôapfê€aª/vó½5#Ì9‚ª©b2ÝIëXÃ8XqFÖ@D˜"ÑMƒ°ýòU<£v[«ÖÖ€½%X.|GòFž/A„®ä}±Èxwc×¼8ÙYZ>Ç>EÿÁ¤ž'Öxúüýóéóùâù-W:”õnµâb »O¨±íÏ¿°õ'.ŒOè$‹eç¾é‡eŠ8>г+i žpÁÐÑ0¿ Ñœ‚ugãiÐØÉÁU¨ó ¡¬;Á¾[CPîl¼ ûk¸µ­~±„Êig9qD…òôoÉì’†«x¸gƒÇ!}¡Œ`†èv•L“,‚Ò?@GŒ“L\>ᶺ[d.Éòï åÀ„ˆHËЙ=€V ì(±Ïýþž¡å,yòš‚õ—#z DGl‹*ô4¿Úµvœ:2jõzÈ4P¿n•Ʋ*™øYŒ‡4 † é㼊Ö~_¿ÖœÒ£lýŠ neW´£HÈ}?‰3¸ÐÔWªMŠR¾œk.Etˆ¤g$™»xGPg—ˆ<‚U,~j „ :‚ª[ííô£_Ö5˜î8Š}$kÚÝN„4ÎK˜Š_÷z@)„+¾Xʆ˜‡ãsÆoòM°`˜·¾‡®<˜þ'»4gK,ßj|¢í0’õÕvûÔ9×Jéõªƒ±Ór¬½d<«¯¿÷V†Ên @øóø¸Û=1æb-¬õ^·ù÷˜Ø92R—ñr¼0¹ò×›TéÐeñR[rŽÔbø)YóM#WôÀ|#CaIÙ¬#ïJŒMm|€`z^„Êü+~ÒcûöKÛ´ wÄdz҄ ó (´˜*u¼> g¢y~²²:JOŒˆÃϦøw°€õ†ža£B0Õ&?ƒm¥=­LJeîkðM®6°á1ºL-máíöÖ$™ ç·»:—ÒŠm•lûK´P_KôZyæÔ}¥1Ìw5`‘•´‹«B¸»†ƒ²º¸èUìsêÃba»)|à0Žvò¹L²Pî?‚"èEÝ7`ÉCÁ>—è½ð=†×Éð}­f¤w[£Œ¨½îE¶^ ¨¥JÍé8UkeÝ9\fl?˜P#³Ü¾D¾ž·f°¨(ágðŸ´;†@ʼnb‚+ªK$˜°£z½Y7‘ZÅ·^›Õ(Nˆæ]z“=‚•*J¤$BkT`—I'¤ÙÀ]dy4˦Yë­AL4ï‚ÁÊÚvßɃÂ(Ô*VeY±ËK]ÀüoÈe!Ÿø3#rÉ1hÞ~õº§gŒ¢¿+Þ•±üŽÁÔC8j|ì+Ä|R9ÅȹI®*°ÀUî¢ô¬Ãò2qì)¯ÏÀzŒ–?.9RðE”€°?!ÇìÈÇü9m'“}T´þûߥ÷–dVDŠWB0’¡Ô†Y9I߸vz.ZCý°“#D@j¢ù‡ã?ø_!tv‘Ù3ˆäÆà®q<œí#7½PÝ1 )ôÚ(Ïn[u>ßšm§¦¤ÏŠJeC‰< •c0«¦`Y @_Zý+© ,idŒ(c&Áv»¬olIC ?^sÏi~‚êruØE"vßJ„6)«4'õ?#ÝP"QÖP `Ût^V¯×f›¯«"h*-"¤íG?!;×DòD—Íu[«ýþ‰ÁNfgÈ¢ÌëÇÜà­$Á*¹=¿BØ¥¥5ܨšM±„Nãè¢IçåMr[mGœ=¥A•¿©‚T²Á–ô›îÏín öaÓ)d»€±¯Ý1Ûj½=‹Î˜“ÞŸcèb# °‹¡\[ HH*¡™$A(¤Ú8yàB«(–TÆV)Û¹ª¡Æ-R—Ü Ú˜lGu¸ÕàFß­,›!I &\âïî2ê„[ƒÁLd‘mu`u‚±µS˜ÄBˆ ñ=ò˜üê9[d`åÑùqzÿ†òÖa4ëãÿÜ-êÒQ'¿œæé3¾r‹Gæjñ†,²¸ŠÚ§UíÌfŠÓyŽÍaFSÎÖ°‰ç%Wáh–äÓo±¦ eyAܱZ…]ÿº5ˆNÚÇ\²:ª/Ü‹8)¼ƒv”í‘-ß«×jô»JGvéEnÔ4z„Üiy;µ‘·w "o°š{8¦Ì"wàì5{F0b½EŽa-Õ„&ãœ[1+ÜpÀ €–´–M¥| ¯‡” ˜OçvÏeö­dcÿ°X¡bWA²ö}¼,¥#+á3²|ÈÚB|T80G+,\r*+wÒ„X%cUŠBz¢ÇЬƒQŒ[¶R«„¼œNˆ.àE)r²2!Ùw*Þqߣ@]DÌño¸ËåsdEÆÑ×úOBBÒ¿|½Òùæ]¢’໎g9=.Õ&lnq%³ ¡ T¶ u ƒMÁ0ÅöSDÍl=+ëñÜö¯`B)VAˆo·*Â>š:+v¼5)¡ôJ˜ Î 7Û¯ÚÍÆ  Þ!K¶¾«í YmF2<侎O¤h4_—5ªBFü! }IG² ¤Õl!ü¡]òi“‹e\SÊŽ†¶ÐzE2'ðáeIèêªsíD@Ýï Ôû¹š8P)ä©‹ù¿ˆء˘ý[üB®çÍç$‚§­ôøh™ÄÊü& ?£§ii¡«TÞ—{îª/áV”üvz«ê×¹FX‹Õt¸ÏêØå]“5aøEóš 2‘‹:SɘïÏÛØÜC ?ΧÛjô;O£vgÐzÝêÁìcc&c—§h¡àõÐòÀD3ÐcL© 6¢¦±G®˜E.À×õFÒL'‰œË½© ÑŠ cÓ„Û‘ œqwÒ5O8*?Ã15Ç1N:Q+v£@¿©n 8UÊ>r¬‚À+ªÔRßá†ßgYzCéÁŽÆ˜Gþt —Ìð#w©‡ç€'ü‘Ì…’ZUa¦ËÉE’ÁÁEvX¶^B{2Yâ(œož/#ƒ P.&uiÔ.ñD²=!]Õú NɪüÒ&Ð :> ”×ôÁCÈf¸p½…³^û-ÌÆp„ò¸'è§Ý—0nãéÅ’ ‹lœ”±‘cNvG‚'ŽtOÂ= ñ®2›ÖÍqÛQ<ªàõ%·I°Û,;)ýþy«ç6—Ÿ”ˆÜoõÚ“¨s~z¼®ÉÛÆÉ9ˆ¤á‰í]6ÉKY……„„¶ØÉfù™m—rÖÖØ ®:Èákì[ÑR‰–Óª8?›ÈCj¥ÐãF¸eÕJà3kψ»é*J'F Öu¶=ê]Ðr”@÷ùžþsÅ¥ßRlT/¥Ï4Å ÷R1ÔxõXàéûý¹ÈºVÚ/l‰%Ur' ¼n¸P¨d(¢Z6ø^_‰Fž¡ ? ””%ÅŸ>J/Áø'0&6/am“éw_Fö,™»F°º8†Ö°'y't†\³~r®ùWžwªK!=-°½åíŒù£ùåñ‡²e›»X.XÔ•6˱4²,vNE¹ÝŸ*° >¯6+ ™_nú'Kè‘°5MJà,¹­Þ³># Qe¤ í©ÚäºTiA îöƒBOƒÛn›¹P0+SŸéÀHå §hlR pælåG¡ZySš¯ëcêÑŒ³'u¥ÝÁrúÒå/{HzpĻ־ÿæõCÜh±%k¢¬’î …ô•îÊI7_ÏQÉQ0;éö¿aRëÁTØT—¤`²—ÇÈùÀ”B¶iæÚžRõö7KW€ý‘Ó0@óùþWCIB¯$ ¥ÿþœÝànhöIsÌ|äŸÀwø™b¶ ÛlôÎ Y Gòõ #ó(®…™¿ÒÁ'±g*¡Rˆð””\E^pm¨Ù°¹.çûÕ'¨çprí«å§õ§§ësßpO½R©Û8¾g’“ù•þZ§¢%•†÷gË‹’V©K±Uòž”å@d5ÐÜ8ñýÿ-nÑÖÁPݦ›J«g Ëoœ³qŠM,t¾Äw£³óã“v“éjØ@Xæ­5wJe· ùȧöú mUNº­>1ÔÐ ÎÑvÀ ´”ÃU70l¯Ñ–Õ«ˆ;E/×JÇ¿Ž¢¨çï½²ížWÐ ¿;ù)pÚXxÜÒ&ƒ©¨íÏz{±V ¤¯­$¾S5ÂôÃõ§jÁÆÃv7}®,Þc×[¶GjaìŠ›àˆª¿­w³n3†úŽÝ”»zUò™§¶kã½…xÜFiƒS³Ÿåq„{eò;—@«ˆ#O"LVÒ5 Xk›Éo¤¤é¡k-QÔTÇ©ÿèâv‘àµt‘H\ÚÈUî#³Ú&Q@˜ÿú!8öj,š¹=£W1ÎZàM±ÁwÜðÙç.̧gÃ]#¸1SP¼e÷V°’t^—5êp ±ÐÝtàvËgœ.¬B»Ñ"í¿«¼ÏRl@06ØcbßæÖa­ÏæQö~˜æ¼1ëèý«n{„ Ç’ÜÏvá˜PöRïºãaÉqßýV§Ù{w6ÀÚØàNÊ[ì~¼zwŸ¶Q¯Õì¢ûˆ û9êßnþØkœmÚ[Rç'ç}„ëøK7ÜU²BÞúé¬Ûiu0?,wY%5bîéZÊnyêöÈ›Í#¨ Iª;§­Ón/8 ³€Úœ ThÂqH\YÈPô÷—µâ’=ÊB× Ú-¼³½½½t1}†ŽVq2¢»*ÏI ÕWÊ æ:sÅJ|>eÊ`‡éÒ U¨o(-¡Ê}r¥š#UÜõ³Å·.;çR5X9¡cS±€>—s‡ ¡<Ä>в۴‚ÖŽ@þU[‰Òb+?Ô¾MæO]÷É÷1ý0™3±™m‹º èp³Ln%17‚…Në \ä÷‡rãa¶ˆp™9žTÛ+v _°“ÄNEú ÙrͬJQ˜:{¯S“±æëüAHá|X×Fg-p8±uÍøNèc[~¸£å‡ %ɲ¦'$ïŸèµxŸfø4Bù’Ç3ÞʤJo?o…Ú¥·B?ï09RWÚ€ra%r©ÐÌ·qäE›šã.pZ K£.öäÅÚŒ—³ûâS•’^_Ñùr8{[N¤ì’üÛý*¹÷u¿ú8«Ý´ßâÀÈ&ØËÖ=¼µ>b£ÍÀ²å}=µóÎ}|µÖOƒ^£‰’z~hWðpï¬/ì›wq5ZÔJÉSìµO[Œìh•Õ—ÏÌüG=¾tpÙ™ Eÿ]Û PFb¯øoµU³Ûz…ÃÃmñU©UPdÁªî¯ê±Òo‰÷:—?È¿¢=åP—'¢ïîmÕ&ûňVÜar¾î9™^÷Ü3»þ-]&2¹î­ç-ßʆdÕ_qRG¸½F©d´'dšúYÉ¥ŸEhh<ÝŸ– ú§ ÐÚí19Ü ñNwžáf²ÌîÅ êlì›vÛv¯&ÇUÀ¼·s?é!g…+^ý522£€8«Nÿ5÷¾V@ªy<`ù8H6„Ï~ù£° ©õç"jBÃÉ a€]D= ¯n…†§0dèb~~l ”1"ðànÀZ™*“˜K”…M¸†íUIÙZ`ß}ƒ>²{¯ôàJÛÃSÄ 90!!ÀŽÏì×…Ÿ£'ìãÇm*5¯­¬¶)ºo._H½” ýö€Ng•^ža%R=DøZ€œÊÂCÚ4×]¡:…a-¹ÑiCZ?„ÐZb°²ÔWcf¿ŒÿÚ!9n˯¶m©°Ö¯‹ ñ¹œy±5fôà0µ)©i À¡¦¬d§JøÚ#e¸Åç*˜YŸXÎчłòc!6öÈ7rý1§µÕ!¤OiÏÂÞ¹•ÊÅBg»ân†´Çõ [:χÒëÝæ·9m!<4zÏš¶á1*¨w•¥gµ0ŸÜ… …Ií «œîa ‰¬ð(ñá‰=–¶@ý-„z »PšŽ^UšÊÂ~ä}`Ñ¥RÓ—jì@E” –÷VujKbóAºxìá=‰ Ô„‡Á•TšPVT çqQNÀêKFèbÔš8m£üTçµ­r€‚t,1V HlP?BšÜ·|DpêG/½òjjqhsÅ€îX}iyÜu®Þ ”ˆÄÜ•o²'ë-Ç0{„G…®õú«½¤Ø?v®¾tT}ý™èpºÛ¨ÓkÿÖ´’;íŽãÛ)CdÃÂUÂ`™b©{éôW›©›OR£(‹ b-j Qœú“5œËO~]D£g)ü±-6!Ô*wqiW‹~óúPý1@øõ™Üè7ÛmÞÓgÙ#,jÜ•u'ßë©B~ó¤83sA‰áôYɹÿP9îÚ¹*¹¸¤U¨„¯2]àëjyã8–­>´«æb¯À„qG¹„Ûš]9¶uÿŠß)AÉ<”¬ä­ǔ߯€¢ÖËgC¾`àr9r§ÆN_—8®F[ia‰ oÛhD7hTTèƒíUÛãn“«è€º¶Ëåk,Þž ìíº²žJšZ)Ù[)é –KmîÂÖž¡vnÉòÁ;ª”ra•0ûÃÝfÖ ¦5^”óÀiHå² ¬ºÂV&˜4nFÂ!…›Œ¶zv™{ |Ìg%ŒÀ-[´/}úG²ß€ÒF¹°þ-¶\Àm¿Õ÷Ü nœÀ×"$Q“Vá ‹Ï9Lß ‚“mI¨¾± ÃâÀ×*¼‘W,ëG¶õ'ÚãêV¯ü!<®^i ”TªÚb± *õbX¿¼˜±»=ïÎthr8OÀŽøÅhQrÿ¯ç!ç]9¯Ò4Ìj%ɃWH–\Œû¿R µºÌlTN{õ~t™ f4ì«Í_“ÇsuàKlPúM+̰Ä1’ðµSÔ°¯ïñõi `)ÔÖ¯-‡ÌBÈ9Ê›á ¾AB3CP“¬Ög&øÃ÷ã÷LhŽåHÃßN¢iivmÍSØ'±Ò jr K’æ€å„gcؘ3Í ^þ9nÊFgíNáãËñ&!h`€PGà/Ì䄳ä‰SNYTžC¡éå=ÍQÔ ‡ZŒJ‰ÁY‡MÀaWÉ+Âe·6cPxφ(«ÃaŠÁÌ•Öí¯Èž o ×X<äc ]êVñ µ%Äê)ìR‚ƒ°Z@bj€Jª1¿F‘y§Í¼>±<õø/)q$Ú¨0þ=c ßÀzŸê³‹}wu‘¬/Ïì÷ßP}-Õ÷Á3®9è¢ÄCÈ£{&FÊ—F¹¨ -òYó^iPû½2x×Eê†ã$žò yä‰H3É&Ž£†ïÍÓ—(`Ýl¢Ì¸-W.ÉnË‹ÕôzÕ@}÷—uÀ'ý -õ¿©Ò&tpm-tools-1.3.9.2/.git/objects/cf/0000775000175000017510000000000013737507136015775 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/cf/cc6cd32a5a984b2b667c59db2d0b7a5a90c09d0000444000175000017510000000174613737507136023346 0ustar deboradeborax•TÛnã6í3¿bÞ²‹µ],ë‚E‘Ý\œ´I¬³Ý‡Þ@J#‰­D $•Ä?Öèu¨8»Þ¶(PÀeqx8sxΩô0HÑz]|ã "ˆ\43Žq„¼æqž¦iÜ`•ñu\ñb-ÒT„¹@6rƒÊȪ(Oy“­ò,jŠªë"iVI„qQ%yœ<‹°®Ÿ\§ Üpç:É-lÐX§ÐÀÛ¡Ý?žØÉbPã·¥«$OŠ|›0 CVÍ}:*?C¡ ‡°ç¦FxÏ…€·õüò¤—jz ¤ª'”uGq‘†1,ÃŒP˜‡¥Óº·%TÚ˜it '7NôÓ-þú@­H­hu¸ª»Ä¾× Æ8T“uz  ŽÚ8¬¡Eç¤jÿõØ¡3)å×\‡ìèùè:€+n2Êú|A NÁ=jÖNhA*ÿžvÔX2¶„Û×× vîËÒýÝ Q¡jböêlÞþ<ßik¥èw0©©¨áš;NØ0©ü4¨u5³+UEç+ª&–©80 uªmALMC£Ó^º¢:€ûŽÙvxo5ô$pˆ&Ãmç;·DTÒTÓ`'|ËØUZê§’¯:êÛ¡ÒÊqIöRSßï]C Ž~9!™¼"©[à㈜´­˜8ðêþô½Ú+2a6do¿‘4Lá9 âôÎmÀŽZŠˆ#oŠTR³‡•ʧ åž k™]çO|{ïk€¯\\ÂóçÓùéO¡­ÙkÔ¯j}Œr6Éá¤Ï‰ )»è˜Ù„½®xÿâ]=Ó<ã ü÷ý~Ÿ*0hJò"ŽÄ›ÏsŸƒ_ÑXK㜉~\?+›¯Æ¦‘@ûX!“neKy³ÔM³»òd6û ÝÁ.Îtpm-tools-1.3.9.2/.git/objects/49/0000775000175000017510000000000013737530004015627 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/49/b9a942d6e905d1ba50de6329e5da03fe453d010000444000175000017510000000072213737530004023026 0ustar deboradeborax•’[Ó0…yö¯˜whj7·vµB»€¸‰"^ZíIbmbÛ!í¿Çɉ'Þ¬cÍwÎ[¹a0êÝþYôDPí+%*ž£Ò‡ƒj0ßéƒ,*©Š¦à…¬˲*xÍFôd#`³«w¢Q”Wšr!󲨸”J(lšºÀ}!ÏKb8ÅÎyø`T‡=U7ávO§;OºÃ˜)7¼QìëòPæ‚Ãs.8gIM)#yxCÒy„oԣׯPJ¸Õ«x×;2#‡ ¥â;‘ï…¨`ÃëDaoÍ ädz ³‰|ÉïAdôD|9Þƒ$c[@ nÄŸIÑO*2¶Ü™ðÏû7)ƒ4CKkÚf²*g Sˆ‰Ì¦@z1B¥(ˆÁ#!-8:› |MÚup&O`]„ÑSX7–]ƒóLkÀ•:BŠZ7\ðf{Ò$.IÀ5‹)³D:%¹ú`€0µ-…˜dy^“ýñ™Í£ïâDzªKµûuƒ¾w3[ë\úŠã°‰ÎõáÉí~‘Ë )clÁt1Žáf»]¸™K¯BŸ9ßnÕtÊÆnܦ7y¸ÿüîáu‡6…bìhZKzãšf#Ï7ÿñØo|@öhtpm-tools-1.3.9.2/.git/objects/f8/0000775000175000017510000000000013737441327015721 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/f8/33363645c1661268bb271db66917f167cf9b2d0000444000175000017510000000121413737441327022556 0ustar deboradeborax}TÁNã0Ýkó#±Т”°ÚËVB)"m£4[i¥ÊM&ÇŽl§Uÿžq ¦´9%o$Ï¥¡i*½ÒÖ¸1âQx¶uëÚ&£õ4ž-7Û6kƒL”̲0 þƒAv”éa¾-SÔ^EëÅ2MçY~Âù£'µêåšÓïá”õ mè†;üHû «Í?,¬ù„ÓE³ø„´-3f_R7(éNÁäOžÅë»d‘à |?÷B/‚¦Ò…qtpm-tools-1.3.9.2/.git/objects/46/0000775000175000017510000000000013750245140015623 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/46/56147dfddc02b90cd2fb08d665cd912db416e50000444000175000017510000000071013750245140023104 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™áÜC•?>3û'Wßž|!WÄÐï¹—&@ ’Y\ÂP8ÿèçsÌ7àb›„ð;žÚÈÚ“zºÙ¤ Ͷ÷qÐ8 D"ùÍ'r­¼ÒàÀ;».<#1§‘Kx’F5lÔ#èÒõ VÁËØÝ‡ šŸv» œCq"K±KŸ¤ï’'©¢^Fw¬B…]Ò¾fJväG2Ë´å4@^KÎB’¢ ýj¬];= Sôº@¶"qý }0Ë#´Š6›ç•Tçÿ.þÎÿ¶_lß¡éЇs®Œo½)=áœ×Þiµ*ìNß:¦þŠú—%a»¥¼±s;ë¤Ón-£¶ˆÿ·†=(Àû(*_g¶…¼ÒË:À£9u\mWï*UëUæèè# Âùø"Ÿ jýÈÅ¿¶¼3F÷PÃMI<¼/Nm§W[U“;)C÷#–Ú6ª]Ê­½N‡]W—çª<‰wôj§{KòºT¹ÏíR00<‚JàbP[rSÆ‹ÂæÌg3Ëv9ï¨ÀQKôÒ(ì«—zÙãxév°3£ÝAÛ±95Ô¹s‹®fM¯½+slxSmb8êܽÞÄÂS<êÕººÚy›™—;oŽù]RǼF÷aiŠs®hÛ{cá»oÀþ÷\Û<éÏø<ì—ØàûHª ßÍRùòk‚Utš‰VëŸY:l¾.¢¤<Ûœ6gåA5ª_N™•úr °d¼s‚†¨òü効™6Ø„rÿ´IØæŠˆ9ø{xØt×ïXJ*jg‡’“¢ü1ßáoô–`çîÓOî~iîÔ"„/êÙÜm·y·¤NŒj+ëT§ãKµÐŸTöÿvlchtpm-tools-1.3.9.2/.git/objects/d9/0000775000175000017510000000000013735320664015716 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/d9/9035172d2ef8c16ebcaf027088aaf61e6b99530000444000175000017510000000022413735320664023050 0ustar deboradeborax+)JMU041d040031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ç$õåNWÊ$sÚ…op É_³Š¥«"’X’Ÿ›ž[ÂðY\o½rq¯ÌŒïóˆ0?‰õqŒ†¨))È…(i÷gÞqn}á”·§­Ÿ¬éºqLе'8çtpm-tools-1.3.9.2/.git/objects/d9/e9e6259108a67b1fd7bc6dea63d8f13089d7a10000444000175000017510000000071113735320664023141 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•Á9ó©iëY/¦³¶®*ï9V¤ìZy¢"'3‰a»ógëßJù'ôoöa ֞Р‘ÍMÌc˜ìzC³^ðç¾_¯››¶îY¿CÏVý D¶ ?žáfÆéiŒÛTsøU×ï»ub­öÏkÙâ¢d†›LÅuõ~ÌÛ³ž© cÕ7¹ì™ÁÙ’T Ã”ãÅN¥®h{ÿ%CûΣÙ—bÈȤtpm-tools-1.3.9.2/.git/objects/48/0000775000175000017510000000000013737441327015637 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/48/7a4c843235f2ccc180d343e3961ab067bae4640000444000175000017510000000152713737441327022700 0ustar deboradeborax}Taoâ8½¯åWŒº¬Ú6´•vmSSÚÕF*Aª½J'!“LˆÕÄŽlÇ¿¿çÝíPüìy3ïÍØ‹B/èòËïýß>´>ÐH¼p& DÙòë×_œ3EJ:) ºã5ºbC:#‡±‘K©°3Ô)“´8éØ(á¤ÚpÜ®¬Tl-R$¹ÿÂySiSŸ h¢°”ŽSZl)º5áG‡IFpµEâÜQgØ¥«‹‹ÏoóÒ>_Ãð~Þ°(hêy,MÙ²Ys¼QA•ÑK#J¯-3Ìduæ6(âš¶zE‰Pd8•Ö¹X9XàH¨´§ •:•Ù¶©+•Â9o<*íÞá.K­h²Z2¡™°²L©=bóÚ†¾›wM,ÁhhÍÆÂCºÜÓîˆÎµt„óå¢m•7ºÛ° µ¥–7ñÿ§ÿ 3%©j!9† ‡¾„Ÿ ¦•ålUœ5I` ýˆâï㧘ÂÇgúN§ácü|—kìb¬^ùdY‚á°Êm!¦¡ÝO‡ßÞFQüìu}‹âÇûÙŒ¾§Ò$œÆÑðé!œÒäi:Ïî¢zƒ–÷ÝÎê†a´RvBö؆gôÙ¢Ì"¥\¬ýNXbTHP‚AÜûý.q“VZ-k½¨æ0V×$3RÚíÉü@ÁµäÏà‚ܹêk¯·Ùlx®,º™p Í²‡©ñc{IU\A•W¾üV)T>ßÍhÐj!M<›Í¢Ûy4›_^í~œ¸ªœ«uŠÛ¯8¨tzòwëdJ•é:ÂpKÓ_±‚…ý9zc¤«±+\‡]Q£ðEÕ ’\¨%ëb#V.úMš|ëP?ürŒ-ÙᖼŠûÛ˜4{-{ÜO±G-™CÄ1«Å$=þ ¬K ¼ÇñŽÕ;"uôëÉ 5°Bßñn-ßæ²ÚáíŽHS»Ê2ùý³vgg•(™Ú¦«Ýn÷¿Úêýý4ðM5¼Ö/ìý!¿„0ÿz ‡§·v»F}Q.Å„&8·oÔý_ñ4œßE³˜û´žI?‚í+}ôÐ:¹ÁÿŠ¢sC§ñd„'^‰%—¬Ü)y“Ï:Ý})¤Üt_÷Ï-Ãl­}jÿARû¦õ/¼þhtpm-tools-1.3.9.2/.git/objects/2e/0000775000175000017510000000000013737441327015712 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/2e/38c4b4e064fce0eae9d0d80bca6163eb3bc3c30000444000175000017510000000047513737441327023405 0ustar deboradeborax+)JMU0¶4a040031QðMÌNMËÌIÕKÌeøalfæz0M(c·ºì¶LñéçgëB••䯧&æ¤$–$ê2LþöSå“÷å>›3›µ{ Ÿù'ú Iei’Ú†u,uþ­šYv4sJuGWs¯0’Ú²Ô¢âÌü< ¡1¬fŽÛ?‘Šó8º†Oy9›[»BaI~vj^|fnA~Q Pñª%ÊìâÜ¢sÑ^Ýç¨GƒÕ Åy™ ¥GŽnd~jÐæÏ¸í‘Õäó×—L=7 ]i~RVjrI1Pµ»úQÖ[wË#fý ¹p9©Fó‚ÞtÕEù%@å@ÕÚ¾k¥-ý!dtèǹ_~¶‘BW]œZRX\\žT)m榮ô;•%¿·Z•¼’br= ªw Ætpm-tools-1.3.9.2/.git/objects/68/0000775000175000017510000000000013737526666015653 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/68/6c1603acd99cfa32d9b46bc4f404b7aa5564070000444000175000017510000000071013737526666023051 0ustar deboradeborax+)JMU0±0`040031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶ªÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•á ŸØáþëγÙóÿe/hà¼YQ‘“™ÄÐ÷³bûÜ0–¿ ün s ªbwÏŸ‘ÍMÌc¨w™z©è‘k¡¹:¿od¹§jÇ ‘-Èg¸™qDzã¶Õ~ÕõûnX«ýóD¶¸(™AõÏ”R‘M;Ä´¶š®ú磿¡Qµ"[’ t¸€r¼Ø©Ômï²dhßy4{ÃâRµeÆ:tpm-tools-1.3.9.2/.git/objects/30/0000775000175000017510000000000013736475612015631 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/30/0d108e10d0b698db9bc7d212c0069f13d823aa0000444000175000017510000000514613736475612022740 0ustar deboradeborax­XmoI¾¯ð+*D›`;Ò­töf#l“ pV‘7BÃLs¦çºgð:‘ÿû=Õ=/=ÄN¬ÕY»Rè©×§^ºª‘\Я¿ÿëÝý&íÓl-h‡ièEt!¶"’‰P$—”âÃX…«0Æ—s 5(S¡b/ %N™ý,Óa,´¦KÏ_ó¿@ª© É!]IÅ´š|%¼T´¸£ÁÙ%s:tä)ßÉÔ­SjŸïÑ룣Öµ•ª˜ùam½(¢ ‹Ð4Z¨­AÍ ³5¬O”\)oÃŽ,•¤å2½…îSº“ù^LJ¡NU¸ÈRø›’]©h#ƒpyÇrp–Åbx€ÅFXËÍFÆt•-¢Ð§aè‹X ò •OôÚ8Ï"à¿ëü)‰Âm…ÒÀŠŽ ‰¹ŒÁ‚¶—²‘ˆLÂ€î± /¾£¨–¬9[ùPÓ×3þ©ðè6p A™Ë,ê°l@ fÆ×3ê>ѽɤ7š}:qº–øŠ\±¢ÂM…ðH*/Nï`>K¸ìOÎ?€¥w6fŸØ‰wƒÙ¨?Ò»ñ„ztÕ›Ìç×ÃÞ„®®'Wãiÿhа ð0 KäK R/Œtáó'DPð( µ·ˆ¤/B$yä#³ LjÀŒd¼2ÎA•+§.)–i§ÃY¨¶¡¸eá)ó®Ó49évoook¬'_Jµê"8 t×O¢ããÃd°ÁÝfóyûQ†ªjù2^†«Ãu«:û-‹‘†Ááúwç Q¸¨Ÿ¥J"hJwS­û’“ðçJZ+M6óT'aM¯9ÍR†æ4ÏÆã!'ÅuúÜÞлÞpÚ?m6uŠ÷l¬SBÁd~šg&é÷"Ëq’ê›ÏàùÖl|£ÖZDI«(çžZeÒÑõpØ¡—ë—tß1Dy ÎÊ)8©Ã¯B.Ûµº–nõ¡V^œKõXQ©›]é¯àŸ™ü}EŽE!Ž ÉX§|6BýävTNwvbåè‡ßÃ>3¿—îðï¢ÃŠæóØ P@Z¥ØQ§ò·8 ¬Ôְ⤄£sšóæÆ–Špü ¶~'1ßÁ޳¼áVý]¢¹_Ù[±õÚ¸]‡‘0©Ä`#Ò+‘Ê$GhŽŒ ‹²5kP*Šjk!(m·ý’£goèàØøÂÀãFö×PdÔX¾‡áõ„Ín5•ŽUÝ}6–â«i¦bHäè4rÖmΊZºÔ°wÞný¢‹å„~ÑÆ­=ÜŠEŸEä`ônü$‰Løý³ë÷O’h(‘ß  'ì½—(bÌ4Oëœç“ –³Q€n*hòoƒ„{Àޏ¿sƒ­!?É×ï3€ƒ¶À†ñÅðÛÜÏò«Í/³É5Æ—‡ÈßþR ÄÒË¢Ô™Mæ›°H¹k(¹·Ck+ã~^ÖP#ä¨ù2siܸk¾Ü7M9äŸÌÜ`F•ýfÙuíoD{¿o»ç<%¬ßL¯åÎÌsf5ÞÐVbÍ@3kc–999¡ú§Tw-þžëÒFW±Rò‚UÜüÚ嘙1E¼'¬±8ðÂÅ[_ ca§nOë[©©y½òƒ<ºæ*‘©äU{jtG~$0‘gùXmœÓk …–§ÏC¦MåbìÜa`Ý=n8—“ó­C|=åCƒsŽc¼Læ­µÐã{žÚ,"¼œl2ŒÊfídß,‚Æe@²ðü/¯•1Þ r³A×® Ñër³l=Çj­C?iÛ£=S`^ÑÙ2²ƒ¬ûaR–Xñ­Ù¤™”º]z/Ò²4iëE™@Ë g•¢»-#¥¾è·ÛgŸf}Úß›-¥µ³X‡+-wÝ}ô¶Ô`–Oµ|ø¾p;ô¾©8A-.ü€¹&ªóÚYÚcoÈrJpÝs†ÿËõØ­®‚‰H"l²?j¹|\zqwº©a&€Ÿ÷ †‘(4Ç6æë+z}JÀs"ÑmjßFx7}/UxŸ ñ¨È7-*Ñ4JÎoÅ<禬Æ;±ç©Iú˜ :x!æxy¶˜ƒû‡+ªèXÛðúå\ †ÙQ´DóÅVq‚Á°Ò„7G<?A@8CW ²ü,Œ¦Â¯¶’Áä“ft´~cy¥ñÆ Ægžs_þ¿DXÐíHtÄD¶ íV¸` ¶µd±,Z…¹8b°tð†Žñà[¸O¿#DÎ\›±¿Pvã0๓­gø!Ó0ÎDÙJ`b—™é¹F,__Åžƒ‰È¶¨¼{|\WÿQOœtpm-tools-1.3.9.2/.git/objects/7e/0000775000175000017510000000000013737526666015731 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/7e/df8b692796d68dbe7de3f5e7239ad4089d49360000444000175000017510000000072313737526666023135 0ustar deboradeborax•’[Ó0…yö¯˜whj§¹4«Ú„„ÄMñ‚ÐjlOk;Ømÿ=N¶¨H<ñfk¾sæØÊ£‰PçûgÑAµ¯”¨ø•nÕâ.×,*©Š¶à…¬˲*xÍ&ôd#Tu^äB4¥jj$]iÞJ®v¢Þ‹‹]­×% Íp޽óðÁ¨8¨~4:ÂížNwžt1Sn| ¢Ø×eSî‡ç\pÎ’šRFòð†¤óßh@¯ ^¡”p«Wñn0v>eFŽJÅs±«Ë¼‚ ¯…½5'³4MìáÓDöpx" g‚èàËá$ÛZpþLrˆ~V‘±å΄.ÀØ¿I|¤#t´¦mg«¢q6À8‡˜Èl¤#TŠB€Ø<ÒÒ‚“³©ÐÁפ]ä ¬‹0y KãÆ²kpþB‚i ¸20BO¨SQë† ÞŒÓ@cšÄ% ¸v1e–H§$W 殣“,Ïk²?>Góhà»ø±¬êRí~Ý`Ü‘­u.}ÅiÜDç†ðäŒö ¿È‡‹å…”1¶`ú§p³Ý.ÜÌ¥WaÈœï¶Æj:eS?mÓ›<Ü~÷ðºG›B1v0%½qm»‘ç›ÿøì7µªõVtpm-tools-1.3.9.2/.git/objects/pack/0000775000175000017510000000000013735320450016311 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/pack/pack-29429031f398a3145035383c0a66cbaa8c60183f.pack0000444000175000017510000075343113735320450025143 0ustar deboradeboraPACK‚œxœ­Ì;N1ÐÞ§˜’Xãõ_BACAMoǬEÖŽ6ÞnOAûŠ7wf¨&‡¬c%66„‹.hªÁÄÚåŒ ×ŒÊk—´sŸ`ɪÅe.u))úˆNÛ ÕÈh Ž})È,Ò1×±Ãûèð¶¶þõðÙèû÷žÖÑé<^έ?òÖyÊ–7Ic{e‚÷ upðˆQÜuksò?TâõØ.\àÆûµÝ³9@I-£Tâ{ºRB“xœAKÃ0†ïùßQ+i“6‰Œ1“ †Êð6’ôK\ISÙüõ<‰Ç÷÷á}sBÇ4L9‹¼–R©–µ”;N5²ÆZ¡3´Ì’w0dP\TE+*a¹”œ–Œ .+W—à•ª¹Ö¬®J¢Ç|Œ 61ÀêèCw³÷öír æÇì).O>Œçâ#`.¼é û”\ ¦ÆÌhM)™hïsÆÿ©Î$W¹÷gèý0LXïw‡ÕÃn³~:¬^^ÁŸ½>ùO} „<û.`;‹ÎÍÌå¶:Ùq€-Ní0m™÷ß ¿æå8`Š!ŽÉ¢‹©Ãbš²ømùy»@¾Ð÷‡ŸxœŽ=OÃ0EwÿŠ7Âȉ?WUU@B ÝØmç%±šØ•í”ößã10!Æ{¥{îÉ,µÃÈ[Ý*†’1ÅMo0B™N0Ùöì:IÉEGôzªצgûªÆJdMÓŠ†+.„Zkª¦ˆÞò"¼/³óÓdzçû#œìçà펋óÛ­¾z̵3kmÃz€†÷SBÊ**(%¥]]Îø?”ä¬SüE^Ý V—Ra@Yœõ„ðéò á‚>¥…w7yª0Ž•¹ïài)ŸÏ:V'¼Â^—d–ã–0¦:…-ZCœ°.·‡ßÓ[ø›.ùáa¾šxœ­Í1n!…ážSLAÀ0x‘¢(J©Ó,dQ¼`­Y˾½9DÚ'ýßë[J <¢Žl<3Z´zòäi¢™ÜQ“5a2Æh¥X\xKµƒËabŒÄ3†è’3Ù„mŽɪ̃ 6Á{_Ú§Vák)õ÷å§Ä¿Ç¾¼-­Æsû8—ºßå­¦.KXelë;h{ô4.‘àU‘Rb¬ké=ý%>÷õ’f¸¥íZÖh‰Ò‹'Oß™xœÌ±JÅ0€á=OqF ç$9I "‚‹Ã‡‚{›œØàmRJ*úöÞÑÙõççë‡HÊAæ€Ö-(N,q2Ùaïs°DfÈ–Qíó!µCÌÈvgŽ·7x’!sÊœM"Æ28dïÕ|öµðÚ*¼¬¥~ÀÝ{‰Ÿ?÷pi𸶯íùZêù­¿ªt]–MǶ=¹0:ò#:x@FT·º•Þåõ_JMç¾·£ÃÛ.uš.@š4ª_ ROd—xœÌ­®1@aß§ ‚M§Û–mrCH0?ýc›ËNɦKàíA¢‘爯Í)ATD*;‰Ê¡3V[Kƒ‰Ò‘éµÍh‚G£Eq§9qƒ!+Óg,ú²·db¯Q:é=õ)’r1ç(hicáXcá+¬.%ü¿Öpªð7V·º¿^žÝƒS늟ºP§ Þ:8hi¤Ÿ;•ÖÒ—õ+%ΉiJ*çr]æÔ†V¿š‚xwƒVëœxœ­ÐMKÄ0à{~ÅõÐ’4é&)"‚žô "ù˜lƒiRÚìêþ{ëÞ¯ÃËóÎL]Ak˜Q)SZØï˜G'Pšžv!xÕ)%ÉlÌBO¥ZhÁ:ÖuA²gº—½±Ö2%™7š˜CË7%Ãõóþì!º×Ó9ܸKv©\¥˜ïí1cm£ZW¦K`BrΕ=4TPJ¶ékÅ ÈNåˆPG„-1Ç´©ofÉ›9Rçé%?ûJnÝÀx7ü •}t&A.â %§˜yN=Ôò©’„¡Âh²‡5z„¾zÌ×m÷§æñ‡h6¢ù~èˆ+®Ï„ÜÇ}Fß”{þz+ùv¾•»™Ixœ­S]oÓ0}Æ¿â>n¨M“&mÒiÀ6&R‘6ÁC5!ǹN¬9vd;[ûï¹N5@i<ðÛçŸ{ì"dùº*ª:[K)‘gEÞT›¦Ä¬Ì—VꮬªŠ Ü¡ €M½Yñ´NÓr5éš—9Š¢’©Èªª¬Òº.ËT¬ÖŒ¡³n¬÷2íÉW%§°µpÞY#´½ÐÊŒûäÑ`HTÝ'Âöo!+Êå*ÏË<…yZ¤)£Ù^…€ÿAŠí¾\Þ½¿¹‡Ïü¥Ò˜ðþ z€‚Vµ2Aƒò  l¯?l/?ÞÂS‡ bƒ cwB=*ÝÌýÁì HÖ ×úpœ÷ÀAØqÐV‚<(…w =Œ–MX¤&±ap¶u¼÷ cßâ~TÏUãsó7Ö žp²¥q?h%T GµŽä`­¦¥IžTè~•jÀº†Â¥U‡ÞêG*&îÁzå}ôà}mu´v×Åh<4Ö`¤F'| ƒS< Evy}½Ø~º¢<’c^k2}B÷ BtóÀ]‹½þ~ÄÒ÷ˆ&EŒšÚŒ Рä£ÑÝ„'³p$œÎ@ZǸ9€·£S¶Ñ-©܇Ås…r4"(Kq©@ >W!:nژ㞘ÇÓ\iºvËY~ëÎz?§Ë4(Í£È ‚Sm‹Ž¢®ì*òœ%£“‚ä®'vvO›Ðº†³Å‚:ÁNëIýŒO¬kl·|óÎ!÷Ö¼ C?§èçY’'Ûå/R©ŠÎ/DµŒ_‹LµfFÝ.³˺”RplhÈSÕfµ8Þm4M¢mËØ«[ÕlæVÊy}8ƒ[Þ¨©\ xÎ}ÒOÅæ¢í)½©ïþ ýì[ø·Æe?qŸ:œ xœKoÔ@ ÇÏ̧ð­pØlž³Iµ-E‹ ‡"@\*TÍÃI¬&3ÑŒÃî~{f>[þÛþùÁTQ”]«+TJ•½ÔºªYhƒvRSçÂf׊Et h[”U­«Ü–yYå½4V¶•ÜumÕ4E[ÙÔßwR¨•GàÑ;8Œä†·?ɼžßÁ“‡ýè™üÃDn=e¿rFzÎŒŸï¡¨weSJ)sØäuž‹¤ÎÄŒÿjëîJ<ûðãðø >Ñ Œwý ÈÙt™bJ|rÀËü²ŒIË ð¨zES½ÒdáH<Âçä_ äÔ4Áy&ƒ6ÕS¼P>¢&åÄ~d^âív«×!fö*f> [3ÐF“»èÒ¬Þ§è®-Šf'ïá8bÀÄÃóM@1úå²+{X#þ}úoʃÃCd¥'„€ªˆ™o¾ÓàÐn|ßoôù¾ÐkjÄàûábæ«»þJüï!ªk”-xœm’MoÔ0†ïþs‰:ñ&›Ô«R =@%$PW ¤ ­ü1N,{åJþ=NŠ€CO#ÙzŸy<ãAÖ¼éØË¦ï[lß7f׋ˮgJö¦¾ÜíŒäMGÎ" KÀ$¶}oLÍ:Áw{­ k™j»š· 3º©¥î ¯ 9>À[WŠ[à=…w"Ú áJnõÆŸÑEŸƒBªEQçk`mÓt—-ëj¸¨Ûº&ÊϳM |ðnGë†_­ú±¼„® ZMþf².ÿ¢?&jåLKhEõŒó~Ǻ?(’ÎóÉý (4Upˆ:Bò` "ëâ—XÅ$¯ÁõÏŸŽw߉AUktæTýÏ€€ËPF8žîî¿ïA8 &Xt…-sí1çÓó]G«FÐh¬+Œ4â B)ty檶Pr— ËNYf0LV*(”„séJäˆà͇G±lu,‚âß®Þ!EcÄðjó2ÂN.ßn¼Õ{Îq¢„ä}‡1¥s‚TBƒÂÁŠ<ÑÖÈeÓ(ÁT*ò[Yl9‹%º²ŠqÒ‚AWE.@ie‘Hi‡.ÃmÛ˜<ò¢ÌqÄX»ß{nÖÒŽ~ÁkQv]Ź0Q‰6‹æ|¿`=bw$#µ€çÓMUo-_bS£ê#•èܪ•Òj—VOs¾´¯VÛ :;wWçãùô|²;Ó³›ñ||ܾÜL>No&'óéÕeCÓÀž4tè\âM»’/µ‘.+6â¯Þ–…‰¦.9‡™ÈhG£g¤¿mv&—ŠÓyâ3ð¹­ùtHíÁ|ív»ß—›4æ5X] V4 .sLÀiàeI“•Ü!†»v>óÙ œáÊæT¶Àó¼)³5Ï+zM.6°ë ÐÍü¥"!é,Hdšbþfm¸Jà!Cµ® ÑŒ;gd\Q?¬kòÑ ìæ÷^‹Êøo”«g?›æ”•y&-ý½œÈ *“Ö`“gKÙ¯Y¿2KìŽm岊ŒN*Ñp YT$VhóÂÑeÎQß9Ö9Ç%õ»#Çþ;q7³1Ñÿ6MfWãÉõböiì/.ÎNý7ƒÇ¶‚wI3n`t&ýŽ/ ðÂ!ĔзCÙc²¯Ót?®Gÿács´Žˆ é?tì'ò“Ê[”xœ]ÍNÃ0„ï~нQ‰œ6ŽãªB•àÐHHT\‘Ö±EcG¶SèÛ \8­>íÌìNIˆ š¶ëéFmd˵Ôn¬¡Rh¹fŠS­ÕFX2É„¡€î™ÌX¹Ì;Ã:+”Yš i¹íãk*ÖDÎÅÅGG™á – »rŽ»bñš¶ég}³Š2J‰ŽãèKÁ‡àÞù0¬^½~¿ÜÂc„‹AŸâþäÃüYŸ–Ú«±^LQmšß(R¦ñíŒ)û¶ðÃMÞ¿SÞîýOÆÖ'¿ô¡,'R›ao8g;]RkøO}÷3¥i«x„õº¹u†ý¦T|r¸¹šSžàÅå%#ÜæÔp½¸€@éþÊØgš2Æ®uþqüËû%{iç™xœMOÃ0 †ïùþ¬$iÚ´hB»s䜻#Z›L÷õïéà†„´Û£×zì×23ºÁX§‡`\X¸#kk]o#µ¦ÖMô±ëY[µÇ™³€õdM°] 14è»Ú:r{D²®î£§lë£|•Þ0oá=aÙa‚õåªó’nR«X¦g0uÛxmoa¥­Õ’NI„gx¹]ý(´àzÇ×͘òñR2K•Âô®d?}nY‚r<Àm#fz€Ûh~<ÃX"ŽI®p`‘´´”ò£äñ2+õš¶™iU†a®O÷4ù«Üõ½úc2€˜xœÍMN!@á=§¨ t‡â·™ãÞ¥+—TSŒÄ&ÈLìÛ«ñÆíK¾¼9˜!XJ&JÔ;j/m¦,1“Ž”²ñˆ~ã=xŽ(®qp› w ›ò.°'‹äòÃæ’Bk’Å-¤€RÄÛ|ëžÐkO<àá§Ki·ÏõÞx®…êº÷ú¨2Êj­`‘NJñ]k™“ÿÉEíƒk¿3ärá8sã'' ÖkO¿]ˆ—rnœ–žóBÇé/?ñ˜ÌaŒŸxœŽÁN!E÷|Åû"¼Pc45F]¹j`xŒÄ4ÈTû÷NÿÀx—79÷žV‰ÀT!z­d0^ ‰N)«5 i–]¥êû.";¹J¹A–l cZï.…°½±v¨}·B?‡¬öÌMí£Tx¾Bï%P…ÛOºÜSž~ø9Sãɼ/ãÈù©C…¸‚…ÐB°¹SkôO|æsLÃT‰§¼†Jc9É…”à7káasؼ½nwO‡íîåq­ÀW+'˜ÅK¥ëûv5ÏglŸ†LaQb\øËú/ZìQçn¸”xœ;n!{Nñ.°k¾ÖŠ¢ô)S¹\àa£°XœØ··}ƒ(Ýh¤ÑŒN<)ɥЅs2%AXÃMÑØ°`”b±Ž;vY;Õ¸x/Ð×p…×ÞßçT¶[{)Hmò¹—üb¯Úö„†kÎÙ~͉ÿ‰3:çï4fŸBGTÄѹYjeÙ åŽ+n´ˆRÊ mñ€(Œ‘³ön¢@J©ƒövÙ ¼þJï[ ÏWzœ–”û÷ø™©É­£ßÖ˜„⓲RÌ0ìyÎvº¦ÖèŸ:[’{j·õ£çJ¸ŒþõÞ±^ ç^)@¡ÖK¿wá KNù\{KçLaØbÜãø—kö²f€›xœÍKjÃ0€á½N¡ Øh4zØ¡”ì³Ì¢t©Ç8‰¥0Ȧ¹}“„nøø;IpS²DÆi3Gë#BŽ^[kQ+§1;M“šÄ=0Õ.SHÁƒV bö“!cC@gBòí¢&Èç(ÂÖËÓ }·L,?®ô8ÞJÝ~ǽRK\ÇÔÖO h5˜ä œRâY×Ò;ý“?}]ÊecK=H¦µí$‡/bn,Ĺ\*å¡-ˇwâîß\n’xœÌ;nÃ0EÑž«à$ ÒŒéSºJ9‡6aK4*ˆwoeAŠ×\à¼ÞD´! ¡ÁcƇɑÇh3-dd€àg«ÜdëãDLâ9C^,.‡`≠Á¹˜ÅYBV¼÷kmúó}Õ$M¿Ýäùq/Ûþ3~oÒÇ×q©ë»6.Xã æY0¨£®¥wù'Wã¥ôrÙj““Þ‰»$¥ÎG‘4Ôœ‡ø<ýåY½ ÷X·–xœŽ=n!„{Nñ.°Âß®eE©Ü¤L•rÇÙ kbûö!Ê¢4_13Ÿ4µ ‚sF?Ö )…“abLÌí(‚b“åÎß;²ÍSƒÜ *%•c&h£_¼R^r+™ž5ZÎÈÜê9xÿ‘>³ÇÇ >ß®1µýJXi´+uy}.Ä(&Å…†)ÆHO×X+þSï~ qiiL8ÅØ¯¾sû Âvq;ç°·mË¥Â}Þ¡à­Å‚jþSB>â’Ð9„Á>yC¾ITlÚ—xœ¥AjÃ0E÷:Å\ÀB–<+”’\!…îåѨQ©å È!½}º|ŸÇ­ŠÀHžŒŸˆâû™Ægo<'‹ %‰8«®¡Ji@<ñ.¤iÄA|?˜]±.Rt‚Á#±XÃlQ…­]Ö çðïp*±†(ðv«O>þä²=ô½HÓy^4¯Ë;ôΑ%BKÐgŒÚ×%·&ÿ:QŸRoy-°]chôÚéI©üU$vkJÝü{x=¡þ¨õa™xœÌ1nÃ0 Ð]§àbÈ¢%…EQ¤K»7'M:QÛ…,éíë Ý;}üüW‹*8IL60¶ÄJ1vê]ÊN‰ÈvbìÅ™ïTtª HÈ”};Ä`î‰úÐúäÛÔ#êdÐÀ&­õ:8WÝ>ËÊ ¯Ëå™§¢rMµéçñ Zt]´> ‡ƒuÖš}s­Zà+Ýòï“”$ºŸË³ŸîyZÍ6im2F£EÚÜó‘*Àk¾ äeYu1æœ/“Êa†ÿ¼üŸ7¿g]O‘-xœ•‘Q‹Ô0Çßó)|¸;°i“¶i·ˆ(‚¯‚wࣤéd7›Ô4=w¿½ÓäôI¡´™tþ¿™ùONˆ *emUp²ÚJÙÛ¶9Œ­jj…ºÖmÛ Õ6cÓ°E' j!•œªíTïJ‰UsнPº×­ Öª×ê˜Þò|ÖßÜ3¼SÒ›5íñ;ïÂváÏ3wã™›x~ ¢–MWIÑ4PT²ªÝž]Îøº“a© žf·‚u\áñ#ŒÛ^Õ²“TŒ±/3ø´`ø®KŽ'”»$\iÒ×—s‘cô+^ó¬vtΨð ~¸Å†áE–dß €)Å4À&´.à -Òž î=ßMþ¦¾c÷œó‡ÝK${âèñ¼;•gŸðûæÈ7ÐÞï$EÛJHxY¼3.û+¬ gý¢öv÷Eëp39cîH­ÑÚb¼ÿ¾|öÓbì›”xœ•Ž[J1Dÿ{ü½ÉMç!"‚ß‚¸Éãf¦¥1IÏúmÐY€Ÿ§¨:T¯Ì„“ÂIÕ˜„öY:)5Óˆ~Äœ#%ÜP|åµC „Q%'©È‘”¢‹É°õäíhQ`¸õ)ØÃl³4Ök³¨¢Ô¤³"uA‘ÑüÞ/[…Vý×t…§ÅOóË/ܯܟAi”5 Nh‡¸-ËÔ;ÿg3¼q=3”}ž¡ò÷έÂ\·åÏò°^çiåS‰µ ô²|Þ²V|äGð)AÛKÙj‡||~ý€Æ~žÖóbÿh!šCxœ•“ÛjÜ0†ïýs™Bו½¶³^JiŽJBHÓ@ ¥Œ¬q,b[Æ’×Ù·ÏH›Ãæ.½šù¿™ùGr#¤U%™$”XŠ"]–Ešæ˜H• ©ÊL¥K¬DQFŽÔ;XÊ 3*D‚%aV¡õª.ò´&Y¥DY!³”"œ\cFøéEŒ¢¾>Ðö{«ûé1Þôäb-»¸2Ý7H–ËlUdbUÂBäBD|ÛiçèÃòÇ!Q÷JWœÉb.d-)¾7˜qkcî!‰ášbžj·0Yñ},F8ðØ·zŸ~1Ã/A{È N›ÞÆ»‰fݶPádé%¾ù@ôøjÃf=dƒíDP¦‹|èæê"T ú×µ¦zºËÛÞÌ—©ùø24”ÆðûmŠv½yˆ7Xª[®oz‡º÷y¯-„þÉ£;t‘©!dk¿m׌‡»ñËüîžÝ¥G>ÿ@ÛøûPÖãb•zÞÅmà/h'ÞÁÂíwûÍ>üªJdíxœÍANÃ0@ѽO1H4®;AbÏ’K{<,9vioO¹bû¥§ß*3ˆPpÓlÌÉëűf!b'³„ˆE¼•ådQ}…Ê¥Xqn!M‰¼[¬Þ‡9D²ÌŒÑ#b’™Ð¨ÐÛÇ^áõ½ï‰+œ?ùþrɥ߯ká6渴oÏ ±Ú{ífpBTºåÖøŸ\I¾q‚•¾C-¹¬T†^úñȱ78¸Á5Ôâ…¥ÞòZ8 »ÈïO™ªi_eª’xœŒ;nÃ0{ž‚°bé]ºJ¹+>ÚD,1 hþ}œ.g€™Þí(¹)acbãMZBŒ™YØKˆb(ÚÅ õà {×FV¶ð4qÛ•Iò’½›3$û(X/v†âk?צÑWMhúýÏKÙ¯÷ñ¶£E¶q­Û‡žŒ±¼ QäˆÔÓn¥w¼˜+NI§ÒËi¯ :— ”:> i¨9òxûÏYý†ü[–xœŽÁjÃ0DïúŠý9’m©„’@s+Ú(kíÊU±­ É!ýûºÐæÜË03©™Lðd[c)ƒyÝbïlk[îB·)7Úx$.˜y©À¤t×ï×±G‹{°sÚOFu²½c-p­)ÃSMëÀS,p ?{\ ç"KZó†Nyd¹p}„FïucÕvj¯”ðižc­œá?ãN e$†CÉ?ù8Åe½Éë6–q˜åV¿Cœ³¿qÎy;2s)8roBœˆ˜àüò 5AI3C P/óûºƉ°¢ô÷â-Ž Ó.…°¾þÿG|Ât¥•xœ¥[J1Eÿ³Šl CåÙ‰ˆèü¯J*šÁN™ô »wf‚Ÿçr¸gfY=8§+0iãLÕÑ„œrHVƒ •1..Š3îS2jòÞ¬î¦q&{·=‘ÕÑÙºÚчDù¹ùЧv•/½ ,,/ãÎÏ_­ßêÚyªF›Êûö$µÕÞAˆ!É,€¸­[›“ÿu"Þy\ÚÞåq.8YjeÕ*Ä[ûè\–½Ö…~þ¿fGa(•0xœ•’ËrÔ0E÷úŠÞ%,ÆñküŰ‹$Å6Õ–Z¶ˆ-¹dÙ$|=-O¨U°kKݧï½rðDPuVJUw²-š´ËÕQµy[R}T²åª*«J—)‰=Ù2kš.UEUkª›¬Pº*Û6;VyÓ Ò]†%JʵÀ5 ÎÃC >“ïÉÇeÿì>Æ®/Éf)$¦›é¦YZ´é±®à–i*øt2!ðÜ=~3œ¬ò¨ˆ)>~ÿ R›‚e3¤`ˆ8)K˜±§4k Á—¯÷§;`OÁ¹qâq0 79*µüÃL|zéãñÝGÅŒÝG&ç x@a7ÌNEØ„®ç¹Ç ”“ëÄÙb0ξíÝ$fò#Så3ƒßZÁ£]F Ä¥ÛÙÁ;­ñÖÅØ®xC΂®ö ~ålŠí\¦îð™´)Á)õdÉ3õw»,`.<Éøæ»lY˜º·àœj\è%ìäyz²[4zs.cdÓ¹5ìID7Œ8·,æ_; )t¯ø!¶ü¼‚C›£Ý „Ém,ßò}{»Ó[RÎãнÞþÇO'~¾òò›Uxœ•TMoÛ0 ½ëWðæ ˜ '·tź/ èÚ mQìÈh°¥@’¶¿~¤œ6é°–KBJ||||Jpˆ fãBÍ&y6ÏÊù¢^Èy1R³Y±˜LåëÅ8ãDU‹­th”%8¯U^åtRe‹q1«æY¾(ÆY6™©³¢ Ù…up°–>¢[£ƒSÃòC£M÷pÒ 'ºlO*ÛžÁ(J6M Í&Y&(Ûê¨îFþÒ=œå¤BBqÿ $Ÿù,ŸHN â\)Ö6jâ#« ½×f ×÷7çW@SI/ÄÝF{ØÊPm@*åaú×i´ÒÈõõK!RÛvez…µ6ø:lèü8–ê%Ø9GÚÔVˆ‹GÒs§G°5„ ‚—-‚Ým§„ °‘=B‰h@›à¬ê*Tô,]wb`Ï|_N)„ÊvÛÔà¬Áa­³½V<÷²;C’S­8ŒHÚx¿³NA¯¦m›€Ìt‡MÃß\­Â‡wàõFŒ-ºV“|Lœú©v"DŸ/@Êš»½Æ—ä²ÄÇôËÇc‡ÛFò|ÙÃ×ý‡.$9r§Ãî~\­®ïWן¿ü\}ûþér€m»cÐãã Þ¼ÏÞÒ~I=ÖZ1s ½l´Ø¿®[ŠóÄ2®Œ×€ÌՇޗ¿„j#Íš€YD%àé%’ÐÑÙ΄@o"‘Éóðt7MíCjMóøúæÁÅs¥= òñ‡žj–ð`7aŽš¶¾°µ}ô‡š}’ì$ž¹c 8Ûò¼@‚]QÚiY6ûZºG¨ú…Ö଺3Õ`ÈÓ¦˜tÆëµ‰í(C[­ŒÜ ®©9wßš¸RI€Ø«Ö”$Œ65¾ ŽÄæ§©†Ó¸Œ3ê°{ÆÇiX"øokÿŒî‹lØ:¶‹o)šßš¹É¸m!nã©­ë´|\þÇ_™ø ÊËžJxœ”MoÛ0 †ïú¼õäïÄNŒuØÚíÐÃP`ÐÃ0t´E'ZeÉä¶ù÷£²ôsë€ 0bS"_=ÉGË~…e-q½Î×e½Öɺ‘õªÉ« —$—ü^ ˜Ð‘ / )WHX,iQʺëJ¬‡uƒDCÞÔ²y^ÖÍZà¶ÖÁE  œÛƒ7~ovï´2ó]zc(¤ªÓÞŽo¡¨aU4EI¾ÈsÁ«£ ã>ãuït(‰U\´_)ªE•7åŠE*ƒºö¼Vf“³¦QˆË-à€I鸶a“`­öp €/£Z!>á~µÅñ£ôbÄkúZ}ká£aÒ¸+•£>X·ƒï™³6dÊ™w}£ŽDÖ)“ù-¤iÆV]t€$ ¸9>=àÏÑJ:Ž °é{^Ø@r^B2Ö H.#BrIÎñ'—ŽÂìLv±åÕÆ$19.YT²1·+O¨%|f¤ö‘`OÁ{ÁO*Õ‰Ž_¿ïÏ&F<lqÈ¡Ý_[»gþOdNYÍgÃ~ÂõËù)=¾¶{`÷öÈfïöµÐ²}qD ³‘4(C Äýßs›Xð»±ãbœ_Mv:z.bl öq”‡{î™çaêEüíÝn –qÒ"† Ü4(eì"âQ±1ã}ò Äi@#£IâÏ-;ÍZF&Fy õ-œ™ÔJ‚ÈaPÖðpiÍmZr½bz±LXÝñÉ>`˜½_øø C¿…Ž´½ž%ò Å9†:&ÖŒ~?,·*lùrXB\peI&v’n×þÃÿø “üãž xœ•MNÃ0…÷>ÅìX5r~\'!à´`â7F‰l§ÐÛã„  K~£yß<½˜a‹d+¦NoûÖ¨®é´î°”Fi5±â¦UU~bÁÀ>nÛRb×rMZW]§´•-[Y+ªTÃm…6(Yàš†9À.±Eà&^d7:¿¾GÏ©pýT˜yº…².ë¦ÜÖJÂFÖRŠ<\JÙ÷ˆÏî÷žgJ8ë_ Z5Í'D<-„‰!,Ä… X72Ømá0ñž؛“ûÁó+L9ð‚Žàòg¦óö„)«fZ ~óÁì/¨«(òn•Íì3"™(~œÂ˜}ýêF‚À/« <M3¤|ø+[,„عƒgÚÌÖnúÓõ?JüéüsqâMë®E˜xœ¥[J1Eÿ³Šl C¥ó,Ñ-ŒàÒUш ™ô0îÞq‚Ÿ÷8wf¹®(8*V€ ²)˜ Æè£ŽxwÖqNƒÛ”‘]Îè@ç f¬É´~ÕŒÁÛb6›E:æGò”>ëU¾4‰X>^Æï~þªí¸©kã©jÞÕÖ÷'© D££“ q§{“ÿo<.µ7yœ)M–³K­ŒòB¼Ö÷Æ´ôR–üýð÷ñ—¤a8“xœ¥ŽKnÃ0C÷:Å\ †,,Oí²È.=>£T-²œ¤·¯›èŽ$ ÖÂ Ò =EÝ9ì‰8ÚŽ!ì|‹½Ñ;ÒFk%®¶p®@ÎG$+©o1Êè½Ce}‡jÐäÑI¬î[a×ú98Ù¯tƒ·Š û¥üú×1åõÑÜ2×&¹©ñót€V „„f`'•”bK§T+ÿkD¼g?®LiYR>ÃVcp…íeâÄ×¹T;÷ýÇÑ® Ó=ÁþòÔ<Ù4ÄG:ç™c|r¾#~qÚq^Ÿxœ…ŽAnÂ0E÷>Å\€hLÍÙ†%$ ¤’¡„.‘_"° vªƒ«¸OK2(:k² 1HEB ƸäÕ¬nã½u~ÄS¹ñCÍ3ñÇkÿÎÏçR·»¸U¢ÄU¤¶>qP³•Æ|’JJ¶·kƒþ ?FÊU>Uì IÞŸûw~<–zÙæk¥1—¼ÎK[¤6”‹Îz9)£”ØÛµŒA#Óò™Ûö[Nkgì‚Ýñz;µ³ä²ÎB¼”·J85æ)ßîþM|£+]üŸxœ…Ž;nÃ0D{žb/ ?‰T`v•*M|‚]riÑŠ$ƒ¢ çö‘‹Ô©æS¼™Z˜ØÝõº {ÏÆ3§ÝÇ®ï¤6FA9 >ˆ^*$9öÈÑ’òè’EÅ’%§1 ä¨w®óÚ ¼×q-p®ü`ø(w"8l—— ÇkÖù”Þ‡¬7ƒ†Fj)ÅÞιV.ð…×ü€Ó F†CyÅ#}c˜h}¶™æ?‚³JYãº`v‚øÄ‰!æ­†‘Ã)?yk…8ç˱YSjèçí¿gâÃZ9xœ½NÄ0„{?…_à"ÇñO‚:**ò^{ûä8ÑÝÛãƒAC5ÚÑèÛ™’©TÌ‚¼æÂ±^iï ç\E㤖ý Àõ\LÆX¨° iÑq]ÃVY©,˜¾óùÀ¹”Ìv‚˜½Ì)Ó7óú]6éã–ï÷y q¿6GÄÒX›Ö'Úr%™Rrzbœ1RÝ5”‚ ß XŒý€týIТmE§e%t•@^ö…8ÑK—T6ºâšòÎ&ºZajÃÑ’÷'¸=бàô%ïµìt×sF7›òõâwüßëÈ'Òv=à€qxœ Í» 1 PqPQ0ÕÐ9_;kПcÇB!‹œ¨˜š¸úï7}§eôÖfÅÆè4‰Ïê â(ª™Õ b– K–ã“{{ŒY²‹¤É“R$ÞÄs ‚k¬Æ–Ð)¬ B\?דmѹ·×Myðå½ßÝÿèŠ&Ñ”xœMNÃ0…÷9Å€F‰Ûq…PY±§â{ܘ¦rœ´Ü·°àgƒ4ÒhÞ<}z39õu­n¸PŠQ/}ǨHɾÚi”Õ›I30­P{+E©ž ÝŠ¦(mï{aÑ"rí¼dT™%S‚góVxŒ.Gp?§ë¼C\.õ)×OµNÐ2YX\ö6 kšª¨§3ý|2p4öˆÓå;AumÛq% Bõçpˆä`5ãB3œ) …x3­Î!ðÃvy0ÎÓ2:ÀDæ~Iy(I2Íy®«jóo&ï7ø¾…}¦•à)-ˆåÆÃµï¹B¹%ûmÿ÷Sª+«Š;•xœÎÍN!†á=WÁ áÀaŒ1öj➟ƒR;ÐP¦©wï7&n\~ïâÉ7:‡h(Ê3J»¥¥‚%IƇ`Ž:x`ß©®Y#a^L­ŽÖh§1Íè<™%AFÇü6Þ[çG*7~¨©ûDüñÚ¿÷ó¹Ôí.n•†(a±­O\ÍÆ¢´ŽOr–’íu-cÐäÇg?B»ÿ”fô.°Wê×Ò*ß.Éâ£q%´Æ^Ê[¥4µœ§ðùðÿ—ì ÷Ú`Š•xœÎMNÃ0à½Oá $Ç¿AÑTpÿÌ—Æ®\'*·'HlØŒôžž>Moˆ\‘Ð6% M@R”]œµÃ(Qiöcd`Wß°tNÚ‰d‚Ó’”¶ä1¹Y)ogA“ùµ¿ÕÆ_ü9oüPRó ùã­}åçK.ë}Ü ö1‡eŒuyâbÒà”5| ÀövɽãäÛßC½ÿ¬BI«vÜ'þ„|Ãv˵ðõš|Ç‘±×|*˜†J4„‡ÿÉ>saÖ’xœMNÃ0…÷>Å\ ‘S§qŒ¢6H,Ú ™Ì¤5MìÈqús{‚@Ćåûžôiæå$kÑd¨%\—•©˜êªarhYœÓMY•ÈdMkÔˆIBm¸‘¹Ûˆ®kë*ê4‘sŽ5Ö5·‚¦k4:…s>Æ;|ógØNÈ÷SúȽóµ8É…§¡hãðåz£­sÖ:Xi£µZèàs–?’OõØž(^lU.oØÍ—Amà ö»gqš.11Ló8Æ”!˜Ã$¸rPê%^ Ãë'bÌzOß´˜"´à¸4½,ýos¡žüUbºA/x‚c¡ÔÞ‚ð*vÝŠnwÿŸD½9‰¾žxœŽÍNÃ0„ï~Š=‚P";vìU¨}.ô ÖÞuã62N·'qgN3#ͧ)™dÃÑ—ƒ×äzÛÉØÆ)ÓªÎBkïÄŠ™çÑ[ÛèÞ»`Ï;+ƒáÖõ^k$)•V†¹w·2,^Sp„s¦DÓû¯;f¦K–éTÓîKÙužä.±·S*…3¼á5Ýá4SFb8äŸxô#†›_>ëä§?‚3JmTRïq"JóÖ¼¬;&~äTøá2—-ÏpÇqc‡[-Ä9]f¦j‰±ò_Ïÿú,¾ëcdÖžxœ»nÃ0Cw}ÅÝ ’,ëQE²té–|׉[ d%±ÿ¾.²èR.IଘԪWÁ λÁ" =ïý`(G¥EÐášÇè×–c<% M†Æ­¯ÿ¿C¾ònã—xœÎMNÄ0 à}N‘=j•Ÿ&NBp8rbm2ꤣáö±Abƒ7Oï->¹oÌ’ÒdbRÑΉt&¶!ªà9"ïA‹n\»ÌìfÉEVÚXÞ·ïþ°”º_ÇKå>–¸Ž©­÷R› ¼÷Úiy£ŽǺ–ÞùòcÄÓGl×ßLZ¶VÊ‚è§õe¯gÆ…°£ì­-‰˜„x.¯•ih9ñóöÿŠ/%Ëcš’xœŽAŠÄ E÷ž¢ö³15ÃÜ¥Ô²#hˆš¾ý¤™ Ìß<><ø_Nf âŽ˜‰ƒFOe²Ùš8{ÔÙâ₟q±VtrÀhb1ÉRâä"ŠÑ†‹w˜IÅÍ>bPtÉÚOx¾{æ¾ÿøӄ·E„/}G¥¾ïU„ÿ¡ªÞ¶7Ô6„¶ dec—þä;µƒ<àµÞm\ÇÑOrøhŸ jy@¹¶Ä«n¢~ õQ/˜ xœ‹½ Â0F÷<ÅÝ]òßÄA§‚[ÝK~nh‘6oAßÞ¢/à‡³œ"„ä\ô&k/ÙA®•‘^Š$d .¢É¼Dtì®*‰\¢/]áB9‹Wâ{–Š—Î”­GÔ’…¦Úàþ®>ÞØÎ*kàÀ÷±T—e&Â?R–±Ì+Ât©+á‹ nôœ3ÂmÆkûa’}¾B@ž xœÊ1!@ÑžSÐÛ0ÀCb,Œ7ð3DcV6ÈÞ^/ào^óçPµ…*5¢´”\V @4ï¨ENªÍ;³ñÐç´ÊJ%S ©¡Ë1236‘ R),š¼K`xŸ·>ìãÝE‡=þ–¶Pô˜ûr…ùd=¯› xœÊA‚0@Ñ}O1{7 Ði'1^Àž`ÚBDJJ áöšxÿæm~-ª"u”<·Ö'ï:’¦!겄-¦Öq`¬Y¥èRÁIðŽ S(8Tö‚1 ‹:°Gj“ØU#ï:æÏ#'-pþyD¶–{âNÍ7óë5Õª¬Fæ9ï Ë÷ÛVÙ¶=—û¨ l*ó´< IóäÜAžxœŠKnÃ0 ÷:÷݈ևô.´LÆFj+é¹} ô}ÌlžuÐ䣦|Ƥ>‡’g¤)TRNHÄ8JpOî²D¢I¹ŒX8Ö}%ÄaÎÁ—¿æjÛ¶ÕLþqu?l˜Eùü1àjkÛaUØp¿—îëKv°ÇÒÞpÛy¸_çGšž xœÊ;B!FážULoÃðº÷òà ‘èõ‚…»×Ä xš¯9kª’õ^ªãÂÂ.¤$pµÃ'§(½ÛÆ5Â…-ªybêcQŽh¹K nC…åØ[°Âê¡w„Ê6¼Öõ˜t{¢“Î?/Ä\bÌÞ¥L'ûÍ´cßÇZúÇjÆc¬;AÄ|õþ7êžxœO[nÃ0 ûÏ)ô¿;³óÀ†^¢›Zƒ&q`++zû:Û&@AR ¨ cÚè&10fbÝÀ­c±6¢E7Ú*O‱Ù9cS2㻫ë{']7´½3­ïcF©P0tâú†½¥L÷gŠÈôùw/díèýùåéÍÔiBZ×Yÿ°6#"mx–}&9¶ sÚ IMÒ}ý*à%²2i¢£àƒÂ áNó¶Jµ¯å”ö´Ìáy…^2ô—Êø9û| ‹6/Ø–ZÒ’xœŽANÄ0C÷=…÷Ì &iÓT 6\1\à'ù¥mRµ¿3âöXã½°ž-+3ÜÐr«•ò–wÊÇ–½ëb¤šXµiLçm¬Z9 lMMèu)7øšLšº·]:ít°.P_+SÑ.cYññY"¯xüñ'(Õ·­Ówõ¡*”yN"üjE1rĶ/KYÃߘ¦”ß!/ϯ”=kƒÛÈ„·Ëê^cJi])Mä' üž¦I3?üÏã çë ,·tÜß™9þ„’3ùŽ [¬¾ÔJcË“xœŽAŠ1E÷9EíEè¤SéÈ€3›ž ’T´»bõ€·WñþÍÛ°— xœ‹K Â0@÷9ÅìÉLtâ%êò™ Ø6’F¡·Wð¾ÍÛ¼×›*ÄÀ>¥ó…˜$a-‰0Y&/‘0‹æÁšghºvpâ‹G]âxò„˜Q‡ïhyЋ ÅÚb«ßjƒÇ^³68ÿ|DÏ,D8ÀÁ~1©.˽wý#5M—úÖ M˽ÂušuwØö%Öy3ÿ¤>Η xœŽ;Â0D{Ÿb{$´þ;âá^{  ŽŒSp{,qª)æÍÓôÆ IÇ<gœÖÖôF²žŒ*9³w”}‘ŠÅ¿:P .{kTÐ ‹W¨£i’HŽâ(k-âѵÁóS37¸üò RNÖ%Âi¬Q¤ºmKïü*âx”á}ì{mÊÐßæäYËš¡¬ñ.¾¼?Nš xœ1 Ã0 w¿B{ËŠJÿb[ ¥qpJ~ß@?Ð[n98ëªCD⑊ÔL G*˜‡œæÊSŠ$šÜ–»®•ŸkÄ5e ~”€È£×˜h&OìSáâòaÏÖáu6Ñ÷Ÿ€81§àÓ7áj{¿3ý#uYDVýÀÖ›5;7Ýa¾.¶o ÌÇZmië²A ‘ xœŽ;Â0D{Ÿb{i½öú#!®Aío°PdŒ€ÛĨ¦™7oF/,)FÄÊ‹´ÈVÅj9™¬¥¯Fj㆜¸…^Ö†½·äµ&R1©¨}D§‚ÌEO”PW[)£qÙ:\ß[.Ž¿<”žÙ²ƒÃîE‘¶eic”?ª¢¶Ô}t:ßÛ¼N;ú}ÏÐ×¶Îâ'p<îš xœÊ=Â0 @á=§ðÎ’ÜØâ.®ã” Ú Ü$.À[¾ån„£§ E1s‘¬Z²F­$ ™J:‹TsOé¶È&Ê™¬T›½aòóœ8dŽ–|˜Dkœ4‘Š“cÜZ‡û»ëpùy…1c"‚“ÿæ´mÛ:†ý±ºãYdXm{]—£Ô‡,/÷úq=œxœŒÁNÃ0DïþнsÀq즖øøÛ»›F¤Þ²q¨ú÷8â˜ËH3ó¦)pý”ƒcï9ã98"ö‘Éú#³ÅMÙe'sKJµA)x²Ã;NF‹£ÎØ=w®ŒÄ&íí" _ARxùóWèhSC„'ÛeŠ\¯Kkô©Ië*wHðCº-R¡ÿ_h½Ò÷N[ƒ&°í¥!ÜŸŠÔJ¥-u>šŸoï³Ê<aª UÑÍüâ*T}˜ xœA à E÷žbö…0Î8F¡ô.QGJb±¦ÐÛ7Ð ôoÞ[<ø£«‚&ʈ1,9…Ô#a!—+©&ŲøÊbžK×}€cô3qªÎWϤ‚ç˜ã©d5 VË%‰3Ë1î­ÃãÓŠv¸þxk£Ÿw-˜xœ‹AJ1E÷9Eíe *é$¹€;=AUªB7:!foo‹ðo>¼ÿþfÐTÒ‚"Ù355 QQ‹$¿`E I,Ç詸;;&´• FJÔ¤*Y-«PÉŒÜVL5o%úìø1·>àý»« xþë+kxÂ3®öÛmŸÓþ¡ºýØçÎÀªp¹Àï•…ÙáÓ&|m*0ŒO¶Üòöúâ~ù·ECš xœŒK!÷œ¢÷nšHŒwi†n%:ŸŒz{'ñ¾MmªÞè"S-YPÉû„ŽÅ…T¢æ A%c¨U4›»¬Ä¢NÉ‘õ4ÏcE*!Sd.¶rÁ*D5Š~ŽÛÖáþÙªt8ÿxk³GG>&8á13oËÒÆ?T£í zœÍÞ/îk[¯æ þÆ<ù— xœÊM 1 @á}O‘½0¤?Ó& Þ%mSd¬Ô*x{/àÛ|›7‡*hUÌ‚âYE=•ì¢OE¸¤†«ã@¶QAÍM†^'d–ZväªGG-FI\›üJ•±ÔW'FóÜ\^½ê€ãÏXË]$›à€ŸLéû¾Í©¬æ©ã¾õ+ØÅÃì_4oÒï8ë› xœÊA @Ñ=§˜½‰©@IŒw™i%ÒÒPºðöÖxÿæm~o"¬Ol"M. ŽÙ‹5)† 4²w^m±ÉÚ„pÔçÃ…Ì’`2ƒõ,'ƒZtÄ âÑŸµÁë]YÜ>À˜pÓ蜶pÑgŠê²äÞåUqÞc*¥Îs^gà£}1W„}ÊS& XŠúB ‘ xœKÂ0 ÷9…÷lòqãFBÜʼnQÑ6(¤ nO%8o3³é® S Þ«³QкT q)ʳ£)RÑ,ÅY•`žÜuÀL!"Æ0!IõVªVE%7#¥d.Qˆ ãÞ:<ÞM´ÃõË8—Λ½…‹=gJÛ¶e ý#5ùXVˆyÐöŸ?`=ù xœŽI 1ïyE;kƒøÁƒÈÒÁ 3bü½~ÀºÔ¥5³¤P­ *3å #†œj@R.Qqä!G…œQlqð:÷>1Eit W§ êl-Œ†0"xãIÄ×¼÷!Ÿ^xÈÓÏg @FA ò vDîËÒæä?R±¶/Ü® G”oÏÖWÙÖÚÅ{š:å› xœÊ1Â0 @Ñ=§ðŽ„â4q q‰r§v ¢PT¥·‰ ð—·ü¾™% 4Hô…W¼6á!Sh©²q¦Œ\H&÷’Íž’Y¬Rh>É‹ª§Ò0ZIÔÌ2c"'{¿­Ü߫ڧŸg@,Ñ#c(pðßÜ´>sïöÇêDÕ.ãx P÷yQh‹\Ýcå:~“xœŠAn!ï¼bî¹3³R”s¾1@ãEñ‚…IÖù½-ù©KI¥š $à=–EX|Œ¬'e¯‚“*æ"NR\Ä™«´Iˆž5À‹)ç¬6qI¶¬Q5Æ^Â⑌þÌ­úþëƒ>^þ$çV±.ØàéÍ>1©ï{ÿXÍÀÞA×QÛ¬íL½îs(5—Ú@ÇVÓFõF­”û³Ôv«téç/ÜÍEÄLd™ xœÊM! @á=§èÞ…P~Jã]ZâÄŒLçöšxßæÛ¼9T!‹„¨,62ŠH®›GN*©Zu‰¬ÙËÐÇ„\ĩώ2iË^ü1´L6sY«S^óÖÜ.:àòó αçHÉ!œì7Sû¶­sê«ië[jßó^žSAÇèÃ|˜û:œxœ] Â0„ßsŠ}¤›¤ùAñzMw£ÅÖHLooÀ 8/3|30­Š@öÁ%KQ'±Æ¦äòHDAt –dˆ>1±¨'Uy4p¨G›ýh‚ÄÁù˜ë‰ m¶è8³ÙŠ¢­ÝJ…û§°T8þüˆÑÄÑkïa7t©©¬ëÜšü1Ui[ŸÂð–úšËZÜ›s§i›†¼Ðr?¾œÏ½Eè÷Z}–éEã’ xœ‹AÂ0 ïy…ï\’ÆIj ñ×vÔ hPI…ø=E|€=Ì\fûfcAMPˆ%ÒˆÙ2 !q¥")ŠQà݃7[;p­1{O8ÔÉÍ9Ä U„<ç©`ôq,ƒã½Ïmƒë»©mpþù!P¤TLpòÇœ´û}éÝþH«šÂj/ø¾xÕ'ô}6˜öå¦îçœ=ÎxœÊA! @Ñ=§èÞ !1Þ¥´%Nfƒ¨ñöšxÿæmþª(.±¤JVýâhAâä3VWrDTJŠ)š m¢Õ VðhÙú”QlpäŽ>pÍÕqLÉÐc^ú€íÝEœ~žÁ¹ìsHèì7Ãýz]çÔ?VC"*ðÒ}‡­õWƒ»òÐ Ô†>;SÙúm®½ÝÍ6DB’ xœŠK Â0@÷9ÅìÝL2ù‚x—˜™bi›”)ÞÞŠðmÞè"`²1Ñz‹„.…o™ T eJ!c¤0‘Ús—:ÀZ‰ŽÏWë\¢¿ëR‚DvÖÙÄ>O,U~Gë°¼K‡ëÏ7Ð:QrÁ ÂOTiÛ6!¬*3 Ã!ë KmG…§”.Ú>æVŸêi]=Ò xœ‹A Â0E÷9Åì¥23IšÄ»L’ m+!.¼½/àßÚk­4~Ö‚JŸdLâ䣎‰núšÖy~·†?Tul%7’+|bšh\Ös¡CE£c她ÛëfnGÅ®¾øRD©”xœŒM®!„÷œ¢÷ºàGó.á š¦q&΀aÚL¼ýÓxkSÉW_J3Ô˜ˆÎ©’ ± ã=QÕ™BÕ:…’b î¤8¸ Ôìë s¬¶Xt1Xïç¤yöFƒIGTø”©¸¿zá—oÿ1É%´=ÃA¿£¨¯ë,Â?¨jnðèËL¯+Ë•i°aŸ¸ÁÆ"s»ÁÎË÷Ö÷úîÏa}Â6¡QÿqAKú™xœŽ1n„0{¿bû\áemƒ¥(uqÍb/ldÝÝï)È4ÓL1ÚD ô1QBŠiìÐe1…ä³s„<Ú”ã`í”ÍÎMŠ‚w9õ<¤iâÞîQ𣄮³ŒQ®Ø¢ Ÿ:׿¯š¥Á矿1Rô!Æö¤ºm‹ªü#5Kµþ|Ëó{[®†{­0­ç1C=u?mÂø÷^ÉH_Z%u©u0¦ê8§ÕSÂ`#×ÀèÙù\h¡5fK¡Õl«éeð¡àƒ%ZBÃö!#ª‹;E—RŒDès XLyè¯ ø{Jãßï¾säðËGtðaϘ*û¾©ò?¦¦´Æ ¤ó1çæ£wz²nr\á|”Ë }¿¨È}~ÎÎÕ¼k2F$“ xœÊ1Â0 @Ñ=§ðÎ’¸I,Kˆ»$±#*ÚºŠÂ§‰ ð—·ü9TãbòU8öX‚ '¥ê;¢œ¤cÆÎšº;ËÐcBQæÈA4ÖÆ¸p&b $!æÚ ÇZZBïÊsÞmÀãe¢®?o‡ŒKB‚‹ÿæšíû:§þ±º"¢ÝFS°s®vÀ4ØÖ:Ͷõ­î”>Ÿž xœÊ1!FážSÐÛÀ0ï20ÿF¢»k[x{M¼€¯ùš7`U*e®¡¤ ZtȬSf¡²ˆÍKöic®Ñ%ïCnŒBX¨AÉ­QC­gäœ÷cØÇûP {ýy³ÞŸŠŽíÅ}3íØ¶>'þXMßûìò´¢j>G=8`‘xœŽ]j!„ß=E¿'Yttl…»øÓ½‘Œ:¸îÂÜ>B.zù(ø(j"ÈDˆ¨v·Gc\dg!¹iëYÜ"²Žˆ‘ŵ ÉF'wd'e”.¢·Yn޽”ý®r«z•DxÎï>àçê™|þñ ”òÊnÚx orE¤^k™“þ¡ŠAµ¿J»CiÀáµæ;Ã<ëÇìýxÜ'¥[iïP{.\(Ã:Ñk˜%…㸠^zãrZžøíÁO‡”xœË1Â0 @Ñ=§ðÎ'iKˆƒ8±ÓVеA‚ÛÃÄÌŸÞòû® ¬^X*%¢õ‚Ñ…˜„êà ‹92…BæÁ»¶±Ž˜r¦"™‚O£z¥ÀÁ[¢ ʈÎúQ ?û¼íÐïÚ„Ëí ç/€˜lôHÎÁÉ~3e[×¥wý{0×& ·¦Çuy7ºí+÷¾´ ÊÌmÒÃ|–_F• xœÊM Â0@á}N1{2i~A<{דd‚Á¦-1z{/àÛ|›7:3‹l´×ÑHƒ–Іâ[­7ž] É*¨Db£ÎË€0x ©°/1SᜂŠ^gñ*L,ÉX­íã±vxkæ—ŸW@t΢E9ÁI~im­ŽÁ¬"ÍLËyß^°õõ]3gˆÜëvY€ŸØVˆíjîÕÁúºc:pÛîì\WŸ xœŒK Â0@÷9Åì…’_'ï2M&X´¦¤)ÒÛ[Ðø6oóx½‰@Ä’Æâ¢eÌ$#’/hƒ‹ÚgÏ2Ũ•›¼:)…§èH\ÈVl¦¤Çf1%Œ>³EÅ{¿×£fipýúÆíýˆá¢OTªË2÷.¤j_3wÙ œãÞê¾IÛ@v xÉÖúœÓñ“úŨCœ xœŠA ÷œâïÝ@ ”&ÆÄ£|ø%Z0-]ôöj¼€³™ÅL_Âhœž†8Ãì“•)¦,à8G¶~ˆÆaT/^Q;13‚O¬Ób]ˆ!ãp’ xœÊ= Ã0 @áݧÐÞÅ?RlCé]dY¡¡$®èíèú-oy£«‚MÞMš‰™¼u.ñSà$iò%“ú9a4;wÝ F®è 9›5g©¹ˆLˆJñB¶(Æ ãÙ:¼>­j‡û¯p.ZD"Šp³#m]—1ôÕ{å¡Níï¥mæ ö89• xœŠA ƒ@ ïûŠÜ e£fÝ@)ô)»&¡R«EãÁßWè:—a`|U…8Q0w­vØpÉŒ\fj“õ[Ã>eÕÙÈ´GëÚFS!nˆR”È–¤²!Y‡"­pÊîÏe…×1é¬pûùˆ‰)æœz¸Ä“0,ï÷讬á!¢¥ŽÓèøë>擹n~ör _û@?txœAKÄ0…ïýsT„¥im“‚zó Šz—i3uƒmR2ŠÿÞd÷l.9¼ïÍ{O"XÕŒV÷õlM­MÛvÊÌΆ jo{¥¦¡6v¨6ŒäÌ8u³Æ­îHOªk ÒØô¶×¶ÁÚLš°u]a’cˆðý³'¸;ÿ÷ T7´¦m”‚›:¿j ëêDèhõ`­<„äH Ûú‰I \AoAÂIð™qž—Åù¯?•‹ŒÎBbŠ »Ë “ÀãÓË;pÚ¶öc€˜Š;³Ž9ÑÌÖ3íÀÄœ+0äˆ >^Ÿ$†óÝ%`.âV:¼¥B9¾D†‚\‹+f[ õ¥ë»Õ-OSò¾<"JÚ®Õ/ëiÁžxœŽÁN1 Dïù ß¹¬Ã&q$Ä¥ýÔòNÖ¥Û¤ ® ϶‡J½1§‘gž5ÚE {aÄ1¸T†é9Šh£Œ…8ºœB"ÊÞœ¸KU] íK™œ)–õÆâ’'qÑEël”bø¬Ÿ­ƒ.R'·_x¹ÛW@t‚ äáiXer;gUù7`¶ ÚIçVa]ö=×àråß÷{È­ªü(ä.|«h^–v·ÍZú’¬æNç~Å¿™?ÕZšxœŒ;Â0{Ÿb%JoâÏZB4”P q‚µ½Q¢@‚¬¥àö„†šWFš§M»€$zg¥'b™ áàuÕ×èºBÉ<¹É¢XJáÔçT““cì‡ÐF©ÑgLÑVf±ƒá—Žk½ËR¹Ìo8üðˆ>Ÿ‚GØÛm¦¬Ç¤*æ²r…ëùtÛ!Â}ÊÛëøýyÙÜ2ƒ®0©ùmF,‘xœŒK Â0@÷9Åìiþo ¸ðÓÌÅ6)iºðö¼€oó6×›Ĉٹ¼%)æ€cLÁ ÜĪ’üžNÌÜtÃ]ßÜ!"Q(é(-&i¬®6eœŒc«¨’6Ê9¬¶ù³CFSS±D’¹È•™´ÑZ‰Rá‚Áö~{mÐV+÷œz£Oó§xÊëñ˜{÷¿‡p]½@›‡}­Öý¾#<œ—xœ‹1kÃ0FwýŠÛ»èN‰-CèH¡“§Îæ$Ý‘ÒØ òyÈ¿¯ %sÞôà}Ÿ5 é})äó¥T8s Ò^#b3w‘¢»s“Å öÈJi E™‡¤è;JSîÐG=”£ Áñf×ÚÀn²Î?8=õ>?ào~Çå:ÏßfòòÁ}­çÏqZŦYæIªNMlk X…óÀ{­íñ7†Ëøá~B—L'– xœË91 @Ñ>§p4Ê[BÜ‚8‰#³i0·‡Šš_½æë!­ôÉv©ÃµÈ’õ„•²w”m ƒBnb½ÙùU¡TÉ>tĘ<{W2sŠ1ö>²4FÄ,ÃðKoÛ:ËÚ¹=ÞpþñÎE*.E,p²ßLÛ–å®*æºwVÝàYø)à&?EóXÄ>ö• xœ‹;à {N±}Ö˜…•¢Ü"X`Q¬øƒlRäöqšÔyš‘¦y}W…œ“#çÉ’®(1U_’r"³F«¦É®kô1…ÇEç†ê+ÉÈVÄF[="häÕÛ}ÖµH~¾áúË Ž¾\ì9“·e™z׿æÞŠt-°·ަê4ëa>õW?H›xœË1Â0 @Ñ=§ðÎ’4‰›Jˆ[p×vDEš¢&•àötbæOy}WÁ1øÌ–CÆÉ1º8(DzNnvƒqŒ³yÑ®µCŠ^‹’1nŽ1"ÆäeÌÙaâ91&6tôǶC/Z…øùëooà\˜Fç­G¸Ø3ÃÛº.½ëßÀÜkS*—·6 *ÐV*Ö¥±–BU·£ÁñêÚÌ ®I‘ xœŒ1Â0 ÷¼Â;KוqªªMR$~O%>À-·œ®73à`˜F”PHŠÞ£W)#&J¬ªPܮͶáZ<Ë$¾”iö!ÇâSÐɤ¤BQ™ÍéÑŸµÁò©ÙÜ~¾"Ñ9$Àe8q©®ëÜ»ý‘ºcÏÚ-îiчÁÛÚk®lÇ­¹/ä[>ž˜ xœÊ;B!@ÑžUÐÛ ¿—K÷1”ø>1êî%qÞæ6§7L@GLxòev±ˆ÷Ìyž ¢-FÝ©ÉÖ5¤ Û2ƒ'9ç†f¦9"L6EEÏ~Ý›¾}ÙD?icœu0$}€‘ÊûºÖÞåªÎõ­‡¿×eðµ­n—‡ú±;ExœÁjÃ0Dïúн÷²’×’B¡_RÖò:6–%㨔ü}œrΜ†3¯ª•¨‘°ïU&œÃD}Àdm ‘9Ò¨f—CKŒêÐG?qï|ˆB¼0qÀ^Xýye…ü´¹в–QÒz‡Ë«~‚µd¹‹Ä|à“ê¶-­éÛó•sý…éTÜvMËt_ÊÚ¬Ðꪲ š¡–´oôž)ãÍ<J MPš xœË1!…ážSÐṴ̂°,‰±ó  JÜe78Æx{©¬}Õ_¼O:³&@ÙS)P0˜èÈX¤b]ô‘— ÄhÕA›hÎ1b à'Æ “›g—¼§À%´`BFE/¹ï]ËÊ-Sz|ôù—ãf±Ó¢O0¦Ò¾mU„ÿêºÖ­6ÖÃuôM½Õv{ª/.&C’xœË=Â0 @á=§ðŽòÓ&©„¸°S»D´IÕ„¡·‡‰™7½åë3Ìn¢¬ j¦@Q³A-ìõìD^ÂÈ¢v<¸t°ƒ8?Ç„äýèDÚ}Ù :–ÇÎ?^ÑÅdÑ&‚“ýfd™¦¡5ý{0W–§Â+†[ða,°¯* ¼«ùúpC0’xœŽÍn… …÷>ÅìºèM# ˆIÓGè;Œ0(¹ †šûöÕ6i·=›³ùÎg"@Ñ“W¤'T{ë¥RfÀA™¶·Æj9’Ò4;fŠ 8ŒJ¡7ÚR§Ûžäd´rô­ÂÁôÒy¡;5Š+/)Ãý‘exýñ7BuZ ­<·§›¶-0Ó?Ðf ñNx!pÈFœi»~]5]œ1݆‰Ë^ÞÓqF¿s;–r¤ì §Ê!R? j ö\…R÷=e¾]ì,®+ðIÊåéââ ¾FË!Årƒc vL5dún¾ÐùtF˜xœŒKÂ0 D÷9…÷HÈIê´‘g`ù‰ûý©5BÜž`6#½y]E€‰ëÄ1ú"pÊ“`ªËLäÅДγ ÷fáU&…è±ÁÂeqHˆ9%‰® ˜"ÎYJ‚ÁWU¨ ?´›W¸¿™N¿>ƒµ¾ $*#pIó8öªò‡j®KfÐN ½ð¶=3$† úé‹÷oc;*|~yÊÛѼ=E´”xœŠANÃ0E÷>Å쑪™x’ÚBbÆ]9ÁÄ“7®lG¥·'‚ ð7_ÿ½ß«*È aÄÈ¡g9Rš{$>;ŠŠd%$27©ºuqŒƒ Â80N–½’ŸfarC²ãÙÇÙNŒì})¾Y7…ç¿~"Ë4ùÉ1<áÊõºö®ÿ¸š·õ–r‡¾(ì[SÉ×¹J}@ö,]Û¯½IŒëöyxÍ­À± iï‚Ëû¡[»—ÍžcOr– xœÊ1Â0 @Ñ=§ðÎ’ÄIêJˆ[ôqêBDIªâÜžJ\€¿¼åë.¸d—(!Ûd\02Óè00Ib¶¼KS\Ž È© â%ùÌD”Èe!ñž¬„X˜G“}ôžŸUšÀõç œCŒÑz¸Ø3SúëUUåÕLÛœµ¶;h‡ÚÊzÌS«¥ŸöMkooó'@“xœKnÄ D÷>E/EŠlƒ?H£\“@w#£Ø42xœÜ>ŒrÔ¦õªªÌ Èò¤•Öd†ÎÞáäˆ=!ÙÖô¨M‹ÝØ7É xσת›‡Õhfgû‘'5²f¤q24êN©Æže•¾~6Ž ·?ÿ€®fƒžûIÃ[[Õ ì{(…ÿ6Ÿ‰lá EÀn›\àëà 1$›ó%eˆs8˜ž$Jˆ*p…²Â}Y I:8ùÇ«}„:ò²Èþ$"É•keO¶¼¾7¿Ñ\ÿœxœŠ[Š!Eÿ]Eý‡Km[!Ì.fj]I¿èØÌÌî' äþçö ¯“ó>ŽÎGF,ºêè$gfaL˜¤ŠÑcV{:°v{Wª3FL5¨!‰l±NÆ"†=r'v*ý¾ôø›±‚®o~³åƒµž.ú5U¶ei½ãƒ«úÞ%u<©oTÛ/íÇ–g,OúiýNùl³´õö¶aÀš^uäó¦þ^ôHD’xœMjÃ0F÷>Å·/9¶F”.»)tÑÒègT‹Ø–‘§¹}•æÍ| ï ÃÔÌ oÈi!µaM¯ížKa\cþäù¾­¢æÔƹÀí¦ ,Ñ·×Übi`j¡Ùï©‘ gÿX°eÞc±75¦µº_gVm±xœ‹Í Â0„ïyн ÒMÚü€⓬Ù-Û¤Ôñí­ˆwç2Ã7ºŠ€íùâ%:I¥cæ0¢bÎÔc¶ÐFNެYh•ª #gŸ‚sƒôä‚P¼Œ,!wd%¹³~ð†zm+Ü^“T÷€èÐ¥¼ƒ]·Åä6ÏEUþP͉¹hiÚw¥U |þTypþ<Ë4Am ¥nÒÆÏ¢W ˜é&¿Í¼|úNs• xœIÂ0 ïy…ïH¨ Ù,!þb'6­ºª ~O`.siÚ.Ö:U¼'Æd‰(D UÙ+s¶¥xÎ)‘Ùh—¥juŒù–ŠD&Ë䢆à“g•hUJçr †^­_wß“,÷Ÿß_ì\DôpéNLYçyhMþH Õ*ŽM è0ÉzZ?°Qé)WóÔ(@yšxœŽ1n! {^á> °¼R”GäÆ-º]8.Q~Ÿ‹òL3ͳ¦*°ÙP6ŒAbÞ¥rÌŒ‰JÊ¥Š)ˬ¹óÔ¾ ¡/ºy‡!¹’<’°—È6WI‘‘lŽ{ö†ënß§v…×?¿sÑm¼Ø'FÆuµµô©y×k|þ>K+Ï>A•[ë0*Ôv*|µuÀ˜st¸ÏÖW5?°7GÕ xœK 1D÷9EïI&™|@Ü{ŒNºãdˆQðözkS<êAÎ N‡,QÚÄ*Ól´‹QçÇÒ:ÜÞw® §_ŸA©i±Ök8È="µu-c𪸬[o/& CŵÔ+´ü%*Œw†¶ÒêQ|f³C› xœK Â@D÷sŠÞ ÒÝ™OÄ… Á•g˜™tk0 ÐÛñÖ¦xÔÛT]D€ yi ±&jƒo9w¢`TâÜjQæ3óL‹L0e'Q­vȬD´ÉÑÆ·~#ª%ȤµÞçïA&ï@ÄÎRŒì`‡[L™Ç±¯UþP͹Áér…n^ó  ßy½íÍUI: xœŒ[ Â0Eÿ³Šù$ÓNâ&\€¤éTƒmSÊìî­¸ïÏáÀáê*-uÔ ®‰98âÐxD¶,6Ö¸–(9g]Ì’V™"ùÁs°<`°òsß"µècÃÞ"FÇ6™´é³®ðÚG™.?^ñxu„Äp²ÇL®ÓTTåÔܶe©«‚¼—±ä¢ãsUè¶2öe~@Ÿ4ݧǤgó °@š xœ‹91 û¼Â=Mb;ÇJˆGðƒŽ@Í*d‘ø=+ñ¦™ffȲ3ÞZM’(,5£«E·xg0HuÚIV[²NÀÊÇâ3&ʉ«Ö̆Å.‘|!Ï™ŠOT0«¸Ï[ðø§ü‘ª«´þ˜1½ ŽÞ ïsÛ§úÎ;j— xœŒ1 1Eûœbz›$3›M@,,+Ï0I&¸¸îJÌ¢ÞÞ€ðÃçïóZÈ8dMÞs 7ÆŒqŒÅzÌÆX¯““b8Dõà*K‹väAÉš çДDbrt&’§„zè oíºV¸}fYö¿=@—ÞÃN÷¨´ÞïSkòÇU¦7H­][z#?Å,ò‚ãù…§y«¢¾¦¢?¬™xœK;nÄ ì}ŠéÓÆ`¤(Åv©Råxì¢Øá·En¯6È4ó—ÁŒ5ÚÙ%W’_ìâ˜\Ž!)ÉÙXÖ¼&µMž¦oÜÑïÛtÆz¦¢¼.h•R0!’Áêyžè.·>ðõ³qc¼>ù Zk•3³Ç‹:1¥¾ïU„ÿ1>ÆåýÒ1˜2j+uãÓvt uy”_ Ý7A-Èü”ŸÚ®(£ï8äÔ –!7Œúx#“Ðô óÁVû›xœŠKÂ0 ÷9…÷HÐ$n>â NZiÕ¸ nˆ 0›Ñè=Ù˜Áç3rs5±XW(ÔP(ÆlÉ~zÐCDŸªZÓÆM úŠ“1n¬žPs¤kq!Ù0阌A­Ò.Ó²ÁýõàÆpþùZĽ5p>¨¼<Ÿ³ÿqU×µ$á²€L Óã´·¯ Ë^ëwØ;¥Î[^ÊÜnGõÅGbŸxœ½jÃ@„û{Šíæ~%nÒl°S›½½=,,é„´äí-§H©f†ùY˜A;kMãLh8pg¬&ôRÒ-R&Æb.)wjÆ…'ßRô [çÚ”£‰…t¦`¤Üb0©ëbIIáCnuxÊH÷xÿ³{0Æz½‰¼éMŠê8ö"üo@}­ —óùz8?¡ŸVaÌP üæ²=_Ö¹ÂaX§ cýfyü`9=ß7F꫸Ê6Ü‘z³¯TÞžxœŠ»jÄ0{Åö°’N– áú!—>è±¶…mIÈ«"Ÿãò™fŠnD 0:©Gôä¼&e´qAÍh½BZèYš(Ãtªk”Œ7(&4—胖Hq´FY¥Üè­V2Hé§Ñ®óZl?;e‚—?_A©¬EžðÎÊq$fúÇ:¼—FÐktL'p¨‚Ûwøº}¼ÂÜsàTò )×ã›ÏšÀåýLy^ ZZV†•\¤v>Úíóí^ZéËZ:?¦º-ÏÃ/ÙÙXP’xœŠÁ Â0ïùн ’¤fA<úéæ-m*1û÷Šþ€s¦7€ŠxøQ9YuVóµdÎÎYøAExdxæ‘j'uˆ:B88 CЋE*‚˜>Y°S“×~]ݶ;*èôó™œóCŠ>2ÓÎ~0²ÌóÔ;þXÍezQ_¨_Ak-[Íó$Ts_hÑo¿a£qUE{îÍP’EvxœN[ŠÃ0û÷)æ¡ØñkKö$S{ܘÆvp…ܾ¡Ý¬@ 4:3 Ϥ1ž½3tCDÃF[d)1Yta2)$‰b£Îu%ô*zJ.ZÂÉÈÀ³ÒN¡dg•ýŒZM‚ö±´cåÊðýÑ+(5itÊ _ò„­”<ÿ£*~ªw~Âh0†…)ž»•޶ŸÏj„Z/ô±O¦Ú6r«ïQ.[o¿ …r'é–×<Žwwßîâ_r/æjY£™xœKnÄ D÷œ¢÷Y„æc@Šrƒœ!jC3¶Æ†nk”ÛÇI.Ú¼E=UÉ`†9`ŠÙÙ4ëÉè\«O!2tÔqNX &«4¸ 7Jè#s4Þ¶óTsÉV3û¢u8‡IÑ)KpÿÚ¸1¼ýñ ×§ó𢯨Ü÷}á¨êƒ<èÆÔkZ†ƒi{=ÛàÙÇý·¨§œƒam·A²öÏUØ{ù<ŽM}ZùL™ xœŠ91 û¼Â='X‘?à9œeµGP„àõ¬Ä˜fŠ™ÑU!‹'‰g ¥e-ŦJ=»šHУ8[…’yÄ®û€ÊÑŠ0%Òš“ÉHA¥†‚îˆÁF›M|Ž{ë°¼WÝ.?_Ȳ ³G8áÉmÛæ1ôÕÜZW˜ŽØã:æ}‚Wë‹ù0‘;‚xœŒKnÄ ÷œâíg1| i”#ähbË6D6,rûq” ¤6U‹V÷ 2AOa§è|ö:Å$MðAºÌ³É:e”ß|¢vb3#؈â­Q³ñ (³ )fDé³^{Á£/í¤ígG½þüAJicÍý.é!oDjDZöŽLÅç8p¶qQZ¸~á¢Þèà t÷稿¢2jêk«wrÍ4.”±‹7˜`Hõ˜ xœË;Â0ÐÞ§Ø)ò?±„RGàïæ#°,Sp{,qfŠiÞ´Ê ¬8"Ñ‚N†èWöÁ­KàÑF&È…´æ‰$‰VÎ T”Úi¥'í¬ŠhÈ¢Q“·¦—¤²£CFøn{©ðø<93œ;ƒêW×½4p’="–”ŽÖø*®;æíÈ´©T†­ÓzDȘx€ûå6ˆ/ ?¤’xœŽAjÃ0D÷:Åß‚äH²¥›îKié¾¥Qb¢XÆúiÉí«Ð t6Ãã1²¤-Œ€œ&tpÆEÍ–í˜álöÈҹnŸ&#èlóQ`¹VÞ??AJ¥¬uÆ[¸aGÄcÛrküG*^{eZaÍ¡P¹€RÊ-;Lýè¬ ŸÜf¨u……¯z_øCÑ–xœŒAnÄ ï¼bî¹0¤(¿Èy50ƒ­ ++òï³I>¾tI]jÌ`rÚ|ñ>f—)N´Zç¬N\ú5»$õÄÁM`óÉG“uŽÙhŒ«w!/%bH‹±‹Vk…§Üû€ÇµscxÿëÐÚ·ic=¼-¯¨Ü£Šð?Tõù$žP^Çrghü2ú9yL˜r–ØèwB¢*µ7èŽN·9w˜ŒûÜ|Á)u¯r©o÷R2‘xœŽAKÄ0„ïýsT„š´Û¦BëF ­múwª\5ÅÓiΙÿˆV‹¸Ì„ñþö‚|^O¥ëþ5^£KĀťô-(°}±oæš5>·”q(}sØã9\j}Yy¡]ãq¬LÛ1'ÌÌò¿­«`ž xœ‹» Ã0 w…ö.vdI”B »ôüih%¸Cÿ¾™:÷¦ƒãÚ® Dsêzqž± ]ë‰cÈhc-’}&¤ê¼yÅ]תI8q÷G³^jMV”‘ÖÞ²˜ønm‡6ëZb~~àüÓ 8ç„„XNöÀämY¦ÖôïÁ ¥À}®·ê4«ùË;¢› xœ‹1Â0 ÷¼Â;KœØm#!vþà:6EЕ0ð{:1sÓ wm3ƒX% ÏHŒcÙ¢[s”’=9q‘^1Sïö÷à.û4+¬S‡uWI×Dîà ?4”xœŽ» Â@EûýŠéEÈì[+-!;;‹ÁdW’ôïMkOu9páÈÌ 9dr9ežR°;¶)ÆCÖdíªŠ÷L1õìg®¤}GÙu%°dRô©hH[,Æëf Á¨þ%÷6ƒŒ\sOóˆÐ:gìºEmšþû Î,LµÕ=¿‡E¶¸Ûå e¨ÕM,ê $4Fk“xœ‹A Â0ïyÅÞÉÆ´I@Ÿ’ÍnjÑ&RWÔß[ðÎe.3ºŠÒ@"y+Qru|ˆ…¸ÆœÉ“‡P±8sÏ«4?`´‰—%Z–èµ+a$_Ja‡ÄhSö&?õÒW¸~nÒŽ?ŸbJ.ÀÎn˜Ò—eV•?Rsf†&/¸Í[—Ã$ÛùV¨ÏVtî ´Ã*Ô»Âò˜öæ EJE_˜ xœ;1 ûœÂ=M~'â °X¬`?Z nÏVÔ¼jн¾·T¢fEµ(É«Çà=aÊXS-YD50Ö‚d6ÚÛÒ¡F•,1$XØrΚ¼sªÄƒRà-#zõûºC¶¥’<>pþáœs©$;d'{ÌÈ:ÏSïíïÀܶJ½×q„ÜhÞæ ÆÛcÝ¡½t)œŸ¸þôÎ9Jd½E¸Ø>“×yžZÓ¿æ>½õ^ œ[ᦇù Š> ’xœŒKj1÷:EïF‘GßEýQ2KC»ãÛg pm^-å¦ ,„ñÚ‘(Q^2Sn,,%"ÇTº4)y‘°7ÓáP°kÊD1cŠE¸Ô,I{IµõŽ5G"Z¤ÔÐÿ™¿¯)jðõ¿7@ĵ^׺~ÂG< <ï÷Í]߸†c—æ* fgÚtŸæÛø†~ ömð ÇCaèÜæ©ö€mœñÞX/á)TL£œ xœŒ;Â0{Ÿb{oü„8¢É ví5D„$rœ‚Û ‰šWFš×ª02ÇÂŒÖÅhµ.ÞE.:8MÙö6«•ªÌ ºÐ;Cû.Úb;W‚do’ìú‰IcV´·ÇR¡M2gJÏ7œxDôÖ/Nú˜JËë5¶&jØ×u© ò¸Oã|‡Ûu€íkÕ*ÛBøxœ‹;Â0{Ÿb{š¬ÿ$Ä!¸w½†€óQâ åö¤¢fª§yš¶Šö¦ï°ˆNÑèBä ™ä³ºÌG E-i•©i¶Iííy¶Ì¾3±g2áÌ"²q§RioÏy…Veʉß\óˆèzÛ[´péNÏã8´&ê.ãüÈBûfz 7ÈöÔt§Z7õ<ùDAœ xœË=Â0 @á=§ÈÎ'qÒHˆ›8¶+*ú§âÜ&fÞô-ÏUÆZˆˆ…€˜Y¥ôJà¡÷) º]ͧšj«%q©=U"Ƙj§Æ(Ø{•ØÑiíð6ë*ÄÏ·¿þxóP2替„oŽ·e™ÌôïÁÝÏiîB¦/÷&…<åœ xœ1à {^q}À€AŠò†|áà–ÄŠ±# ù}¨Rg«•fVÛ€œÕ>X*3W™ÄÌÉY†¤¦’s1©7Ø:_µ”hCJA#Wäâ<¦áÍ’f”˜c–¤øìÏý ¾b.¯]õFƘà¼ßtÑ#ªì­-½ãïºÀÐÆ Ä›/+oáõ†Cß– xœÊ;Â0EÑÞ«˜Ž‚Æ“ØcGB”ìßg9JpPpØ=Hl€Ûœæö Ä>‚9XíµÄÉEq~r¹Œvˆ)MfÐ&† aGë4i˜¨K ZÜ(bLÉ,­ìMJÙb(*½n;-ï tùy%f–Q,{MgýM¥í~Ÿ{Ç«ºÍ+èY·cÍíÔ©†(REZinê…?Q”xœŽ;Â0{Ÿb{¯[BHeã}&(?d ·'ˆ 0Í+ÞÓ*@VE}‰6[JŽ6•´³×Ü!Á¥¾’¹KÅÚH÷Ó¥ÀYRî¿°°&Íþè¼:v=ÇÂZÄȳ[¥é=c~{&f>ø>F:Ø“·e¹µ†?TsQ¥6‚r…4`¢EVºË$«RÅŒ—ì{lÆÃ|ÓÀDÝ‘ xœŠI 1ïyEß½díI@<útºÃ ô÷ý€u) jtÉ‘‰ž“óžÅ”œ*Qr¶ 5h¦dQ³zä.û/K¢ÂÙ8ï*!æXqÑÂ•Š±Qpfâªòs¬G‡Ûû.»Àùç cС ÂIOT9¶­!¬êÚ^0VÚæ‘7¶{•ÌÒÕˆæ>š“ xœÊ;1 EÑ>«pOƒ' ѳ ã¼3‰ »‰ p›Ó\-å:WM>ÔÊQD£”阥"朢Šr§ßú û{E~ž‰™K,Sâ™vûoAû¶™;þXÃ¥™›¬4ð²‡õ>5–,ä xœ340031QÐKÏ,ÉLÏË/Je¨ÜnÁÝ×ßzÍ#u ×üF§×ݹ¶Ý¢ÊÇÓÙÕ/Ø•áäL®º%±»S~ÈWÿ:—Ë_;í@T‰obvjZfNª^b.Cʼnô|ùs—ìïVçu-Û]Û`ýª,ÈÕÑÅוáIÂroÛ°øÐk_‚üun úøGª")?¿¤¸¤(±@¯8ƒa×ñ}s¸Öç^óŽ™·jE…á]ÿ^Õ™›š*$ç¤&æ•‚U¥ü xyFã³îÂÏiRnårWzx]ÎAMKÎÏKËL/-º+™A}fÈê þíWîŸuzyqóÝÖ M €@!%³¸„¡pþÑ Îç˜y’Ž…¾tñª©: ²{1D:3/9§4%•Á9ó©iëY/¦³¶®*ï9V¤ìZy¢"'3‰a»ógëßJù'ôoöa ֞Р‘ÍMÌc˜ìzC³^ðç¾_¯››¶îY¿CÏVý D¶ ?žáfÆéiŒÛTsøU×ï»ub­öÏkÙâ¢d—8Í7;.J¸ã¨9ÿ4ÃéÈûQ‘²Ù’T Ã”ãÅN¥®h{ÿ%CûΣÙ—ÑÏÆU°Qxœu”Árã †ïõI¾–ü5CèˆyR¡*«4‡UFÝ;:á5\*‰ò5Ì(˜Ïþ²`zûfm ܹG:g¬z£†Æ‚ˆPrEÄãwÒkc×"ùäõngl‘ÔÒÕÆ·uí‹›¥Î5HTÔ­Y‘=èwÕèX¡ÔàÖ^hÆ\›ð¤ÒJcŒÑÔpNö]ŽºØ¦˜W‘~Þ„VNxZp^O.ÓeׂUÆòˆþÄ.WЇÐÀ'²ÑüT6Ã΀÷èÍ?g悽ÕxœÅZKsÛ8¶ÞãW ²‰]¥ÖÜé;soU÷J‘™˜5²ì夽„HÈB‡ AZñ¿Ÿï€$HÉ™to¦«RmIÀÁy~ç,«¢¨JùÐîr“Ê•Iuiµü¬kkðõ_çÿ#Äö6’‹åòþîa±~Š×ŸäÃæþÓfq'ã„þüßD7òq}m$-ÝF›»DÞÄ,À¶»ûµ|xü°Š—ÿ¢uÉ«w‹O›(º‹ÖÛw×s ºò1‰fràÍãrcÏýFÞÄÉvxtŸ?2}ºXÞ¯“m¼}ÜF ö-ã‡ÔÞ'Äjô°]¬—QÏDØ\ˆ¿ÎåMô1^ÇD3âݲ*›ÚìÚ¿“…V¥ýE‰ÿÔµ4¥lZ¦ J©öü·)McT.û}U=ýV™–ªÌDV¥m¡ËFi™ëÖëL¶e¦kl2V.žk­iÕŒ÷ðÁ»³ƒµJÒ¶;«ÿÕbmx¸gÖ\Ëô ÊgmeSñÞ‡ºz®UÐ5X¤²Ì?Óe¿º%§ƒ®5NÂq9lÿKU¿¹QVµy6¥j´Ü×UAË¥ªµåݽb‡jäQÕIÛ\Õ¡pZA¾ïIÚ÷ž¨ÖK³—¦‘'e‰)Ÿ0„ÓX€Ñ–Æê|/IŽòµ*µPicÊg‰Ó¦kß[¹Ó•ïç#®¬Ì*YV L“æ-™8PˆÏ?LzøE^‘¶I™b“zŠ*ks(ö´Õ¾9Ñ¡–L)Òªü½-SÖÂÉ4‡‘\×hSËêTÊÜG«¹ÎõƒYæø¢å©ª¿Ú΋=ÍyUíýŸt$Àp²i¼~픎L>@ز±ÒQƒÑé£Lse ë™V»\“ÔÈH¬8vžR§ÚZU›üjÙ×0UçFZ¶µ´*çØ€iÇî£rX2=M*-v¦Äî©>‰gÿg'7ý:±ùÈ>R¥iUgªLuG. a¢¸Ñ©9|tI윕¬!,a/Zu„Â9y¨ÊGXcqÈÏs \o à6ñ§ÛmÒVÒî~×iÓ…D£ëÂÛ|Œ5 (¡î)î¡_°Ó‰^ X¨¬ÊŸô7°cÁûŒÜ(ÏN&ßuõªòæõ§=ÈöޝÛCÓû%¢ÖÇ^Ÿbñ±¦8€ÇŸ{$~äücCßÇ\½ßÀ÷U]Ì@a7·¼À41GØ$ªg„°ÅÌoNg±1# Ûª­S݃¸¬œ>ù3ñ1ï!ú¿§jQøÎƒºð]ø¯B}Å^ÄË (”ç3°·'g«üGS«ºqrB†údH›àËîÒˆWëénKº™°oäâêx„±½.]̪îÐ3ûq⮋!8±LqÁ!L—*<„Œ$`gèÐüây©‚­O‹o`wGܾÀ¢m1ÅÁ¹ÜÎl愦tÒ N ËV°Âb—t¦¬Í庒UgœM+°,I›wL³±ƒxÇM¯åàqüƒm Nëà>v¨ÚçùÓ:oåó=m+Àô|¡$ݱŽt´)gR*kÛš`Órf(¼oˆ=JîÌGY…].ñºDÀ¿z}bƒÓ™)¸4Ü­U¹}¨9‹‰£rЮKgsMEÀø$E‹s£v&çÄWA ѺT¶«IUbD]î)Ÿ<Ï3]0·{ò)Ïø¬‡8DUFà ¥wLh[Óuj,¥ò4¿‹¢¡³‰³Shw@ƒ~È$9u•ƒ’¶GÏôÃŒi[ë@°ï2^j sv`0©lø¦Šc®Ý—„ŠuÆàë4à®5êZS»RQ~¡þúG•-ª@lî—¾'BSATʤ_ù#ÅNÃŽAõå5”+Ùõ¹“PFÓÖ,{ª‹¯euÊuçOEX±ß›”¸CfôÚTNãfÀQdz œ&U„—páÅ-¤üøß9z¡>ÆnwP,FÌêe}Uqr–—µJt§ÀíS ˜ož}D“R‚þ‰ˆÀ ­¯¿\¦$¯íûBâüuÜ5öüØ¡õÑÈk)erWBøEиJž`RGñ@MÒµqmŽøAÔ|#C;> ‹@þÝ—eÁNB„± ¦É] H =D€YHî»4 D:°¦!¢¶7MI,©°™:¶õFýuhóB…pE‘éÑÇz8CdªPèC±3„RÚÐ7Ý_öˆðS9/‚€ã¼³­ïVñë@Šs(â#¯lC^™lÏ7G6r½e#jCȱ,kÅeÂÌp ÃmáØc8µp…ƒ*¨k9C÷w1GédÛ LË™—1+ai³ç, t÷¢LÎM óÅŨÆ`³—K½ƒô@‡@¬vbLà£Ðy1µB•%¸ã> =&'¬(tfÚB¦­mªÂuI-åâ¬o-avîàçRˆ/脦<ŠÊ´žñIýF¬Žâ¸ÀaTíL¶]j_Æ¡«Åμ§èkß¡q¶v ˜ 1FþJ`Fv¬uŒ[ûÐÂFp+ •pGR²?ÅWÄ÷g8Ï̱?›ýk7>P®êÆ”®ÏûO‚rѕĪ3!{QoÙW—ål8ÓéÓ—îýÑÄçøÀ³Pˆ¿ÍyÒm–ñb5›‘Ò MõˆOú ǤKô¶ú¼F^'oeÒ¿¹PðM†KÃëjõ #…¤µ]…_ÿ ür0¹væ’>—B¥ŸßìUJç(Ÿ‹Òçv½õyRÂSsí;æIs͈¹n´q(AxfQîævlÚË—Ý}í™ÂtàíX5ÐÆHéAdÔ¦SÕ_s™áb<Žú3ÌÎÎpE^½ ¬r®û2Â=*Ó{2™C¢L%¼Kh´.¯çìƒpì×P¢SVÏðëà0n Ö=¾ ‡ü>|•V\.ºônÅ iwí XJ—¨g2W'Û_Ë:nrýŒ¼¡R—ÃZ{TKvÌ"ß`Ùw•Bsƒ(ÅXé;AàêîÂXÛ%_ßå^Ò¬ŸÒ•:ÒãC)9ôÿÁ°¢3¬ë«]nž]Ó××vÖãG£^±+rÐú³n›¹r•¬[ \­ÎÀmòëR (s(;€éÔÝý ëà%”¾ÞT.å/”#@¯869ƒ²®@‡ã.W7€õÚfi\ž¤œÁ=À˜ÂĤd…¦®ò™¯6H ѾÌ|Ó~?8¬+¨eíA6بÞ8A•ú¢8“8½©õêë1CÍ 9 Y`ŒÆä&T>£²¤“Û£6iŒg¯°íÿQošÑJŽßˆéI dsJ>í’~à{NVâ-ÍÓn,Ùn4ÇãÐ.’9Eí) Õm¯[¸TÏY‘s"l’°2÷7optÞõq7—CiâãhægZ;q&8¨ eÇQ€2 OãR$ï…òážMÙÖð° jÒ „•+X=ÔR1Bµ¢mófö½`ãJ†6;Öüvxßßçr}/¿,64K~B ôÝœÉE"£ß6Q’¬ždmåÇûÍöVÆëÉeÚ,¼Ž]Þ¯åb-ÞPœ¼“IœÌä—x{{ÿ¸í΋£„nø–÷ëwGÃlºüG¼¾™É«£MÇVŠøîaƒx¼^®oâõ§ä*¾‹· ¢2cß;boWÑL¬ï×?ÅëÐñÂPñt‹]‹ñ*Þ>ÑÎñvM§Cr!›m¼|\-6òáqópŸDn† ‡Œ§{Ì]¿iêzMÙ €ä€ßÚÐ$„ 'À`Ëi‘/ßK8¬òsj×J¿’#Ø*5ì€}:ò“"*º1ÑåKÇ¡µÃyœdrS˜f¸Uógôyž]ו®ÅnE(M™”ÛJì]uÀ­NÍ%É›©FÍ:ZœÇ(ŽC›Ü–¾ÍpQ]¹T]·Ç.É:ÌgxâÿæTø.W‹¦$S¯boË?áÚkï€ýÍ2BeCÎE÷ή¸¾ß$2¹]¬Vòvñ9bÇëOt.ƒonbP=8uÿ×A?[ÍDòQÁwÿ-‚{/6O3ï±IôÏG,âj~q·øW¾ê=ÿ‚ãËÕ}²ˆ@ølr=“·÷_¢Ïà¹xL4‹µÊ' ÚûÍÓH?ˆ¤ÛˆÅ…&X¾8ÔD,·á2ð±·!+ëèÓ*þñu;´NT¾ÄIt-›8¡ñÚÇä“ –ý->¸úü|>B5èj’¨ÃáÅ` çEüøJü­eŒU7Ÿcº£wŸ$qÔeò¸¼ít ¯ùÿ¹÷Ñf±"ÞGzVCµÙ ª¢Œü±-5õô©ZáÁùœŸg”Á°ŸÇ2WLÄûuOÅ{º+ÑØ*Ã4ÝâÍ+&Î-†F÷Ü#›Pöp•sWærqBtMå;‰APÇáŽÎ¤¼5D?AVÑ"Ô]íÜÝ˾v·KSBN5ÄO ™9«6€I¤RÓðr? n|í;tãäL¸24ŸBu;¬¡©u×Ð^¨hÞ9?¹:Œm-áˆûLÕ”ðíÇõÌ×FåtF=ÌÕ/Í•èà6œ±‹KXë•ìò‰ª¿Ïè#“½{´Í•äýõωÿ¨&!Ž»–H-]Wvíú—ŒÆ—3ÂF®ÜŒ‘–„—WÓFˆ­èŠ›ÞRt!êﯮE׊؉Bßwò]ÙÎHg |šë Å&‰o ~¾BWñg Äû.œõCfv¯UöÈdÖµ-5q.Q–}°XZSIêƒül¦<u–''ÚîÍB¦sDäISen6]@ð= Êv¼°+8CìÓ(«rHèܨ? }/÷,¼Ùî‡ë^p°ßišé¥"/¦ö¡›kÂ5Ž÷¹¼­N4¿˜˜ ÛèK ßð] íå°™ÙrÖ¥ÞÓ”­òÛ¶~1/„rMShÆl¸9Bå )žgŽ$滣/Â9Ubè ¹ çfþ¥2Ô¼ÓHûu™:P¥¥~ä©þRKZ•PÙN‹¢Ê\Ïꟕí+ê¯I:7írÍí@.i4\"#ÀÕu÷`ÅÍSáÁü4ÃÂQôI¾¸—‚6ÜZû‰ýõÇus{¾¤¯øÿs±FYXú¾Š¦œ×qsPcF$‹õzv ¸ómnÿ&ïŒü«xìi­y.}Â=¿…øÂŸ{ÎÙFDrõ½F7Ì–º<>:—vŸá?²äPa õ’&»}e[ì:+uŽ8(|ôHJg©ò“z¥‡l£LvüdeÌV".nüË÷Òο]âl$‡läD]2 GÑà|†îЦs{–Þ¸ <‹. 'ÂöâB úo<ÌV¶»ÇC ð}Ç€Ï Vü|¥®9Z8?¨]EÏnBð¶Ê*¸¢ïÃÏ/OÕü›ƒPÚËØé y¢Ð3:#$â;ÂT9-kÛTǣΧ¸ì®”CÑÓ¿AðQJ¼tiæãœ2Ýö¬Þ}¦ç-å01¥ª ³qÂ{|XCùOUýµšsY)áÞÇ’ÛÌÄݲáËE,•*~Ò↻¬`cϦv ˆ»B÷¢pEånþKF˜W­já<Ö=®õw ž‚B=¤}ÔºóOŠ­O µ×3Güï-Àœ­ý Ïaˆ«¡~˜‹yîö»±xœ•V]kÛJ}¶~Å@îCÂMä¤pïà yPl§18±‘ÚÀ³–ÆÖ’õ®Ø]ÙøßwVßRœB -Ê™3_gf'½ð.à…}à– ôÙÞ» Ÿ‹?«a*¹åLÀ(TŠÔ,æšï¸$ËHÅÜÓ¢–ÌrEhã13\¢1”"JÜñuªtÎóa¡´û0idcØœ`úøR»·ÈÀ4ÒÏé‰'.GWðíööŸk÷ï¿ÝìuÖ:ÎùìºhB4¨ûþ©­T«f{×áV#‚Q[{¤Rîá¤2ˆ˜17VóMfI LÆC¥a¯b¾=ÕÁÈɘôsâQ­{S)9Rû=µ·È6‚G0ãJƒÀ(µCL’«RÇ!uÚMÜr ¢á€Ú8•e k Z.™uåÒðRçtUGcò‚„¯ý×Óf \æIZ ú ðÔß‘“ž„Ìà6×uò€ÓÕóümÁë;üÂ0x]½ß“‡MYi¹Šx|Ÿ NáIaͤ=Q3Í 'áè™ü‚Çélºzw}=MW¯“åžæ!°ÂÕtô6 BX¼…‹ùrâ,ш­:§ö6-XŒ–qaÚ2¼Óœ •)bHØiÞrZ`Ñ:þvŒÐBÉ]Þ/‘YïoA*{]s E8][H¬MÿÇ£OšKCÓŒÐWz7E*3ŒRqçßúi’ºò=©¸4vý< Æ“p9xØt¿–‡(¯ÓOjÂ"œƒ—% c™¶Y:øß r@ÓÓ°žg6\ÖÜ2Z”0¹Cu”¨YF­Õ>‘@¦›ÅëÆÙ¡¥õÆ×Z¤ì63ÐNN;•䦊Xdi ƒ6„’mDÊ qhÇ—*þÄL]Ÿ2j–®bÞ›IxÚø—/¥í,¶–êô<æj¹\Ϧëér}÷­+ÀßPN!¦{+±Ó½\/xY‹§YðÝÿfú×%Ù×FG1×WC.#‘Ño‚›1µÿúö“>ºR  çðg1<”tC=o6Æã9ôMÆEœ;¾qóa™”û‚Áp_ž×ZåõrþŽ&nÁÛîG^-QŸ’ƒDðÎly‹ÛX¡ ˜¯\EªŠÃ*{ùú”.YÕé±*¸a/¦. ࡼ{ɯ¯µ‚ý:G¢rr‹ùÉÅ_9”ûùɧĿvcñå¯ü'=ïÒ¹'½Ivl%¿>4½$9È\–ŠV_šþ~TxC-îT/b6¤òFõX%ÚЪ³ÕËZÀ¶äu.YÙ±•üòÄõrWÿE¨rW¯GªàZïâ¬ôXÜj·ujš Ë5îÙÛ/·8njù[öÞôéò}åQÙÝãÿà®Þà‡)xœ›-vPhÃæÉŒ,]“ç±\Œ))È/J-ËÏNMÍVqŠSKò R‹Kò‹KK2 €¢)‰9ùÉÙ0~IQfrIqQ6—£o¼s@€›£{0§-§®§ŠP|RifNÊd'6GV0ks›9ãæwºLªU/mè{xœ;(´WhÃ$Væâ¢äÉÓYAô滬)Ìt-ìå !xœÛ+ôcÂþGE˜ëƒC\<ƒ‚99m8sM8c¸8993ó’sJSRÀœœÌ$ˆhqQ2„Q¡só¸¸}ü}â}Ý|݃lt=rM¸¸\#B‚ã]<ƒC€b>žÎ®~Á® %©Å%ú%¹ñɉyé©“«Ù8Ù õŠ3¸p*'H±\xœ}TÛnÛ0 }÷Whµ@㤶a}kÓ,ÖtYš~€l3¶VYD9Yöõ#mç2t]$‚(’‡‡L úz3”$0v~tYE¸_ÂÍhôñJ~?ÁÌF VEí¬2pß¶Hs•WrbÇà]hí ÜKA!X"aØ`‘&Œþ0y/g‹ÕìûSƒã'9æš@Ypí€\r¯òWU"Hº´X@t€Ve¡ap~^€òÞè¼ßk´ÜV¡¡È^cWû&j[‚$_‚:XFŵ 5Ì]Ñ0êÅj1¿¼J€t­ OÕ*DÈU(£ƒ³ …àK @(ÑÄc®×}nÔ^s¬XA¶ƒXá?ܧÁ5ž“O/þ« P»€ h+I¶8ÀßÖyyZ=÷t:G¥J.Ó¡P£ËFÆî:ÊÎÚî6E–›ÙñJZ«ÆtÖÒ [Í»uÊáÜÃ.VíF°0l( Ë•IaFÔHNqZŸHÇ*·×í B¯×d¯ ÎÚøÀhî²|xœ}UAnÛ0¼ç ä’œè¥99n‚ pcÃVPäTÐÔJbC‘IYðï;”mÙ)äúDr8³»³+úúêš–‹ì%?¯e®®±ßÿ²Š)5*(¡é;oYÛ†Ù‚€…S¥2@f6gR7;#‚²84žZ¯ {O?…¬â ÷]c]/¡¥uqáI:sÚì(}ú9ÐÏ.“pŒ}³Cà*ÐÍì–¾Üßýwˆ7(ŒÇjM«¨ãiŞݖóäSå(¨q¶t¢ŽµŽ™¼-B‡$ig[’Âã\ùàÔ¦ ° 0ùÄ:ªm®ŠÝ  59œ‹¶!×Ú=œÙºFaËv£•¤¹’l<“@èxâ«ÞA¾œñH¬ âhËÎG޲¡;B.7"ÄtѶ&’n5av¤aùÀÿ_ý§2sR¦Ra°€<êëüÜ0µž‹Vß :`Я4û±xËhúúN¿¦«Õô5{#T(Æj¯§êF+ÈÃa'LØ¡˜SŸW³àMŸÒyš½Çº^Òìõy½¦—ÅŠ¦´œ®²tö6Ÿ®hù¶Z.ÖÏ Ñšc‚|6Kcn}Ã0Z9¡´?·á}öHSçT‰-£ß’F…I âÛx2Z[SöõâòÉÖGRîŽbq `áVq#„A  ¡ù6™t]—ÀsãÑMɉuåDïCù‰lôCrŸ4UÓóEiŒ|ßž¨+­Aq0Özt]l4æ-5e,øØñ,ª[ú^6yÿEv:§Åp×_-NÚ7¿Uïo"ô_®Èóøá<5R·x3z+µßMBSÿ¾QIõé¨ùþááŸÃ6ÄFUQl®6N¸ÝAL«ÍIH[m˳ÝAòt°—“Qî;²§ZQrÍ&d½“˜!~×eö+Ù÷9Œ`eañ6Wª»p|¶åÕ_Á §qê…*xœEÍ¿NÃ0p9Yˆ—.,‡²œ©ño© 3Üp¡VÛ²/UaáJgÄÄkð"̼—‚„dýôé;Û÷9xÙä;PNŒ-ãTæ2Ï–[Ç"[Þ0¯GÌW!²ÕP\°Zœ³âr3ÓöM`Ž!g‹õãÕ0é¯\'gì{rÊ~'{ìvzÂÞ¥‡ì[ºÿœÃÄ9Š´/Ö‹eDµý7ð€D¸ ó„;ï] ÙÎîMåÁ»ÿÜŽdåA]qy[î²¥$×UÓ>õ kÓ`a,Ÿ¿¾ýöÐt+uG.`ål ªžƒRÆFÒM#ŒÁR¨ºÃxœV]oÓJ}N~ňòЊÔmÊ…‡TH¤ië¦m'âV€¢½IV¬?Ø]§äßß3kÇIJA Ùë™3gÎÌÎäˆnÅw¹PZ"mµ¨ú›¬$…™rJhº–k©óBÊäðáÞ¨¥Êðe'’”…¥“&Nå8m0®J«2i-BÄ+~‚½)rãíå†,ÅF 'šo(¼ºmÜ÷ŒI‰÷bƒÀ+Gǃº8?ÓáÿßFo¢68ÏGïkMcF³4–VšµL‚ƒü‘Vaò¥)g¸0R’ÍîT.i“—‹ŒŒL”uFÍK!‰,9Ë ¥y¢› Ê,~,¸¦v«ä OS¤7*çZÅ4T±Ì¬$Ð|bW^•êì'qIRÄÐZË*u·°5P‡ÀåX8¦‹âìtÒ ‰lCÂ7þÊ—fB*óAVh <ù=*è9—TZ¹(u§Á}'Ÿî§êß=ÐçþxÜ¿›<\Âír|EsUx*-´<6"s$³«áÍxð ~ý«pN8¯áäî&ŠèÃý˜ú4ê'á`:ìi4€(’LPîuÔsj/|ÁÐ`‰tBi»/ÃêlAS'´k‰zÇR¡UHPŒvücwBë<[ú|a¼“õ’Ô‚²Üu¶`ÜPp­ä#Gp Àʹ¢wvöøø@óÌ¢š± r³<ÓU({ºœŪ`úðü(“?Ù²@¿¸¶Îc¡Ñ­¦Õz×zyœ'ðrrV³ÇPÍ0 Å娛ÒI[«ùl8†Wãþ8¼‰àJ-œ¹"•+t µ³\eÖ¾Ûš9[(µ¾¶[øÛú:–Y‹¶WºÏG¤…KKÇ^¬åa 'íþíl0}ö?2•ÖiøòØåÅ̚ا¢²X—H§×³ax7ýÃûAxsŽß}}ñò¸Ñàäë‹vêO¢¦W³0šu/á_ÿúð»Ìp«+ÎSd Ð¢Úk¶iï'6ÓbÝOǯÃ.ߘ*øDçË ® &Ñ(Ä•Â=\ˆX>Edý~ôªÆOmÀ´}½Ó~+3êDÓûðn2„Iô¾Š;úwu»Ï„†0£nwMG£ûñä¹ò¾jbßcÛíúZœìq®(׆ñ¯f¿¥½ÇxOúd„Fw [}À«ËsM§õ8;UÙ"÷ …©$–¸¼¥–¼ülóç"Že xÃ,ËTfn{¥1RŠKcpö¥gäZ1æ—€¾} 0QÞ¡BXl›å“˜¯{Ý‹^—¬t Áwêu‡¶8üÚ½è𾠦Ư'·ØÎôÆÓ‰-xæ©ÂH:Lpƒqµ¥öÈç¼ÏlÎÓ¤Éì’–Ö1QÌÍk<œüQbOÂóÜòÛµAV¦si˜Í'iªÀ‚sae¼„캒ºð[°,0Jdµaêjö‹aR¿«z~˜uŠœ0®†Ï˜qŒóþù©,±¹Ô—µ<ÐE@Ó*0çð,P¦7X))®;Ìð<—‹Ü§RTSÚH-Æ?"zòí£Öv¿t˦Øù?JÖ¦ÊÑz)Ê,ðTªòù@ËRðÎ’µúL x¿Ó–'›Åî5K&imM],ÞipËj’ƒ†6ŒZ*”´Â-wìSpË„BIepúÛµ9ί3ç{Ýwã¢Æ¶`E·yƒØä$y1G1’ß°¡,hB°¹Œ¯A÷Òá¾:Ç-*ÈØË+<­þ†ùÿ¸'™ÙÄ„©äáŒÿôˆt±Ÿxœ•W{oã¸ÿ;þ³Þg§¶gwƒ» T‘GXÙr%¹¹Ô E¢maõªH%1Ú~÷IY–›C $ 93¿á<9úÜú A–.£UY%J[Ÿñ@þÜ5#XäÇ0"¯$ÎrR@¶†«ˆVQŠ- D9)RŸEžÖw%RB)Lü`ÍWÈ_äY!ø˜e_P â3ÂËŒ»I-Þ`¿ ¸Ï7¨xÍ £uáêòò[ÿ¿Þ×^k­qNkWãlŽFÁ&”¯$TöìG³ò"[~Â-\„Í–ì ¯r›¬„ÀO¡ aDY½” ÁÀOÃAV@’…ÑrSƒ!¡LCôwÞ5¡[OjY’ y³ò%Ž0£€¤”€ªù ] ¯Ô8è¦7@")à•”{i¸…­€z€wéøŒ_ƒ—s¡n槈ÑñµüGöïÌ !J…’5¦.í{‹ÐŸ/JJ–eÜ«qP ÷Áš» NŸàQµmuê>Ý [gHÅä’xQ’Ç£‡ ?e4fCÝÖPN½3LÃ}âvÝîTw¸·lPa¦Ú®¡ÍMÕ†ÙÜžYŽ®8„_42ê”·—"`˜`!a~Ó¦ž0ί‡°ö_ Æ; ¦ øX8ùæÃ0îgéJØ‹Ì;·Þ@´„4c½-O(tákDÞ¸V¬Ë ÞÞÞôyJ1šQ²b5ˆ¥*:òx¨\*ù:ç×o©šgL ·Ãò¤Ï²,¦=*_”ßzÀŠ cTÐ>#Áú¯˜cŒ*t©¤„u¹ÔÌÖmýo+exÕ Ó˜iÖôÞ{Ž­ »3ñeÅOP`²¥>èêH·;²›(ën«!9Q5Ûò¸ð"ùú,ÔhêÔššjz®ju—#ñ {êܵ&êw½³À°h…I­\£L«5ÒïæãÛv›‹Oœ±§=èÚwc:œ»—rÕ'©ÿóš)£8”šÞÓ§ê©wOððA7gžãÚB¼_‰õý¹ Ù0,âD¢ÉLÇ„ÍKl’`›ñW„>w{-X`4¡ ÚçïÕÛp í ¡íž&i‹³²ƒŸŠ}eŽ­;sÓí,6 $Æ jð§ÙIö4ÜËè™_a÷'wäg0dÒò4À¬¦<Ú½©Ž„vº„`®bÚú9¦k^Dè7Ï“\·çÿ–‹¿ ä[;Û4gUQ”4ï¶ýŠév¦º¼®Í ‹·íŠqôBQÄe( Y.¬™>Eõ˜š9é¼{¡ÕËzËߖ̰eÆü8`DôŠi›¤Ÿ Âù xègÄ ®®ŽFùë¶ma;=‰ƒÝðKš¤¿à[ûŽýþºR`UEõÓ&$IG!7ÐûÆ©‹´wØÎüÎAعí=Dó’n?ÕÝþãúÜ…gè6ÊiFó¨.þ÷´ 'ÄwlK¢¯£€ë8œç¶=lsù}§2œX1n¢-.3Ü~ç[§PÙC¦ÇM<‡0L]вB-ÙºR6¼ÚêÚî.Û´ë\òX¼úoÉçud¸XóªÙ©n휕¿ä%AïT—ŸZ8ÿ೩Uó<ïÝõë/fÇÇô ÕÊÀŒ¾ô‘éÿ‡"<¶ÓÚCÕ\°:è\eëÌ•ŸG`M|>17‚°!³½HÅ&gYfúÄÃH‡Þß.qâifÌi}^pu y÷ʪJn@^saT£>VtlÜ”´£iöÓ̵¾<_¦™üG@‡C–9~àÙ:Õql£dîWÌübaÆ‚mBŸù^²JΡI‚ ˜Âb’¥_ÆìkðY 8(#Ѽ}Õ»Yæ z/..𠨔ð„ÙéÁQJŒùWÉ YÑèZ]—Äûùiubªh¿ïMU§#C÷#Hñ:@[—6£t|.Ês×µÛç‡,û¥º}vñ¶ÅX&Ša¿Ð34Æ™Ïf–írå'TàU†K£0ª#Mf<‡s\¹4¦¦1ÕŹó„lMÇÞ½aêÞTèŽ8wŸfº7±°+»õÖº¿oìfƨ±sŒè{Û1^»ÞÎoëèYxôñ °ÿXViŸmðã°ÿHq‚ïcRåøÕÜn~ð+:õÇÄÙÙ?ñ±È³Aýu¥ò,ù:ØgªžÞÝ)?ÄJ=`£Epâ;–È¿}iN ’ŸÖ [“8 êö§ðKÞÖOœ»ß–†ÃC†íË´_kšèCø==›cøl ííL^ÍÝÕ©9ªŽ«E»õ?5ï`r xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMf°Öç0Z0£´úÔÿFwœ^ñ¹÷¶!š°J½Ì<†µC—.T_õj^ïûy]³™ÿì|'’»’xœ•UmoâFþœý#µèB„íãÚS«H©” i•ÜETê'´¬Ç°íõ펓r'þ{g×6˜¼œ® ž÷™ç™á£,ðö/ªŠˆŒÉø ­Ó¦Ü)Çñ»øg1Ã¥Û»ŒÅ¼. i7;ɵ,å , B ÈŒZ#ÜÞ\ÃZÚôQZâkꪗù¼ªr­$qJ—Ì7ްS­°ì%»¸™Š»Ù´_/¬‰ªÓ$y||Œ]—HIeÍ?¨È%Ä)w!榶 ßîü_Kn{ ¾>4Mnc’6^}j§3cè´³\PQU’ÖÛä¹ÿ´Í<¶‘e§hpÌ .ê-DåP´ñðs­-:Ž)k2Ê”YøQÈ{„\/ý˜ +6Jñs0–Ên*2÷º'r.ožD/h\׬¤è”Õ•¥Øá Ú„•Ÿ:˜¬…† .e 5é\Á,[3)\˜¢by¹j{ã`Œž@É”EI8GƶaÂl~÷¸q¡ªyf8~Ô´65wca‰œðßÊ8NªK(°0v3ku¶áÒ«\S©xÃALF!¡#ÎÅ ¼s3­••ÕZ+®É­Ñ…ücK%Õ½oµºWn¼çíÑD’lÇÐc-­%…Ò%Üüy1ÿa<æ²m&ú¹µŒny|ttÀßkÒZ‘~дÙ#u´ã ^dÑèwøí Þ…­;À´k`-j/#ܶáv+ØuðLœ4 Ý›ЮRÌë™çúA1{Iêrç ºxAÛ Î…°'±'›-7»ÔÇž#PhIg~XÈOH*ÆâoSþè¢2–Yz‡Æ¹vž5¡ÔeØó®r_€Œ‚g[B÷ñoögÿï:ǰ l‡7Ò²xL|Ö¹ÚcË­xÊö.dý¤™¡'O2 ÎÝÿžÜT¸Ç·Ùÿo×DÀµÅÂõÊÖ-é×(S JTèœoÇŸám¿.û¢d¹<'”ÅJ )úì%KÆ„¿YÃùŠ"Ç‹Eœždž‹—ë/7 Síä2ÇÈï§VÂ:¦³µD6ƒg7׋wWÓÉböéÓm0ƒÖ&—óÛÉÕìì©‘÷}æÊ·yÁý§ÚnP«bQó‡Ìã\úÄŠç\¾––õ™ç€Ç “Dö8ùkÞ|DC–Ó«‹ËóK˜]žO®/Å þòþý‚Yøúÿ‹¥.C¾ˆ“oعï5|¹1gâ·ü‹oZx-Ÿ¶ åïq—ì@úk+mçÐÝ—WÇñ=­‡ëò,Ó¸¯êÒ5l5Ûëíy.U^§¸d tr¯ŸdþÉkï‚çIà¸áCUx’gæH¬c"r„œg­ÏáÍÑÉùÑ—þ!k4îQi!ó•Æ·þ`xv}µÒP˜"×+7!cWäv¿å¶óËZ°o•³ýÕ}í~Á•—–¨ö»`Ã2˸š/E—<çÌ07`¤L5$R™"ÜÞ\”«ø+dì‹’eÑÊâ¨(RqCát0œkƒ»æ­¨'7ìnpÑΦÆûAðððàëÄÏÑ…’ÿbdt`(„¦ ØP–*Â^+{W°·*Ð7\ù“Ÿì¸i<Òì7š#“7ÓEðÜÊ[µÁSdäu6É`$âQ¹/ßbµ?üQ …š|òÒÈHæ‰û‘ñB*ƶMÐ$ëÅx)ÈóHÍ #g¢u¥uZŸ T/i±V0÷Y6ÁN„Ž”(l‹™)2¯‚Ghà0±h€LjÈŒ„ÌÁ<¡4"?±Q•M '2+è>ŸT@¾×kðúk'ˆx‘Bn° ÚHU»¥© `†sÍ4F%õr›ÂLei€ªQ0F øXHMAEfRÍ·ºvòE2§Ô‹”±ì=9‘‰qµ¡XÀWý™(^LED9é)jŸ¡Om)x4³¥³H‡árž7N¹áuZÓl¦Ü¸Ô9ÜœŸ ß…!¥eP%LE^>ú÷ô¾ã‹qæG2û„þyÀcJ½zEp«J½ ‰Åçâ³p%ï!ü‹BôöàÜ>Ý¾ËØúŸÍí÷¡{e¨_¨Ç!9¾+bKº–—Ë_{¼&Zííþ;þnËg «½ 8Ê«ÙwÅŒý‹Z¹fªxœ340031QðMÌNMËÌIÕKÌeà|ùý¶–w„Û¤×Û§y²8áóæ‡¿!DYIAn|Avr±¡¡^ò/\/ü.=ñ|_YÜœgÌu÷ž4"©+NM̪š¬§QµºeNÉÛ)ÆG÷‡½ø¸pùd$U%Å™@UWä›v—ó‹ìód3Ʋ}»$[!©*̓šv!bÍÿ>…•Ü~ÂÞ?¿¿á|²Ös5²º’Ìœb ²L~ׇþGolökZ©{ôš–I®fc±î Á1xœ;(ô„cÂþG…™ëKóŠSs2ó’sJSRS2‹lT4\Mý’‚Üø’üüœb..µñ®Ž.®AÁ@ %9½ ®¼ü̼â4Ù‚ìäbCC½ 0¢Ì,..È„²KK2sŠl.Q¦8ë·’xœåXQoâF~¿btyI¢„J}iªJ†8wn FÆé•'k±ØžñZ»ëî×wÆbrpI¨ª>ÔOÎx¾o曯‡t®ZpÑÁË¥•"ƒ[|ÄL¨AÍÀÒƒ@˹ÌéI_¥Ò§E +YÞ+ÌшdÁwäª ¥+—6Œ”æ‰Fa1…é¼Þ€‘ ?éïbMá.ú—ðÓõõÏûÑv¡|8š“e2… êGLÛä]Ë¤ì ­æZ,YÈL#‚Q3»¢Ø7°V%$"©4VËiiI¯‘§¥a©R9[3ÙÊ<¥ qy(»¥ÙÖª¯–K’2*§™LÀ— æAPT¶˜E%ž)H3í@Ix ¨ £»eÜp|ÊàBXN’:S0è’‰D¾†Œªºƒû¬)™WÜ j3Ý+)ZI*Ü¡48+³LAÎðÅ‹>8à |qÂÐF“r¶ EOiVj*¹,2IÌTI-r»¦ô«¹aÿ3Aœžç{Ñ„EÜyÑÐá.Á‘F^ÿÁwB=„£`ì¶ÆÈia= ‡ :«ÚAó’¢23[ÍꠡIJâ©“ JÐdý°KU13•Ï+qä÷\¾3È•ý¸åá)¡R=J\1¹eìÂÚâ—NgµZµ©¬¹¡>%ØVzÞÉꦓY·}Ý.'ÜiµÎåŒæhqñè¾?îvãÏ­s²Ñ`¿4“{žd%½„¿Úb—–•/~kÚ9r¢×…U_e§øš˜n·öØ02_0r‡ýp2Š‚{/g29mâÚF}Ø£;Œ}§çúggxr9¥ón—ŸB¤¾b¾¸ó†·ñÀùóì¬{ÝjÙu,RæôV_Uî}õ íåôïãÞ$r®®D\Lo…4{?¼òàÃO„!H™1ÆÇü °^/ü6Ðü¼1Ú"žºu™àò渰Q¹/ìýºD|‚*Êîýš^HzT2ž›[œ–ó‹„Nm ÉBèJ…ù6K:ŠþAPKl™Yîp®ÖJŸ€«-'ݧ«3ñ C Ý?Δõò™º §±D±7¼ *:»}ÔL¡êüÖ¿~Yž»‡¡Ê/[e¾hæYY|1ÅŒ;Q{&™2¸q}ÆKúRÑ¡~ Ƙ>–\|ç;ŸÆ1 õÍðñiaýtV{Á0¦SüÖw«X‹ ç¡<›á^@)Ü$}²›`Ó›)Z>6jÈyH¿Qc7Œ£ÉÈ}]sU̽ëPe¹údyo6¯×ÜO >Æd)‘½Õ{ˆ«}sÌ‘–¼Çõ •gÄÀåo¿7<DZ¤ri–Ç@N…^ï!r ÇZíÓúr ³95wŸŒé«2? z¿»ýh'§ì`ú&¶Q„zc­Í§Tá$E§Iz]S-)EÚÕúh:‰1ßo޶¶qâÕæiN‹÷zÔ×€ïïÁ[ÑKëOZgs’Ìÿnö¯¶sòŽ8õæE˜—U ŸE&þµñ:áìÅś͓EÚ¯ÓFz›5——¤›ô¾ÔN:÷v䭚ݿâM‹çΛïïüÿKu«Znåv3«þ±!¿aZ-Õ¬ÐÙ49}ñüÍnµ³Š§†µuN$g­¿ÀèÍ¥·¾xœ¥XKsÛ6>G¿bgrQ<ÉIÚêNg¨‡c6²¤!)»>q ÑP €V”_ß ѤD)JêƒM.v¿ýöèþU® H)¸9SŒd0¢/4ãÀP¸0lÅr\ò˜“¨©¨È‰b¥Ú|PJ–S)áD©~BUQpaTz0çB?Hˆ%ŠÆ°Ü‚;xЖ5= ‚â{±Ew©‚îð|¸¹ùµé­r¥Û½9Yž†àQIÅ {¨mÃDö…à+AÖ:DP ’'jƒ¾oaËKˆH‚ÆL*Á–¥Âx<îsk³d«qPVæ1fH§Ù­å>WC¾^c(ór™±&,¢¹¤@Ы–ÈÔ¯!0þ:í[  í¼P!u2Þïw×€ ºDi’X™B½Ó@$ßB†Y­LOûS ,7Ø)–#Ú0LÜ’B)iRfוáÉ îg‹œé3<9žçLƒç[TV)ÇUì ÅÖEÆ3)H®¶Hß”hì ïÑĸ7xÖAܹÁtìûp7óÀ¹ãîp1q<˜/¼ùÌ÷|ªiQÛ m ML9°_bªËä>æg¬ DbY )y¡XɈ2l ag­’IfÆó• õ^Ów ,œ«ë=ŽîLÕ £ ®´mªTñ{¿¿Ùlz˜Ö\b"ÚãbÕϬÙŠì}ï¦W¤…&ÜïtÞ²û(0 æaàÏÝð¾ó%ØÖM!ªæQVâüCª8cË^úgM¦Ǻ ÙWRžZÙ=,ë°T:…(îЯz¯AàûábáŽÀ÷>›‡ÛNÅjº˜LÂûÙà¯ñ0€›ñçñsCá`y>ôüæz§ß1Ydd I™GfLt"ü¥ J‰€«Ø®~¦Û…$+ú@ŠîÂ? K6"мCríwYÉ #;aâ”*ýA/N¶âÛe}¹É8ü(¥ëðâ³ÕY]/oì/&¼FßÕRS¦ø®ûýO4§›þß’Šzγ٧DP¬g›œÆÖx8›ã¿H‡‡ðWe!tGBÆWx(¬j/œÅ dÁFtY®ºõ0H(¿MɇX) Îç2Ó¨•íX.~ÒÖJ.1V•1†ƒÇHûZ+Ø$äŠã»~¶YY“"rÀyÖ­”H¸|$YIkYí2+©*‹¾¢DÄ|“×T£Ù|ÍyØÌõ•.×k¾[Œ2.l¾gÁóœFêÇl µÙòŸ3†×7oÞ€ýÑ*wç.'Á¶ §Ö¥„´åرõt:à‹™Ô‘Ïã~¢ Ûý$¤EÂl ¢j¥à8×·Òmu¹³ŸÏ&îðÙBÌEŠ#%[åݺE¥}IHƧʧxÉR'vYªM«>¡ù5 žƒ±á¥Vz0Y¬‹»¬”é9'vGìNX³1Zwž;˜:<Ç_ºU¢m𝡶Í=ŽÞFÚ´æ£3qGNàΦ†~SÆ]Þô4âtŒÞì<âáᯉT™Êh¾Ré>I/¶³· ¥  ˆ*å”N}}XµF¨ÕD9¢÷³˜W'PWT IA–,cjÛ ÛØ³¨ëà8° õæ)—¸¤›Ç¬T TØ…†þ•±°s·ÖnF½šÆMŠzT°¥.å‰vDT[K‘ÍëBƒŽÏ¾Ñ“ÑQQ+ <>~8ÇäxеÉ÷lšLö'ùî,ùB·íÛ&œÄ-Ç{­ÝQð$HqÔë¯Æƒ­¾Õ}wš6› ïÛÉ^Ý1Ätプ¶°›¾¿†mä…‡rñâˆÎta<îíAyiAª=kïÂzjFB6cғŧÄÞ6îÇÓ!7G«âÍ1n¶ãÔ™QUæÆà§8hPèQŸ™‚nüµQ&¢McIËÄ)"ñuÁ%S‡ä^©{ĪÅ[-¶w oø-¥?¥4âÄ„®¾ÿP§Pæ6ÿ£ýHvó„››ôo¿ÀO¼´íA—_bŠñÓkèÌÃDZçãɺӻ\½|/ª ÈëPm ,Û©T÷Çàôqd¾—ü‚D»äLý`æ!Åݱ'ÂÝÕÇøLu!ÑëpÏî2«'ü”¡u³#zÍ(‘çø™ÐZµÚ'fW†“Lwj¥9Ý'Y¬Ì9p㬅5þÿ3Ø·}ƒ=íêÀ¿m<,-.Û9œí¼ý¢·òéÂÙêaŸNC="Âùb€w1Û¥oi³¤³ÿû}ö=£çŒxœ{®>QyC“ ¿rj^Jf”c4…éxœ›¨|kÂB6#³ _3Õ»:úÄ{p)§¤¦eæ¥*ÄLJøÆCá¢@1ˆKP|pH§Ÿ»‚’.8¹º{ú)„ƒy1yJZÜBд¸ú¹ i¨ÇÔ”DÕPðvÄi…kXºÎø5ø9Ã4Ô#t¸8†Àu`hàé« \™››ZR”™¬àZi¥€i³g€‡kP¼£k°‘©™³“³‚© dë9(æ»Ã´»:¹†(($—ç¥`ꦠäéä«âÀh ªÔ¼”Ì4.Õ…ÔàxœeAKÃ0†žü~ŽT© ^‹‡Ž¦›¬¶%É”Â0™ l©¤ Dž½øOü‰‹që:¼žç}_’|Ÿðóu¶Œ$¹A Õ\…BðêAtºóÎz•ÝçDJKŠW·ÿRÆÓCx Ìz…íëJ(kkÛà;œ“¢äŒRŠwxÁv/2N#>Ѳ:äɰCòXõ1MxÇdʧùåA’2BÆ|ÄèîÞ´ÊÔ¦=¼ÀÔ1Àž'¦Q³e¦7K>/fö2µiô‹Q=;áªî”e~Ã[­åqÈVÉðtá®é¡Wm­ÿ}ø—B ŒÔsØÆuÑ´îxœµW]oê8}¾üŠÙÞ—P!h»Ú}Ø®Vš¶è¦€èUµZE&1`mbG¶åþú;$Àý®–‡–ÌŸ93žqÌàº×°ØR˜p¦Iàîh"2*A¬A£c&Ù†qôŒEL)Dj*9ÑL Õ,åŠqª¼hk¾!TfBZHæBš/ "I‰¦1¬0½˜• Iñ9;`¸­gÜ…»››ßzæïïí˜u@Cq9æ0IÀ7D |ª¨ÜѸè"YÌ!“b#IjÒYKJA‰µÞ£‚{8ˆ"ÂAÒ˜)-Ù*טµÂ㊘­†m9±N¦H¨.UUÅÆ"M1¡y¾JX‹(WF5µµ%0X…¦ì{  ×KØQ©LIn+Æ’£¨À!ÚˆÄýÉÌ¢®!"ü Ö¶^úµd9ÅÀ¸åÞâfãdÅŒö ·¢+ºÎ“ž¡@0|ž,žgË §oðyèûÃéâíÁz+ЋSP±4K2c%%áú€òí¹þø— Go²x3IM—a0[úc·Äâ `½‘£ÙÌ«uš5ÝW ‡^àÖ0û7g¨…¿<‚Ì8¿Xl÷-½ã—‡ðÕõƒÉl ÍÏ|8þ4|r+ßq7{ §³© 'ŸÐ¹â‚Ó«n 鹯®w‚¿i!\ßÇq>ã¢R y‘¬½à¶…˜Lg„1¾¹Úø»âÁ-ŸÎ¹bºÊ7ÉÚ ~­Ç. ±ÆaؘN.Bs§ì‹y"º<^ÃÐq*»s5»¹êv»'SÔZ[ïæN°’S┦8uNáU=ÓQõ@¡7ÔÀqb:úQ#Ò¸œëqÏ2='ß~]O,®´u4÷ÊçhK$\ËPnI*Ç’<Ó${Ìydß5N{ºÍ¢B3à ¾¦“à k5Á6”SÉ" ðŒ/ЄJ§Ð²ižbL̤àº&a¦¾XKçDzð­`Ælñ.dMyéòmXà<<À-ªìdU³<=8ÉÓÈ/¢âtÏ<™æD©}ÜLßFÑ\ŠÔÔÓŽ9 WcÁ×L¦†¡ì™E„ÞdN‚ðö®¤ ¯¥¼½sÎÓ¬Hz´0ò³µ!_*ºä,ÂÛYKöÏÑÛ¬;õÉ]̇AðùáCSyí?º[^Ûí'‚þ79ßS ×iñ¶ô«VéíàÍoŽ5}ƒØšZåÓ,9|GJx!ï¨ÂVß”x ¶æ‰gîê÷•ÕŠÊkEå&bóLßë±³ù§Æz šâø¢6ä< ™”Óï÷Øsxþ0z‚Çöƒ]óÂø>º‚c¹"ü1àà¥Òs-/”¤½¯3ìHˆqS1gNS©þY¢²+È£BÙÙúò䬑Åq„GÏlḠâªH¶hÊ­o°5½Oõal~Ž9§Ì øcR Ò}¿Œí5ŸMIþþçÔdt£ù8 È:"qʹz%IN[1g{Tn&è+™M_'x[zo{«©ÿÒc©xœ340031QðMÌNMËÌIÕKÌeH›Ä¢Ym8S·åÉ7E¦j—• w !ÊJ rãsòÓõ’ž~u~1éû QÉY|¦+üÍúíIQAvr±¡!Pc oäL»«Wwï{ÈhüTy}’º’â‚L ª‰^/ÝñÇZœy§Xy0rÚ¹‚ô¦—ÃÙšƒøÐ›ƒéM•ÍJâSì%Öq(3©XdvHß–¨;n_¢I³Õë÷¦7ÄEo:èN&p1CFÍñ´×žõ›cÍÆ£á¤[˜p¢Å]ƒ<—Ð…-öKÀ ¡Îb¾Á j$°bŽ•ô¹À>vÖ7«d“ÊhiƒC½Cú ISÉp¨K0UÁ·nÈveLü¦VÛn·ULk¤±N>¯Jµ¬…ήùqøªZ¯Æ«˜×<ï'ùa‚SU4ñzž eUô<aIúrÙ§Y„wоŸ÷»×Ýþ¼;Ç §Êå%(Ñ‘ÍEŸGØHÀ)›ÇfXÙûìy‹UÑÚÞð þŠ)8µÏ8ÕDÀå´$PVÇpám ‰ç³³2|ö ÌA Nà—×ex‡zNlåNþ°Ï¬´€ì®ô²Tü}4Årƒdøçxˆ܃ýz„•³xôÈ/1G^–é­¸kìe?£áCÝþ,$ÎÌOꯊiÌD8>„í7‰Š²0½Ç}NIËÇëʀ˛ëOR­Ö¿Z­æ²Ú–Id~Ãæ8Ü6¬©–šÀQ¢ S¦äDØ8{âã,1&t×3%m¦¼R%Å*;t¥½`O=ó Þá÷É'Oµ9tßÛ\÷uº­Ùû2&:ePÿ—±Ž”ôñò~¹€{ÑBþÀx{ƒ‹áÿ)Ü®RRýÀxííò2s¥^ à ð¢×ïÒý<׃Kĺ_KB.›§ø6#©7n9”¼åÞâ¨ÁÌKùÞ,b… ‹æÞ^äè’ø6Ç.ýu@Ø…læxåiФËÐG€¤v„Ö^C»:ã9Ù“¸:\û*óânNs¢é6wÿñ~ݦÊG¾Þóˆ+á;]"±Esð!ʱg³~Ÿ ý¸fa(ýÒ«ßÏpW yT¢Ö Ýr^àºôŒÞ9©Õ¼š»¬l‹bÃuA½­Ó:XIŠçaÎÏ‘1ܞ迲ß;Œ/óîNÖ­;’/w²NÀ6ñQ~‹ç+B]ñ0F ¬OGè8d¸:àî %®Yl‰¯A¬^µhI>1ßyºÒ=­Š_ÃHãCË ·½Œ[üBúTÝî¿YfŽŠ7‹„Ûþl_¾'4¢™8mGs†o÷)îw³A¯=ìtGøŒ<Ó‚3­·RŒ¤@âpçÖ-ãþè3÷=vü¥‰eœÄp/¸¶”s‡[ì¯â}Ÿ¤$’ñ6Ž¡µÜSyŠ;¸îánÿð}TA¨‚t¬5ËVÌÁõ¸yE_iØS|„¸Ä®8žÀöa iÔl±?ÞŽõ­Ûöõ]:Öm;Õ…/GìY?݇/ûîðð{»7Ý6v÷Ö C6D)ú©ŸÜøóç-† Ô/“ø*ñ8ËÄ÷Y_f·ÐwƒÝÅ+6ó"–øó Í’`ºÊ`¼ó¢ùAœ°E<.ï<[Esನ[¤ŠW­x±€¡œ¯¦a0c½`æG©Ï<蟤×|ðˆÆOÉn0?€ö »ñ“™ñBa”8ê (¨y ’Yb£}DäEw,®ê¦eƒ5cš³ ⸯAÌð`…ÝÀ¸©ÏV©¹ 눀ÙOÝñëÁŘ5ûoÙOÍá°Ù¿mpvÃ[Ð*X,Ã0'/Êî€|.¢Î°õš4Oº½îø-â´;îwF#v:²&;oÇÝÖE¯9dçÃóÁ¨óœ±‘dùBA\ ½äâ}™û™„©ó[` „…svíÝø É™€0Í@³ÖJ‰33Œ£+>8€3ìk°à’EqVWxPK€U7‹È3l{eË£ƒƒÛÛÛçÀÖ(9ÍüçqruŠÒƒÙ2|ñüðùòz‰T« ¢Y¸«ú![.&Ëw³ôÅ‹ç×/é‹4›‡ÁšgóðrÙ°ËYr·ÌâwÁAT=àŒyÆS°ž/ ¼iè§¼ûÙµ—À»Ü¿«É2ýÏ(îSvÌÆçg“Áy§ß¾=Þt'£A£zsg;ÑŠA»þE¯×`ì5Oè#ãa”HüxÉ]µõfrzÑo»ƒþ¤×'çã!Çv:‹z ³Ûé*šq_/ªÕ“Á gQ0E'&~³ÓfoÔiT Y7š3°‘åØšHOü,Lsêƒϼ0ôçŒãø €ðrŒÜ ˜A‡#t0¶Qo0žtÛ]6 ã¬;oT þÍà•ÔJàµ@ƒÍ€Ùþ¤Û?ðfœ ÑJƒƒ,¸ÿA£Tª(ù¶?]]Õ@Q#`ž±‡2í{ ÌÚüƒn†?Ê¿½IÞrflŸý·Z­„ñ•Ä3©í=IYºšÍÀíþííƒ(tl¿Qý@ºî$Iœwþ[ cýx¶ƒ=Ò±—Œžýþ{þmþQ¸#¼ÂrèrÏÔÒeèÝÁäJJì„ySœ¶ÐÜRh ܰf±ÂQÓv‹ö‡ÌÍÔ+ÉÎup“ð´í§³_X Þ$¾ä´jØo_¦ò}p™Aão`fÿ­a!8»LÊÚ/¼huéͲUâ'à(tóje2Yø‹Ôm6TÔÙa]#2‘÷b èÖÑž øjÂ…h¶¼³{¨ }Û_;Î:ȯ²-G¶\Wœ4wO6GÖtT`“åÖ¸ÿbŽØéà(ó®V{¾gaCû JÔeè]¥ì)˜Ì©ôðçÃΨÓsë°º 1D±Q†=PûpC’o`Y ÜÉLøT“³¥fÏTÜRôKÛTøãž7õC[Ù5ø·/C|[´Q0Ò®ÌJl¼”w½À·eöeHÏŒyá°1E¶«¶2G ¤ÄÙF’˜·MJµ™šÊ8ÆX6ã„¿¿²Ó%W–‘/¦ù³¹B"Z: ~;^;*÷V°ÖŠxž?Dõ+‚¼,EË[UPxaFý®x©}1ȹGî'Ê%—¿NbTd(³ŠMÿq~DB²*§ÉÁbuE8…^ó¤Ós̈’ÝKû§â^žwûR¨¤Àáô|xF«¾}Ik"5îÌ\šf`¶W²Š*ÊÀh‡I`ÛǪi ú¢Õb*ÊÍb.áI¬ËHÖI0¨=zWa"¼0Sç„×ÙSé¯KŒEµÚÅP8„B yí¡Ë[ôcÍi1Ž|änÔJ½3…Œÿ ΀³©†1V™˜Ç¦«ËKTç˜]Çá\'°,˜§ŽüD÷}„º/Þ⊞¸LªÛÆÂÛ>ÖÁâY½0B&½}˜Ó)áJ¶µ4žf^‘¿ˆažÀ°€2‹uÛ©ƒO¯£ñä¬s6¾ushègIàß= ÑCJ-BÆÜ_‘äˆ>Š.¡}:*¡22v*†M0â €þÃüï–°à›o$ï÷@ð¹¼æ‘ % ±WÁ8Òûä1LÛè‘äÍ/@ÃoD\N¦òÑj,%µ”†,ô¹Šï WKØj9c«€“ëEaП¯ÉÄÅ<ƒ•VedY.¯+m^“2˹ÊÉçBùvKF—pÚ¤ãV“dœ#(2[Cn—±ÛâwÅ®ä;“¤×ϼtÊ›“t¯…öl%¢©¢iP3Y!&vš­ƒ7ÒûŽ}гy|YÁ‘ÝI-ø4ÁióËaz.¦å Lã’×E–¦i²wŹ2~Vóš®Ää\#ÙŸx,$àf?h º±"Ý<ïRQèÆVÖ~DyÁ”¨*XåÁK£WÙ¥6òºÈ_7‡¢”ÄI¨Û™'ª®ØT‚í}9ˆ¤›qºb1òS\Œ_Ã?«„Ês0…Ç`§½æ«Y¦ñ€è»¥sÁ#¶Îh„+ª¯›ýv¯Ãep­z{1ÈþÙïÇ|u†]x-û嫵|N´l±‚ÈÌ o½;\eP:ÅHXb R Uøâ¿ÖˆŠ#¸6È̸ŽÍBãn¨Dj<5‡ €ìG–ƒƒ”ÊšÕc‘OvFANBǘnbÀ+P'Ãòø îû‘ÙBè!:Vʾ;0íÑ&§ÙC 䃉ҥ? .qëÌ*ÅôœòÈ`Ý M…õë °ÈÉøíyg¿…GúïxkΪ—Ä·ôÙ.yq´„´f.;œ3Ùy°ç? ;9ñݾÍÐðQâÛÀIðá€a OG>bɳT4Ûš£e „sÑF¸¾ûQy/¹žõ’V›ûâ!˜Uä[ªs-ôP"dlØ•ñ²ÃÿnØ^(î§ áS ™ÇÞ©¶E÷µðAQ.Ôþ9úÒËäÞÔ*¡h'gÜXØqggŠ„"xs<vO.ÆÞ¢PEhºúƒÿ¼É*DèV¼Šàƒ“uZcM6¶Óû³ìãiÞ+Ê;Û•RF0k ¹0J¨«À¥»Øðj»À´. `J¹DSæE,&Í·V!Úón:´£V쪟K/ZCòŠqOM H7¨ÂܯßmÔ…6…ËÏ’Åê`÷=pµ©s 5«xè?éölöpá¦L¥pa[Ð#Ui(€<½š"Ü2»æ¹S>ñ{a(‹5Ñráe³íœ6étçyÿNäÏ”ÃÞ 7¯B€vèù‡‚Jn&™¿Xwš0Ül"Ú3ÆWzJ@VRMÊAμ÷9ÜàôÈh1ŽØTisCãïe.ŵi¾±O‰mì%eV¥-ØxëIÍåms¸î¹nȃX6~è„\ðçÕÊgƒ…G˜žXñ…–.ÑA}pCÉŠ¯·¡#6œvûíÉYóg^™&r­qê•_²ìkƒð5d݃Y–ûÊ`víÑX·\¶Y)]R™Ç‘/ö`æâÉ1kØ"V²N ¤ðÝÆÊ%@Ù³5<‘´ò%œÒuªvq÷ˆ«Òs–®)×HÝ0ùB[Ý3_¯&â)Wþ-—V“¹jin€jÉNp5ƒÝ^ ºšå”ŽsŠRð+Do‹ÎÅ`‚–HÁ‘\¶Á#bÙÜå7¸K]ÇO¾³©š‡ßÓÞšÄ,˜†Ë`ĪF)ô³Ò˜YlÃ>¹Ëüf’x2Å>å«Ã¸÷ã$|ÁFB“=ÙùöÖÙU ˧îÕ3©êùÔD™5—N;ï3?šÃùÎñ¸­%zPŒz˜ÙY+ûkõš£d­ÐKåÖÚ“Üé;ÆDhQúö< n€Q¥ïÏðÄ.?ð(@xþ{¦µ…™(ˆCv†ãîi·Õ”4nؽ[–÷4NViæÏå†b£f(´þ_~ƒø¤ó_àzSŒ·hp˜m â70òCÝó-,øa€Åïðù°û#Ðà’A¤|’kr6hÃh›'=Þʰ44smùÖEµ(wh½Ês‘ïHáe~³¹—sƒ^ŒÆ6®`+°x¢š|hþó÷‡ÿëbøè‚+ž›Òn»äùhtѺßÉÏþÅÙI$_Ü«’U›'{ðS¿ {³õPú.™ÑÎô“„&lPr¶ýF™¥öƒ¼heF¿ï@‡üp¢S²ÝÉ rèß7¢$s¤I9½éžŽ-Š3qòœzy“"«ìÇUl))!h×-)èŒÆ¤ÐgeåšÉ‰âÍ_Ò,N¼+_/ȉJ잨ùï³D-€$ož©nŽ  ïK"dc¿='“ôK½ÓV;êã<¸œœÙºZŽx‰ÝiÉëG`6å¶Ú$do“6ŠB‹xl I$„Âb7*–Ô+\I®VÒÛ«2ÆÓ"3gÐ(jM~ž€ñÍ|Z¥‘ÃÊÎxnCSêcjü­ÜWÀ*| Î%ø‰ ¹û †dõ3÷/=׋håôÇvHw®‘‚Æ|1gA jÈÌÍ2\YÒšY¦‹,¦b©‰œ³\<űX’c¡]e×éþ}ô:òeŽGV@L^øvcűëXÿúÁòsú¹Þ‡ly Î>é1j|aÇ‹˜ÃI!Q7‘²oÙ¿qQ€×4¤þ¾ÞºÞQ!¯§ãU'…òsÝ‹Uµ:¾`©9a&ãþ"L–¬| þÿ¾ô =UCÉ÷÷Ý6ý©ü Ð£z±[ŸݦO’Zº%ïvëÙIz–'‚!]ÿZî¹'Õƒ"Îï·’˜ÈP¨°dβn‹¨óø¹é~ý¿ƒ‰é è/ñ–•bI ­¤xpXOmOå3˜ë^µNºk™üŽ<ó÷-`þá‚!wi¬ï‘WÉHñÔ¶ª´~Z†Ò”Os]»‚XmˆÍýý}Ëþ\L‘Cåç{mÈÍýþãñÊÄejùy*3¸¿¼"£" J“ó‹“^·….ÆQú0ÉúŠÌ@9Ë2<Ò[ºÑ’‰Ò§©˜èî>]ÁDwù©ë%]Çîår»j Kõ$šÜÒÁlS¨ HYÁ®Eïk++Q¿#t¸¬ A{°ëŽjD.?y€Éƒ5YÉîKÌÕÆ þwÑ-ÿõÒÿ YĨ4‰`÷H!FÎ î‘@üiò‡/‰ÁΉÁ—ÿ¾1þ†?¿[¡4àÞ-Þþ3Æ¡£NkØ—Ä#T| ¿„®ðq—Øiš%ûs=Κé\½UGñÍãÕ„Iê#‡1öQ2îSï0çRfí¤ó)>Üu2å}™MDòšVy^ú3ßß_Ø9â>’Ÿ&/RŸÎŠ‚6<*¢÷ª]Ç·üÊ\¡>WKŒQÛb»9n唼íežì¸úÂÆ³Ýo|D1ºE¾ô(f~¥ÈÞαJ³&÷¢ÁC:Î9(gJñü¯šœvšã‹aÇX{pÖìö'çÍaó¬3î Gø–. ˆ:,eL;.¿ó ¯ Ô—Sˆ‹ù ž¨n$Ñ"ksæÈ)¾ç‹Öè´ðßl¥£ZÈÞvpYÛf`§Ã/ßÁŒ;ÒÎg¤^+ÌQ^ëÏJ—VÍÑ=4Åø¨nÑ’ùÁ[Ê¥PNæWÇT6”M93uKÁÚ É;¼ðP—üðºRa!èÇ=¾gzê¡™Û[ÀuK`ñY94¡†C0í|x{ÛÆŽ÷»ð༅T½ò3eFx‘z)ÜùÊÀáß®B¤n1myÑL%ÈÕŠì­>“¾œv#>iI0S½°Òm„¡9ëmõGYA¾(Ш ´óˆ»¡×w&€rYƒU¦éyÐo庹W–gÜm‰™ÙóþÐíp8Û>X.Õy®?^Þ€î£åÖE:knñ Hv9S®ÏIë{œµ«ÓFH,Så BËkì©Ò8~XëÖ•æ:WÀ|̾}¡r ¥Ðäš\û‚ûjÅ–(¼X®Ôátî¬Yäûs¾e»œ¹K@î" C2¥)Ð׸tg¶ïrY4{,ô’+ŽÞЫÆ$o~'”¼´ŒIòQõU¦( wl!á¯5´utÅBÎáä!{[n˜Üú=±¹&‰ÒºIéa{ûÎçD)$ûÅç?#Ô Äýˆz †ü±uÁ%c½æ£ì f #àº^g¬Ìef.¾škžñâ:@üÀkâ/Ä™!>þ©Ö™·Jù½Yüc#‚Åø¹Ò›`îóæú“àc FæMä·1.üÖ%§Ü·˜”Yƒ?¦:ØXç3 'êëlÌÜ"3ÇìE˜W4%éIõá¨þth«Ùouzvù½T;@ØL_ /Ð5’jº9jû$ØH®¸ÚH2æãD@ò/Ð§Ž€$û·Š€î¥»D@Ñ…]ƒœûYÒg oÊÅñ°†"ùøL ¾¶¢?ÜHoìÃO0˜ùgÉñŠ>^”¿½öA7ó_`Ô_)'߀N½Õb?êNvõY ëÓ5óù„ °¤S§šÊåOGЛ.Ï‚è<ˆzê:u5Jþ¼N ˆ_¬ ªM±˜|lr†'Ê« ʪ±5¬ÒIþYûz¸«P£Ê‘î½_Kº÷þ¾¤+Ä@ºB…¤ÿ?€¹íñ¶”xœ½o›HöïøSL³jÖ‰¼IÓîÞõNÄ& WǶ N/w·BÆ6W ƒ“º«~÷{o†clÒÝ"…̼ßïÍ{ofàâ¬EΈµ ÄýÄwÒ£O4ˆV4&ÑŒ$01Œý¹ÂL7ò(ñ@&4Ä`ѯ×Ì)cäÞqø ñ*Š9È9E1>0âÆÔI¨G¦b\ß#¦Gœ˜Âÿ« °[$¤Ý=%oß¼ù¥È-c…ÈÕÜ´ c$ÁȘ2?Qï …š ý*Žæ±³DEf1¥„E³äx_‘M´&®’˜z>KbºN@ß„8¡wÅdyþlƒt`lz`!4H·dÒVÝh¹UFëi໤ï»4d”8ÀGØ‚+$@Uì+B}ÀÉãRRLitHÐv<³B¤S$ä„€U3Ô]Êæ:yÄ9í¸€*hôìƒá¦”¬­ƒ’`òɰhƒGòIµõxÀÉ"‚YˆAÊ_®(ƒ%c'L6 >w‘>îÞŠvmô 땸1¬nšäf8&icËèNúÚ˜Œ&ãÑÐÔÏ 1)ŠEE€TtÆÝñâÑÄñ&u~2,ðÈÂy¢àI—úÄ!.DV­—¸1ƒ(œså.7ßñg$Œ’ޤƒQ¦zòé3Ow‘$«÷ÏÏÏç`ÖŸ\zÅó‹@0`î*¸<s¾Z¬Pà‹Vë?tƒ5¬ªãdµ´¶òÏÇ­–ešödbôˆ9þ(>9fÃØU‹~ÁEÁïºÃ¥ÿË"‹nKåKrÕj¹°Úâ.œ˜œ-Õ$üFÏ!P9NK@kæÌ©éÏCô°ôÀ¶¡ˆÙ9åPâ± Êðh˜ø&Ÿ«à´u²è.œPÌÿ«‚½öC¡ðoÕ|ŸÎ—sO¹’~˜YàÌï/0ý×"®˜XýçW˜ú­utüêaØ×,£¯wÈ«{ãv¬AôòÆzÏë]ËŽ;5€¤J‘ÔR$‡Ê¸ °Žb½Œ»K¿•"Ì×NÐKÈ1:‰?”ü˜AiÁ³³a<&øS9``>fÎM­L$˜÷(ÇíéæöÜ»tò]嬹àTÍ» ªwKÇÅÉ»{­»=« ²§Z˜¤¡;ˆBáø·„ ³ Êè³Ë.IÒÍÑÇ®ùtùK%èС+óò~>»Ì†š>²AêKûþöæ²,óç5Àl&N‰š¦†b\‚œr VO¸´„ÔÓÇ(H ÊÐ*p6é†û^{b ¬wo‰c¯ýž“8§­ßZ­#YØ]@É“£¸6]’?&½úãÄÔnuÛ4nï[GG1MÖÕ<œ«¬áþnáˆTVcôô嫌$[5–6±î°øm3ËÓ\5æµ1è•q0éUC÷õ[­»%›HW­£o€”Nä¥àªõm—[n ²’[ø˜ð ¦Ra¨g3äDf׫œ™L«üë.~š\ï/‰ƒÑ=·±=Ðô±¢1ÕäF“ðZÿ“öhV!ˆ\ÓÔhZ0bè–/ f­kÃÊQâÙ­àn‚„U‚L¶ôn ê],è",ü- LtE(L[`Z™£FQ]Ó]ÐåK3‚nÚƒá@]jiÖ-H PYz}¸ü¥e³J”b‚ÝÂT“rSÝ!a}—îæ–îi¾/(brEd~~H“z©Pö`÷ ‹®T jM€ôƺ9é[$Ï;mÞÌBVÕð¿P\)[ÐÝ¥ZûZ’Äô¯éu®-œ­p¤ÌEjBäCëˆÀÏœ&çOÑ¢mÁµÃ•µÌ‘fYc㳬m n†ÐùÒÖ$ÎÙ~Lèz:ä$—%E8ᢜ‚,°…h§ü_‰vÞœt»°:͘©Dó{6oÛícBľî=H||z*&ï藶‹H.;Uœ@Þ~÷ö0%w©ÉËM¦äwéij-jDÈ›/¯ßüü…´_³Óÿ†Ç§Ì¯BÊùVþÞôµ[ó÷Ñ•—È\׿Õëš•ß?IW¬ˆ¿£c³‚þž+û¶FÙBíÿ³´íßdžuw/´ æß§¬,ü»»<ÌsÕVAðG«¬ºf÷N¿ÿ u:Þðã'"jÖû½Q](í’£a_ð{j[ ¦i¦ô^­ E]Õ…à®'>¨ý¯éŠM° v©1 €â³iü[ÏAÕÛhËH+dëQ¾ÈkLý„©:Ízƒ¦Å¸¬fŽ÷ÃÞ¤?1ÿ šœ‚ŒïªÉJ ü?®D tËü #¦ïL~VÌ=º¢¡ÇH$ÎWA6Â6,¡Ës D¦Oê &7ág‰×ÃaŸøÌZ-‡Ï!õÚ•GƒyOÅ­…Æž‰£ŽñhãF뛺 ÒÏtsKÐñzƒ'mIE¸e–Á†úÑ´tȧò¬,ŽtO…[·Í:’ˆDë„sáL­ñyŠ€™÷™Å`ž›ë)ò=‚Ç£=:]ÏÛ…ƒ›}8K*„J[EÇöÇÜØBapŽ@ß½f„­]—²4&%þi‘‘ÇQüFQ0š9~@½,AþD -ÐøÃkÖ!näÑiã㯅8¸êsFuàƒP6'n÷‘J;gͱT¼¨ùžyÖa8W JÆ£‡X'Q­ƒ1• Éä§DFî`Õ’* Má„™«á@TÒ°ë°»Ž¢€¯>æØÓ'XS”HþtÌ7´SŠršüƒG%yŸ¯ˆ4$§iH*jºbYtùíVqááfFY|ÛûŒ´| d§T4P\1úqôq'%¶#ÛTÈD¬$jQÐ$½‰)½§Ë(Þ(ÒvÈ`Òï×Êœã•å®´—ôPs ð ¬…!u“ï´‡¤ÒÈ)Ò>™¡[…pNÿW#y§•·¸£©™µYѪq¬VL,ß»áõ?õn½‚îàY¾"&SÁTcHæ9·¬! §ýñ.÷sKú=+àEê+LŠÚ¤`ŽÝ<Ž¡ZCýߣš5ºŽÐ#[Ð­Ö ©Ô)¤â6ˆr²Š ÁÂþ£]éT™Ñ°ot…>#Žq€§€¨€Í5R‰ šò´#'\¥e‰T— ý4Æ`gÑVuɾ<¾-ˆ[Q®¦$\‹•è V›Pͤ‰IÝX:pK;XûÊQ§íÓ°CÄŒº 1Z­±<ì{¦Aðù.‚}Òû}ûã`øi`›zw¬[(ñÅ…1#ŒÓ÷!*á:ØÌàUt ·Ä^ [å} ‡Àm…ÎÏMe;#…$''Âm°Ëa°ˆfíLÎÓ ôÕ’.ÝåJ¡Ò!m¡þiÞÙ&pzZÜ(©nËí^Ф²"û•¬¯˜=︾‹×¨¯ƒC˜í ÄŒKãåu¬Ù¢. ë{²”¿J¥>l#4X6Éj‰éd=Õ?·³L-2l§••ë´‹á./VÆ´¾ÑÓðò¯´±¸“N“îöøðB»O×¥æxW– zQÌè’†¸l§ò¨ˆ¢2- f,«,¶‹Q3»a„$N²f[†+´8¦£Ú1ß ìKª(iÎG±ƒ¤šÛ¥g†Ý8(^¤ÜYcõn¿K½Ûæê¡ÞØß/·ÕËêC@Ãy²¥󲫱}1œÏ5’ÄR"5êÔ&]ËgºéGŽWq¥,Dø;«ý« lINRQ«$WPDY.vzÔS·Ÿ(]ÓlG3üu5Hó@ËðJÙG^ëØIE*í$rÎ97e;!¹Õµ¦úͬ%RV¥›Ó =ãŒ(= ÏÀ‡¹=g;>'—’Ùrc¥Š€p¨ÿ €‚@Íü€ûUê U<¨®Þœ´R)ÊûëÊ s=…ÈgÈJÜôê2^qwSêêËó·ì*ùMº6\À¸K:ãr\fdê0ê)—üÊÛ éÚfÞñƒ4â$ò£48)1‡ç(#s~Mä¹eN/#d†–ñÙ¥HHA€$Ä€Ïä9"_iá—m³rÀÊødüž˜ˆpŸ¶q*â.y?QÛŠìÉÀèßs dñ‚I¹,ÞQì¶Á®·[Êpöh8šŒ:äD?0-¼yÀ¥“ò&ºÎRÿLÄù);Ó塜x«¥ðö‚ŒÔb_‡ì;Ó—:pñ7~ÿò39K3<™yDÓi½«ä+¦üÝrö´»ᦟp×@a ¹-¹úO[‰y597­WýroÖôV–¬ yiMÊXd„‹¬C’Lƒòºµ7ÔËÙQ_Û°äe¹¢d™ŽµÈ’@ÊI}[ÿ÷{¤$ʖݦkwpÁ–Eäãûþ ¹£ƒ:9 ΂’^¤’3zOÃ8¡ŒÄs’ÂÄ·A3ÝxFIÀ2¥,òÒ †Q\ÞYñ ¢œ“+Ï_à_Ê’˜ C2ŠþÁ‰Ï¨—Ò™®I¯s…+58â1 ßÉÈ-Rbt›äÅññËþ~U¦™DÕ4Í0$cDÄɘrÊîéì ¥° CÂâ[æ-Qœ9£”ðxž>m²ŽWÄ÷"Âè,à) ¦«¤N‰ÍŽbF–ñ,˜¯Œ­¢è •Ü-y¦±n¼\‚@£Õ4 |Ò|qJ< Š#|!T€(@ :ÛmBXÏÈ=eUr’aT8Z80¼™û$¸¨‰ˆ¼hMBÐm¾t—°…L3D÷Œ Vè!ÅM)Yq:_…-DÀäºç\ '17äÚÍsÓàtÃ,xŒD,“0Ì IæEéØ&²ÆÝ XbvzýžsƒBœ÷œeÛä|8&&™c§×ôÍ1MÆ£¡mbSd‹J7©Rè\˜¼fFS/y&ó XcáŒ,¼{ –ôi@<âƒíµ’PfG·B8€+Ô×&ÁœDqÚÊð —€ªîú€ÈS\»HÓäõÑÑÃÃÃ!¨5â`'ŸÆìö(”ø‘Ÿ„'‡Ç‡É"A†êõo‚ÈW[4Yº)O‚ÃEcc”S/Ü]E[ã?RÆ¢øpñ“6„&n7ÇfÁ&Øš¥ë„òíažziyt'ÍÊcBbÑû¤<‘²ŠzÎwͨ?pºN£Õ’ "\&fœüV¯YŽ=êu_ºcËtÈ)9nicƒ®£µþegRþìdŸ¶å˜gÙÇËåëFþmgg¦3Ñ&LÀ>´ëuǶ݋îpàX¿8dÑ!E½O‘³vý›CR"¸Ä=Ÿ{½áÀ˜W–{eþB¾;®û i"ºÒFüí»·ÕkÞ’ßH½? W)rnWäÔF«j*Ž"ê§ÕsbÙpúë.€~ìÍ.麳žLzgû!:a<-AØ45SL3g^ê•fÞÐtC$¬+(Ë \lS¨åIÄäN„»W-29n#'ÎÑ¢} #Ø—Ö{f›“¾ãÚ½[䟯~Èç­ŸG[ó/O^ÔëA” 3Ríü[²q„Ô hÆ2¼%$gGàr=órwŒ· Õ¦ò“ÿ@€Òû„³»k†—Qü‘&8z½†d˜ß‚û4:=náBõD–ø«]¯unë`F)ƒ/áNHë-Hãv{£ kìNÃØ¿$ õ(w_¼|åúSßh6!Y¼z§‘ ÆD5ƒ&ý~[2RŒÛ€Gz·ZÌT.)Ƶ%àß+?%˜HÄ/c"€¬AÌ$ +òQ€lLB6»k‘`ËF!þz]˜v‡ÑIoà|÷‚ðõ @79wr$û|ÈtüÖéŽL×¾0OÜ“WÇî…i_¸}kðØD×V¿ï^†××¶ Õ8™nÀPÒ/ËÂæÃ’vÙ ôH(¯ÁQž«8ì ÉÁTƒkÁç«ïµ%]–QLƒxìãZ¨IFîhäT‘ßϽ-CçªÕ˜’Ž®lËì»¶sæZãñp Xk¹§€Õül"­ÚmœÆŠ<üýȤ2v JRœ#ØvPžŠú<‡(!ô=Ô ùËàØl *vž §h6%—:/*úʬÔ$™Æ`û–ÀNDê„ #Ó*Œ¹}p #Ù` WVO%áÝ:ÛÐN.9²± îQ àY‚#äâ–¦\²Õ"ò7ê.žøÑl¶¥‚ \"™"£}q6úãÞàÈ!T!Œíië X£Âäç½¾µÃæƒ!ð 8¶t­”Ýã;¨Q¹D^äB ù%„ÃðÛ#\1ýYÂ]‡ƒ7€Ã1ßT.s%±³µð"€YİÄíâÔãb¿ÁsOV±©ÌÀÿrÆŒfá\Û¾e™oÌÞàÎ%ÔËiЍ]Ш )gÅ"A¾ÊP7{T± 9#ãšt(ÂÃ]ãò—ã#Fl’Ÿ2å+§F÷ƒF3Üiñ¦ ´ÇòXœ”åEiß°|1-5zÜD¨)Øë¥ˆ‘ï¤T)DR5ɹ·l$¹a[xÚnè6@#|ØçÀšU\¸"åH7Hå¦{¼{+Û+žQîhümçUF÷ݹ+Wa÷ žUs¢EP²â ƒW-"F1cT¹(H:+Yz—‡ )åþ‰<Ïüá§]Mæå­ÎóÓªc[: 캀`#„=–¡ákmâ D•V«Jõf+_YWbÅ>§,y%ú¤Î;²¥6…b ”ä'kCx®6”å(S)êTŽÉÄ£›'NÐeVø £4û.ö+ø»“ÜTµ„­²ô/g!N* bò‘^Õ]P¿œ‚8Ä~ÉÊ>àÜŒ,×¾¹ªŒlm¾Ú*N KµWÞ%|Űõ-‡ç«$‰¶qü YPVDžᯣQ®IÁ/Ó² ìøI·ÓmæA¯Ë¾°G‘³ u¦”€¶*± óù•z¯26‹œ½^.)œ7ý?«ÔE>['¨{OŸSñݽ/Ÿþ‹W¼BŒÊЧ‹±·âÁ ðëT¼²küïëÞ6?_½úÉž^ýÊtå'§v¨}‘êêW,mmâþsª_©QUý4€çª‰²]ý2Eý­ªßf.¤ynùýë'CÜÉÇqªe@ÿ±xîŒ÷¥Àbú¯51ªR`IŒ])P¼òÑùOv"õ®ÊiE—×x–5§%â$=év-Û®`Fo³WPE:Oô¦eî#/Ùõ±Ç—$ñ8ˆÙLúÞ=ÃN»iÛ×g†k4,¼Ø+-xMMìiµ97û¶%¢4c@N67ìõa—&d/ÜÈ4Ñ’ þút u`Ç+§W«íÕ¾lI„…³‹fæ°ó/«ë¸b»¥º Ú¬qÑÔð³¬Gú¾‡Õ\õ³Á{©uodô$}¤X¡T{œ¿NØÙ3ÓL–{‹„ü©²ˆËšJY¾€úe[Y›”îÄ6ßX¹öeÓù+ƒáÍ‹CjI"¢ í^ Ï€Í>ì>;‰F‚5Õ¤!{àÍÙOä\Ü~=‚óòíKÁþcÝU^®=ÆÆ¥[*-¸… mWdlÇR·Z 2‹ÀaðváÆÄ‹Ä¼á/޾MÕ ØÂ¶’$B "!Š­ßøNn\˜¸E~]ñoÙÅ”/ùþ–C\Àöuî­Â4[¿•Ý7.Ñ yK²åµäcn[)¨¸­Nª ê¹?/Xóc¼~‘žJеÙÈojš[™W·9XhÈé§ñ±/œRÅɇsªEÑiç“R'Ìÿã>tî!ñ“¯xqÊÖØpXyÓ/÷tøV†Ì‚ùœ2ƒß½(ÝÑjñ!]&kIiôÖ3¼s{\ltþŸ›ÿV¹ùþô¼¬]Ó›A wtÙmf49ð©\à3ŒÝ±s%뢯 ÀKo<…ð4fÞ--]ą̂~:»  !“âS=ÂSž•.Ÿ¥ /‚³U¼º]ÈN[®8Þ;‚ß2Oõàm.Õ“ÚõïRž•Å9ŽI@Sž á<ú©7öÙ R»Uþœ«Ýü”½£Éf…G9¥-¡s%J§ñ ñDüô=9%åQÑ_AÆqøLâ׆·È–Œ-u‘ß"Fé&] —ÞÏÙ]×Ç»?Lÿ9ퟲV¿f‹GÓë$™áiOh6s‘çÙ[ƒ,æ‘ õn6Cò7 åvˆFî…î¢Fžå¨ª0}FW î-2WµR>ôý—xëéAaôSâ¥êõž(¦Ù5@©SWfz]¯•«Ssš—%0ùö§8yò£³ž[gFiw U¾>@ÈB4aÁ,’QÂò´”\N VÎ.}Á™ô ëö‡êX\`P½¦,7kG-AJiǯŒšvA”ƒcÍü­ z~ÑÇÐ߃d^ÐÎÆÕ£Ì)¢vk}¶@ —÷Ù€¾]Öïã`V¼µ²QÏÆÆÛšüe•J¸¿e vž”R£‹×æhyµêX”М`%³ †äã<ø1s§«ùÛ—'/ÞµåÄÆXʈ!ßlI&øCú C~Öj>$rüZôœ¤Œ {åû”óF;›ÞÊ$:8ψ䩨¹µ°è‰•Š…bj·Š5ùC×2'(2®ÑÄ¢§^®$,QÚPÛ]mí¹³sí\¶+×jo0¶–_3|t‹Rï¶b™¼ß± /þª—É‹…ËÄ»³êuêþ©BJÈ,Z_]9–1tÌ3Û².·O"oŠ É2¾§²Vñ\[>Jbà‹n… [Kê((m% Üln”3¯ ¥Ñ¦ÚÔ7žò×äøýÓãÞ“Ð[Svú”·VÈÓ§Çß¿'ÆÓ?å µ¢âIjîEïdÁ·‰C8KÀõ-º»B¡Ïáÿ3ðø)[PÆÉ¦jÖJ–d”) ©¦ÿ#pxS½§xœ­XkoÛ¸ýlÿ ÖÅ6vÖy½âí.ÇiŒuíÀvº(²… H´M¬,jI*Ù´ÛûÛïêE9æî½ÚHä<Ï ‡3:Øm²]¶Xs6Š…~ÄÎø-d“Kf°1Ub%bì dșР4\ž«Ä~šjs­Ù?XÓHU"•%Ùg—Rуfâ¾á!»¹g£ÓÄéÐ1_q¼'÷P·6¬=è°ãÃ÷um¥*b~\[?ŠØŒDh6ãš«[îƒ:sÖ'J®”¿!G–Šs¦åÒÜAwÝË”~Ì…6JܤþæÇáTl#C±¼'9XKã<°n£ ¬r³+—éM$65g>´ÒŠ^[çIüwÍî1.À¯Ø-WšÀ8*$æ2º ´}CF"2 1uHß³¨–¬O9[ù2[Ùk„ á,Õ|™F]böÛhq1½Z°þäû­?›õ'‹O=›µÄ.r%%6I$ H*?6÷0߆h8\€¥:ŸÈ‰óÑb2œÏÙùtÆúì²?[ŒWãþŒ]^Í.§óá>csNfñ,AtiÃ| ¹ñE¤ Ÿ?!‚†E![û·‘ ¸@0ŸȬg£dÁŒd¼²Î®‚¯ÇÄ’ÅÒt 9”%€êVð;nˆwmLrrppww·Xc8|_ªÕA”)ÐAíî'ë„ >h6_‹8ˆRœªV ã¥Xí¯[ÕÚO”YBêýõÏÎb#Ža} ‘¸©¯%I¥ŒÖOíä´í˜b’gt"jÆØÕÔÖXnžN§cÊ”«XTÞ±óþx>ì5›Ú ¡ÀkÃqi`òteú=Çxš}ý<_›¯¬µæQÒê_ÏW«tÃcà<¹»lg½Ã¾u-QžÜOÐÝ–t‘\Fñ?Scü2*)ÓÌô'$¦–îÛ¶CÁÚWl7Ñ_àÊ|ºF¾À“Öú6:I[ ¿•‚Η0¨[Ñü^·Y~6š›H~ÄÛl<ðú¤¤Õb^³q#âÐð¿L(7¾ˆÛ8ƒ_ûï‡]6žúãáÙhfÉ!¡õoͦˆMsÅc®Ds.P®"®Ú0¥Ë“tÓW+ÝÍmßõ=˜oWšc5Çì^éWNP"htÄ®£ÃalB¼]ú É…]ã¾wi÷?Oã +û– ¶”!¶½Ê :àÝ~œí—G–a“ýÁ°†ôÈ·ª†uš9_Ã׈àíwšVÂPLª]”Ø»w6i¬úCè(dl‘u*!GŸI;açüDç€ÀI-¾p¹l×Î ÄTµÈP’ÔWX©ëmé?:a«[$°ÔËŸU@Ë$÷m¨î6B¤Eò¡×ð™ø}³Å¿MGŠ6|ƒcÒfN‚v+o H¨3³*j©îSø9¦º"QŒŠ4[ÈQŽ7Ü3½—Xî>«§µq··‰DP#Î+n@äÑÝÓ®ØÚQů ãvž~öêÛ;ÊOCã Ö…šÌÁFàãúD]=±‹³Ò®T]~¶–⧸IU ‰›‚õ6gÅIú a¯×ný ‹Þã„ý [nMÎü‡3ïãp6M'Ï rá6<¯ êraù÷¬u%Òë·f%Š2p¾L"UÖ÷Þd:A¥Ó{˜LÐŽåjLí/‚B$ãáÇáØf"y#Ÿ8œÍÐÒ¼D¢¥|‰ÈÑä|ú"‰DøgÃÓ«÷/’h)‘y œ°ô#\uX`qkjà)ºÎ?› y.@wß-î9â¾ç÷þYÐÿ7:þèU9–æ9Vë^³«<ÆÛä¿ü“£ò¥ŸFÆMæ­{°‹±¡X³E›à.+ÎC¯ òWN(siT¶k¾|Ë*O¾}h»†ƒjJX7hÞ;£µE§Q;¿FOs g¡ŒyÖû,ñµ¾“*$ÔRû7ý6*Ù%m„•H#©‹Æ8¡mŽ8ç4ï~m§¤×hÓ2ž¶Û„äb²RV],Îr£¼.œìÂp/à’ÃÂFßÖ†­Ê%4AlR4Dv6$Ï Eª{ë0Mo~ðùD˜ÔÀY¢ç£ùŽ|cc)“l ò£;ÿ^Û!34æI̾$Usô]¡•j9æþ’C+’’†àH;4¶A×®¤k ÆI-©s€"µ7ÏÍð£ DhsTôw—Jn(lï{7=ÔÆbJ·>°ë•¹â•!mט߀ªëpw³ kH_‹%Æã%[ÌçÞxtêæÞѱcÝw ƒ»tŽI‚ö˜¡Íc5»kauâ­™¯yŒÖÂTÌö¼ùpá So:i=º~~Þ8´ 7V‘{Ö²M¯ºL°Œü•gØ®ŒBžKL¹RUw–Ïuöo/OoÀßÕž/ÎFï|4N¦À™ˆl½Þ;ʲw¨”TíÖÀ1”R²ù…|3ù¯[6ásœŽòÞƒTÉ8D<û‘¡(:¥ÑDÊÊš_.ƒÄåèmKxóŽý›@z°ñ7ÚuÚ²¿ýý5ÿ;ãa4èãN(Z#ÀDjý(‹Á¼>¾š_°ä¸ž€FÿÐÔŠc–•Þÿž¬Õ1»ª²Ïµr”Ì$ÑP“-uù=‡nV×là(önÒåÑõñÛ¡ÏÂã±}ÌxaP"iv,2³Šq³‘(,©}kuÝÓ÷ÖTZI´ÛƒÓ{§Sä¬sêgñ)O@§B:3¼dÍ7“þã·oÉ+<iF‚«íˆøWUP¦¦P¼U .ˆhLò½òŽ:a-ksÝãš¿ŽÃÇ[g?cõ±•ðÐìšÝvŸæ ´d¬™®²y«{pÀ&’m|jßí¹—&Ízóu™ûFßõÂxÇdÔÔnåýA¥»¼þw³4%²2G¼µž¢W7éŠü\(oâq˽…ô®&£ÁôlØnŸ~Z ±Ÿ¹×Nc-V±ýÚhlV“òN½ºli€]ašvÁh8pòÝlü~ðžÈÔ‰›¨½ª¸VõþϽsKÏxaØ|®´PeùàÿEQÛª–™U¥ ûš ìräŠõGvÜcHª™”ûí4æw]m>Z£|—•m3Šf«’óSÑ^ºÉ\ꯒ‚F8œ]vTÚ¯JŽmQEN?(C–ÙQ´bºÍŠ•®«I›PÄ/ÑNÑÜre|û Ü7ö“î&‰8z3‹ÉÚ*ôÍa.«Òxí ú™ùÎïñÂòæÍóD‡;v6ÿZ¶Ÿ•u½âd.æ¡tÏ.[Š˜’=Ô—žóþ3Bä¼ïíåÚ¬ý•aÃgê'2Ãì #c#â”—eê9¦8gz‚ÄŠ%ŠÙd‡Ø=[ §sõ¯¤#ËàC’XxœSMoÓ@•¾lQj B 4½TI”òq( D@|(7ãØãz©½kv× *Tù¯HüP®œ‚¿Á‰YoêÄ-$_væ½y3oÆnþ¸ñåScöµñëØŠçÍ>œJ? ÂxžÈ4KÙºž—bªP·lVu€q Ae= ¼í¾s‰:—æP€·‹ß«?Mõog b_–W¼9{§xµöhõ©¯Ô$„><Åçµ+S× P1§Û…¨!3!CûIŽI‘B®PÂUÐ1S@ŸJûš0Ê£¥åú<‹< ã˜ð#CF )©½Jxµ‘h J1M3 íX­rsÓ ž£¶ïvÙ££b‰¡´jy[ãÀ3yï»¶¹‡QÕ| xÄdJý NÃN…b v!(Äó^•·úTë±Á`dÒ.UK³5š\IRZif§+™Ãuú}Øn¼³#´8"×=·øxþÞt.°ð`Â’Äø$ès’Ì3ðµ!@â0ùCj¡~eL©m¥+—®Á ŒÖ¨ÌŒ'ßÚ«0+îR`î1ÝGñ¾yñúR¿Õa£ÞJ]±ø¾Þš:û0‰Y‚Ðò½Ñ]»⻄¸í–EŽ®Ë÷Ø9ÍA6'Èëž;W§‚C…CÎâ?ǰN/ÑœâRóÖâH‹—ÍËÔž[úRÛÇÑÛïÀë\érA˜v«ËYš¼ú™—b»s0Ã2Ê!ÈàÙ¹ Iã/SVVy¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró ¶_¯²’[·êzæûúGÔ®¦í–ê„K3èç‡Ím4ÂÎÖ-šþŽû$ƒ@)\Ú‚a1gÜ<.‡çòŽdN–6<ú%—•kÔ©1Aä€üFxœ;(tÃ+fF…ɯ˜7ɹ,Õ“±NþÉêä9³)É4¶ y‹-Qa³6{(#÷GÕà=xœ»Æ¿–ÂþG˜7³±¸1 ;úÆû¸¸ù8ºsÚrêæ”dNöbÕ\Ǫ±ù+`"áB (5±$55Y,=µ¤ 4 U¬(µ¸¤(3./NÍI«/J"+.N-IL.É,KEÛž˜”“Šb@IjT YèzL•@g¤æ%#‹–$f×C¼Zœ‘Y gÁÅ•™¦ïãéïohÄm[ˆWÊò³Á^V€ÙU ¨’|h`)@ý›Z’’˜“Ÿ TÇ•š—’™ÆÅåäïâ¢`« ¢3—9X“  ±ï €vxœ»Ìµ‘sÃ5æzÃx_G¿`N[Î’‚ÜøâÔÄœ”Ä’D=CNÎ.NN°`YjQqf~žž!WfšB€¡a|ph@€PWnbT·6X{I~vj^|f^f ²~¨hnA~HU8ß*)+5¹¤C¢ (¿(!^œZRX\\ž¢g8ÙUŠâM.‘?@º¿sxœuU[oÚH~÷¯8B•J¤0‚DYõa·ÚBÜ5„a«ªTÑ`ŽíQ†™Ñ\`©òã÷Œ Ái³/–çò}çö3lÕ‘6+ÊÊCwtWýþ Œ•G«¸Zq Ãà„BçàžçUü#ˆ5ÚÖç [u¶AÈ* ²,¬æÍÁÚ&Làe&a á&a³Y²*†«Õ›Áª˜×KƸ‰ðÐz‘“MgxŽÐÝW¨`sõÖCp¹8Ñ:ìfW¯T\¸Æ5×p„ÇíÑ„ÕJuÙ›÷]Cô†œ¸NÊzAãt¢cxrUs->CÇ›íƒC.7Üó  3Ôë¿ë ú€ÎbvOyQ¼Ä-*O© ·ÉË]èA›%aÙg˜|¸O“ö.¬zÿA(<Ô[^ƒ¯ÜÁQom îdß&ÓY6ÎÈ߀LXu€~†¿Ø™á;Lg‹ñt?’z›f£ù¸ÞëœêÑFQ]j?}•^ìð—²ùÐÅïÞqµmáÈp˜ækUˆ24‚aCž?lMzIeá (‹¹Þ¡åk‰PX½%´_h»åt£x6W\•$Dm 梸ùÝ܉×X½ y$&„±è‚ôQY°Fºc&‚õŠ j;ФXÇì4ç—àB^wÐ$mYï~)kÝë F9^4 ïU´u õ/-Pš(ø[áŒärq»© Ž$Bf ÍNÈÞ® ¤d8rå5ìñè´l£¥.c9¿+­ð ­Õö)Þ~Úà:”?’ =ЕR¨$îPžiD›†0"|ߥёoL²çBEèKuÄŒœyt›Gÿ‚h|DÆ=*Ê-Ápù‰ÆèéA£¼„ÒEßþôVÓkc]¯þþ-é-qÌÑÀÊ‘â)‘Þ ÿ>ù«Å\.»xxœ•UÛnã6}çW ´ 8b"ÎÖ}Ú.š‹»kl.†å-P¬….c‹Dª$íÀ@>¾3””È©Q /É™sx8ß3ážx—å=X1Àôð„ÒÆJ«š 7ÇÖm°CÚÚ–h™Ãc;à5ßvuQP“Î몢’°š7ä7ßÒ}éÉjEàkÇ힥£hí©•köÙ#A4$P8I‡’eÎéBx--‡œ9ØH¿ÜçýtJŽ”.¾i,p¶ÌÖ(¨Òë&+*[… Ñɒʬº´²Á@6W!LÅÉÔÄ—©¤[b)ˆBWSm»$ÚRù­J>9Q·DmÚùÙRO}j MÖ& œ|©LíƒÓ¶R¾Û(Ž;%×}ÚŽÚ¥—Ï’öò±‘Ì"´'Ž?è‹IøQ?ˆïÌ®¿lךT–4l›§a°¤ÉqaI¬ ¿ï¥3U¶ÝqY;¬Dß\Çæ`ÝW\£uí)ÝVt¤]õµ+½àùõEi…Ïh­¶Ï|û¹Ä¼^|)z + N…k¬öfdߌ,ç²B¶fçgz¿xÁÂut˜ë— mªƒz)¨£t „» çh$Qí½•yMÍ»ƒñÔ‡Æ2£H§“äáCÀÑ,¹SÛÎØËU–Ó‹Heðµù úô+rlÐt^Tß ·Ûi'm¸ín‚5oÅÝTÙ;ß™5}³Í4å<6S+(ïtB¯µ·«¾ÎŒ?à`k:êŒg渳¦UÕDî <:@À;[Û¾­-:Æsí\& ý¹ ¢D!ÂL…á?—œ].6šÈ+㙈ÌÃF×U ŠSÏÓšŽ{"^Ûçy4‚ë»ôñÄ˪$u6<¿88wè MµMyJØŽÈS"åIÖˆZï“Ñøq2å´Ý|þ@Ÿ ´Ë ³ýÇ«½y¡˜Š RÖXPƒ‚k((ö(kᘊAž&ékwQS)1ŸVÄÓó“ì ŽÚ0UÒ‚E$JS²–»Ÿ£r ’jý ÔºBA:…P.ÜÍC2VÌš'HÊ ¦ ›%!¡|ÒL/5S@î  vP-]Q× J‡ø}òi“h~|^3cœJÖœÿ-6| ûÚù´«ÍÒ†Á‹ýö:8“Bû¼ýÞ ‡$ïŠExœm1KÃP…‰`kÞ\q½ àÒâì¢U°ˆmh‹ƒÈMß }š¼òn ™\\ø üþ]ûk4‘¤“ÛáÎwÏÝôÞÙGßéêèQ,ÉØgxÚh6˜]Áøìæ’Q–’~ê¡I ô€K“%X­´¶T`¿œÑþ0…L‚ùh2†{ëï-š$Œ§- nÅ:O‘¤V€‘.è\g‡¾ß²­sQ©óˆüØGB0¤sa_:ŸvÓíÛÞÁóE³N«¤„¬ˆ¹Ü’ó€…ñ¹·®Vô¡R¡zbMBqÁ+µeä\Ö«0ùg#ªJSûŒà•ÀÅnŒEBöÕ½íÈ4Ó9Ùo·gÜ»_1‚³lxœ[µk3Óf6&9fKël•`xœëæïàߠ´Y)…‚Mïƒyxœ=NÃ0Ç•@…pº3!=u)ˆ&À!X€¨) Š+~!‰]Ù®"X8„/ÀÂŽÄÀȸ gÀ 2²Ùï÷þï5xž'ÞªF3§Z×Ìîxq÷#Qr §{'‡ÄÌ+#oQ\u Ò²‚ŠS ´C©Ø†Þ÷”§ÔÜÄîú#ûæ‡=ã©ýô¶m0×°Ðn×È6œ8‰k`ÔPÐF*ûä_?PÁàÜN T!¸X¨ ­o'@₹à†Ó’ß#‹f…e²ªŸš—%в”u«kò~û¡+Ñ ‰HÇ„D³—‹¥-ïR§ùti¾Ÿ†i¨1[(nîB™ç0ü+Z¯Jâtƒ,F÷-j¸G(¥þÕCpúÄå.ž4ŸŽ±1Ögå<(ýA Âf£GâÕÕ»7ÀjHÄ›L`ôµXBÎÂr¶¼Ž±Ö!÷CÿÝ¡ì*éeSȹB“ß/¦“ _/o¨.Z6Ø£öT ’=Í^ÞÂP”/šÃü­:<:­ÅêùÙ[´ÖÞâ#ܾ¿™g?‹$²/Àšà¹]1V^|»½[‹‚$Ê ºL´{˜db¿(]vÊö–SMØßž>E{•ÅÚÎ@Q*/äŒÊVÚ3¨£²ø}\§sv=§püG*ÿ vFU'òøGÈ "YÈpÄž¶<0Bïš$%ú×¼¸^-–ëÅÝm'lÝ"ÔAÇ©tDž.£B-{ÕíAv¹Y–<éÞ€„A!5ÓÔàP;åÕ£R‚K­t°EšNŽ#8,7¾4ºVMHïƒñ“ëÞÑ8/¹’[¥’&iâ:¸F• $hldœPú-ZvˆŠÿJüy“é ÿ„"ÚûÁïŸÙå#ÉaÅÌçðþsq—÷üóÝIû~4Sž/ïVëÅí˜}ù@+i…ôBM|{o=í.‡Ö]Äß?;ZåN8l‰µ± ÒÊöWÙ¿•úD@í…\xœÛÇ»“w‚›Ž‚‘ÙF1iFFãÍFŒ]Œ›3}gv¨Pl*xœÛÉ;•wÃFæÍW™Ÿ0">¹xœÓ+ÎWÈMÌ3Ö/)È Í+NMÌqËÌIÕ3æqqs¦Fxœ340031QðMÌNMËÌIÕKÌeØÜu°'ãm‚ê‹oNYê3Â5‹>B”•äÆ'g$楧æ—ç¥%––dèY0ÌØ4]è¼þªZù-Ÿ*¦Fm¬Ð>úËYCNjbPÙ݈Í=›+Lçy0\Ãöâjƒ}^ò}deE©‰%©©Ù@•Er¡T"6Ö5¿¸ì$ɦž<ýçu$•é©%¥I`•šq _”ÍÚ£n×-÷=˶¬Í•@R™W–ôV^*P¥ðÛí Û¦¾q\M´¼5¢ì*ËT .l* òSŽÝ¯ RÉYyôÌdA%ë‹]³R>£¨ÍÌKËšÉÓ±Þ©~Úž7v=Š»ÓW²ê6Çöã˜ê@&ùG??ž¸r²ŸÊ±ÒNÿ¹µ¢í硨z>h⥛*âíF7kgÄD2ÿõûý'Í SÈÄÿ{‚¼÷—óÿ˜7¡\øÅá¾ÇÐTýäõæE˾³^mŠ81»/Ê)àêä3¯cU 2÷š–-·½à½)moÕØ=Ö¦ žY²EqyQf ÈT“£g{þ™yìï´¨Þ¾¼?7=¢dfk@ê±–í:‹„òŸ~•üt#’Ò¢ÔâÔ’”ÄœüdP”*³.4[÷s¿¸ÞãïV[-´…ž_³‰FU\R”™ Of\‰Ëtþn}m^³Æ†ïë&†w‡f_CQ^–Ÿ IUî¥Írò›¶1¶n–Û¸¥è;$•Å©9i%@Ã*%æÔ^vßé:aÙ¹ëð Gµ§¿x°EeIbrIf(wÏÛðëËïòÿ¦;qî0ägTGU Nþ‰I9 ÕÆÙß{'²|?ó¦ásQOD7¢ªN̓*Ýŵ¼psî¿/Qì³>™žºªÚ½Ui~0–äÃrá§cLó>yßùx±¯û¬úÄÈN®ŽhÊa†oO-p0`NÍ }Æs.|,vâø*Tµ HÉK)^àSð³ì’Ö«r Qi½Bé7Ë»#).àÒ 8#³¨<ÿάSÍÁs“Nµë¥ø×÷vïµn•„ˆì+¼xœu‘ÏJÃ@ÆžºàÉ?àm)-4Ôì)ˆ‘Vê¡`´˜<a›LÚ¥É&d'­·<‚‚G>ƒOàÉ÷r›¤mjñ²ìþ¾æÛù>N_ß¾¿~޲ Ã= ljÂ}:¶mçnxã mç¢K¶jÛ¬a:báÏèqäÕžI­„\øQŽ*,æí³˜¬tg9^&a·v (‘a*W˜€ð¸O ;Vÿ^™Í‹ÜSˆ––âL76í®š“¨÷(;0¯25#‹ÓÉ.L@bÂ]\ k.!ðQiÕZ È\ä øóélÀN?‚(Ùf€Êþ~i¬l€p«Ù¼øªœñ¸äó<™ú>¡ºqÞhMÔv 6Z›ì4Mû/ZëH-³mÿ^Dó|AïŸä$3h¹ @‘«ø:…Û§ñcß í15×sV¡¨)MÝ —´™gV멳«TÚIh}<²¨Å›Bëtå¾ãÒzy´ê½§¸#Aí7¦AWôZ)äìÖøl‚xœëçýÁ³!es9‹<ý¾¤xœ½VmoÛ6þ®_q Ôb"I‘­¶b±c´FÛ°œC]´|–ˆÈ$ARöäÇïHY~«2dý0 /w÷Üû‡bÓºJoŒÈr­î\]\\CÛÿûúÒ¡‘Ü %yÒ ‰ÖÂ=OsÿDžF+ì›Æ›#$9P̤œYL+ÃÌDL,ÀKtÄ$ÂuÄF£hºèL§ï.§‹qxe¬r×ÞýO4N¤”Ójž"´Ö9JX#¤\¾wPZr9«ÃZ ìzÞ¤«cõC¬¯Â:—[$Ó©l±wŸ~ÿ ø1, =õG{`±·\…X“/;½|Ls.3Tk‰†—.á#Äž¯¶ÿù%†x2º'v$Ïp‰Ò!þ2:^%rbE,ùƒ›û^Ô`„iª%p9‚_RF<âaÎn­Jw8‡µ ¿-¸ƒ2ŒïBø8ùk0%ý„€ñ9Ë7p±N3 q¾Áp4éð=ª"Üö’î¸ÖâúœéP…Z[X€`2{ ½ßãMž¨êíÂ{ ‰£&£ÚÇJ9¸Ã @ÔZ ^ïxì†ä7wœoFý30É…¥±jPÐF-µÛ*ñG¡‰·µ2ósZõp‰¾Ù&Ä•¸ÞYKú…TÉ…0Ë*šZü°QFj'jëö´Êð4(öWÙ“22l=­yzÝϳ1¾kN¹Æ¢h?IŠ|àOиPWø ò®TýqnKEЧ`†Ûtžš¤¨‘ ·AçYxF£ìù<ºfu§Ìû¼ áfŠš¸rµ0W éäiûÓöx–‹Ò>zÞÀ²¤ 'ðU¡¾ýOá5z­O/䜴Æ!q$Ò|{²$1{‚Ö¢(Øa4 “JÀÚ¾ÕwÕçXh¯g·Âê‚o¨c–KŸº´¾}…\(V{¶W‡Ž+4–à4ùnM'ÞÅ¡w¡2_Ò7©$¾ 1ʼøÝ/sœ•Ù÷(!fiKÀWXìÔ‡aJ)R5GâÊŸ$ < úÝámP’ÅûûáÙóBäL]l*Ö¹Ö…g2ë/‹,ÑJ—šNôo´»Äê0q}LQ÷_5î•Ø×aÃU'üö` Ã`:;BJ÷¤ »ð±æàñ­¤ÕžGÿ“äÉCH¤@ÿÍ‘ºý<çC Gc_³<æ>-õh%Fo“ºE*M€ÖÕM¿# ©e‚D¾ïvÓo5¦b!‚Öù9ÞEl… çµúyi9 Eˆ»bÌQêXsAÿ7Îêïõàæk2<º€÷ Òº< eøUÇŸªKÙæÂ+SëãÖ–Úyõº½×ǽÑp<é>Cçá3}Œ‘>ìn™…)ÿÍEêjl;üý£ o*ˬ*MŠÔOÒ·“ûý~o|³„xœ}Uk9ý?ŰjC,’”@áÚrùákÍ5¶ñ:wu)òîØ+²–t’Ö®C>üÍh½Ží”ƒàhWš7oÞ<ÍŠY ·ÆnZ–:·]¸¾fC$Þ%«ø@«ÁR&–òÎeÄš~4ØÕ¼BéRx)ËÓ‹)@:ß“(Z.q…:Äù"9~ =ØC@"²/0¼¾ï'/ïf=pj§!”L\¸uÀH‹Z›Æâ åå¼â•Ò’´^c7â¦Ù?ÃÑ8dDDP%¢ÜÂy"n^$brß`4žFCøž4qwýìv2ˆïÒ¶Eûêñû·F<Ñ’!ró[Oʾõ‘¯E·0nšŠ 鬕lËù1"Úî6î\]Ø(«ôL@VpUΗÊR9 mŵ.ä%Z­e¥ ÉAðˆ[RPÈ@Y­b”í ¤'ÇÐ1úß(ãø8FµŸ^ìŽ €i©<ª!&&vkYÙD'ŒÁJï7Æ1†üC>îÍzt&G)168¬ÝZË­òìæ±CšÌAý\à¼^~O2 @G–Ü• ×X½ÀÔ‡0µV¹)¸CÉ5ošeð0ÜŽîú@4dzä­ü^¢m£·´¶¢ ÌyàÁ¿Œ ÖØÚRs~¢ß'^&n‘L ó{ud~ÎÛº?&ø{âÞ#M5š:vpóNnÝ>ïÓa^¾ê½GœüšàÉE\îØ_žÃ|øB.à ñ<N.QçpÜr¹óù“Q!ÜÆs—<š«„Ólµ$GŸRÝÍã~®¿f££¡úb“ÎE7–Áoƒ|Äý ä½÷/{‡Ö½Õ|^¿G}z>÷Eó¸£7éG“é`øn>ÓGc‚ôQ§X/£+>gh8ß‹¿¿Wô=õ›šMe/‘¾›áSòìzÃαzxœ…Umkã8þî_1˜…K }¡°î–mÒ\¶MBœ+,õ²(öص%Ÿ$'úão$Û©»”=a4Ò3óÌÌ#™Å!ÌT}Ô"/,Œfc¸D}_®ÖÑ"¢´<…2`ÅÎ6}—.`›)<Ãj½]¬–ð#h¡·óh¶Yx_Øeˆ¢ñtl ÑIÿ£½àýúçÌc(yÌÍz1fÛB0…jÊ4×Xa‡ ñßFhLé׬„‘JW¼¤ãBKF{¸æÚ‚Ê â²Éxb-dNiîÕ÷¨Ïਨ¼Ê%Ä*ÐcOUU®D%iv¤¥nMôš¤ðL¨/9ÚºÙÑ”ˆ+Ѥ’2j­4!HuW×iU:Rò#jFíÞ¶šŸÔÓ3ð&-°¬Ý¸¦¦“'!ÑPm™b=r²©C×ë#l·õ º¢K•»É>K%ñÕ“u§_SÜ5ù B t$w¥•Ô¸’uriÕÁÓÍÃâVˇïð÷jãë|šo"§¬ vÙ*©O¬‡‰5îUÂw%:â³^Xnw¸/4äÚÉÄMIÔ4Sâú§)!ƒM«’H-¤Ür¡ Þksâ«t†r†jÂÙ i­T‡1 ➬’¥–ˆ–ϳucÁ-©;5&"ØjÓùÈà–ú/-'ÂÞ=dD–W§cÿ‚­/Uþ˜Ä¼5ÿæ«f°’¤ì6º¦çëòvG×)jƒ×ªOê5èbnêî´ÆŠ¸©)÷>»}‘ÓMÁtPb>,1G‰ô‚ã¤åë¦r×¹Ü\4E&-ŸòïyÙtÕ‹¾.E[êƒbLê4ŒÑ‡ýWCrª±§ýû (8hzæ½§¯*ý˜>ƒŒÔ5ÚK… aÐI<šÏáæ!Z½{ßnÛèbìù çþܹ“¶Ë.Üf¾^m¶‹åLÿ¹£zƒôÉ´@×Ì8ÎZ­(»6ÿÿµ¤¯•aF5:Ab˜#}•ì—à?(¬EáŽVxœm‘ÍJÃ@… ŠJp!>Á… m!fíJi¡à•R»’@™LnÌÐd&ÎÜ(uã¢Ä'pãkøÝ»q2q7çç|gî¼î­vŸºÞÎ RYŸ¨ïøºà‡W§p9|*‹ù÷8:„D˜2gK  ÁsÁ¡Tš„’ R7MÆ]#™(m°@IpËúÍëü°Ö^øØŠ(‚ÆÛ ™_þÿ³ÿ¤ø½;ÁZÛ|Š,™¸¦ƒÉY?˜e€*Q3—™„-ÎЉœ0RŽ.4‚º—¨U”)-œ#!m:#k5è8\“I½¿Ñ9{h˻˄ -aaÛ ™*]|¡›•}1 LÅ9“V¹MÎóðùcsèÕ/[냦\Ó­]Nï¨@”›à¡]àûvü {­¡º·xœ½Y[sÓH~÷¯8ed“X±°›É Ô„$L\‰+ [ˆYÚVËÖ ©…Z²1ËòÛ÷;Ý’-ÇIàajRÒ—s¿·p½&¹ŠEND-i*™‰\ú4^ÒPùGG¯DB}·¿O-³…qIÚw{í†ë5ù—F¹H|‘ù”fRÄãH™ã§ÑOÃõ%RÉ723¢’NÅDRk1“ -$MDâäThIîpÁ€rruJÙ%¼k¸®¡õfÌ´žËi˜Ð\fc¨S.?ç 7Èéä÷†›ø•äyÿè­$#%þ-(Wø74€l IRÒ*†\3‘‰I.3Ê3‘èh*Ñs±­|„ l­ó,L¦Ú%ò·:Z„QdHMù0É–ý(`Zò…ží2àp`-Pš³—ÍÚ™ H¹!ä«‚q?*—»†=€¯6³p:Ë7 ­@';7¢$œ@¥“@œˆ4Ìá¨;jö‚O¹¥-¹¥QÝPÊg2“Ê$-ûn ºsF [òýP zâüœòd?8·%™ ‚]C)Qù æãÓܜȚXX„ùŒN~y¿äy­Ç¿wàJ ÁéÄ›;·7w¼™Ó饎§;ýr½ãé.®k·!‰òþë5 hÀM%ÁòîHC»C¼µ¼¤åž?=(ÚZ½øi r×h†n¿pêëû)„þŠz]ÐÊ'³;Éuï'wh©­Èõë䀆0i6W»«Ì^ß9¼sÆ™÷¿†+£›øêµdì}­2¤uF>Ô9NE¬¬gz"RI¬ÂN³+£YÉnsƒ‚LÅ4eÿ:š^#rÒ$¼»ÆCl¤©±Ëñ'È!>±ÈdÊSgÅxp Ò ÊP4§(b7/2NH•좪8œeA„H¾üL28P%Ì—YƱfã9Ì#\´Üëóö.ͤÀ-oG¼ÕÅXˉÍ}põbÞ Ò¶MHÃÀª˜Ä"ûaL¿ýå[exy c^4QE¦‘ÊKU°˜3¼Dr¤™šH­Y3CJyZä è(`¦.ÅR$0kPD /!XeÁµ(—4xk—yL–ïˆ+¢—{^òÐË›Øô›¦ì1L’ÑCêÚ5 ó˜˜Ù"èÚ›ÒÇ“ 6Ê’)ˆai§_[Ú±vÅdB=÷ îuû{ÝC½ülÃáõÉs:pûm[w_H‘ÍU‘àߤRû Å!ëàwŽâe*R*²\—Â?(ü©„9&¹‚縆˜"cœc KÙHê9ðà¼Ò˜7oÈ=Œ×Ûäî×¶ïÈ zëí{l‡Ö¦[Ý ÛjõŠNËÂ:(ö‹vû±ÛÛÛüþ¹Á¯»ÁíѳG–W©¬¶}\ãÿ¨¶Næ‡úæúf·¾ùFßVë½;Ô]ïã®–QwQ<>Üëu;(ýÎÛŽ‡2ÜüŠ›£¢Yg/Î\Y§.åMœ^w¯×«þ¸g÷v>mg÷ào[À–4:MÜv¾Ý‚±÷5¾x-Õñj>ÌWkù"Ô˦!µ+GZך†wt—·Ã«à‡®ÈË7àìÞí—WŽ»@ÆÐ>$ÜBÜ~ÆÌÄîÌ­Úâ¼ã-èK§´M{¯oHvÜýÄÐyÇJû’;0Ÿ¬Ùâî½!êwê-P8ÅãþÞ~›g‹žb°µ× ½Ógä~)ãìï=q*Zªb²ÂHÚŠƒô FiîŽ%WwÇ«»³UÀLT–Umˆ3~¾Êó¹éÛáûø§z0²œÅ7Ïg©ëFYø^‚µb$Ô:Ø´lU…!W¤èÊZEËŠ®À%a’å&Ü£4³3¾™ŠžáqRmÞ<ëýD^£^\ŽH®Ö‡¤õj£H¬Öˆ(E=ÄÓt}lb¤<ž-WÇʧë4¾6'/‡ëöÓš1{æÌ&osqFEF‘GGÕ>ù‹_KÜXoéš'jæiüŸd¾È0pÐ!n®Ïi㈚ý.<ÔýW§×à x=|Ex󉩌Q>ìdÈ͵j»fF"®0:<ÇØKÐô8Zˆ¥^ßÏ–)žgæögÌ;hñ¥6Ô‡iEá$YRŒé‹oÌ/'³Ä<ð|5)XnÐöý&àx¼Ê0ŎΩyqüê¬Ù¨ibGÿ¾¸Ž#k‚s3†ÕO½G^ð¼®ÿ;ÎÎËáõàòb„¹ÿ½\YJ§g£“«¹Ø$¶qq“ÐÉ,S"<“áýÆ<.Þ\¿x¹kÌž<‘P +òÜ6y U“¦²ãé& Ñ#Ÿ0S^Å¥aµ 0¼ϥ˔=ažùÂ8Hã¡z+BÃ0›š_eüäÛŸkñs«ÐðçÉYa"Æ@åÒ(ŒñŒË¢e#·:ÂÍË “"CsP/ÙRÀݟͺ­Àˆ'×­sÆY¥ˆ«†%£Ã/<£ôEf £¶+ÝÝ[´†îºÁ]¶žz*3D¨æB41*±Õò™ÈQ¡>!Œ¢ +“mã7DºI^¦È.sI «Th½P™o½+—æñiŠMe܆,MЊ55H˯ Biª²\úGˆÕ!5•^‡¿tðGF)â²I&ŽxyP“/;æªÙ8 uÁGÇ\_ ô‡yåÖ¨Í-µ9Þ5`»MpÎËÛmšåÅÕÈRÔ”Þ%*‘_ñ¨RÙWûêËq1}¿Í)bN÷`4ü S6S$ç2ª³,,ËÂ>"·ÉL¾¼m6^k×#®fùúbpryzÆ[™Š¹pߪ|f"ЧˆKózi•A ¿uë$S•)Õg®Ž+)¿X)9×½ÎÇQ¶-é–”!,€V D' €@V˜$@óìwËl+óB·¹„È?ÄÜþPÉ·%X·aj¥«4Þ-eѪk„ƒLeb ¥¸˜ }ò%žý,âFŽp))Ë76½U2Î$šä±4Æò{JTÂ@QÚ8®å Âè~ÈÃQ´\ç"ó—Ÿ…y)—dçÔõ~Z-ðáªÕIWlø C¢Öl ðŠòºdjš‰Ø~ˆÃ&NsÊ«ÖPêߨI¾r@h`j7–*Ë;?kE,s™µo¸$d—Ø¢w+´)/÷wÛ·V8Æteñ<Œj“0ÕªÂg8›Á„7ÎM§`cšìpºŸºjÚªÆU|;®4+ÁWVÜ;[ÉÝ}ðšCgS…±\}µÌ³"áPL¦u{åxå*[ÐòígAAÉ¿Å4‰5mÞ?èö„-V¶û»ý~ß<`©Ê>_Í‹ÚU›Íœ€Ï*°âÎ=ª›k®DÆÖ§‹Y8™±²ÆÍ& ¸‹MTºdóÄ÷MZ5Á}+8ãÿ Ð> møÝ-p5Y~oæ3µGúf°Æ}ÕŠ£0‘u!ã•uÑiæ"*~ÔÀqiàÈbÝ#1''KÌÀw…ï–CüÙ¿]ÞâW§µ¡Ûþ äm¶¡FuÌÃÀÖ!»ò–Ã3dIÁ²¿:^^].~£ç¯»ñ’¸yw%yì"L¦öü’gŠK·ÆxÁ~ð¸Ñ®VE6áÿí˜J7‘ù³ÆÿGÂ^ë¡”DxœVAoE„XAJÚ:iÒ =T;Ul9…P©€Óº$ÂI,ÛVZ“Ýq¼êzg™™íÉwNHsàÀ .+qàÈ ‰?‚+Bqåěٵ½‰íª$Êa=ï½ï}ïÛ÷Þì¿o?yÿÉŸ¯æ]Úò ›Y«ØÜvƒ“ádo•66 ¥wð_-Ìÿô¢1¨ßæo%Os—ªƒØÙnÕ!~@  ]°Eacï“zy×% œ d›Â±wBð—ö€.°V|d ‰.‘ ÚD€drvâ¹Ô„†”wX^t¡Ô{ü™¬GÙÄÕ¸1!fÀB"D—q:¤NCjXB`è9¬ÓÑùZ½HxÁ±%‡Á?~»07w»¿vÁ.˜»Ð¥¾oøõËÂ[Vqç!ìHÚl] ±£úåÊ{k# œANe½kµ[[vá4ÆÕ2«ï®¼ù‚yÀ0#S#Xv]¦~^ʽÌt:ó럥UõÇÕ:àóÝaÅ9`ܲoä0nt¤>ͼžëz²µ£®,4 k¹ãwÅÙ1'èz¾o©¯3K0Ò/̓ŒxÃ$<ò¸®¾¿tYýuu¹)\È…¹<ê‡Ìê÷̲š_¼ý|$¤ú|iç•Fh5ŠåSGêÎx3îÕRo£TZŸ|Ñ!Ah*±?D›E¾«;ÉyqÀ˜-qÔW‹ï¾¤Û3]»¬»lŒÔ‰Õí0‘gÜø“ÉÆYKƒ%‘T‹9‘رº®Ùy7Ø»qí¹R/WÄL8:VÈèȧz,}vŒCåû}È1žƒ êQŽÊ£ ’c´ˆ§Å|Ÿu5Zr¬Wˆ( Gw¬b½aªIú—Fùãæö ^)ßÇÅ1Q¬6j[ÖªSâj\N¿ˆ<ŽkgÊÂÁágÜ;5³_œHrPßiV¦'$Ö¬uÀ=yñ4µÚ¬BbË”2Âv_x”»– Š;ê<äLÞ‰i i:sÿ`¯RO3¤aGÖ)lÙhËÎPÀÏd<¶ž%Ý~6ð«û[åjuÿÞGÓÀÇÖ¬U†.›ÎM¦;Øy,ô” ÂÂ7“О„fm÷°! —Q˜×iÍÃ{ÕJ¹ŽIÖÎä×¢6šCヴ]sÀn‰GÌè—â‹c€ó—Ã7„—¡Њ82â&HërQ’FÞ§±œñk•&ŠºéÌOãÙMÞßÿæùYšèýʃ½©½’2?+ÇÔ+Ö{HØïOªƒ]23#Úâ…zBüˆš ©7¼N/Íw ~ïè«×"Ã$¦Kq«U†› ï”r0Ú#Pû´Ð¼”S»×wŒ·}ãÜÆ¿kßÌWÇSøej¤næñ}™dÃ’Î×€æÆ6¨oVÖÕß+™U£:å7×ðfimÅ|o<"Ô¯+«jáº÷$öL¢µ’xœíX[oÛ6~®~ÅA_œ±á}(†Æ˜“¸1×,gÁP -Ñ6QŠÔHÊ— ?~ç²%¹IºÝåayˆå£sçw.ôùгôŒûQäòìN­S¾ŠGÑyxÿ:ž\ÇÃ8Š.ÞÕàÓäz6œŒãßzÞ«A|9zò1{§Šo`üË´ÿ˜á ˜·â°k®@¨”o©ô""+îyfÈRXn`Å,8 ¹Ñk‘r/šs“ k…Vøj…ú­œÑX’pKì±U6;Q4Ù(TÆ |¡œH˜Ci#fv UÔ×|ínß—Þ9GÿB`ipQ{µ9³v£M Û!ÓÞY Jy‰Î2ŠQR" +ÔÒ;x$¬sr }%Å -¥Þ gI¶äØ"ϵq<ýA¯Qú >Ç3¸x×^A»½â2Ç#º6—èÍÞtaÙ’cººS“X“ª¡\>"T¾ùBL’˜ÔKø¤´âÜmˆé!åóbI‰¹äXR’¯¹¬Ë$_(‘è”#ïå0‹c¸/'Wà _àBWéñ(@Çr¹ƒp+`y.˃´‘OªW’ë¼Èa®·ÜÖ,îÈ¢Ïw{Ã¥lVø¥4ÍÀòÄ ¿A&%Üs£-œ¼îÂ|çÁHö¤S (îÏ­eK±z`÷d†ó¬T0|Ô”&Sù&Õ=8 a“eXÆ7§EM„¡xÿ ¬¦ÂðÄaR ¥¬ó-ÃLsô-àZÁØù^¼ÚD­¶>|ïÀpJWú±¸*ý¹’‚«`( dY¢ÏÈ!e„_²<´_ûä‰gª8ÄÏÊøÙsñ×Jùû%'ýkI”ßC{!àÐOKÇ pæ5”Ù¬°8úƒÏsÂfÊ‘aU‘Í‘†&¬0þ#ºuÌ8Ê„¥Õݶ¨]i„§ÄüwOÏ<ên_u»g_6ÃÊ%»Ò…LÉ›V[þ2½íšŠV=zKÑÓ¸(ƒ§Ç8öƒ/SòÅÈ5º2Åሽ/aR¸¬™,øNî óAÊᤩ®»=%Ã¥I„¨ò]x.T˜TU©Q`¯@¡Zј/F{‹ÔFÎ)a5*9¨¯kT·Ñ%õMº2œ{êÛu¡ SêíF/úØÃj.yòNp:²B:¬¿è|Î’ÏQ4ÖŽ‡1q0…ʰ»/VÄH¨b vg1‰”",@ÙˆT‚mä¡\f×q ¯ÎëÔàÎ`:€Ãy3Îö+XÀŽü­Á1Õܪ–ÃI¾ƒÞ4Š FsáÌî 𓪑R(bdsì ¬MŠ¡6{üùéÂAÃ#1–:Nn '“[ƒÄÿòßÇɦyPÏ…8¿Pr?ߪM·ìqåŠ[_q.èD0W˜¿«ý5» 1}6Ê5úA1ã~††"ñ|ZÚ´JQK:­#i¶æj¹-É__nû7³Ÿ¦ƒþUÙ_IÖðß œÛ¶q¹À_qœN¿gƒ²î¾Uþúú)ãùjg)fâÜâæÊROÚ|Nlr;LŸ²§™Çüô¢O}^öÃhrÑ&—?÷hG ¨ÇC-Ç/ÀçãÕ1ï„ôDÅ·ŽJî.¦†Uä'ñìîr4èOO+Ô]<ódoÄ·`)?¼»û“E´–†1Ax-t…ñ¨5eJ¾Í´OJÃv°nƒýšñM™Ó¿`üjð~8üiÓ¦›êž)ôHãÉ•-Â’Pçóмœ¿iÓ]ÇJըƟþ¡ùöÕaÛ¥ûI­¿ÔZ‡°X™¦tþò€Õ‡ z/+×z ûßèâIõƒgïäíéì)>;M’Á“Ù#"Ý8‰rP>\O¦³áø\Ü|ˆ©x¨¡^Iýíñ3šVjÛöÿ”Â:Û±ØþŽ[ö’ww½èUÇ$lŠ!xœ[ªtErCûæÕÜU¬!Ì®¼Àxœ­XmSÛHþî_Ñå\"°° ¹cÙlj /‹«paÂæ*ʲ4²u‘4ŠF²ÃÇo¿§g$[Æ$›KåE3=óô{O7¶Û¦£²‰WD¾Çw4©È½B4¹£‘ ßy) ìÁuôr%Y,hÏvö»-Ûmó_^xy@Y.¼d‹C½ýË_ôÓ²AãŒy#r-*©Ìóu3‘ÒBï¥VA¥dF, © [ed¿œëUÊ«–mk¬› c½Ó(¥¹È'P?¡B|-ZvXÐñï-; ñWëþÍY^|é4 ž¸r…#}­! IFJ&kæåž_ˆœŠÜKUŒk2Us±­F)l­Šhe‘Þ{Ûnìy‹°Ð@,ùî—RbG³Çá«õÃy4k'@ÇÛ¢4ò¡Òñö6N{YTÀ#PwêQ¤Ø Hr ­ºF*f"¡Ì-$ûnܹÅ|¶â{[ zl‘øšñ°·Ámi.ÃpG#¥²˜Á|¼[è]¬Ž…ETÌèøÕkø¥ÈÉílýÞƒ+§cwnõlgn¹3«çd–«zƒíê{ÛU}T„@¹ÿu[pSXmÀYdVˆ·Ž›vìó_öË“ü2ÀÙ«kwPZÍïû)‚þ’œ>° öM¸þ÷á ÚnЄÃ5„I»½\]­­`öæÊâ•5ÉÝÿµl?¶À½Û‰{ß4dÈšŒno›Œ,««jÇ©ò½L‚ë°SìÊ8BÖp¢›Ü 0— MÙ¿–¢÷@‰œÔIo'¶öiªírôrx_Xd2?Õ®µd< 9éŒrÔÅ)ŠØ-ÊœR¦;¨*çFU!R ¾’H!”) Džs¬™xŽŠ„Ž}}ÞÝ¡™ð@å嘗ªœ(á›ÜÇÖ[P/áÅ0ëš„Ô 4TÍ$ñòÏFGñ‡W¯Ù*£Ëó2$_–¹B*ßÉ’ÅœyÈK$G–K_(Åši(YYYð)œŽC†Ðu)^ ³†eL!ò‚Õ]kç‰Ã‡ 4^š¤k=n†ïÖOÍ`d9Ë7`©›FYüY‚iµö$ÔÚ_·l]…!W,x••ŒK–¯—l¼~^èp³Üôøº+zá¤^ܼv~"·Õ,.‡$–ߤÔr!É[~#¢t9ˆ§éj[ÇHµ=»[nsHk’­ÒøZï¼­vØO+Æì™S“¼yÂÅEUûø/ž–øa~ kîH¨]dÉ¿Òy”†’@¸>§æµ}ø§ÿüAx=zG˜ø¼©HPvˆI9ý´É)fNß¹Ñnñop`ÊfŠÅ\ÄM–‘a©]ËáÖ1†D —õ)¦ûˆcÄM,ÿþe*ìT¯[ÿGôás·>xœSÁŠÛ0½ë+æ¶»°1z(%štÃèÆ!N e)E¶&¶¨,IqÈÇwÆN6N»‡^Œ<š÷fÞ¼ÑC…R½ƒåôy.DlꟶÕvë„xè/²ïËt•-2!fãË5¼¤«Í"]f?&¯™óìózÑ…¯“' thŒ<à__˨™»]…[mQÁòÛzú Ò£ l*„]@µ<!z]DТ;s³æ‚¶¥Áò4ÞµZÑ HK5þד•s‰ÇöF‡²•ÚÈüІ{UºÀ{«®Ó¾0³Æ Å õ†TD¢ ‰¬cëŒq{F¹†Ã1vMã|Dõ‘æçZ’úž:b ³ñ¨º‡Ñ¨BÓÐtOz W×Ò*š‹,±«“ -#ˆ&P…7@§›`†aÆ•ðbÅ#zïü‘“Ž ó]Éîf2JV`°E3ÄkÆwžÀm¯Oh¤—5FôwB¤<å³g4·¡S<Ù.VêOF%°ØRL‡Ó¸€NÖEÑ[J–Æ\Ù´×Èñ\Õ°?Ûé#Gìö÷øÆRÞœ÷ésYüº¼ù¦_²ô²ô=|rûáîÎ1âPב½§.ÿN2Tª ¾Ò¯ç«t½Y,Ÿ`öõ‰žáyq€Ü üÆÑ;~*aÔ}?±Ø·óÒ*–˜XŒñu¯PÒæ(½fxœmRMKA=¬—4¸ëBWM Ôë  ²ÞbÈÁ%èAÄÓøÑk÷ƙgGÅ?úwbþ@.ä£w=ë/ðdu J¼ÌTW׫W¯^?®þ^¹º4§ z3$ÞÙ[ärè3®Ñü9‚?Íå:h´¾ |¤ÛàÿµR­r ³¸¼µ»½¾™˜% X€I\Øc® SdôÌžrP*-,7$…´ °‘Èx î¢ÕëÄÐO})) ‚ ­†‚qÖýˆ¢~/%~„Jd ¸Ï@NOE^æD–ù*…ÁÒàµÿ ÞOí>NF«]P~ÂJ˜ºEu¬2N’¹ÿå<ǻ˱Ù^hdÄ9 Ó9תKDÌãî+»¨p(”ñSXr­~½Òµ±÷ok¥/ Ľkn-½J+ލJvÉ÷“ö]ct>Y, jL¥4›w{ãÒÝŽOºfôëÍsa·¹ë‰‹Nð§B‰¨O±TÛZÂzçfß3X°ò¯BoŽÅýzc‚Rw$Í9C¾ŠaØ> +4¼Mž†©ÒºoS‡S§†ã›ùÐ[ÀŤŸê7æ)™.ž0RßÓ±xœ½VÛnã6}×WÌ[ÀÒ¢E‘›lŒ…®DNb±((ilK‘,IÙqßJ²eçò¸/¾Ps9sæÌP׊ò7˜ß|&I°õz³u2`’\·O²ç‹ûl–%ÉíÕà9|[Ü/g‹yö}²7½›fŸfñøÄzñËC)‚€`@h˜ÿópó„C‘&Ë ¡ñè n|ëÌF–N¥.ñ Ì*þ9¸€ð°E¥ø›Ÿtq“›Ô”âØ!…… Òh¡Ô޳›ÕÊc8±Lbè‚çk¹A Û ]‹„CK½î±ÄŒÒs1>RÈd-•pj—„¶¨Åî¨ÝÔ9Iò³A¾Ç€“!àÌÔà <ÍØ•2ÛÎÍËgŠBážÑ™ÈÓѰ’–¼Ë4™½â¯¢x]-½'V —Á*Àáÿ¤²ÍV3\7pLDC‘t…`:GWÇàVx¿5®l{Hv•—°‘âØÂÄV¤IìûÊpE‘Ùxì9øÆZã–‘¼Ì†`üA?¨èn¯ÆÕÆã •%ñÝIo]˜ºº$âÅš]™tà±a ÃÕ¾áÔ=y妨M™5|ÓFã :gÜ ½”˜7kF¬‘Åš+P¸A5ôoؿѲ0%’í#‰b™eð8Ÿ}^ÜM5=`Ç‘ÜÓuAÀ,u{+CÂZÕñí“Æ³=±Æ6ró„~ñ™3òhŒhê_—TPs GHI,¤ (ç¿_vJì4ä/x ’á'Š!„­ÚHÃ*-çìá3»hQǺ O)*ì,ÆÜGêáùé´VF ŽS²¸È"ê©Å”äø.¬>?»ˆ‘šLN%¥(‚ÚDÉéðIËH@KëÙ¡ŒëþÇ¥HÆvh˜´9d „û ‡apfíDMý#²éOm„~Éu•&Ä{*%Sçvç¦[Y”Œ‚a@wÑÎÌ;[±]¤{ãX|×Ìœ5Pb!k ×ï!Gg‘pr÷ÓÕwvùt6Dè!ožI‹åÝ¥öÆ^r?ñå‘”2Z»F³0ô:9ìtV/„a¿(5X%ü+©ð—Ô­¹îöÚø¨5o^,­T»»¤»0ú å—€_1x¦JS–àóó8¨‘Ø–äm%‹ŠqGÞc[xgÆî¸ÄúÍûv¼ääìöQâþÍàÝšû™ ~ ¥ˆÈ]¯ú«ú°ueTëB*Ö²Ú'û­öµ¹™Àþ¨û¢Ñß ãN½“.AªL©ò¦ñåÒ3HØÓÚ¿ãLôæ¿… 4倚|Äy°˜ÿË”ø]x&s»×<–pªùñó£vë¯âìuóí_z‡Óñê&Ì>xœeP=‹AåT ÜSt]N‹¹ÃÅv¿E¸;—eƒéÛéqgºÇ®Þÿ‚ÐþÁD0132óG˜˜]ÍÌír`ÒT½zõúÕûw÷ûÍ/Î\w*WÜXp^_?Ÿû»vgq ¼±&x¥ò\ð7†Z (‚Û,N^@Blˆ8QyK ?Î?LVõPMòtQ2‚HdOH°Õ-«Ôþ¯dk¥z±ÉL…ß&@̓e2}°Ž‰k}RYAáe÷J¿Ò~FPä¶lÂ_N1¿v²€Jç9 º½5Ÿº›áWw#t.nõÚˆiÑÛ㱆ݞ/•§*§}`—ËCf°ÒÆé"VxœU¿NAÆ£BÁ¶6ÇŠ„x$T #caÈÂÍÉ&ÜÎewá$ÆØÙ“{ÁÚ—±rï8þØí|ó›™o¿ïã_vÙ˜"÷jය׌™0É…ÂrŒe½þ½Û»éwúŒµëûÄê¢r–±MȸwxÛêWÈ«°z;-2òÁLñŸÞñ"‰*–¹â«mÊ”˜kT̵a¡¢…ð0USB®uDÊ«2æ’I:Ü€¦Ó&\J20Æ´“tÅ2a Dp‰ÒT¡gE¥™±•ÍœYÔ7ö·â˜ìÂ̼^jƒÁÇóáð€-ÏÁqÖöŽ®œ­Ç²…Æzl‹C»îP‡‘GMÆSŒ?s½’­›ÿ”+;´­ãZ¾4Š„™Ú»B…FPÏ:#›Ì£âDb6Kb B³ËÎ'µ†va휈ĉ>5ã÷|éd¡=ah?¶ø+ÿCá.)aâ—Âàôå½Üáåxœ}±JÄ@E 花PÅÊ‹Í*dÃbc'(,¸…+l*aA†É ÌfâÌ ÁÊ_æK,lml¬ýÁ4;Z¤PË˹ùóž7ÞVï·{‡G[›Áš!KœŠBËkÇwŒ0NÎ099…\ͯºd6€àœ*ÉJ—ÂÜB0‹ûN¦Çµ%ƒ}C7µ2Ý”muKJVR,^xÑ^r9¹p¯ÁÎzÇÆÓS÷ìvwͲé·Ýþ£1fTFÏ«¶¶˜ò›¢L#¨ •°¶Ñ&…²Ú’AŠ¢°è·OhÄ ®mM®dŽT“EI’¬õb?¬ÎòÇ&÷±ôâ{O˾åÞW’/ô’ï3×=xœ}RÍj1fÓ4…%¥¹ä>ÈÄ>µ·H›K c\rYãÝÙ¬¨, Ik×'Ò{ûy…@"y˜¾@oÉ»ŽÓ4½I£™ïOsµ}¿ss¼²ä¼ys”œ­Î:Ù=lÏÞÔcúYºøŠÇB ?¯›ŸÉ^óucgÛëø¢gŠls—ì­Ð~%oûвrÈhF[ïâˆóèkº„Y¥!GÕb¾YôF•p –•XKcªp*´T tpŠBâXÌ„¯bsV~ÈzYo (µñB«R² ñ9°©ÚX—™”S_Vu½íMpC$Ü4ûÝTæ’Iø ÀÎ/}²ÅÇNjú…&d³ß.”a8÷¸,Šõ9zE†:µŽ©D=3O..d*›è:0Š…â–ÕY»ÓêÀ阀=Rä@b9‡DKè z÷N³ !sô@²?XÚ<¦}”I[²ØÃE‚xâŒHŸQÉ{0})]áÆX5ÙùPVÆY'ÆýgCûtÊxdbޱÏÍ\sTó äºõh" ÌP¯C¤æ¼˜ût–B¿.€fqÁ™‹BèûÝÑp•‚ê5s¶G8B,´A½gÎÕn¶z¶˜OÌ7T)+¿õ‰Íi³YxœmTmoÓ0þî_qŠè¤Åê“øëVF$¶VMAB Bnzi,\;ØNK¥ýxÎN³¶ˆ/­ïåyî¹ó9¼HàÖ4;+Wµ‡Áí\‡WiV / F­“ƒQÖáDÛ㌠ãK„¼"Ëۅò ,,ã²} ¹h±Â5jO£ ÙìÔ )³ãùgx¼y³w‘‚Åßm8|ƒ¶2v /q¡—”@ƒ÷‘ É¿?N¦y–SQ±Åx½ƒ!㣓bŒÏFð“é<›<ÂÖAïÆùí,‹¾¤¿”c]N¯Å¯…§·s4Î×îDžˆ¡kl°‘"¦RÆÏœüsrj•‚›ivvÔAL²èZå‡9a-Ò"Ýû‚fš°H{„‹ÓúҬ鿊¦TõPߨ¸•°•¾¦Ü¾ ©W,¶!´!œíÒøËÖã’CVõ¡Ruå^¨Ïi“ópÀB¼µkCËF+JGm€t­©A‚lQ–ØDÞù¡ÑéºÁ%HM³ci+Qzâ³´õXÊJ–&+|&E4òC“’xÔVìÜ‹x`¢õ†áé¨PŸ¸A»ƒ…1žÓ•Ï»W—Ö4Öó~Ò5ª&<Â;é%v½~ze´¶¤®2¼G¦›c Q;šñÿ°ûÐ?huŒVf.÷IÏh­±Ï!ûy‰‹võƒåèRVtc ¨ u ±Ç4‡=a³n£ú!­v|¿çùx 7_òÉÉ’ô.Î"aðzñ ÍVS¬–a.ƒw‡˜CO!±Px(ݲ3÷Åfãéd6Ïïaôõž^å^µEËdཷ†¾`Ö¥ñ÷£¢ï“ãδ¶DºïÒwÈ_³¿ÍFÔ[µ­xœ½VmoÛ6þ®_q0 Ôb!IÑ¢¶by1ZcMlXΆ¡. Z:[DiR%)»òãwGI¶'þl@˜"ï¹çž{!ãy®M±³r•{è_ŸÀÅÙÙ[iV / ®J'5:·"Íù™ØÂذÅó^gI–” ‡iµ±°Q,—à!NŠ(Öo£x2‰æË«ùüÕù|9 Ë8®Ì 6ÿ­—)ùt…HúÛ5lR¡_{(™œ4°®€øí&¬4¯¬QÀú,éq]3A˜Ïu?~õá×7ÀlˆÄ›(Fôk4ëñÎEÀš}‚ž/ÖßzAAm°ï¡Ç øï] 7›Ü’0Z¬pÚ“Äû<ê~…t`¢8ùw—·Ã¨óæHs¡Wl_t^xÒ<Øô’¿îÆ“d”‘Šâ|gQ|õz_`<™Æwð5ªlo†Éõt¾õšLtÌ(%`‘2ëø¼ò\:0˰"J¯,•X9:µ6“zvÚD[§c€Y.È -Ã¥(•‡æb#¡3ʲO©¼äB!l¤‡¹HóAÅ€y™‚‹*†)þ(Ñyv-j²•KòRó-¬YÂ’|0–Ùj´Pç¶ÆfÕÞÁ!ðÊA­¿kboŽC„¨ßð¤#ß&ùÎqÑ&èo0¤C\NF'¦Àª]ˆòRZr€™¡Nƒ`E@ÔÑñÇSlÕ0×Kµ·ä¸ÆøÀM|GÀå’z.nÇ%õ!²¨íß’~Iƒ³Ráÿ .õÁ?s"ªB©yZ¢ôDM*EU¥Ì¶*:ƒ±B¸\ nÒ´´ÝR IQ´ AиqTµµ8G ’r329RÐsQ4¸äz™¤"È䌦¨³Òâ¾8‰†eBÔé.UØeµï€Ó£’=}&Ù§AÏg#"uÉïºôeP ¦Š;ÉÉLE Ç)mº¢fÖkÞS4óa˺.x[+)TSú˜æÊ¬šçƒ¼Í'GÅ~£é %v{ ÒÑ<¤4.MÜX6mà —…ÑÏÙÖ[O¬UÛZ™GûES h­±|ú1ÃE¹úQ¾€Ž¬xt(Ü :À”m˜RËÔd,ftOÎ,Iàþnt=¾Rîh‡í9{Í@qœq¢Y¨[és ä+*ùJs¾;W¤0EYPž¢Û;î$vŸêhZ͵î ~nò]1ì±Å³EÝr[um©âÆû.îtçé¡5©‘¥k72‡-JŸ+°ª»ÛwOJ¾P·]ZÍû™í‰ù6±ºq)wÄêz7´x+܇6ê•|×4‡û’òøJùF©ªäâ ;¾ë)Ûh u¬{r{A¿}•rYýI¨ð;£B‚©EBV“Fô>àù.æf…~zÖoƒd8„ËÏɸó08´cÿü$„Q?¡yçýa§3eŸì‘jAW|û{ê²jY³˜'ãélt÷®î?Ò§îjßÐd¿xkh([7ÿST .v¦´)Rt+¤—œÿý ï*¬áˆxœ»*zUtÃ1fÆÄÉÇ™o1&n^IJÄIä˜ äüæ¸Åé4 Mé<+xœ…RAkÔ@&+-èE(HQxUš¥,T<R«E]ƒÝÞ¶ÔÙäÅ fgÒ™‰i{YÿCþ‚o-þõÚþ_f'ÝtWrÈ›÷½ïûæ›÷kõòþÅSïA”!Sl”á:<‡õÞÖÖv`¿ê¥×Û½i‚ß=x ýý7¾ÉÇÇͬ5 æÚþÂ}° 9*f¸Õwoãn®~{½Y±ÒÙ^Ke &u“LÀ§WGoY TÃäñÕd ð¤@m4Í0s3ØÈÏIkã g îøõ÷¾&ݵØðÝ7ÎÅ' ´’(9†èY ª²0³¦Ny\$R­N`rݺóÏÎã~û¨à0I02PÃ3KJ¡0N“@îî–‘’M^ ƒa@BQu}gmâüïQ þQC¡k¯azÆuÄ2j‚‘À “JÅÏØ|L ö!–D&¤±qs…nú#?Ÿö™ˆ¡äYú3%1 -gZ—RÅSz¹Y$® ‘-dÁHi$åË_½É¿W¢Kk8}Š%´›M@Í–ø. ‚,%ÎUsõ© ³}ByÍ2!PãJ`éHð”ÓÚµ $mõ á_ ÐSh~ë)þ+/‰Û¡HÅÙ]‰«Ã{WU߸d‡*íþÑ6W•ãCƒxœ¥RËnÓ@•[" v©°¹Ê†ò°E•E)T!S‹FbT öp<ÖÜq¢°ÉGø|R¥~;XÃO°aÃxfâĨ¨ $/Æ÷qι÷Üo7ßørÏéÑœ¼Íhö¡? zõ÷¨_œÁФÀõOžÁËQpäÊbzŠTÚøÄƒ(%ù; ã0¬>;{óúî íëúÖcûz±u¾oš'É+à…d<·2¥€ ”tz5¢ä:fâjo»ÇŽç9'T>e¨%ŒÂçw}€qÊPÁQA4b!ø´ ×]PÄ91<U¯Ê‘)º\ú @“N¼‰kèêÇö­åEl—Ê5ý4”DÒÿw°R£5jͤòQ¥ɲð$Ñm1W²r.AEù¼úyåþR‘D›»æ3*‹­ü¿¨2 %hÆTQ-7] ‹H¦²TQFt-¼‰”2å‚}0»3FtÁ8\§¡í?27Sƒ«šðÆjÑ8ÙÑʃ¶5&TÙp½è×S"AaZÊòìWç«óÄž«ö}ׇ®êôZÐ ™÷ÔÊV·çWŸº;o4gË?³ÀÖø>4ñÅÚÛ +c«ÝÛKÍpAƒŸl⯜v[[Oÿ¥ùJTµÚæjÐݹ¦ÛH¤©Î^_í9úgV 7úE|x5à*€„{xœ•‘»JA†Y/ DÄÂClqCŒ…6Q^rÃ]/ÅÂ:ê¬ÜÌ,3m|ažÀGñ ll}ÁÖΙĉZXLqnÿwþ3Oc7#·“ÖòýÔ¸5+°dæH2Ž:²•…È–ŠÅe{±h—JYµjÙG}=™‚³ õr­’‘QÛï+‚gƒN - IL…qr…$a.PØÁ@h·ÇmÖÔ³57Ú§£Þ¬Âu_Î v…!‹…AHBÏþCÈä.JBßÁ²ñ9Y6‹—›[ù€Û"âSòÚÈDœµ#í'Ð3Jq "füÕN o÷°," Zƒ¬y¶gÇ8 ísÊbj °¨Û&u²w$ÍÉ #p7<Åê„\ÇqýƒJµêïÔuß©¬ïV\È!(íãK‰ ÎÑ¥^aÎDøë„êõ{ ªùôÌ £øá}hÃR©™êÞOò/à?¨úíÔ]jb:Ò>÷,ò“sùêe87iøµfRR©%u˜ÞV¯éý¦2írà+Š.xœ…R=OAÍA‚qCˆ…S)Á„ÄXY`b"x Gp9æ¸Ø;oW6üˆíí,ìLü%ÚYøOœã+6›ÙÝ÷Þ¼y»[_›¯V*HÞìš#ë¬>)X¾z•bùœé°×P¨gN\ŸË6ÂÀGíc´@Í.ïvƒ‚¯y‰€‘òEAˆ×"æÅÊΚ}Z…Y¹‘8N o®ãr M„˜ß2õijˆuïštb 3j VC¥±·§Æ,L ¬ê¯X¶/ø¬U£Šú2†•¤ÒÄ67IØ ý¡.ïB¡Béb FxÇ;srNŽNû(µùNf®èP´Kû0¨ù<^ô€».’}Ù^éÏÜ&·Ý%þ„G´S‚"še#¼$16B×q¨8~ÄÖÛijd-Íü}-3šfΊÿfš§¿R³Å“ ‰q¸T,bOÊÕ2s•G¢˜Öú“&Á ¦ÂvÌ K›;Öù½èöy¼Ùxœ­WmÓ8þž_1ªØ•h´€8ñá]w© :¶­šr§EÈM&‰…kçl§½"~üí¤MÚ§Zâ83Ï3oÝx5€;Uí5/J Ww×ðìææL¤E-™åJ2·µá{––î‰Lt¥´ßâÕ Š3„¤r–ÔkƒiØXë(æ9Xˆ“*Š%‹(žÏ£U~»Z=zºÊ~ÇÁ¼r梶<%LS±ájW¢„BÊäc µA “ëÖ­© ~±õ+éV­¯‰÷õŽ Üâ¦a‚°ZÉ«øÑ«ßžƒcC$žG1 ¿ §ÉŽØÀí<ó¾–oa`«Í'ƒ¶ÒhP¦8€—0pIº¿ `°œßSf$+pƒÒR2ˆøÓ¨ÿ†pâ'Š“·0Ý£“ÕÒ’ÉÁ¹¨Ê½ñ i·ÁXf©JY. ã] ’¿§³y2IˆË@Dq¹‡›(¾=^ܘ͗“Ù>FÁúõ8¹[Lü»A[¥Sbù4RÝ­["5ÉýŠÈ>6 Vúª`:#jçôc€eÉ ðà#ÜÕÂÂK¶å“0a°4¥–ãk°åÌìg¸\ÇFU®ÑbXà?5— ` Å@‹P–•V›Šˆç„á|©D 3f§tæYè%µá ©‡iã«ücœØ7áÙPœ¾·T Ó?v&•ýž¡ÒÏ'nyæ"­µvæßè™CìíwkE˜éžö±P2Jû0ÝdD Síz®B•uT*U› ÕÎx.ª(~³uã.VÆÍ0²ØÃ#\Nåk]•€y!Àr÷â+©•wL“'^>8ÂÚ|h•æv(xŽ–oðÛÍs2è§îm ²ãU+Œ3—îc®Ú©BM1ižê¶Å™Ijšk¨e¦dÛafoHaÇ…fé‘L¡9a?ŸJ·CÙ«Û÷ú¶QÀ5RC£KCŠ^lj)Ü)Õ‘Š=vtÂiNÁ)í¾¸Òìj>µT|¢¤KäˆÖ휺”l*;nËP¯äîÓ¼­Â¼­Âh>‰IL—ဖü¤åQ¢¨Üy÷º‰¦é\Š›ÎÊo®âÖr¸íR qºdÛlX‹®µP… ÿƒ¤|E­•þê¾þšáº.>F ºé- ?QT.qtSwÝÔ’§*sú½7.üÞO'w³×cêÚqöN[Úºù”ÍŠ„Ñ'U• dùì‚»LÞI¥ªº"ú͘uBüeŸY*°lÃ}=/H0³¾H›pW9†”v=·¢-p£¶¡ùšKé`àXùƒXGïèÿ¾k\žOp˜0}Öâµ´\ø3ÍiuÜÅè‰t4rêåLjüwu1èÇ‚é9î+²k;öóœw•·Oú’â=œ|8åþs0.Ik‹T×Ú•òẋ³9(iª¤ÕJx…§ÏÏÁ)çºå‡Yç¶4/îGÓñtÙá²ï¶tкhô]a›I ªGwµòãyŒkuìÐÄÇúÒEÛ¡ÃÏ’ÛƒÖ£t7w:€?»õÞ_Tsø‚Z‘šS}¿ê^"üE^áçL5Úë'4tdÐÖ Ž¿ÄµrC©:¹Å5wÙd<†Ñ»dֻȕôêéµ£¹Þ†–tï_öÞ3ú³½ðž0O R“…eC`1žÏËÉô ܾCòE¸’’èú¢üJ=@©ÍÐÿý]ÐUëÔiÒû*ú®d¯¼jxœ­UaoÛ6ý®_q Äb"I‘®¶bqb´ÆÛ°œCU´|¶ˆÈ$GRV]äÇ{ɾ 0l‘Çw÷î½-ònÝ;µ)ônûpuqq þùÆ: Ó2(£eÃÚ+Þý,J~"¤³ÆÅx"ò4+„¬Ê™ÕKEXºD¨5™M„F¸NÄl–äëaž¿¹Ì×󸢅[†ÿ‰.¨‚jz+ „^S¢†¡ú,@íÒïÒz âzWšW]®qÌõYù*àöÀ!ÏuO¼ùðÛ[`6Dâm"°Š zÏ eb)G®b®Å'HƒÝ~ òM£ÑùRÙÞCÊj øó.H³{GË nQÒƒ¸_&§»¤í‹T‰È>Áäæ~”¼A>¡¶ 5Ä]0B‰Ài#0ÍþšLgÙ8£‚rU"Ê=\$bøZ¡ù¾Àt¶O'ð5iñw£ìv>Ž{igÍ (ùôDüÞ“ºg¾eÔÛ)Ùñû¶  ÓŸ­ÜÌÆ}°(•c±pøw­MS×T0°D@-—®¨ÚŠmç-:œ*í.÷±9"DTø`ÌKb¶[F4ªªÀ:³µÖÆs$›ÿVzß·òmv£×Êm#"¶f"4a4Mø‹šË5*”¦€ôËÇ3À’ã\¬µGµ:rÔÑÍšÞ¿Vc$–§TÏYK|¤kjŽô·€ÌŽ–üœ¡;ÝùAüþ½¢Û ojW ù·Aº™Ã‡äw2P§ xœ340031Qðñôsu fð”þr¤1ãÀAåwψüäÑ•2„(ñMÌN-K,*fH;Z¿3ö¶#÷*“Û·©'$ZœL‡ª ðqóôq ÖËÌc(­4|Ñ/<‘çÆÛ"«ùÓu2·ö@••äê–äççëä—0躗½z~:ÅóÁy©éb>Ó/¤.v9ªèæuxœkë`úÕδaçä]œ›ßpê0OV›lÀ+79€×`sï\¶ÍŠ"Oó8 oç6xœûÕÎt®iƒ•àfGÁtžÉíÊü›ïÈÊ¥rCÊì#xœ;×δý;ㆭ̓O0›Lægݵùë®Éo®n~/üƒqògѨÉLX''‹™N^"–Á’’Ÿ—:™_<ÌØÜ .ÏZ$a?ù­D6„-y{²“DÍäÍRo'¯‘.hP–)ad±¬&êJJ:Ç»eæ%ædV¥j(ø…úø(hZsqå—–XMfT›/ç3ù‚ËäVy±ÉÛä4¸ŠÊlÀZ&ÿ•Ÿ¬./8ù‡¶Øä{ò=““Å…Ù¹8Á 6÷(¤2‚&)¹oVbad Ož­ü$ÊQ6YQExó#¨ìf+5n³SÝ‚‘jWpêä>u¥ÍÚšLPÙzí+Œ¼PYç¢ÔÄ’ÔɲÄ&w™HN>§ûªˆ_ÿ(# Øšú"›µ o0M63Qßœiòis˜¹ ãæe–“¥ª;&/,’fqŽwÍ›|¶Úyò„2öÍbÅÌŒ“uËÌ'ÇÕjl6(Idܬ[v˜qóŸò×L@M‹7Ÿ¬bœ¬_o¾9®ö(ãfýúfÆÍû˜2ã1é‚xœÛþñ%»¤2—²‚obvjZfNª^b.ˆYmÙaL 8³ÎÎôŸxI”¡áLj² £#œ]Îèg`Ah˜|I• “œÇdgÏgÒDÒq–É.ÃËlg{2}Tæ\ZT”šW¢PR”˜—“X’™ŸWÌlj1Üä€xœ{Éþ”[™KYÁÇÓÏ=Ô1x#ÿ-f?"¾®xœ…VMoÛ8½ûW ÐM€TiØKƒÇuŒulC¶ÑædP-•D-IÅñ¿ß7¤¬Ø­ÑÍÅ’ÈyóõæMÞ ÞÑ“ø)·ª”‘¨ïðþV;I“Z9%Jz/²Ô4¤·äp07ªP5N†:—¤,n:ijá”Æ×ã¾µª–ÖÂE¶ã'Ü76þ^D møÁRf¤p2§ô@“û§Þüä2 #ñÞàxçèjxM}úô÷¹ßÞ_pÙo\–”0Ž¥DZi^deŽ„£ #*Îmk¤$«·n îè [ÊDMFæÊ:£ÒÖ¡ŽDßjC•ÎÕöЃᠭsTŽË†X+{¬áPW[´i©2šªLÖV’€kþbw¾=êršÄIC/ÒX®Ïç#ltCˆåJ8mkØèºGõJ”¼·ÿSþoiæ¤jïd2àðÈo¯PÏTRkå¶-ozXÐ÷Éêq¾^Q<{¦ïq’ijÕó,ÜNã´ xªjJxT؈ÚÌ[GÉðvñýd:Y=s^ß&«Ùh¹¤oó„bZÄÉj2\Oã„ëd1_Ž"¢¥äå —.U{ëjåÒ UÚÓ2<£Ïa–9íÄ‹D¿3©@”ˆlã[¡K]>_\~+ë©-ÕÚÝÁ˜P(á‹’{öàz€sÍ—ÛÛý~¡æµE73iSÜ–Á•½Íšòsô)jv ‡2Ðô"Œi þs¢‹9Z‰,œ6n$“ ÙOQpïâÏÖTHçä«‹hm[Q–Ÿg…¹â›¹®Œ‘ µ¢òœåç#VoÑàaþOfô•Þ_-âá?ñxtÍÔÝíõIp¹Df9éÀ…Rgaä}=ÿº £mS¼´Ñ§›MÚª2_¢è >ÐÝr.ˆÊZ”ÔizíSû1­V£«Í|±šÌgK˜üøSöÚä_7'ϳME]ÂY¯A;]†¹Æ7Ð †Þü˜H‘÷¢  ÷W¡*×Q£yÍe¦ºggô›‡Žh¶5FCKÐ(@uņýÕL»n}Ÿlq%Ùº°7„„È8¬­ÑÕi£>°NBá^*=Uÿ'ˆ£ÛkÈ&ÕBD´±¬ÎÀ’¯ôž„O·î½¡1ñs¹o”÷Êã5Ò5 pMÖN¹ƒ×1C„²R¨ª³î£°©dÕ@5BÒø{ÎÉG†3P÷.ˆ¼eÂÊ Ë穜%rt Î\†óÅs2?®6óéÃ(./¤‹‹èWjIDW’ÈsÃH{L9‚ýNe»ßâ´;Œ&D h¬i[Ø£:·õñ"Rèˆðw>Ò2¼tœ*DÈW¿²öd°A=‰ëa¬ÑÇ¢U¹,9¯M«Å@y³¶†OŽ12?ÆRøÆtî?D‚Áö@àY)…9îIƒôþm94Eu%Ítí½¡0iÐY¿_­Ó:¿„[A í‹(„ÕÚ¶êÄA¤¼‚¯69 vCNAÒü¯‘côQ@xj»5åE @Ø“x3ãéh3ŒW£ñ<™Œ8ºÿØÙ­’å‰Bxœ{'úZ”G™KYÁ71;µ,±¨x#ÿ}.NÃc´þ xœå\[“Û6²~÷¯@Ù5e§Î\DÝ¥lή<#Ç*Ï­¤±ŸõÖEBw(R‡ g¢üúí@€A‰{ŸÖ•”e’øènô M¾yõ†¤›õYÇ!;ßÄé«7pEüyXQ2‰‚4pCrEŸhohBâIáÆ],ƒî\Æ>%ƒ'SšDnÄpUa¼ÏXQÆÈë­ð<Ÿlâ„?wNîã0â%ÔM©Oæ[2y£†&nBáß›-^¥äÝåO¤Ùhtvé*z ÁLw†dŠ8ŒL)£ÉõÏwV Ú$ñ2q׸¶EB)añ"}†IüL¶qF<7" õ–&ÁÞ}~ £Û¯ä·Ñt:º}øú3ŒHW1ܵxÁzNÜ(ÝÂb´ ÇÓË0nô~r=yøŠëú0y¸ÏfäÃÝ”ŒÈýhú0¹ü|=š’ûÏÓû»ÙøœÅ Ò‚.™¸½àÕòiê° lø rf0ÍÐ'+÷‰‚¼=€ª—x ˆŨÆÑ’¯Ölý™ Åéi† ,| è3RHÀ*M7Ë‹çççsàyÄ@š=“åE(H± o:çóÍjçJÙŸn_­Ù2ðÉë×øˆ¿^ß'ñ¿¨—žMü³/BðC`ßå§Ñ¯còe[²³‡xHø­û»‡³Kܯ0øì thÈwâü×rHc0l7àw£!>›Ò§€ég¿ŽGÓ³›»³«ùx7¼™üÏÿÝÝŽù³×.KÏ@ü 43N†äÃçëkr;º“¿ŒoF“ë¿®®¦ öÿ•GËÌ]Ò³ꮇäztûëg\Æ_®¯ÿÈ!ñÜÍäf¬ ŒâW/c0ÐÛn`R)ý#½Ø„nûÊ[¹ £é/ sÓÙøa÷iœÝ‚&gãȃm-‡¤?R|æÕ›!l/Ì|z&õŸYŠê´v¹ ¢8¢EaTè:ùš$qRkH+D‹¸ÖˆN>§ól¹?$ æüñ”m‚soèô»ùã„(^rlØ ƒêèÁ6[ƒN+ˆÏ 7äúÝøã¤Ñþƒ¼;a?!â5M3Þ‡Ð]2ׯ70ã²t%çˆxͺxN·/\Æ Ø€õ䬿Ùl™qA “-7ídæ­èZη6n«aÆKð©ØÅÖ·‚¯Ÿè°ÿ¤š ä¼\²ã˜í¾Æ‘Æà†Ç†õzêÒæÑcŽÍÓ;a„ežáÃñÉô„xê+1œ—ÝÒä—OC¨ô‹Tvÿ§Srr€N/qÿ4Û„%Þ…ï¦î?×Ëu*~yÜã mq­ƒúÔ?J¡­ŒÍUÀÀ‚'teÀ›ƒþ´'çÇ0šUypR EÙ°M \„sIBŒ<5ÊSn``ÇßEøÃþq”^M¤#8Ý~YëºmÓÅN£8¼p½iºØ-_ìõ#B¯ß2]ì”/ö{æ9ô{†9ô{íœ-i’•Ú#nÈ*¡´¾¡l2Þ„þ«'Ð7áÍÂ8…`–yIÀ5uxÐÌh0ãâ`°‘³…ë¡7Hj¢ ”Qyˆ!Âçq/$ZQZgp«4e Ç1rF ]»sÖ\†ã¹"€^À§it·¼Cí‰5Ë< DªÎõ€Ñ/ tŒ\¶Déª=p“ûO—³7ŽChÀž‘-³" 0&¬5£žâÌçȇÆ$žCn¦émyÊWœ*™\Õâyßè¦RcÈpÀUq0ôtx½RÂUL®êÎ~`´©Ö÷i:Jh9îoÈ 7[[›ÁC ç˜vBùðH°:ØÝ–¾¤I,RHrDZjïåã¿¥¿wR€©3^Grü(Íë=¶HÆDè[ú9zŒâç¨G0%/¾ Ž0zSð…îÍ4 !zÁÖšÜuMO ÎÓLõ> ž´8kÓ5¸â gÞ6Ó½Áú\ÀUÕ’tÛDÚ^ô{Æmü-•Îçí {[‹`ÌC’±#†zóîšX¦]ô,“\¨dâÀÀ˜ }K'¾X)yWx`¸Øoä`Æ2ô²Çz½ïöU~2£ –³o³õ¼&žA£»ºòÅ 3Z G%¯wÏQ=Ò}eü´ÕAÓÀê 4 –³Ö@ðÊ7{:Ý®00¨ßkÕ)·“ÛXÊ´7S,?0ZÆSRذÇÉõ &±¯+sXû¨íºz:ŽK©Ø_kdÁéå6¶æÐ¾aö{Æh¬o½˜£ßPæ¦Pº9®Žý†RÇÂRê tLÂ0§Lj!ÇQ»]½þõšÖdm¿_¨näãj¬cÐÔµ7ueU'‹jkCB‰ºŒýR3(m´ Ù¶SÈ ~xBBE•’úËWdž-4©¦,JÔÀ3cà óS^€>äÿr§aÜÛ`¹á¯0–&†ç‹xZø¿xWm¶{àèsœøx\æGo1oN½U íæ.ãh$k²‘Peý8T l*Ã;Æ3QÎy ìõ²$àGjààÆËàÍ¥âׯ^HDŸSâi¯Gžóceu} {ÍiúL!=<R±,Œ1`ƒ°ñÔ1¤Ñ2]óã±@$ûµtwYÅHq{9ŒéávÐëóD1Àþs<ÑEÜÙP„¥~ž>á¶9%›º vèHДBšÒsB&¢Áü˜ ËïÅIBÙ&ŽøtùîÌ-D¢—=3—Ï;ˆD« ÝÛѰΘ÷K=»[щS˜­‹…O–Q±ÊÒNù+ùûöâöµü©âzËXñø»ˆ/‚wµ$˜y‰·†„Ü0¡®¿Å¥Ó?–"9aä°¢5+¡›Ðõ(º=Ù´FGÑ“°[;Ä,ÓÑíìzôp7 IÙ+5§b.ä¦|“FS¡.Ìö°Ü¥ -4sÒ¸®)ã'ÎZö¢à ¤GÀ*ìºc™üñìF)jú‰ Êè_ù$_•ÉÀx" ±Mäp ÏùmžñˆR8/œ«HÝjÿµ¨¶¦…¿-Fk2*@²ãAD*;lãξµú}ßO¶+w×8 éá-ɵ÷ÈE±Ú`è±M/CS€úãåJ–{FKR=RÙ~òŠKMèÿg†½•î¾U”±7ì*aMa'nÉ[peo‘"7SJ'…à·¾“jÛ)Ø–ßÜ$â]i¥€:7ûAõ9™RõÏÜþàP€£¹ ñÜŒ ¢ay6Ëa„1!á#øzvz|ÐÆˆ Ùóžª~ÈÎaìD,u"/ XjUq}?ÝÃÅc5wŽý©Ú֡“&Ÿ×nUJ¿r£¥0ˆ•Ùqä$NÅj«\Q^U¾•G¬ø¨X!þ~0µèýx[J}/D†*z™­È`=§‚H ɾÜï#«o0±|%ßaa ðƒ2¼\ÀÁ׎EâË[¨Ü<š¦Û}‚l- ~Ǻ0Pì ëLzÐíÜ$aiE´\‰¤Ø<’Ñpœæ&˜Áy b%ä@ï÷Gê³`4rb[óÅ‚#ZSƒO°LØòÎM”È߀ÉHGXÆoé·ôïñ" †=à7ÿ•EB&*n "Nk0 „8•ÚßÎsP¾M¹ƒ›¶qxüœ?ÐvE@Ç8îƒ[ô@wçôùßÞ1èT°»…l+ê=r¾e¬¢hTµ°N«U Yº[ä^%²O¿[7s—°SŠA‰› e:vdœÆ@Óó~Îå¡%Ó(ß÷¸º»Yºâµ³ð@†uTÜ“*ÆÛ³ªÆçÏÔb\¬ A?Ð4 _R¥ ]ó ô6Æëmàˆ>ÁC©BÏÀ„ýmÒïQR÷‘ÆxHÌVÁfGïE‰—ß;Rä­–nóã›æ¥í<Ó1€hÞ9ú¬ï¯$¢®óÕ”-²i삸Ç3 †/emä}2:_Y ­¤Ò2VC¿Ä!à ƒRïë¬k$|‚rW®tXÜl€~`vm<<¼uµ¯M?½t¨>h=ÜÅ3ì°ý â4”#áJoK¡ÍCÎ[·P”¢L¼¹OØbµ…0kÝ÷7d¦¸¶%¼4þj'žý!UmYó¢´¬ æYã9¾çözÄ Ùùò¼‘¿ù*ËF>]¸Y(“ !ɰe‰ú§ø-®^äò-âפäÎ YÔV`ú jJ×1äî<E}¢`Ø-y…Ê¿x"¸G¢ˆ*2Ÿ’ò霉¿Žì ˜÷'+ïo5¥önžP+„Ž6\Qí§w8r,8ÈïJY¼†kCÑÜ|<…à‚b)Ïs„†òwœ¤l•³Â˜]qd\†~¿®¦ Óvªü’šU¹Aé²¹(û‚þYŒní.Êrx§_iù¨,B×Ný´9mV‚J™¾Õiôi¡\Ó¨W¹Yd6u1S¾Dž²Â_ãG°¨ddÆÞ#šßÝØB÷íhõ;{´Æ‘'Œ®‘'ØÌW®Pgé”Ä3ð„p*ýã²´ÖªŒ /ÏßÛmí:wif¬ W‘Sìñ™ó£„b^œ¿ajƒ©•E²ùG :æW¾ïÄvš­½€få¥|“VØ+e>º‰_.y†2x×Á‚¦Áš’kØS6ú]£ÜÁßKoƒ¢ÔÁ’¼>ˆÙ ˜Ê±.÷$5B¨¸ŠÆFŒQ~jî¦Äõ×AñGD}Ü%NÑ\Ž‹qÄdX…G6°Í"û¸Úë_‘"0úЄóÊJÛ°gcnŒ7))‰ŸHͶ"Ñ-X÷?F¥h!j7•hÙÐè7ެä‘Q’çß~fo‘%¼†¨Oò¥‚áJÔTž"üÏ¢¬U$Æ QûÇÉŒŒ.&w·~ݧ7£Ûñ-~ èŠ\ŽnÉíøËxJÞÉçÛ«»Û±Õ²Ú…e²4ÆC[˜5äxyÛv‹ Ç'OÔ¤qüô²L5Ižè ÞS‚ëá &2ÿÙ 1ù²ýûº±÷D`ÿ~<&qÅÑú[x »wØàÃhšæ‡êanCC;#6(Ç êàCžœ©6n¡P[>§áö祸Õç)¸ô—Â:Õ@2~Î?;ñRƒJy,ýšÕ¢”KXå[ë…ZÕ2Í×ðÝ$ªÅËð˹š+ƒB·¤Ñ>pØ·³ße+è–Öªé(è77ôë+>ž¶‚—ÝßüùçÊlËRErúµ80³X^ÂÒ†®Ö›²|ùF4ðÛ) 4Åö"MV~ÆL‰AOcÇtJëWp.¾)œÑŽƒ–®Ää^rׂ_ó{¤º Ÿpùs€‡ …ý v7åÃt'h‘3¶z¢ßg¼”03^ݳBi6ôx÷e^8Äém€sn„ÈOø:©rHÞ*ŽYÎmüœÝÌ›nAt¼ˆ–[/Ïdçk¡·ÖÖl±´›S ?fU®·„Ê&nÕi,¨Âó–‹vz’%7Nfâ>õBÝå,߀I ­¹®_¬.£³Ú¥ ØjT|¢P½“'<ä±L5[ޱ6“ŸG!ùpàJØCGV׿k@—šLª«iâQ–òrÐ'Yz þN剈”¼c”–°ßÇÛ1¿çl®-q‚ܦͷ5k ÎR! H¶†o–0 `0w3S"¾—ñÛ©Y˜2Ó‡aõ÷{ǃn"tŸS>7¡øO464´Ûšæà ¥|+u_ì{[žyç_W-ž=¾¢(þX`é†%ô‰ú;Dd-â}qü^*éô­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ç$õåNWÊ$sÚ…op É_³Š¥«"’X’Ÿ›ž[ÂðY\o½rq¯ÌŒïóˆ0?‰õqŒ†¨))È…(Ù.Ê 4ãákvá‹W½*9 ²Ö'ì†')™ä(ç¨xè hnFJÂ?1-j#7\±¶-–>´ÙrO懂÷ÎÆ¸bG·> wÍÙ2åÓe  ³O=û|8¶Y{pÉ>µM³=°/O@œÍ#Ì"b$+>8Ã’‰f+¨/\d˜Ýs,iwzýž}I›8ëÙòØÙÐdm6j›v¯;î·M6›£¡eì3fqR‹Ë0ÙdЩp¢fÂ3×Ò|Ï—ð` Å‚ ›»7žô¸`.ó_zI3ˆÂ™ØèJó0ÊÂ(Ós>%0ÕÏo‰yFkçYÜÞÞîìa ?y|?Jfxqp´¸ÏcRø ù̽`‰ÔúI¬Hƒ~ïÏ®LþÂÏÒÚØN/œ,ýýùÎÚè2#cÜN¹Ðh3Ím»‰|ˆ±æ!93æÍÝ„í¹ÝŤÕüÖlÑ ç4/ÆNò¡¡;m祯³—/ýpêþì;z³Ñ`ôãäÚÎfCwÁa²^ }˜ö _±,bB!àÍÔ]§eŸöû;­ ²"’…XÛR¸ß&>—dÀ9R"‚ª. !½Y\Lâb/aƒñEÇ07 uÍ|lâfî=arŒˆ”¹š‡LsÏŸR¦,@ëÇØSæ/€aàçÍ£Á-Y2paµYѯ¤è-‚—_Âè6ÜÑ™£íŒ±Þ¶,ç“Ñï;ÃOÇ2º¦aQè[æè 8Î6s]×eè{@üK6ôºÃSƒñsäKJœeì¦ém”LÄ6"`ÁJf‘ïJ¡Sw8°_l6ï"qø™dž/öà ̓”«ä¥wþÓY-™ÛÉL$3M'X¼<F ·xsT¬h1Ì{.üûÜ~ŒðÊib!M4¨¡¯´Š7€€˜×YnwŠ FCð?¤Ç;ü»F­ÿr’sŽã\õåÓYÇYW·æ¥/(NÜ,ò势”°ꮴͱAÔåºúš¯R«šw^3‘ q\‚HÏe‚FÄ“©A>\A5áëdæéÊË{x¹!77"r>—ln%_t6ÿÀW'jÔtOÛv›ÍÐ#¸ÊÇGÃ~¯‹£9JÔÄÞ7ó`!/-½,0üJ¯`¿¦@ÁoìÛŽ,HÉ„ÿwé£kr ÎrÁCÄ"å›Nquý¶£ðûQÚHÑ|¥‹]‰RatŸj©¨j¹‰ðësüÛ]†©? ̶:Ë+ããÈéöFç†é\‘÷ÅIý¯\£Q—§Î«7oïÚÓZ-”ÿ£·Ÿ•i%‚íGç)¬E<¢©Fd-ö‚m+#g¯ØH 0†wùê\ÚÛÈŒùŠžl‚w„åB*a—Ì$©RArÖo¿§z¸3ÂQC”9öåÈp,{h¶ßìÏbØêýj8¯_ÿ›ý)ã$Ÿø8ì·mï m{ŒÎÒìýŠñá`~0´‹Þ{qÛéë‹/‚Vf‚(@“r%1âåÖn󌼲»£¶c·œ£·‡ÎyÛ:wúÆà³Úß½âIÀÙé ÙÞµ*:^(—Þå/o_¿“¢I¶ŸáÔX«Tk‰@ÔŒ‡<ñ=Àî9|ðD“‰L¬³ÿ8:Ž—_©À!ѨëÝSáB£-v¿Ör³¥ËŠPYEÝ]‹ý´iap¡.#seZ¼Á§Áv|¥Cãâ;fåJG®¬KøI\m·áûw;5^Ùa(9`ßU…+æ8&£dÒ¨"½A™æÚæøv~jÒ}Goð¾¥"“`$ÿ$,aQ˜werQŸsjTC"^¦sŠ_‰Qš.ÌXØ]æ^¹ù&ºÜäÓ@ð(àóè1Û beÜÇ"©®d“ŽU+`ï€HfˆûA!îC& @-MðÀDÜ.#SxÝ6,às·Óý«JœÔÕwˆÔ FÑó?nÆA·0#û«M7•âÖµa{^ö¨ë£–HmVªÐŸWi –å±Võ²jõEegÐû(¤ßÎ x4M}]RzÒ¥¯¼ë¥qU¿-ÎÁ¡¢Î8žÐ¥¿PH}K’uO}Uʪ’¡'<±Éí§ÕEx׬íÿŒþ„ìayÔ&ÎÿLTñÃÖèÌ®€Zê™ù÷]hb-=§©¦®M‰S!ï¸ÙÈûVz-¿¢H¢c¹Sø5/ô—jâ]An½6™'§˜†æµI±“ü³2ÔtûýéÇ»ÁÃÝtÔí »ã·7«j4üHV`ƹÂùË® 9íRMãm*ŸïÛãÛé§ö__èŠ<½¹¶JëÁ Oˆý¡äÈq|Ó©¥¡±b[nþ‘|@Gåo›y^~>6`Î/€Q±Ð}´ÀEp… á|s bÐ~nÈ• F‰ŠÒšç•á3ý•JŽßäå ~Ÿð|m•Èúgȇ”üèçú[ãá¤Ë×÷†¥Ñ¬ÏåÁ0QÉÌà9ˆÀŠÉt-!o?§ÕÌ£`Kè>VÌh•£Ï"·ÏüÇ~F«¹®¾Ñ7¯h%T܈2‰‡f Ûl)jt7é÷æû%( `âmÛã§úÈâµ¼1¸¾7yÎM^'÷Åi«ÔÃU3 gíÔÊgÁk‰tœœ+t'|–ç½w•ã±x¸Šs¡„‘äs‹'3Æ/Xbzò䥾|f±ƒnºmÄìGÇ>ïÖ¨Q~Y YXñP«Ñ/¨c+º¯T¥ZÔq’Ï žÇ:ý½Œ»d—ÁQkÕÊ”¬ŽÄX£+öš«•ß!_^5ñ@Ðûkøzû–ꤜƾ÷[ä;Ö>Ë/¹€ç È,6 dËý8Eô1?!¯zÀ[c¬°sæ|Û-˜o]c´ñ§Z*|Jò1ÉÆŒœâ…fû¿U1 }nSŒó¡êï9ÙSrP\°|Qø;í®˜Ê§ü¹«ÄQ¢1›ÙªbÝÆÿ€í<³ÅA!_ªÿS¬Nq¨xœ340031QðMÌNMËÌIÕKÌe¸çñ^ÃÛsyõƒ­¥eg¸Öîb62„(KI,IŒOÎÏÍÍÏÓË`¸»ØÄ~Ö»ùòg~®_RuBô§cfy²ÂÌÜ‚ü¢½d†¯&…õLógðm¾¬v¢áÉé}l«ÞaQ˜Áp•u‹ÚÜÛ_¶ì}òl´Ø¬¥Ík¡(ÌË™·ç„Þ‚…†öñLÞ÷êÓó¥LgÔÞ.ÀP–Á`œÃyréý–þ–”ý?,Y™î¬œ–,ˆ¬,?)+5d^üç#_åÙ%_a)UÙ}6ýÞ²;‰Xf0<¿³Ã2ÞiÝ~±ûš¥ù%y¸ï!+,H,..Oš¸²lAͦ6Ÿb?•œÏ¸»àäï–Xf0,ü_¬ðùzòÔ;éÕeßçÞdAQX”_q¤«W^K¬þÏ5e­Ú³N¨Þ|¤°›Ê †·3[}MW®ØRs‚ù—w“Yx›ò^EÕËcè/ƒÊxœu‘ÁJÃ0Æ 9èÍs` zp¸(l®E›íBÉҺƥIh"¢—¾Â`Go>¯ãÛØ6e®Í<µ|ý÷÷ÿß÷yº9þþ9Ê—”‡svë§p€–©똇”S ÀàOS±–X©·¨¥‹åKL´j©4•"³2º† Ê•ÎÃ;oèz~€aC"ÒTð^‚ªß*É€šRq]C0'4$sjS2Ë{ „]ØE#‘žËÐò•²=3¼R[Ö¹Þ~uÎs¹&ªßï1Œ®˜V’ˆ¡Áø~1™Œo‚4ˆÅ|Š¥1TžD1£XÓ‚YúÀ<‚@Ã`öà¼gÏi£H‚s¾ŠQå@d‘ Û5±#: ÓÒäƒUÚ¦Õýí³ò½Pÿƒ™^8­tÛ«©‘XƒwèºåØÙEõzYdýH²w©E{s Bu‹S®¿Y±ÔÅø ïŠû€±‹xœÍU]o›J}ŽÅÈQ¤¤Šì$mÚ*y"˜(ÜØ€0nd©ZÃ`VÅ»hw±åûëï,äËŽožëÃîÌ™9g>~éÁHJ_pÃY#\c%kT 0t*¾ä‚n\™#pM–•`†K:µîw浆 ËJûD¦ª–ª5@$•}Ð)dsXlÁ¿›XÏwvÀÒ{½¥p¥S÷ ®..®w£½†²Î‡£9U±…УFµÆ|@ÖMʾVr©ØÊ)"hY˜ ž…­l cæ\Å!¾˜È‡RÁJæ¼ØZ:kDN Yy(»•~ÑÊ•«Q‰šEÅ3ó …F`Õžè²%o!ˆÿû´o9ù+X£ÒVŒËÄgŒs  N™±IRejëtf˜ØBEª¾ºþÙ7N9pÑb—Tfz Tb´á$Ü¡ÑX4Õ¹… cxò“‡p–€Ìáɉc'Hæ·dlJI·Ô+_Õ'dRR1a¶”~["/vÈŹóÇ~2·$îý$ð¦S¸cp râÄwgc'†hGáÔLѦ…]ƒ´hËAý’£a¼Ò/œçTAM‰U9”lTÉ 950Ȩ³>­R+f%Ų%GvoòÝ/@Hsþ‚c»„¤ZsÜXpc}Kcê›áp³Ù HV¡©N¤Z«.€fuu9¸ÔemözǼ >* MGNâ¤n8™„AúÐ;¦Cêìç¯Iøèix÷ç&é£7?:êÿÁmÿð½ëÅ d¨Lb¦~à'iädòóÇ÷ëo_¯.÷ÈŠ Ò('A¥§}ÏNe+fM@cÖ(ÞV½ ² j¦õFªüúg±ïiϛϱl Äœæúð»wd}»º^-V6¶0 4¤Î<ÉíðÚ¿¬dŠe”³~çKcP¡Xšrð[¼vÔl:;,öh̦^ü^ºË«¯ß®¿ÿø¹/]kwP¼v’-cš¸Ok!ö4Û‘làï’É~9cÔ‰DIï仌¥5«x~u…Œfܨ-°%ãÂFý€K2$ϽŸŽ;oLͬ #fDJÌگʣ‹=ç LºÒyqÆ]I”’êüµ¡üCº”¬KlaEâÝ÷‘ÿ‹y›Ð.äÄ›„ñü#`#Ø¢"2’vK%3ZÔÏÅÒÛ€ #/˜NDZBZ+th_oàDp¾÷Ç^‹ðY*v?AÁéåD†óû‰·šNNk’€ö1ö@ÜÉ(Î\—Ö}ë¢A7YÖò?Óšß;xôb]Ðr6í£ ïoï?¦Á/¼ÿ xœí=koÛÆ²Ÿ¥_±ñ\9Uâ8Nã“^Ȳ’êÆ–IN@‰k‹'I“”]õ4ÿýÎ̾ùeçÑö šJÜÙÙÙyíÌìruø¸É³é’³~ä²S~ÃÃ8á)‹/Y Ã4¸ "héÆ>gA9O#/bxŠÝOÖYñ,cçÞb‰Ÿ4Mâ”@ž²Qœâ‡Œ-RîåÜgó 럜cO Žy)‡ïɆ[æ¬Õ=`ÏŸ=ûÎM…«Gë„!#ŠŒyÆÓî?h1M >Iã«Ô[áD.SÎY_æ·0ö1ÛÄk¶ð"–r?Èò4˜¯s˜oμÈ?ŒS¶ŠýàrƒxàÙ:òCÈ n•)^uãÕ ¦2ZÏÃ`Á΂2Î<ŸdKš<¢€ùÛd3@ÿ”Ýð4Cf)ŒG›-/G"A2 v:@D^´a!pUw­›¬™“Ï‚ˆp/AÌð°ÂŒn`Üœ³uÆ/×aQ0û©?ýqx1eÁ;öSg<î ¦ïŽ8_ÆÐ º"P«$ 3p2õ¢|䓈zãîÐ¥sÒ?ëOßá$^õ§ƒÞdÂ^ ǬÃFñ´ß½8ëŒÙèb<NzO›p$‹ ©bè%‰ôÅ繄™šó;`„…>[z7$¹à(óØ4k«”ˆ™a]Ñäΰ,Šó¶ÂƒZ¬º ø-"ϱï2Ï“‡‡···O­QrZð§qzuвÃE=}ö4Y&Hða³ù Z„k°ª=ß˽0Låér¯Ø° ‚±Á´ü+OV³äÃ";:zºü¡ð|#Wà±õ<Ëý0˜»°ë´Â§g>¿cb³×ƒ‹Ùdx1îö,¸+žƒÎ¹}yšFqa šy¦™ç«†_¿{ö}}ËÍÿT·%|UÝàeÑQu ¿IjÒ”ˆn’ʼã9ø•/ ¼yÈ3Ìbé¥ìñÕ,É~{„œ1ö’ .ÎÎŽÃC6œÿ›/r&¤Å. òVÜîÕ÷©_U/ŸGyp,„Ó«ì=Ý$ÛÇÌ D9]ÍæR±Ã«ÎÙ¤'zȧ±è˜%|£òÔt{ž“þœnðôp£æ¯’ ( 7iñ°x‡4ñ(ôæv&ãØ¥s·7žB/Ùy‹– GßYIÆèuÙÞ†g{¨+âÁçÃH¹åLód£YÞ¼ÌçÆG@) OóQùšuæ]|Íi%¡·Ñ~†@À‰@¬µ¡59š›ìÙéÞ*»‘îÊ—>D<„G0Õì—çï Ny¶ Ç͆V¾‡©ì½êŸõöŽõs‚”m³Ö^ߨͨwΕێ'öoTÔþóSˆ+Ø‚§rÑÕJ D£›Ñ0uplqD‘_/`·4a|³ý‘‡IïW)XøÞf²‹þ€}I֢Üw‹í= ÚìÉ“À§@€Èh£ü`†èÉðòî4Ëó ¢"ò‚&³’ë*J5ð§Éö*)ú€ ¯9™Žûƒ×Iâ!C™ "ü« °Goº“I×kV‡š#ƒ -ãI&ˆa0þ—Y(ö­ì f„GnJ#·4HwÇa<éÏäÓŒ91 Í”íw”CqŒÞ­Ö­Õ Ý Z4|…¬“ek` K.ƒõJ1 ×—à7_¶,ÎH­Ç6P@)®ÎW<âi°øA!Bž¶´´™.Žk˯mÒv!H;m»ë )>­Ï8úKX)iåtÖMjFBAAx©È‘!(ÍyvÕ’K1úÈYo<ŽÅZZXœôÄâA ÖP´BšL¯°F‹~’Ž÷’eåå#ÊÞ¯JCX)2µLXÛ„{)„Ð评íëJQ¶NDÅ„|a¨dᩌG @uÐ ò,DB¡¢Fi㢷òƬ+(m1'½É¤?Ì~ì NaÉAs_N õE)e â:u¦à›O.0%öíÍrLôê{È,Èüyb—n¼ŽÊù‰î'Ã-Eùœ¥ ÷Á°Ó:½h<é¯tü– Ò›cúzr2ž16Ÿ¦k®£ª&¥£–Ø„ùüÒ[‡V ùš%•º[|ÉO$ν³Y÷MgF*Üfû4T[[ªù@û•zÑfv²Ü.¦¿vþ©îûm+£Õ.ÄåÑ:´hü1Åž‡ãSœé’}@3¯Bþ­+|ö¾‚¢JRv ÁÒÅ•å/Òo”k'ÁÛÈ‘ OH·ÙXñÕ"ÙÈ‘Û/ÚU3{\C™q|îÌÑû9coÊhÑË1ÝîÛ†wuÓD³×æn™6Ó“p†Ñ¶ÅÊ&c¹@pà7èÀ»oƳáðÁž ·ª]ãbÉ*}#wîý—ϱªŽq pËuœ¢¯ë=ë4…eÈ×SÆú—,‹ÛªŠ…ÎÂÏ"(ц¸]r*¸ÃG,ry qIŒÕxΪ‰TºÎ;=g…ë¼ÃsVy³]<§™YNrOaN¼Æ^ʵ·äok[’LT™ªJóÃg¿H¿è*ƒX¾û§³Ñxx>Â<úÛBBQù-&]vê(2d“…‘Q¹eF]­²Öà¢t›²NP¹*ÚfRmyà·¥ì—Ù4®bÌÈÖ9%ø4¢ ü•hY ²gjƒC)?Qž™ú‡Ìøe'ª÷ ]Çiî¨ÛÔ3KR?‡R>í¢\Ú®0¨¼Ð°dpÅsúh£8Rp‚Z ýûïô´ÑÒ‚ÖMÄ0dƒƒeªÁ(8‹¼ÁÐtRŒ°Xß>6å?e)d!• ^4¸¨—ÖÜä#M•åî0¥Ñ~Íç@]¼¹¯g cÊÕ!:ÝÁ¯QTXpnbe’£cÇ•qQÕ4=ÐI=ÄMÝí¨ê]Ž ÁÔŸ Å>«'ú+¹ éTJ™{ ]j¿„nXP¿]bº²Å‘к/5B€¸´*’~aOž¸Hd’$S´¬nª¾Y4±]íªÚˆRîù?÷ìû.Osc:tè áÑdrÆÂ`žzéF¸27r e°B̃Û)QÊ%Ó½¢Û[&À¬y×ü7|S„£Q¥I 6ún4ÛRl*à\¢óK?ˆ€uÇcÑ]ërïíh6ªôã†fÖ*§‡2p¹Hä<•E± '¯CM•Û Å m[!-pã’¨Kܵ`Ûl/Ýj =¸…óï^𯩓Gð‰Òð¶ô X1ðÚx(+U¾AÆ8—¢\› 5sÿ §7Ãï dbQ 1ÿšPû‘‘N£±Ž²à k¾´ÑÆCó¬@ø ²™¤õ@ï×Ä9‹8nÂyi€BÄSÍs?æYô.)‹êª´Þ†@ô¯{ÓÙYÿ¤¥G%ÛÇ–ñ 'mj‚ôÂô÷:“á Ð»Œa œM¦1bôÌ:êG—±Ê¬I‰ñÒ,fx$$ºÒ˜奈”U‹%”‡¯’þC7§m¥lrÍ@UÚ†à×=UÛoêM m¡râ†âz2¥—¤V$çd=D >B9Œ²\[yˆŒ(Ï´¨E…)ÓèÒ7êqó/RNt)Ÿ0øz•O~ 6Ÿt32HSïH Zp«ËÊJOÁÕ[>‰þ¯—Yãwö÷™t€írÆo©'u+e[奡* C——™ÅûçRÛñÅQ°`,–¢€n²|Y9³ûHZ.9$ÝT™Êîö_õ»io6}7ŠˆµzàÊÚÑðÇÅʉü«-1ClA¨M)—ž¯¦à£#¥‡VY¤àª3㻪 :Œ'-©åøZñ[ 5ŠPêŠÚš¾˜TRö·>}¨KC¶k„#}qR´Jø]jÁÅÀ–e¥=[vÀ¦â6é·¶T\îgMƒ©Ë¶22)ü sÞÑ_?ËÖ<â”>·3Íúƒiïuo ž^8X¯¬ÀÏFÂú®FQ™­C`:r˜jh}ÄÊE€ÌV¬«D€îq*;½ëžu&Ѷ Ðnèe™ÃÐVìã:Â>úØ\Á†¤¬¿ù( nP\”SäY,b¢ Ø uJb¸ÇNÃhÜ ¼E`É( ^±Îír><‰tNÎz» A‡žäîž?j;'ãlÈ*·¦¤m¹6­_rÓDL&½±J7ž¹öÆýÎÙlpq~Rò¶svÑ+4}¬0—J7¬îÞ„)ì™Éd\êók.ÊâB§é*»LãU]ò%=ŒA‹ž3ìIÁ^1–=ª£Ñr0}Ïhº–6l÷’ÏEzH^b;´Ü}ã+5¥vÏéòÉ—&Ø‚ãP¶ŠÁ^ ´$2õp.vîK¢0½¾š4 ë Ä^Ô@&BˆÅ¢ÑHÆÁòÇc§°óhûÜ—U'+–¤c9£Zb–´LZT¾òÜ&Rñ ‡N³fì:ìŸìýÓä--lÛ)Ã9.Á¬Có¶¬É…ü¾€M‹¶ V@h+ |ô¬€›*@ %Ó¥'”e•Hå"-÷PÅ:]UJÕ㵋ž¤no.TWTí²o!»VÒ—Iºã½JmZ¹J-ŽqÕìgÄn¶­Žžc ]d ¦Ùò]“Å&5Þ5Ú~HŒM,¬IÁœÎ¦®nó—ºWçÚPw@SS]m{œyoøæa•mYër ÚánålD Ø0熧T¤.¨©ÿcêV¨Aã£ÿþ´.6ÂC&^§Ã9‰C˜òˆ(4ñ¨AçìßôS«Œ‘©»d—®[^C“(w(`+É}Íú5‘þwùz×òuÁ!ܳjŒ ÿ·µ& í©:^e‡¢(ê²¥²÷¬ŠWü&«Æ¡ÏÓÔ—L5Å;×ÈÜ¢@.z3Y ]œœõ»XË)µEÿrrW² ðm­ªŽ¦kh•‰µÐJ.%nj©Æ0ª.ìµ¾ÊöGW\q/ØHo¾Tè×C”ë~ezÜ©:÷ÑK´lU…ÚZêeûglQª2V¬¼ý‹×Ð$,ëž5ôÿÀîé"vöEíøë8ŠÏPŠÿsëÏý•ç¯ï$>ÛþJÁþŠ,• ~q§¥dÃVÚa%ÈŸºCc;žVñVôÚz°•¾G¢ p2˜EëÕl¾Í£P (|òC$Ân„ãÛฮ²Öoø˜×1­–W-pó¼ÙEyŒƒ­¼0Œ-AãµÇò˜[­\¶VøÂEÂÕÿÝ|!Nn›-ÀÝ5¹çŽIµÕlc(’í] =ÿŽM ÛUH–[îB áà¾÷ßÝè ºãwx¦w—ù½íû¯ÞÝr½îð-n|ì U·: Õw{ý4îŒv…é\œ]€Ê€{‹Šó’jÞûy4ô0?ÀÆk^vù¤×JÌ[%æD飈ýþ;{¤ŠÅ ó¼w>¿³_Q«®6σ B)ORžqHÅÅ­IÖ²ˆnØz#»Ùï4žCGË…wh”Š6dŠ˜‰[ø¬Níî,{V¾;òIõNQ±Œ¬“ØÛÎé¬yû*fê1[–1ËCÖ±O8gý¯dÎßç¸d\bà®·Á][ã®’£­CC» }}ôµ\¯¶’‹í†µÜ´úV«_jM¬Ö¤Ôzmµ^—1#-ä’í˜kæº C<30ŠÅµ Ø•}œC.ÌîDÑìÄ$z"%Ÿ5(™ô“þ´ÿvÇžöîÃLú¯w}¿ ï¿\ îÁô~žŽ;Ý©’åz\•³ @r%¡ÔyovÔfI[ø•rãó6»n ·âNJàÅÎèRÚÚ±TB=o“Sik×âœõö^½êwûD&ú•¶ö._5ŽÃ}ú7¡¯ÅôŸâõø V¿HÐWÕ†ªP׆šP׆ŠP‹S+A=„R€:#ûÚpµÒý‰âUùÙ·ß(´>_Û0ŠOêëµýÕp`k¼5ø5b­yœ/U¤ç%*ÂᇇÂ<:[<¯k¹:²VÙ ¤;GÚîÎg¬ÍÿRÙJNÈQ˜}CCíI€Ý4³0²›iÔ ­çgÆVï*ŽJCät£¤„íÚ¼"j.hƒ¾VÚ¯ÖÇO[^´q÷;!ÕçK ;—Ö“‚¸ª—XÛˆ»êãgRD£eöá“ ºÏé“ðíÛ•ñu\ßÊîÝyý©y\wsoFnåâ§ðîŠç2díËë³z¿æ©·È{Õèð,zSZ©åý®ê §‰Ž•‡¨¬[ õ=§… ¬(ljä!«Š—Om×Þ—PqB+QÏ^ª“PÇ…W$œº¦Õ}[aØö¦3yY}|Ì:&¤Ž@õ}yY>YêÒšêmsóç:†â¾Ðk´E’‡',%/jÞ©.¿jîM0w„ÌñbkáNåeÐø 먾|¡öîy³¥Âàîv5ë.QЛ¹ç}°¨Ák} ƒºS¡úJ…nTxÐ… Î} â&…æ–÷,íSͶyl=Ô¬Êiäéòòæµ)Žíð¢æg<ª]Øžn³Qº”¸x$]çÅûÎÝÇf’ Î á¯6]5©*ÏæHÓ ß’$ÿ5ŸùÏ)DôLI°Î ÖºÓo„ñëO½3éöûL`©µË•fCÝ5íܽ<Ïf%Ù’s•“³„.0|•é6LýÆ\ýÛkƦ§{e†y“­°„âÕÐ)—÷/Ó]ƒø27Ì ^À3¿ÿ ®ïÄ`XG ‘ÓÒô…ïïëôZÄÄíºUo,W,@ Ds÷î[]p]y˜ƒVßw¹ý®K`ƒ»àŽ‚È]þÊ7œ`¢)ÿTº)2b(¥#U¬K¿Z°õ:,ìBXiÐuÎñdy›]pôOAäý('›¬¥³nù« Áoúàr³!?Ì<ߟyaÿ]Å),r+Ñ”2Œ=¶H7IKÕ´–î Uò×wŽ–¯ŸÜ–€éãÇêÞÙéè\\K/kx´˜¾Ë¸A\Ú½[Æ_º˜@\j ÚhÞ¨ < 2Bm¸s90ÖlÝZ9NgýAZªùqÄ7²rKmQ›{xËo,zC)ËÈۦŠu‘“ˆ›ÐŽ·„M’ƒD%Š}y:ykßGÚ²íÃÌ壸"ñ²8ââ¢CÚt—Zu?·žtõíÜ2¢ù¼ìpÂÈ/>qIyÕD.’O„1=eÂCÍM:.,Á¾šRž [m7B1¢0<),a?\#c¼S²È6DÞÁb)~ÆÆÜHwFÇWAD(äý»x§nöBìW¿žñ’áýê^–ÝÆ©çù­~LW\^Š$ÁÀÑW‚d-y+è1F³!…|–ëEû£›¢ñ×/&½ñlÔ舟Òç (R‘ÈœòfXõ»$"Oú?S\è¾¹ !éŠrBkl½téS…k–o×™pœLoSýÃÔk ¯pãÞn%‡U¥<ô¬ÀÀÍ| öYY~‡(s»cÄ·â´må_ê”â‡V—è‰w¸“4ˆ)½KD)Eý’„ÔÃVvàD3–¹.)(„1,M·Én3ñE‘YâÈx¸,äd¤Œt—u±+j*^w¯ G`è´Êmu„º”šäÐD ú^àâîã¶joà!A}T¬3$9m%§ÆCÙ¿¡r·ŒìרdÆRYH*›ß×”S •ì®#´já©d²©ù%[ÐMI§ø |j¶L¹¯üšq,rLƒpÑ{0î:a/ M @ÄŽöž‹¹²ÛÄ÷NÙÈ}*B"UÑ*Þy„çæå3bÊqñÊRŽ^ÑÜ÷ÝAå±ÐLÐ!÷"¼YܰCÜþŒ¸QHöºç§³ÉE·Ûà w˜Ë×™*z½êôÏz§U 9Ïÿ‹]Ù‰à±}xœûsŸq×}Æ {ظ|üýÜÒã‹7Ÿ`ûÃÇX<9?@ló]QF1vˆTæäÚæPvñdM;ys–N?Dý仢2›õôg12fN>m`Θ¹™Õ0(iä $ç­eLžìo¬$Œ/›øÅ—ÉäÍ_M A­ýà^ÃÁX¼9?à5È!±ñ6Ì wÍÿÌ:¹ ˜wò‚ÔZæüÒ’ÉŠi`:6Íc²¥ÏäMiU`¾Aº=”¯=yyº+XìCºPŒo²mFòäÝ)\›Wgˆ0‚%gfiì]`ÃfÍóçd/›¬'89$§¬ñ~N< PÜzòÂìâÉÛrÀ6|Íuœ¬¡&990/fó¦ à¤k„HI'Ew¸ÅJ×h@—àèElä«Tôf¢ ié¦C£„“šN9|ÜX©ÐZ˜Š|ÍOtÕÔÚø+C˜kÃrƒÂa«=Dã)Göî0Hÿë=¥[;¸œ\ÁÏ77Ÿ¾ÏvLÅÁç³U CXHТÙb1¤Ûm™Ä¾6úÕˆ RD°ºt;Ê} {Ý@.,¤uF®Gõ:ªi]ÈrÏ8tÖ¨‚byˆÝÆ´šè͆J™7«Jæð$sTAPV>±k_*!Ëî‚4È¢é¡ ú!…FÝ€ˆ†»W¼ã³kDZ `ÄÄ7‹¨Ä}U‘öd¯á Yõ)°˜ú$(BËܪËìµ{„í4šæv£%¸ ·!Ù©a´¡ÏCi[µæ)83Æ¢¤ÊF[×+SA+D‚,x7Eþ,a¶ƒ¢GNƒ<¹òú<мݻ>¯ÁMþ[¯Ä·œÃ·ª.é ÁëËù‰©à1°}”ÚÙçrñcµÄr=ðbÏö½‡Ä)âfJrv8”{6 À°ÙP‚Œº'16ŽS‘¢+ƒN÷Âd5ßX~ó|ªWU¯m6ùÁŽ{_þê&fhØæ„HQ!šÌ R¯ªxÒÒÈñKŽ(%A – ‘ÍØ^HÌ“zrÍ[ž³L¾ã­$©x%5ÀÄg$«HÄé:£hÊ#u£ÞÃ…’§°¦t¾ Ïܨ }€µê&,«øŸÎò‚ääçÜþ•”]BéáSÆ'*Eâ?zpÙ2˳ ð§$YñØëÅ——Osw$ÞÆ4/ÐE‡¥tÁþ|² zUö\Ï'8¾V³];š|¦{‚ÂÛ½YÉ'&Õn÷‘J$8'ö(Ñ+¯L×çç”v`‘UJˆ$Ÿb–Â3$ôp ®EóÂàõÊpŒcB-ê5¨n5;æVJÝÅó0”´2a:¥q å¬mêõ÷QœGŽG1¨#ksÓø@hWâO—îÓ3 )™çr[d.%N&X¾ÕƒÔ.f„G6•Ÿ¥UùÝ•lß(ÅÍ _v›/6Ù;§î¯Y, –O¿üþ·Í’ñùN÷)˜gvtáÍZí„^O4[†‘·[2í·—³Û1-3ÃMxþ¥å´¼ç^ÚrÉ·Üt³Ât´'-¥ª¢èŽªô)!27ý7iy+|7Cx®§Oaçoú+á(¾Ão…ÿä<´Èë†OxœkÓþªµAŽ—9¿´d²o˜ÞÀÛ¦­ùÒÁô2¾|0-ÉÿL³ ¼aÒÖ\\œ“kDä&‹ ΂ª³šü^ÐÌÖúUk39Ax ˜-!b¦}E6Lfm{*§âxœ»)p†sCs½ŸgH¼—rJjZf^ªB|¼‹cˆc¼'D.âïíêïìãêäﯡžX”—™—n¥’Tà«P’Ÿš§‘X¬˜S”š˜R©” ÈÌË,ÉLÌɬJMÑSPRˆá⥠Tx=XhŠB Š!å™99 ɉ¥Å©‰@!„ДĒD h…BN~q‰^L\¡sNjbš åö Ñ•ú~±V Jš0¯ñ ûmò6iIˆ/ýü9A^̪äRNÍKÉLã²]R±ôxœÍZëoÛÈÿ,ýz'§òëŠ;Q}€$Ók½ QIÝ (r%±¦H–«ÊÁÿ{göÅ]šr”Þ80$rvvž¿™ÕÅÛ&yKœ %vä’úDÃ8¡)‰W$‡ã4X¼éÇ>%A”9M#7bxŠË{ED4ËÈÐõ6ø HÓ$NÉ9™Ä)~Ȉ—R7§>Yî‰ÝâJޏ)…ïɶÛä¤Õ?%?^^þÔÆÿ?›{ª ‘EýžÝ0$Sd”‘)ÍhúDýs æÊ‚I¯Sw‹ê¬RJI¯òHÐ!û¸ ž‘”úA–§Á²ÈA뜸‘§dûÁj|àYù`'4H·Í¤Åúñv MŠexdx4Ê(qaW|’m˜ XA»ChëSòDÓ Mr%9 m´Ü…ÿ$¸è¹Ñž„`[µô²¥N> "Æ{ΆÀ4Ú`¸%%EFWEØF@L>ÚÎûñÜ!ÝÑùØN»#ç¡Äù&†·1œU°MÂ8ƒ%S7Ê÷ >s‘5í¿‡%Ýž=°TâÖvFÖlFnÇSÒ%“îÔ±ûóAwJ&óéd<³Î ™Q‹ò0©3芹¢Æ§¹„™Ôù<˜`¡O6îOz4€ .ñ ¾^õ3fGk¦Еæë`E¢8oK>%`ª§€îyŽk7yž¼»¸Øívç`Ö(?yôîøãÄã›Äß¾‰Ìµ#¶i<Ã2Áã²Ó|–!Xd7A–„î^…#Ø‚Šµå ‹¿§8ð›ÆòV%º²/ý­/"+Œ×ðå= ™âMG>³Àn‘“3¿MÎÎ|Ž¡'mT`Ñ:‘˜Êª4-LΓÓZ9ÐÈä ƒÐä@ZP0Ü"ÌOð hŽFF”Sü0œì¹™Æ2ÜŒ1UðDþ<gÎÔÝðGÈ5ði”CçÆØó}Àä¾?ûîêJDs 16ŒqCÀ±¯k$ÀNlsP¥g˶¾€1üf€Xˆ…ù€m}…]<»žŽ[<œX<Á«'PŒ>õ0s4ξÌ6дƒÒdƉOƒwïâw'`H“ÂË…²fÍ~úŒ°`×ø—ˆèŽiá¦ëb æo3To#’ç¶ TqVKI5JE@˜Òôç/ÉœùóUêGZxôUúXÐ?w„ñ‚Q±•ú#„_h¼jiFK_huÓ¢ÝS–­iDÓÀú÷àæ¦-åC"]†Ûj^ik{´ 1Шim XL3„Ľ¯ :Ø`?t!d h®!…OðäPÆo‰‚õ@’Àé%G×÷¡. ôÕ+ /GÃlÝ"ÎøÞ-ìÑdî,0[Öt ‡µÌ(ÃÚŠñ!1ðòªäëSÍ×%©Ø‹±©à¶tÔ'rI> ¥MÕŽ-èwO÷<㙲˜ð?þôóÙc]kF²ývKáÈæ‘Gºg¸„%’†¯ƒc_ ï%Hˆ}ZÚ·œ»ìñh'²ì:ÝÅfý‹I„˜î0Dá| G]8©Ù–ÓF‡”>uØã^o<”—NZˆÆ»lejÈnÝ0S ºì€nÜû»ÕwýAŽ„ä P?t¡ÓCºþý4ëO-gqo=ððaáLœãˆo¬o žÙw£cÍöÁšÚ·ÇRœv'ÇÉ0OkýÙvûηxûCw0·{2gÊ%*‹N˲Y—k˜ýà\+¡,;ŒêidЩÉ6ã忨—W1 AÁ3ŽôƒIú$K/Ð0l,ãMew› ÓÖ%±™VOŸÈ„•éb|Ïjê:¤†â¤ = ?|}§*ö^ª¬i®*ÁåP^þ8ôèˆ]b¿:U Þsf_û²C|iJ<Ù* k«Âo†ýo†ó?€þN÷ÿN†·Ì}ƒ ˉ§Ôïd|C¡Í†î{ñÒiFÝÔÛ°øÃÐSJŒAÖ°tÂó?_˜™éT›AJB†JŒãŠQh« 5» n&~L³è‡œÐÿ°-øå ò¦˜¨žÈh€Ê–ØØî« îÚ pÞñûâ€% Ù^ôÊ;œpbDe_1tÂV𯩠ÖјũÖ—ÛÈ]¦ºØÅ;­È#;‹3t”^¬)Öað7ù8SäH¨Ž-)¬Àó/»¨@š¬:‰~)ѱÚ3À”‡ïs®½Ê!s묞r>>ÅKvÕ”Å[*Ïõ`DÀgv—‡!f‰ÄR–³bàŠVZâCýŒ^¦&¾.B1W­le†qJk¸HøuËÁ!Gðr‡ ·Ïif µâ¦0Z;B9œ 'òÂGͿỠàþeÓ55`\áUH‹hgÂ69IO´±É‹Ød´ñ>±ðl›ÜpΩ¹§bt§ÁX£ôÝ0Œ=v˜‰„bͤ–“þk$”ôæ··ÖººZÁ劒­áxjdUU¬2·\Ÿ™ãÌϼ„öà bö[µÉUû¥XÌ&ÒŠDW¬^èæåb®¼0ÎhË\Âícr@p³ä¢M©ß&8ÝõxGå²%Åû`¾ŒÎïâ˜è =œä¥ØCРŀÍÚVYÌ ™CZAÜWìÜ B<Ôs„ak\Àj LxƒHRkÎá¾.•úþûjz •J#´Q!X`Œ7Û\øt<ÂÇÃùÌÁiIà¼@õØTI”c0ÐôŒ0aøÛ §&R{õ¹S?‚Ù¥AN¿Vp‘1Õý—¥‘^sêJŽVsÜEmÅÑê Ä{]Á1)Ì‚ƒÝê€â# ÄoTs,§—•¸¼w¬©+å^XÄS¨,»je17:²´(~GÖ '4SÕcBCJ·ñ•¹¯!…Œ’¡‰5 uOi¤/'×|©w{ ^bŒ]Wi¼…F–>q‘‘%”»G¡zEšÒ(—‹Ôó/4åýqCn§_ËJiï?UîŒ×>wø‚êk˜Å?UC*$Äçr7+âÈDø¤›©ÄxZâÙ¨Ö,ªÅI@W¬`¥Š#‰#Ú|i'¨­ê:LnA-e0ÌYFX`2`q«B£<î«ózs]ݵšZJ|œÚŽ¥åD™aÞCpP<ùJ2ÔæBÙ‘VDw§šá"Š—÷nºoÖDó/Õß9éñ'\•@”w¼•ŸEhÜ:²4É5eÇWÝ¥S^+×EûŸi IÜø›7~Ï'–!„8UmâÅ­êPklrÉ„[ºõ’}%JìkøÙ®úû Ó6/º5¾v*úC7ËI€ßäo>ŠÉíUÜ¥¤W†°5a]׆~UÇüQ}ÈkZë¨Iöò’‡_½Ñ¡»ÙWïeÁ6Wênö-T¤I©INÝüM àª#?9~¨š–SÓš;ý’C¿ã°ú=ã~CLˆrR$$¸úk„J¹åálŸµ¸Û€âŶ‰òûÅŧ1’ѧz¿ ¯ðÉÿ^HÌ£°=`ßEÀRr܀ɘ¨¨¹1BzÀ) ͺf 2ÆÚ.ß´–›÷£±³°G¶óú”…iyÆýVÕF¸Û»ÛÅô£ô7¥Õ ë(UP­i> !P'n–í|)ë|§ª‰Í¦˜C¼ö`'¹’÷±¾ÆthQ# búÄ{Wé“r,Ö¿Ÿ³ÝÚD²<ÖGã%þº¬œ@ñR+ÆßÚ<¿f § Mñ:¼•=º*Þe&‡|¢yçv¹•ØÉ¼Cà5’‚Ú噃é‰0+yŠæï·òü–+ 1‹Ë6pD–þ/½ 8•\ú™‘¨^S#¹¯ tù£€ŽñT‡Ñ²šËÁŠñÐ(ñÚÍl:÷žsï¹gî|½/§Ÿ~|ÿ³¯ŸÉWý‡rõÔåV9Wب,R€EXYJe’q„b1𣠋‹8ÃER"ØÑˆ-TÑ’ m›'iÝ(±KÔ©æ¡6˜„3+ßì©R¬äˆ”s眥;Øv»¯o¥Rq$_I}èÝ(›YÐB]…òÃé‹n°§vs+)§Ð““oÐ…AU3Q5_hcò³¶cD£Ì«2\nNÝòQÛjë”˳Ãã+ —ƒýÿ±ò¦IܹòÖ‰)óZ *¸[Š;÷”˜%§\‡0ìkòæîþ"*™©PG¤™àjŽÐÎk„ââ©)×)ó )j—]ÐöÛWzä÷‘ùa„ö!Ô–/[#ãçÙ xb½DG¿› 6º©ƒ¸&£ÁÛXÔ[6ƒSg|‰>“É·ÁpÉ£`H®é†ò´©‡ûä¡£å‹XÝÌ¥Wå7}rÀ=ÎÉúØP¤’öF—l|ljV‚Öl!¯‡ïاgah© ITpqdz‰)Sf•¼ƒƒwk˜ ö*¤X=bY`b*±±‡°h™Øš»d.–8¸ŠmÁ¼töUI±)°<ç{Ô1 ÷p̃8l8¤žXÁj;=@ïèCI t˜>~îÝ!ù'¿á§”cư·ŠTP0©ãê~Ý.)·¨ +Z¸Ë­ÈgçåˉKËm :PX§®T”ˆm¶=ã:T2˜suã†÷ ˜3àŠï¨ú×±óé¬Þòdø¸ sm‰Hygá3®Hÿ¶kõ6òËo«}ï'žwØ“‹°Å±×Cy´fð²ëé\6½š\Ï¥—ï$ÙŒÔPÉÁXïT†°ümÔå—hLmÒ¯è5õ¾:ùøqi¯ì„mxœ›¬Ø¡¸a s~iÉäÄßÛÕ/"Ìɯ¡ ä—¯Ÿ”•š\R¬–_š—“§¤  Ô”š—’™Æ0õ±§xœWmoâÆþ ¿â,•nÉ^'$WjU-7Wb É¢@ºŠV+ËØÅØîÌnºÍï33¶1 lÕî—Å3çõ9Ï9sÒyߤ÷4 ®¸Ó Û²8͘ tE Á×<ÁM? q IÅDâ+žâT«Ì%O˜”ôà‘þQ‘¥Âˆ\Ð4ú‡¤@0_±–Ï4üø 5krä †ïìî"Eíþýçòò§Co•+­|Ü[/ŽÉÕ&$¹L2±eá¤mšˆ>éZøÈJ0F2]©|wé9Í)ð,äR ¾ÌòUä'a'´IC¾zÖvp–'!Òð º,±ê§› R™æË˜4âK$#^õ‰ŒLòÚò¯‡Ý%Æ¡/hË„Ô`\• !‚¶¯t¨L¦•δ!?y¦¨Vª§’ÝçOŒíeÆXEF;à–ŒrÉVyìh¦ÏÃù§ÉbN½ñ#}î¹no<ìBXE)nÁkŠo²˜Ã2~¢ž¾)ÑÀí‚Jïãp4œ?ê$n‡óñ`6£Û‰K=šöÜù°¿õ\š.Üéd6¸ š1³9èÊ”| ™òy,ËœQA‰Àâ"ËPÉ€q€| À¬ïVÉ€§ÉÚ$¹=|]â+JRå”v4KÕ–³6®´n¤Tö¡ÓÙív€5‘¨SÀ.R±îÄÖìY|uqy‘E™¸ÓlþÀ“ ÎÑU­ÐW¾—ùRõú"0ë‹ýÍU¶ñ²§@^]]Dÿ{už+ ŽkçR…1_Êæ Xš³­ÐLäÝÞl²pûƒšÜš)pîP— ‘¤‡GšaÉúð,ÛûÍfÇ”è.N—èã­/¸¿Œ™4@|œLFDko9{–Šmˆèšn{£Ù Ûht:àƒ¢Ù„2ÐVf,à+ÎD3ˆ|Aï×^&Ÿ§O !tÆ‹ÑȪأØ_²˜TZð:,ƒÈ|!Yßã¥<颩H=Â4?4ÜhúÒYPô›´Uã‰jh£Ÿ•ÿ|O2…þ9ü@_‘ Ú×AC¨'ÖtFߚ͆炈څ¶95y,¤i…*ïÙì3ÛEø‰²…@Ý#} ÍÀ‡ÞO?~ÀïÈÛ¦wNõqC0•‹„ίºMý]ƒòšPÉ0Ït<5­®[bˆ? ëDZ'ûâ]ÓÜ] 겈Þ.»Í—² ¹ôׯÊpÃeûÏU ŒðEÇoì€75ئÈuI…ñdî Çù7p]læM2nÃ4aÅSS¦æcj˜_§S ßFì·žû¹,Cÿª óIZoÆÕêfj’ áS æBÿ0Útê,­ZdÏkå‘åÐlb’j°¥?®ohxÚBÁBØ(úàÃKMc ©Y8A Ò¦c×®}öï c‰Ò57O\mó08Çú¢àM ¨c»Ã¡Òà߯7a»¿Â¶˜Mí7SÉ95ÅÄx2ÒážÙÿÿÕ¥Xõׯ_¨Äë¹æœžgÿ,׊ØEK 7ü€$–æÿÒjåJ«0¥¶‹ºˆFv8þµ7Þ?þxs9Bð×ìÈkB¤¢œ4…¶¶Aè ¿MQFØWj8ÕÂ6koPŒx­€Mùµx){ÚLÁõýdÒ«wœJv8Êê“«Y°Ï†ò‡²á Ã¥±ƒœ‡Ø­Ë”û7ÞlÑïcÖž/þj‚,8¢uÛŽ7Ç”ªIzyù> ­ñäŽ xœû¨òTeÃ)æüÒ’Éçx²À´ ïW0mÊ— ¢7ÏáÛň¸¦muÁtž`Õä·‚-¯´¦æƒïsxœ›¨¼}C³ž‹cˆc|€cpp¸K¼—rJjZf^ªB|<ª8—rj^JfÖr| Jxœ340031QðMÌNMËÌIÕKÌePá;9]¹äòV—oOÃíæ\™-š?Ï¢¬¤ 7>1¹$³,±$U/™ÁŸ­Õ07îðŽÈ¹b)§_çEñ;R€¤29#1/=5±´$¨ö¥,÷_ÍÕ?“·Ä _Ÿ:'pêÖ‡ ÈjsR‹€ÊŽojûó´,öË,·ãâ'‰,`I8¢¬\œä€¤¼ ¨0œþ•+n¯KÚ3÷ø­û*Î%ä/0¼ýð¸Þ™à…lxœ ßþ  õ'100644 Makefile.am|¤|’÷ÜâØÂßÝKqõÏ–gá‘'¾ç<+UQGàf’›ZÕV§&¦},"‘ù]“« cVxº´x ¢þBºôŸÇ˜^£3“ @âÇHð-oO¯%>¢êâV–¥‘¡î“ô<’ðGÌdϼò.ôë­-s²ú“D@+2Ä4fÊ»CjÚß–´«Óüù“˜>;ÞÜÍ´b.o]ü¤[BÄ¢Jð100644 tpm_reset.c_”ä_ € ‘~´y‹d4u³#Z²OC¾ô\•rˆ-á[éVÚO“HD·TIúOa¯‰FæK•q£T»•y{á„Ûhxœ›-öXtC7Ëæy,æLÜ ž~!>>žNÁ“¯²½Øü–]Ž ±´´xœ½W]sÚJ}†_Ñak}…Kœ­Ý\÷AÆd¡‚ …D¼®ä%‹f#$­fd§üß÷ôè°¹7NíÖú!‘F=ݧ¿N7íó:“·4Œ¤–~H×âQ„q"RŠ—¤ñaœÊ•Œð¥/II-ÒÈ×2Æ)_¿Ê”Œ„Rtãk~‚hšÄ©iÑ$NùAQ _‹=ìhxuÃ7äÈOÞ“Ì­5Y½&}ètþzl­2Å—O[s¦¬BÑT(‘>ŠE Ò¹›@Ÿ¤ñ*õ7ìÈ2‚T¼Ô[ؾ¤]œQàG”Š…T:•™†¿šühÑŽSÚÄ ¹Ü±œeÑâðÝF•±êÅ› \™d¡ h$)A>¬ò‰ZçYü?„}IBâ~J"UŒ‹Rc¡Ã& °|Í ‘™„/5Y‘í(DT««¿çìÞ§ÉÈè^#Íx€Vx´•܃ L‰eÚ¬Ât7ôã™GÎí=Ý9Ó©sëÝ_BX¯c|E­äªä& %4#’©éà›õ§½®8WÃÑлg'>½Û¾ëÒÇñ”š8SoØ›œ)MfÓÉØí·ˆ\Á°D^ §º4é@½,„öe¨JŸï‘A`á‚Öþ£@&!QäS€ÊúÃ,™`†q´2ÎAn¾K’KŠbm—z¸JªG)¶¬\óݵÖI·ÝÞn·-„5RÈS Zqºj‡¹Õ’ð¢Õi%ë„·ëõ?É(3tUC'›¹V‰l­/N3Íâ¸Þn÷âH§q˜·Œd /] ±D7ë9ÞÌ÷ýÞ'êTÇNÏ~v¼>]TG×ýêðCuèõo&óƒ/©×•F°§ÐeBiúõÈÌe)r5Pkw" ?Eñ6‚ÜGgäö/+%±DnD˜XPk Ö~Jç~o³hÖ¿×ka¼Â〿›³Ks4‹dîÁÁØxkçûƒÆ{eÓû÷l$S ›æVc*Ð\0¥©rþ$Í7}¾é…’ßtøÒäMnlã²LÁ2©xˆc}R…dàÈ%×Âÿi5šÕh±Iv½V#þƒ¦ÞÚV"w}¶;á)Ü™öŒ#º¸¨ÉàÞö8¤Þ~t]W ÎrÆ{£á}Ü'üMi^H÷ â‚r<]ú³âTVˆpó*ŽCkã'žRæ±°ÜlVA|«Oð…gñ¡?•#?Dþ9ƯLÍÿ÷‹ „ÓÝûã–þüLrŠøÙœ8ùZ\-è~±¢›eÇÿ†©n€ª9ްïíÿ×èyKùÿ‚±™½ÙƒS…ôèK L&ü›Ö¬n¤² ÀÚ³ÌB̳BtòŸ"nþ‡ßã—Îoìn…²¤£•ún>?©ôìŒÞ’7¨u*»ÒwT9»XÛ~rU–ºÕ–˜¼'þ ýäŽxœ;¢¶ImC‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚Áæ4–Ù¬›%¹ô7ÇrÛ0qº»†8‡»l^ÄÛÄÌ™š––š\“§4¹P@x²ƒàBT‘ÍÝRÜ 6¾ûxœ½WmsÚÊþ ¿âÄë_Èi?˜¦3˜k /“zÒŒF ¨ZU+™‹sóßûœ]I#;žÛNóÁA»çý<çe[uº ùFÐ ôß è¸ŒDLrE .Ʊ¿öCÜôäR¯@™ˆ8t_â”Ù¯Så‡B)úèzþÒ8’±&iÒDÆüC‘ 7KºÛÓàú#s–èȾ£=Ôm²z ú¥Ýþó±¶B3WkëMY„¢©P"¾Ë&¨›°>Šå:v·ìÈ*‚”\%;èîÐ^¦ä¹!Åbé«$öïÒþ&ä†Ë–Œi+—þjÏrp–†KDˆÃë¶*UOn·pe’Þ¾GCß¡äB+Ÿ¨vžEÀÿ²Ù>øcº±â`¼É%f2l‚–›°‘ÈLÄL ä†{ Õ‚õ)g>-ɵì ÒŒ v>w'(Ub•6‹1}ÌoÆ‹9uG·ô©;vGóÛˆ“Ä-°bDùÛ(ð!‘ŒÝ0ÙÃ|¢þ´w–îõ`8˜ß²ïóQ6£÷ã)uiÒνŰ;¥Éb:ÏúM¢™`³„HU@W:ÀËR$®¨Üç[dPÁ°`I÷^ “žðrɲžÍ’f õvt‡ðuÈ_Q(;—Ã(A¨î}±cá ón’$ºjµv»]a ò䉦Œ×­À(P-/ Þ4ÛÍh±Á­zýO~è)ªê¯*Yú²¹ùÛáè,‰¶Nš°w›³GljŠ|>­#¥©—·qõ覰û[½†¯˜.Bw+:ùÙF >¯ÇãaFÞ©ï°УÒùTü;Šaò–Þw‡³~çˆH¢>¡ïq3¨$ÅîÙû‚¡Ü…Õ×J$ŸN)ê­Ö8æ’ÐÐN1®®X^‹ì(’¡' (‘±;‰xŸ–&©2Hàv‹Š®‹0Ýr´Tüj¨m×kÐ(ârTNÃËÚÔç/àkíÛȱÎfÓg ›øgŸ{€pH‘«ÔNÆË+â{íÈw;çÒºNùôñ3œ‹á,ú¯>&>/Y|/}`_‘å¡ãjÓ‘~··]6ê°8kü¼á{}ÖÑGYºp0ÖÅÊÎg—Ò¦ËKc´M0¹§c¢Ë騿æY£‚]1;B}Â\T5ëZkΆ“Ó:©1Ú\ )ÌÑT£Aoü®O"ÄZæN‘óz(‘ ƒ(ØX¸š—çš!Åf­…E2J# è7¡* Ù0$íØÄ¹þ›óÀæpq]~åÚ9ŠtY•k€†RØ¡pÈKãõó(‹<1\Ô"FvÂmÓÅpx±TdýÒÆ K„žyú¨Ñ¤ABÛpCST‘ðü•žßÛ$ZZƒ­3Žpu6´ëÚÄJ—b‘¼Ì­ÿ·µß‹ªó¿È•ÈªŽ¿]xaÓQvã5W!zò eÓ4ˆO<hy-__¡ÊMÑú¿4>ô›ùt>X«6éüæëÕ×N.K•d¡ðþ Ik-é¸ïWS†šòhT>hÂò$¨¦‹5Ý£‘ð˜t)Vn$L‰ü§qH—opü½ž¶Ë¹B)9Óþl1œ×1J{Ek·øâ¦7Íûÿ˜#{wÿšKs‹KúŸ¦_ÿ½ßÁÄå²±Íád<ônɉÝD¢x÷ºÛTaQ0‘ÞQsÌo§¤úHÛAtIüá¡?Õb¬³GPFè ¯Í‰v½¥·£îj%¼äвâ1lóÌqÏtï²xÒUåq)ò)ãÄÇj|EcÍX𻆢UgØo]?´4þãµggÈ¿Àǽ>_ùHbÛ&êá‡ÎU¶¥°ŒCpCáÄ DØ1á,´éI Íß’ü<ËÀfmMÈlÚáˉ據âè{3ˆ®oç}½š8ºÍ8¦™|…3»é¾qÞü¥íÜtg7ΰ?âñÏüŸúáóa4þ4rfýÞ´?‡œle0:ÿ—m ôí,Ÿž¡tt«slf9*Ÿù·33"«(TFñÜ$¬â[g|O ª*–0c9êºU„¹Õ[tqü:ßUX?Á».˜í•¥!‹mÍZ „Ç÷Ðo°ŸØÄt­XHŒ ›Îb%׬#k“ò„\YüÑ Vþy”ƒF^¾ºAÛz9jÐ+ °†±–èéxɰ­vü [%TŠXìW;åùùa‹mÐï¿Ó I£¡D½‰±éŸÛ_¸†KúПX%`Bòðœ€9£Ø3ïég³užC^[Ïø›-z=<¥ûQf5Ò­—°:^ •x$àW‘ ^ ~›Î¹~^.¦&ŽGQá–©øÆIÅqòšç2«ª?‰âH¦³ÉDXÅN]µOŸçòy¥®é5Ú>zÖ ¡xç_:oìË+£Éx«J?Že̺Þã*ô²7©†fµ9PGÔ÷,P‘nT·ÅÎâœ5ÿGÛ™‰d¦ci•»aá4Yº×]4rw^*ýÕa^£^•§²‰‰Ú`>dÈ„wÊ ÊÚ:»¼”šƒÅšÅÏ”CxáJZù²ÇeY,gØ ¯è'ÕäØò>XˆàGom}jâK!ø"ÖÊ0| ˆ…mæ ~‚¿Z÷»ül®À_ŸÃ`ù}Ñ<@° „†5•ÚiÛÁf‚ÂWºCÆìBÎüvÒwÌ6çæ·³˜uíÛ9/ }Øg*@W»Z¬ÆòJð.ÔýæOkĆòÖÔqk>=ÞM2¦ó¥°¼rTë« †¡B-V€²Ò¯b?”îòƒØ_ï‹Á;}Q‘‹ÉÌäav;›÷?Ú¿`fäž2cÙ/5¬Êg°Éxþ‡|­*mÁo³ŸÔ¡¼UêyB©Uü°ÂØ“žìJ§}ɘÇ=™ƒÈ[ÓÏ?çzu'Ô[k›¾ñÓ#¯þ>ÌÛŒì*ëu™J6õÃëOY]ìö0‚ûÿx í%xœÛ§¿Nà Éààxg¿׈… çü¼’ÔŠ[ƒÍËX¸9&Ÿä ßlÊ›ÃÌìà8y±€§»kH€cpp¸ËækL`a a=$áxáx’¶±úxœµWmoâFþ ¿bŽJ99@Nj?݇r…†d¥ôt²³à½¯µ»@É5ÿ½3k›·p×\¥æK¼»óòÌÌ3³Kó² —àÇ ú)×ïÍIpÉ„—)&×lÖ@éß’Ü[¥3Ì¥Ñ-U™«ŽX.1”ñê!á xÄRÅ D¯´£b<™Àøa·qÔ—°fRQ2®K‹… j‰•ÉH©N†Ât fu§ú­`÷1Í€§ÆvŒeÆ´Šm8&îÁJ±ù*±É Ã}ßï&>8Ã)Ü;®ë ýi…u,ð¹’›âË,áh3)ÃTo¾)Q×íôPŹíúþ”‚øÐ÷‡]σ#;®ßïLŽ ã‰;yÝ€ÇË r.¡sSäËŒé'ªŒyŠT,™A®V2b !DȬïVÉ$3é‡rûôµÏ!Ú.íK0UkÎ6d\“n¬uvÓln6›¦5UX§ˆ5„\4“ÜjFYrÝh5²8#ÀÍjõ'žFÉ »ª¦³e UÆqídw¥)@Ü®*\‰`-8†Ç’ÌŠ°©4Dq(zg9«W¿V+‰XàgÎÍ^ÛlMRaûâÆÈpÇ*ö÷µ«­ WWb“2yµaIrõ˜â¢fC`Õ<¦MæÌ)(†Œ–À“Bõ®…ÔÖÌ´‚Ùª7jõ3^žÈ‹’ßôá¹w?æáy—šÛÑhc¼GãwdÞÃgàuÛG2èÿŒD)ÂS Y(+2Lë°aŸq¸ ¹ ŒW+ ÅØž(S¬A"IßnßÞT+•p|w‚¾*•œ†íRøÉŸà:±y¸J4IbzV2…«kÜ~®–ËÖa6xšàxßó·ëM> Ÿüð‘’ŠyfÑYÏ„0ˆýliáÞ]wJž|Ìã;° ™Bð¾Zü󑱪ÇVKc¹ †“ÁÀX%:Ë]cŪ×G:änP|Y¾c£r,CžZ¦.rÙEE.q±Î!çê qŒC¥63Ì&ÁhïÚ餞KXjGè£Çß댆~÷âŽÀé/]îSö(ÜrMÉ£°‹õ‡óÌqíh-U)4 ú©Ñ œØz¤“@¸!2SàÛ©ßê—ÀôK·Ç'Êœ×s®ƒë_ZAÏñzÁ ;üL¼A÷]LúÝpt? ¼nÇíúho€U¤‹ëƒþ©O$ŽŒýZ;Óø©0£«%Ku^D›Hýl“ø‹>'üd„Ÿ©ŒŸx•'ÞVY¦®8R­CŸ<¶éá%›0™ÓÊÊ‹JÕ´¡¶}Bë„KŸ˜˜[´¨C³\EU·syÛfPÖáÍ{hÕ±kG ^\%€7ÇÝiš·ÒlÂXŠe¦Í=“¼Œ˜"äŒzôˆT ¦óo GX—Þ*'7P«Ûp±£õ4õAîÿÀá;ˆ]]`< çâù1¾CfŸÁGö]Áõ—èv¦¾….Ê»¡cžvÖEÙ&åDCoÒéàu.ù¥ªHSië5ªA”ÅN üÆ4&q§áP_½ÞLfº­Xùغطåëœ#RQsjÈsZ¦9÷ןgÚÚ:œ ;Ú¼èþsÐöØÄ×_åX‚WÌ×qg™‘sY?äçwîœa>vã®E8ßD¼¿w;Î_–nÿOÇœ0t=|Ab3a_^20ºý½Ûñ:î®ç ={?eËpa®°ÿÂsm]ìGòwä:7ô²a‹þúa&ì쮣ÿ• çÜí™°Ÿ¯wXdäÅÃ#ï´­ÏqjÍ…ØÊŸ”Þ*Šðw ]ëO­ÏæJ9Ò GRÉ&Zçd: ‘q^ªUÙ¤Bì¦HÜéÔV1þf,Æìá© ǃôXavðàÁhéµóåyâ‹/xœ[(ß'¿a/ûæKìÓ˜™7gqs0“³¸µ7ÏçebÏù }àX-xœeTÑnE¤‰³ÛP”ªTJ£&7®hÖí&n âÁm%\×!nŨJ«Õx=kºžYíÌÖJ*+ƒÄ/ ÄCù$Oü !îŒ×GìËîÎÜ{æÜsÏoÖ\}÷óÜ«jµ!¸JEL{Ð=Æ“LH\ºRÅBx¼¿ß‚îW$Î(<‚Ýz«Ý|àT«O#P).íî6šÐh5ë‡2˜Ô_ºù0fœB§Ý›í£VT2lÄ”¤û#NSÏlìuž dèORI09N¯/¬| ™°c‚™¼ixÉV*çûeR*³XU¸®“R•¥<_Á…±þiîæûpGÿ9×ø4òak+iH1)ðÊG’B28‘,$1$˜CyHdj RvJŒ2úå¥Õíã­×\ŒxÙwÌ“§rµTT‚ˆà”¦B‚§/}äW€HP” –4D^¡G)WôX/Í<6k‹þÚÍúÂ7„÷ïÃPô((žgÙ_DzÉ-Œãäò$óë˳8GAôo¥ëž™¦Ò‚](†CÂ{ 6ó»ùÏõ»…Æ"ã 9êéµÒ}=*-ëïKWŸH´B8uŽyÉãWh–·˜ê¼-Oåå" i?R®|x~Ôjù°mŽýI”þ§´Q=µ¿c<óñ‹NŒÊUùØ8 ½Wß v>»ìÕÛ{A«ù\ÿZZu\ÈÝY¬½éoµïþq¶1)¾bi°<&¿F¼/ \ÅR“§è¢"±dë…’ÂÊù¡¦tÇÄ”c„DDäXqÆ4–ôÿxú®S9›&û“Á±ñ–ËÆLì„¡íô3iû³K˜IìMM’˜(‘ž·Ãqú÷D¦‚0’Úµ±¡âæ¥&"fáÉú/×Ów—–5»|k¹àbŒ^sKë8ÊmÄô<‰©B')E‡‰ššÀµ€çv2}¹¹~ùàš^»|õš¹LlÈ, ©”Që®Ü:Ëë2óaÌÕ.vOÀbÒÞ6À ‘§“¢SÚB™¯‚”0¨„¦Öß_M‹ÈÜ·#ÇÐ¥x‘Ù¥Hã¾¹˜h 2Ó3Úó¡Ç$é… [ÆI¨Øºmô{e`)HŒgIî­BéÚDÙFß¾ ³Îrõ·kúß++7ŠÜZq ±Ã§ÛýæÂKî…vxœ[!=Mzƒ ‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚Áf)–VæÉÛÙ7m®ãøËÈéîàî²¹…K…vÖôµùxœ•WmoâHþ~E §ËšÈ ÉJ·‚öa˜ Z6›‹æVÈ1 n±½Ýí°$›ÿ~OuÛ@2ìl.R»\õTÕS/ÝiŸ5èŒÂDÐ “FF)}"Í ¡(_’Á‡±’+™áK/_’šF¨,22‡”ÍoJ-3¡5}Žâ„Ÿ ªŠ\Y• šäŠ4ÅJDF,èaKƒ›Ïly G‘x/¶p—òz-úñòò_¯½í\±ñqoÝ4¥)Chš -Ô£X\@Û¥‰è •¯T´æD–JÒùÒlà»CÛ¼¤8ÊH‰…ÔFÉ‡Ò _CQ¶hçŠÖùB.·ŒY™-ÀÓƒèֺ檗¯×HeR>¤2¦¡ŒE¦EðÊØäù†Ý!!a¯èQ(Íd\Õˆ†OˆÀ‹ ‰ÊlÔb (ÛR Vw¦•ì>§ÉÌb'(3€ŠŒ6Ä=*µX–©ÏP¦»Ax;ž…ÔÝÓ]w:íŽÂû”M’ã+zÅAÉu‘J ƒIef‹ðm‰úÓÞ-Lº7ƒá ¼ç$> ÂQ?èÓxJ]št§á 7v§4™M'ã AK¸9FèÒ–ý²&’©®s¾G5K”D•Œ…DPD1:ë»U²d¦y¶²ÉAoO_‡ä’²Üø5w ¨z”bÃà†mcŠëv{³Ù\€ÖL£N±¸ÈÕª:ºéÕÅåE‘p»Ñø‡Ìâ´ÄT5M±ž]È‹¤ùFZNâFûŒØQw¹±¹¦^e+K…“Ϥ º¯"µÈ!›è«˜ç› ‘È¢Ž£ þÖn,0î˨LSa˜œ`=¤–“©ø½”Jèkš$[-c aW‘ÅÂ%Ñn÷ǫ̀u‡Á›o±M–cš;ø¨’Ôw"MÉý^¡Ö™¡"RZx1v‘±ïѸ@QÝ;<(:‹ºjÕj<7'm'˜9è´è¹qGè¼ôד“4_}åÊ›{M[f|ÍûäÅ6 v[ê‹ÿfÍV«“]v.q° ¿vjÜâ¯q Æ1i†öÅdg{ìšÔ*ç““où:î6ú®Û(MóÍß:­‘ßëóéŸ3͹GîúÃáü—Ñøn4ú½i?´a”Ø6J>í›=Æc-ïby]ù·nUC¤„)UFçW¿4ê×ËNãe×(¹Äúiá½jŒÞzáãù–¬°cE³LÆ`‚±í¯’ïÍsíÓù¹ë‹¦OÈû£ÔEaŸ”Jqy«o­#¶ÛÚz8Ó®- sÁS~0䎙£cT­äP&U_ý8OŒ³áç_™ñ¦b‰l)Îmì#ì©ø$T®É;ZÛŸŒ»ý%p=0»Z»;Á"2‘ åá]G2óìäªUìW¥9ÃË£«è§°XO"­7Ü„£ÙpˆìüC2OE†Wè¶7…ýÿ„”ð˜Z>½{J&ÇúÞÖ8P–VxrÃm&®elêå‡?úËoøöLÏͺjY>G¤å„û6*Ÿçïì=7÷U9¦UTZ»Þ9¦¤+¥ÃÂU|²Š/úæ>ìëÏ­þ¤7n»Wó«Ÿ.ç·Ýàv>ì8£åÃn¥êGâòˆ‹Zl57>ØY’·h&£mnÑI©P Û%ž«ͧfTè'ÄÉ„ù¤1ãùÒã—µë×WÔ¶|‡âv¹oµE~¦Ëºp•óáUš:„ØÕµg/žÞi]gkÀ9³^—‘ï™æY†ãÖ{é_áߘ\S³.ê|wtY¯6¥xUN¼†>k{`|­' ø‚£æî8ø–Kˆ^î—Ñ ;Õ(ÇŨjâFýXeŽ”æ7§À.¯j z{0·rv;Ò³CwÖz•ß;\:¸"êÀîCw¾µÇüa7œ©bPûÓÁL}íýÔÚïMrÏøØÝ«#êšþ©™mŸ q“ç©·ŽŠPkûX¹p¥Øê2Žñ›=wu.AË»’ }ðn üݹåtàW·³/Ý©81¯¤Ç/—¿µ^ÙXXÔ›€_÷{àPõÚ%t8§§ôáp,žNðŸe5‡Õïìî!ˆºÿs™íµlŒ.xœ›*ß ¿k³2W+¤sísxœ…TßoÛTÖÆÆj7)›hÙ$Ðzê’´iš±¡VKÓdHÛ)N×Ik9Îubp|3ßëVQÊ_W☄ˆwÄ<òÈ3Oœsfi·‚Y±}~|çû¾s¿ž}™þñû·TâÊœº}eãCÓ0€®F&Uc=Jp¢0d!m‰¼‚‰™û<‹‹ü0`a*w*£ËØMÏ÷d¸ ²Ã@ÇäàøÌ¡þhSéºTÄå¡Ãþ«Èxz²½N_xŽíC/d‚Ëï{rOÖ;žÛ‘ÿ\B…ÂácǼڜxvÌ‚¨ G¦£ºì­A˜ƒUÓ2Œ©[T|»M²ÐAóÝe«'¯ê–Õ¨T‹ÇF²_Ö¶·«Ðò„Ýô1*.-•x Cîû¬Íþ1xA/’À{„S˜ÄªçÀÙ¾.ÞÄÓ}ÄwG[Èʶ†["&RY¢+&Œ0 1V½Xß±ë­âZµ¼½»U®•ªåbm3uv…ÔÙëô7çU¶k¥ò(¯ú ÌúêÒüÅfI½¸ôúâòlš§W@ QÓ¸ŸŽŒxëµ2a`üæÛé´;«i>7ö§cÓ™ŒÂ H27oÂ<]—9rê¼ÝÆ$̓¦ì z°øÑ yšÌ Ú`ØžO=¨À:síÈÇ ëžèùvÿ”¡™ {yágL¬ÄõÁŽÐgè<ÁäÙŽ­óª,©Ý ri§Þëª)ãƒ~÷jNº¸ŒsêG²œª7ÕÆÜeÍžúÖ¸žäiäÜ8JiŽèÍWýa¬Í`½†µQ\n,ß)46ŠÖF£ZÞRS泋ÜUùä†öW€^”UƒÄ,õ»ù§Õ,uì Íh>†kÐÊ’¡ Ÿ·.Ï 1Jæ|I”ÞòØ RÙ,iã¹ñÄ.óýÏ„›U¿LîþüIâ½ ×Nv¶'[ Ÿ9µ—\ÝiqÝà ‡émh>¶ýˆ¶&®%{ÝLZºM†˜Ê ÍîíçO)·â¬¬û\=ON«kÉéO û¦hgRs‚ô$[+0'nQ%ZÔxM4DP S³è/c‡m4Œ\X8‰%|mŽòH6Dä8L|‡64†øQý¡‡c> Ô:kFíŒ>¾†\“Ã0Bv->ÑòDípƒÏ"ÎŽhBŸÜ‹OÎaׄ ·ê×ÉŒú{ò£$MÆ|Át¬º¸{SçÐuk¤TŠU«¬{¨Aâ}õ]bQ½LÌ$0YGÓ]ý•¸£®&gîÇ {Ü÷œ¾…‚1—stîhå鯣WN B“KXýúÝ1á­ÿ¾pJòßÓÇcn'»"ŸC‘ÜÈcô„HGã\ác‡ŒéŽ'6µâ‡w3vØ>xZاRñ2Ô?S‹*óΓ¬Ä1™î‡'xœ;¨¾^}ƒ1»dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚ÁfCöõL›p21næçŽaâtw p wÙ\ÂɌĽ&ðš ÒѬ°Êxœ­YmoIþ ¿¢Ì* XpîN:™ÍI˜Œc.,À›õù"4ži ×à ×ÝØ!¹ü÷«ê—y±ã“Ö’™žêz¯§ª›öqŽa¶b0ˆ¹â~ïÙ‹’ ,@ᇱàKã—~2à)±¯x‚«´ý|+y̤„O~°¢'$›Dh’\%‚$‚ùŠ…p·ƒÁù'Ú™£_0|ßìPÜJA½ß€·ÎߊÒRQ´¹\Z/Š`B,$L˜dâ…-¤6f¢ö‘,…¿&C‚1ÉB=¢ì.ì’-~ ‚…\*Áï¶ íUàÇa;°NB¾Ø\ÛÆ!zˆÜƒÚ­¥óU?Y¯Ñ”«í]Äò€Å’RiE®´ñÄíÏ«ÝÆq¿€&$9ãÔq´<š€Ô}EJbd6´©AŒüxz5Ýú”±™M!ðXó^a˜ñ¹¢EwÇ`+Ùb5‰ÃçÁìr|=ƒÞè>÷&“ÞhvÓEbµJð+æŠaÅ×›ˆ#gô¤ðcµCõuˆ¼Iÿ·ôÎÃÁ소¸ÌFÞt ã ôàª7™ ú×ÃÞ®®'Wã©×˜2R‹™)sèB‡ó%dÊç‘t6ß`%*…°òF2`|0³ž’vf”ÄKmÒeîë_@œ¨¦ãCY‚®zà쑘+Ú»RjsÖn?>>¶Ð­±Ä8¬•ˆe;2d;ØD§­Nk³ÚÂíjõÑ«ª¦6ë¹’ÞZÕöV·Š Äåêl:_öÇ£™÷û Vý ã«‚wÐé§EÈ@$ÃÁù|0Ÿ¾Íýñ5WÈåÕj»M;E™BäñãhJV¥Ât Xù¿Ìv“óñxˆ‰7aIàßE ¿^ô†S¯H3~`1Ã:`S†¡Êéx|ò¦O}F…¾;‚‡„c>°hSÐFe¬;öûë°Qý^­DÉ/é»^뺥±vJ½v"špr"œµfµRú›×k} i#ýÞGÔV*æ‡.á04þ6R˜CqÆ’˜µ£þ³å9Üž,á$ùB%r{¿Ô%ŠpR„Çäy¬£¡WPåÂÆS4ƪˆ9¦2 —Æ«¡¯|*îT¢•½×E†Ú¶Je-IÖÒFæÄ0)ÈsQ#ãßvà|GV˜ù„¼¼ÑI¹¥ IÇ þÄTdý(¸b†:ÅŸ²¶ú#M+ØøB2›ôî£"M(¤KO,uºH„‡`…XŒ$ ||¤7âÍêWÌöÙä³°R¹Ã¹ï:Ê¥¦,Mûò ܰÎå¿£CTªk½PJá=6»z®n°ðs\…’£+?$$ZB¡„ž‘/ÿŸÊ°ÉO"ÐÌ­ˆáä—‘ľv á ›xÓëᬊðgê ½êÝ×5þÍ®>?_Í6ë¦&½üèÝÐÂG¶Ã ¡ü ÕßzÃÁûÞl0ªÏ7¿ùÑ{L‹&\F³¿¼…cL Z˜~kÂùÍ̃c·¢cœé€¹#©rÑ#ˆÎs”>OU2öâ0ÁäY³X¡u§[ªR^zNª‡ž ÜŸh1õÚˤԚV/Ún½hº{‰\B’S·†ßQ•Î’ .§–ßm &´áTipl挮‡C” ù76ÇÂÐ%Žïšq`:OE3a íÀ8Væó5[K¦ê–m:_;f^pC³°"Ô,‹9[5M‚©G–Pçb„'D"ê×±®2¬nb`Û‘žÁ+ùï¸Ö ¼ ²IëÄ,f`µÒn“F¤ÑM(ÕàØ;ý°©§Í¢óœbNS»ñ×<4`_oýpv€Wš×+é°[BDó4Âh ¯BÃGÛ;š¤Ö[­V©‰n®è0kEXìZ×ú¾•¯Mµ•§™m k@»=c„Œº› öFšéK«‡Ð¯…Z°€£òª[©ˆö’K²'ÈÑ`ôá ®%Ù‘ÄÑN»bÁòw–RÛt¡Q/ç¨ÌìÊ^4 q¶ÆZç¿gw[-^Ç$/¥‘¬ØÌ½ûA/ŠÁ ZQ‚½Ãœ+È`¿u«*©ÆÏ´îÊñ ]|Q9V öæùc]„Úª‚TÒ7`бˆîµÇ\5:ÒüޫG$<(ÈÂÔøD5j¥L<ðb|‘/JíÂ:¥õ¡Up¿*Þèž®ËÌ 3WdÉÛDÝËÊ¡{6f¸Wßs’¥ÈkqQ€Uÿ«Kº4Ŵüû…Åx\}¶«þ)-•õE óg}=™ãú|[ü¿º!•Ç1µ®;± šv¤;Æ—‡ý~¯&vg%õ )êÞÉ5+ïÞ¾^ {`áÝ÷”®ùļüPFCÔ6pG.úOÞÒÉéû÷ZîˆG…9ª·%›ºð›4dþ@G}¯Lå¥ÔKKm€I;IOÝá!)·¤6ž¥M4í´Ö‚X:Ô¸aÀŒÛ´vK!›^öNÏ{Sïý|4õ½ùÐ}q¤Ç›‰ÙÝMÈÕ VÑt'ë'½HÕ­ýÀÄ/ý8Œ˜¨›ðR\iŒXò³äŒN«èã&lbg¢—´Ýk!òõŸ>4õ¹±AøÑ¡V¶Lඪ«Áª¿bÁ=¶ìõÅ›Ve_`Å1B"X팦¹ƒZ<<˜oúãQ6ŽÛÕ\]EŒFw¹a_ìÀ/ .a‡Æž¼Â3•uâgXÓe MÎÂsq¢àÁð8­ïHN–ÏIÊ GûŸ1¥ =ZzÍäæÅæ$xï) ÍsÚ”ŠÔ™ÕkƒtÂjÛû‡lÃ8 [qÇäWËçªá#+:ÓXmMâ›èAÃìÒÃAî\òÚñ4£[ÎÖg¼»?¨<3G¤É­Û´Í÷2+ÂP±×,³ÑÀL´ˆìö®Ð%—îðö²Àœ ޤÓNÞåv£^‹Žy $5ÿvò¯aö‡ºE8A,Z2ƒ/îÂ3-€|€rŠªæ‚ÐtÌúkwa¨E˜N¯û}o:݇µüÖ$ŽY ê/Ù:×NÞcð)ìé~Ì.ê¥/cÓnÛ_$0}éJÍWöúZAp²} 3ìÌóéà_Þüm篇ÿ¦k³›+ê9zý›n‰cÆwäM4ÐøüŸ^f¶N¦=dÓLÛ<áݿȆ§;W¾PÐíÔ¦ìÝy˜! ºly]Z«®°ŸCå´«¸i[ê´Ï.Ìì™g™DÉU•r®´˜nrf`RÒh´t ,\Êm`cdxڢ߈­»Éį5söÃþ\³…êoÕ*ü›ù u¹¼‡V ±L®âül·½¶=˵5Tø’}-µ©{`Qî÷Á‚D„æg„P_þø¸2Î.JÍiµK¶o¢H_Šç..õo>ÞÇ£’n›EÓô\Ó JSë0¯Üyééü)©ó‰»BL)jRÚ=Üv¾Èš1*ÝrV­¸ÂÓpœ‚Jžô,à‘;Mïÿ–¹ü¯á[œHxœ}TÍoEW 4ÙõGáHHûd YWnWj%!ê8Å#¯C„h±Ö»oíUÖ³Ëά¢Ä27¸ÀaüHHTHHÜB\¸r-—žø àÜ™±4ížfß{¿ßüÞ×|qýß·þéåÏKµ°8 t¡{ >‰aÄüPý-=Ÿ XíjûÐêÔêfm6ÎÍæ~u«aBùܰ½k)Ëm]§Ìf¾#øÄøi‚”Á{—x6UHYÄ´-«³Ó¨~ÞN;(⤥}pÞ<Ú7[–Ù³ó_¯Ü¨—nêpªž‡«@­o“‚@€äDè";A$€ÄîÊÄlâ‚ëSõ#ÛèÙI ü³Ù¥=ii ~Œ´Í‚1Ø ëCB¤<©Ê€¨J}Ç qH„Ðøh„ŽïùЏÄS³×[Їº®a¯6pëD†ÃïͶfÃÜâ áÖ­±´|:FÞTg©_úW]éŸÈl¦›žŒP²òE]Ó@~"ìâÿ¨”©„±fËž® üW/é#þäÊ×…ç5FÓº1ÚÇâàØ‚r ùÌÕeÞxeî±j`}¥åÉ 2ü‚H·¯¾:ãNAÆ$• &•0o 3qµÊñrçðçLËAý#k·Vmœs>âæŽ—åpôÛÑ@ eüV³Ù€î‡v Ïjoòжšë7#F?~(‡0ÌSåßj¯ÍãÚH”y˜Ÿ$"mwbS ¥E(ÿAë-Š{:V½Zî”ïntêU«Þi˜û<«r ]ž‰~ªkVuúgzF¿É¿ÔWù÷zþõ’ÜH"æX(SSÃ+ÿ‡þgýb—.÷¬CQ1o»Ä 9 µ>:Ç>é“Ä1Š-”›‘Ðʸ|üÇÔñ/wÒßÌÌMVv›ÿ•¹“S÷iϸ˜9—¯d7FˆnÈ;|Œiå_¼¨æX”Bøôƒ`„'DYùo)ƒÿ“ʧ´L©ùíôÖ‚Èo§Ú°LÙf>J¯ðïÒEþ{:§k#é‰Õâ§ïò…LnIÑGaà;§2 ™p¿›¹Î2ëµD¦TÎ$'D2\¨2†ƒˆ©©æ(ó$= $•ª—!g¦8y™Š`ÒŸtT»â†xœûªúXuC#‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚Áæz;ÖÍW9 7KqÇ2qº»†8‡»lnà]‡ÄÜÀ«±9^`o*+l›*xœ[`9ÏrC ׿`._!´+åxœ›g9ËrÃæÉ …D7ßeväåwö÷ qQÈpÎÏ+I­Ø,*ØÉ @ àïC1xœmSQOÓPŽJˆ­&’ Q“㢣 0¬h2–"„º.kç‚Ä4¥»°†®mzïœtYü $÷Í7~¿Àà/ þß}òÞ­Œö©÷žï|çœï;÷ûÆïù³óiÖŠÅ7çîeELâ¹°e:x¸‰|/{¼…í²njªHL=¿›úkêu3Q Pè1Lᄃ² ØR¶X¦i75]·÷ªF³j›Z¥®Y ­!Aq‡§a ¤€e¢0rcD–³²¬ÒËé5QÀ=¸m#"2ôEÁuõR²TáfoV½¡©tóþËO¢ÀXºqEUˆ¢±ãxìœøØUÀm;1äóìðd‘ó/pbEšƒq¯Å« ]WEg‘¨cû( fŠ¥š¡ïVö¡Í¡¡ï¹§ ÇêuøÑñ»èªQ²WwÙEaU¥'³‹Xãýìµ`ôl6s, Q0üÖ¾¥Aïj¬«R+ÛæNyÕ^]/Ú;esÇÖµêgÎÿ?yU‘WôÈn@|óK2óêbîÕ„^Î-Ï@äıB‚ü£‹Ÿ~óŽ@z1¡äPeaejq؉…qêNÄu ã ßÔé‘ѿĬׂng” ++KETFkÄzc¾ãå'èFå?<Öâ8Œ9ã¶ãù¨$ä…À¸ÁL/æ3SÏö¢ÿOkÒÈWy¬(/šöÁÂØKPx$£¼§ý™)Ñêê ifa\¢hèô{D$î;æÚ~™Î<ËmŽ1&"æp¥kˆãÙ¥¡ÃyyrfN°Îˆg³ç×Åin³Uû`Ze«aÚuÍÔ,ݨì)é¢ñT­/„]b»~ˆnÈ,øJ*ü,µ+£“ÌWƒÁà¶ãËÁd7\ÄvŒZ©§“!N’¾-¶ÔüuýV>WãD„9xœ}R?oÓ@j“Ænª"Ôר N±ªP©·”¤M;ªP¡–c_+Ž/ø¢¤ŠúnccbÖNHL,ý|`aæÎqRˆ›ì»÷~Þû}»ôþÊ«7ïÞÎÏÐ3q:˜Õ;¸Y@õ^SÒ¥xØn4UÕ”RI/î—öuUÉW | FÏoaÏ"ð[´Ê˜¸Ó1\ë©O&3ôólzAðßó\HeÄ=›É.Ö\ÛÄÊw¬r×·±+ÑùÙÕQ€Ÿ€ÁíÔ>"€0D& ýSE 2%'ÈddSUGËð .F‰¢íúÐ1lWâ†×4e0[†ëë1ö÷")‹t3²r£Kú–î 7# œµª¨µ3\E¤çøô(’‚¢òZJ;,xT)—vóìFëv*رÍý‹-f>ƒ,‹ýÙõ¶‹ûî!K×¢1Õ¢‰T8i¬‹ë‘!>ŒËÀÈ“6nÜZeú:ºJ?E—éBìUb/OB}ŒÎïvv_éÕ•¶Ä5ɰ+©Š ûµRI†SÎ"Ø ¦MYÐò•œ®è…]5÷°¤ôü^!É• ,»nO²1hæ0LÙºƒÍ6²d`‘]ƒ>ö,ðÐóží¡0 …óÚä9N‘# ¡§s×7Çãá%ÂdÌMè¸ÏêÇÈÂÂ[FWèå¹{K“žÐ./£GsWw¸=zÛ°dñì6YR&§Ê¡‰Ùîùºé`‚‚»gÖ—Ø]z*,mºÁžUä«Aê&Ã9€ S=á#½/Hàð¿UiÕÚ_›ý±,ú#¶–9÷.Cq-ìÔA,ÛE4HOLñFË&]ǰk‰!Òï±›ôLX^§oê6-Ò âµ[ÓÛô¸™ ¹'>*  Xùmu4'nü¶œOäî„QxœÛ$±@bÃYfÉààxg¿׈… çü¼’ÔŠ[ƒÍ§™Õ˜&s²ÍÙ¼‹m§»kH€cpp¸ËæZέLšN½¼ËxœYmsÚHþ ¿¢Ã•Éf1NvïCû cr¦ÎŠ—ø\Y5–˜Št Ã^øï×=# I¼Ø µÉJ£žîçéîén)g'e8áŒCÛ¡`Üðw<ŸàM ÄÝ@L…‹OšžÍAH” yà²Px¸JÛ¯#)\.%Ü3kFW(ø^ DjÐóº`œ…܆ç´¯ïigFXÀñÞ_¡¹YFÓ„õúyk©)Ú¼ÛZÃq O*$ô¹äÁ‚Û5”Ö4½xӀ͉È$à¤7 _Ðö¬¼,æBÀm!Ã@tZýƒ„S‰× {/.žÑ·Ú<Ìv#òšŸßlµ×;HS?~£?[Iaa•öñŽ»ßgë0½øùkÜÞhíŸwÝëÆÝ]·ù¯½7";b)ò°`Ú| up<ë»T5$“H‘‹ *¸Ò_…Ô†XÝF=c07ïZ¾¹!¹e•È^ŒY¡Jä]¶¤ø‹#N„L %YÐØÑIX«±)N¢@ušÞĽš "~#xªWÑ礶àk7ÿ4~ØûKSó—ØÜ´¾´;ûÓ3#óKL69TA&¥¨3ù:«@1g£DD2«¥ç¶lb9Ä.Ž3CÐîÔá@ãßþbÑ)µ¸¼¾(—Ë OØ4]ø[ tOi¸öWÕEŒW;Î‰Ä Y=Lüi-ÖŒpBNtC³Œˆ"WŠ©«æaKÉñ¦÷rjTŽ$´Ïq¼ʃزš1ÙGöìðOº•*Äú.Ê%š* ë P}OŠ3öÿÓS=°Qtþ‡„Op$3:ªù]™[ò?ZX£·ªÏɵ«Ð9Wi’¬L)r¥„û<¨¤s.9YVó s¶óhžÓ¬ àmŸz“‰ä¡òH¹¤œ\÷Ó_Ï«K\¦<‡˜ç¡ƒYtIñ äÔ“¥Þ^.½Ì¦–ëüï0iÈPº'Õ‰p"-¤ô™Å¥NcH¦Iá(é›ÓSµã•ð); ÚÔœ0aF<0ð©kÍý¼á­+ —hŽi§:ÐjÏ·J<‘ÄûïáÇTvÉÔÍ'ùíÇåÆ˜Šµ‚“†ÓKÅâÎõrâ¾øöËÈwu¹.ÓŸ²&õN‰ÅFháÄÐ `¬×ß#+Ø#B¦µØò}‚ZùMâx<)º­r´<¢£r¬òç8I 3õÇ»KR§ÕÐAkX²šjžÇñ[Ÿ˜ñ%³¹%æL7ÝR¶ˆB…4c{Àrv$kê ¦…’”¤_ÀÃ(pá·Ø[ë}6* È'GáË„x¯\}'‰¶ãð)&O2‹^×6ÅéP'Ûßâ²nÈrÞ¢¼‰é!î:ßP‘:KÙ,KØíKµ4¿â#»•bï„´ÅT„ñ!>Íá$QÓS·'{¢Ù“ËšCIc³mçÄNÿäݳN‘½!3Þ–oÍ‹|’ïËñŸ¥³ë¡ÎG:­)»ËI–×ÈýîâËp‡Ï95‚ú)çþ”Ž.¤;°ç #r2¯Õu7Õ…ÉǦª.Úñbäú˜ªž?×O·›áœÉïè ã>†ç&¶ýªuQzŽ&ŒÕð‡n«ø%4JýWñg@㼚•69E|ûXÚ´W,õ,«ÐL&,Ñ zÜJ1,zÂ;Vã༩;ê˜ë9Tà3j0ʯ´N­D·¦XJÓ4)«àjS±³ìí¥¬OSf¡qLCåA½;TZðgŠæ]Œ ‘Œ“ˆÙXl½n%bˆÞbab*?*‰Ò“^°€æu©ùíÈxmÓŸµm]EK%Ñ«+}äp! §v‘tU~LŒ$MªêEÃÛ,˜T-e}y´Tï›þAph­ähí[M(èTûEùµïˆë¾ Žèv8·bY亜 a!JY ë´è§…Ùü–/»Á.¿ÛsùÖ½§竇pÕè½w £´k&/ÎÂj!Šªªé7mPõ§Ìä¦VΟrCZ¡ÉªÉ ;ë2×K·*/rì¢ÉþMG×PÔƒ„ö$ÎPÚ<r©–ô¯#™¾~â»®'ñe}A¯Ç!Ÿò ¦^©6G)ƒ¥¨(íCBÑë„bŸØ ¯’0˜8Ÿ­|NÂS+PR„úîMèápÀÜ)‡oGQŽ¢'â@vuoKƒŸ"YHÛm8Œû­ÁènSv¾Þà£?Xôè_õa6ôQgüÒßîÜ´þ îB}d8ø>o¸i ãÞèú®Ý„“?zV¹–±¨÷»Q»3üø"§Ïeä„wÔˆJ×Ãö]½ ýýwjÞIƒ¢/t—½É|ö,®Œ/Z@ÍF/…1ml3Úyœð‚ã ¼‹!˜É ³v²15›­ÁÀܸZÂWRäškññm¿˜(õ–¤¶èO:%4?²ÓwGÃî—ûÖ}·ÿHz¡˜'c¾a\\Çcv.˜Çè3¬MšFrìTP0Ó¹pžÓï*%<ãâ¸.'>•sYÇŸp¶íÊ“$MTP7‰w '©0põ·+ß ÚîÄësf×ðz€s ¥þ}.½Q_\Šòôýì ÔÇ”ÿOmMÞá ’xœÛc9Ór#ŸJqIQ^rnF¢cQº‚¶B~ZZqj‰Ž‚’A…’Ž‚‘¦‚­­‚Ádw¾SŒŠ“ùÅ„\õu55.N P°8£íæþÛŒEB(ŠÕd &³É!Ûˆf‘¦Bõäb›Y%¶³Á–&åäxxœ›i9ÝrÃ{¾Éød¹kj¸8@€|Éɾ‚œ›­ùãxáß »±ƒxœ­UÛjãH}}E1‹m‚ídXÖ³ò%X_ådMLGj[ RKt·l‹Ùý÷9-ʼn=“Ë.¬ŸZÕU§êœªjwZµ(ˆ9yRÁòO²œ+Ê6dp1Sb+$nYÄIhx®$3"ƒÕ†÷ -$ך&,Œí ®*ÏTåÒ¦y¦ìAS¨83<¢‡’¼þÄFžøSßy‰t±¡Æ IWÝî—ólO©lðËÙÜ$!ßBhò¹æjÇ£6¼kš¨>WÙV±ÔÙ(ÎIg³Gî•YA!“¤x$´Qâ¡0àkˆÉ¨“)J³HlJ‹[!#(dåAu©>j5ÈÒTæÅC"Bº!—šCVkÑqEÞB€ÿiÙ=âñŠv\i+Æåñã‚PAƒ[$:“Û ¦b²¤ª>…¾Fö™SDBVØ1ÚŒPÁh/ ܧBóM‘\X8ÓŒgË€ÜéŠî\ßw§Áªgg¸Å¬ÔP"Íd(©˜4%ʯZ4òc„¸}ïÆ V–ĵLG‹]Ï|riîú7XÞ¸>Í—þ|¶µ‰Ü–ÅëyIÐMÕÌKÄ ‰>r^¡ƒ…%ÅlÇÑÉ 1 1Yov©3Éä¶"¿gùz$6$3sqıS©v‚ï-¸±±±1ùÎ~¿oCV©Ñ§·3µí$uÝ óä²Ýmçqn î8ŸÄc´¡`>YOo³Éd6]O°a®6Ã]†Iühòtmt.ÚñGÇqÐ×"4dÛ+·zmË_ïXRpí|w>„ØÞC˜†r¦4_T¾wð¼­n§i˜«¶±Wïfmiô[…Ôb+«a7Ô:\œRvi‘¾_ópM°«¿rÔc*V®®iêÆzUäÿÀ¯y*è˜fjÈC‘²äW1áûJös„¬TøOÚ¼¤Ë.‘}aò„•Џ2:küûÍõ{rTÜØöv —ø«£Në§'ȾY?±#ª¶¦xœÅksÚÆö³ùîÄ ¶±óh‹›ÜÁÇÜb`¶››xY,°­tµì´ùï÷œ}H ˜¤IëéLÑîžçž·”ÃgòŒô'”4}3Ç#gtN½ ¤ F$†NÄÆÌ‡z0¤„q8ÓÈwbÀ*‚ŸÎ8ó)çäÒq'ø ŽFa‰#¤Døƒ7¢NL‡äî4O/Ò8GœˆÂsøä&1±ê%r\©¼Z¦–Bà|j5Ï#=DÁIrÍéðNK1û0 Æ‘3EAF¥„£x´OÈC0#®ã“ˆ#v7‹AÞ˜8þð0ˆÈ4²Ñâµ™? ¡z€»)׺ªÓ)ˆÒÝyÌ%-æRŸSâU\á!<¢ùM¶Oe‘98*ãHcT8Ê8°œ™„› ¨„ˆÿx Õt°©LCÂ|{× ?+H´` ¸;JfœŽf^QÀarÓì_t®ú¤Ö~Onj½^­Ý‡ãI»`+›†Ì ÉÈñã`_\Q£W¿Úi³Õì¿G!ΛývöÉy§Gj¤[ëõ›õ«V­GºW½nÇnbSd‹JÉSèH\ØËÆó¸–ù=Ü Ƽ!™8s 7éR@â‚em¼%¡L/ðÇB88—ªï„°ñƒ¸¬ñ •€ªæŒ.yŒ°“8«‡‡‹ÅâÔês¸'—ÑøÐ“ø¡zG•ƒp"Ç…¿˜ïz3ðªŸyøo£×!&vÃxêßÀ^aþþ%˽†yì¼sÕ;Y¡¹ˆXLÿ6¢3Ÿ³±/| &þœß'›§NK/8×AAtœ®ÛãìMö\{1q'NDž ŸF¡Ãù29±|C=ï~.ï9ü÷nwM(çЉ,J\]ñ v—"ßÔ®Þ §u!Zt݈÷À.>¿¼Ýtæïñ±Cˆ¨1ã ©<Škõœ)øˆyÔw¦ éBß¶õN»ßøµO&õòÅ}, ¦ˆ¡qjI$øìtBðh©S‹Æ¥Â…!À@¼…#% ®QgíUÁÚ X×½ïDgÔeSdz¶Lv•ñ”I¥,ä\Ö~-§&JŠíë^í’ˆCÅyl–p;¢ñ,òÉþÑ <ˆ®Ð»jàê8çï “b&L˜AÒ*·äͲ÷ï=Áï΄ûÐslˆùþ˜×ü¡ð,n¡éÎÅÏ2)Kˆx.èÒš‘ >|6¥•˜n 6*LRbß®ôŒ|É éñ㘬֪`EX¾æÑó¶R<Á“Û’éÄyAQHðD±ó$ÙˆL‡5®Žz_²Ûçµ–-ö—c€¹³ÂÌCÊŒy\Ó1¹l_µZ¸¶Žæ fG`ÖñdUJ½®…Ô1$_Fc7!·“6ðñ)á#O@ƒ?C¾s±Ž]ëWÑ’_‘Ý]Èï%ò,feégrüRù\&bæD¾çÏoQ¹ ¼ð3¢•·É߆1¦ó‚í׳Ö{Ü=3•ÅZO%Eú¦Q|Œ?ÆØrN¡« ±l/UgY&ÊG±…v CV„ U¹?å3~#t´Âx^,Érn°)á%q³Œ ,‚c9à¹üŒ‰–˜:‡E,‚AZÕלŒä…å^u("©èVŒ"]_cȺ4ܪ^%+X¿B|Øjúp’aNk‚(™…[::6¢(ˆ,àJ3d…£ä<ˆ¦8 áU¥æâ‡èpqK>à¹æÙ¯ð˾¨íA`q»ýèô÷Îl8ˆÈO¤R9::>~ñâåËW¯^¿þá‡üé§Zíô´^?;k4ÎÏõ¾¸‡^¤ ’UûÕÅßçÍVºœ2YênžéöF­·¯í~§ýyçî7HèB÷b x¶á¼®<Ê™U‘õ…jTÿm‹ÞuGtCÑ~-õ¶p L|½?qød 4ñáõ«Û²|¾cþ‡ÇðÄ9bB°È…Ô‡y­°³˜ µYOF4Y£’¬NÄœCökÐúÀwö៺äéŒ<å _¬! ôì .Râ%]£ú˜”_¨‚'ßd·3 ³8-op¼cI6Db—8ÀòÐ^Š’bpA‘Ž•#V`êa±÷¥¬hl yKŽ^¥ð‰áÖßbb—Ã+š(¢Jkp£C[²£&>T‡<Ž X¦*aýùr¬«F¡½1/¶Éñ­@ŸY…“{+{é&Ú‚(6€TÌ.W£ *óÙtp¨¶ãsÏ+‡Ì‘ðð`Ó=û[¢þÆø7¦À1sÁŸ.èÑHÕÜ– ?w zbU^ «AÕ©FÕEµW½©ŽªŸf žðĤPG‚‚L,–È¡~^rÞRYÐËb‘N@ÌØ,Ê((± F¢¨3âéguì‰1ã–çÍ:ßãMg<Æps6¤:39¹Ív%IÉ“CF¤1¯át¬ u$ëÝ’â@¤œîå } Š?küНŒ~Ùöpe ÞÓÈCîXÌ¿DÀ{FïfcË _¨Õû§•ïEQ,%L c)UC½¥’t^b]½9 ø>&øm@®pº‚à!KYi}°‹Yk;4:í©×7k«yA×fÒ¾–ë›|ÚÕyv{‰ÌÙ¹¼isÂ>x×èwk¶}s†÷ÞÀïÔŒKÏ€ªÐ¡‚üIVŒˆu™³è¤‡1Þ&d‹ÿsÄ‹ý1WeË~-HRÁ þ”û?ÿ\yñ¨œk+QRÀ-Zxoêúd‘[Ÿe).‘2Êò´ºøYOwÌ‚C5$)äIRî êPèÙ¢Œ±Ì2hY¹* ªZÏ`bSgèj¥8ÞD¸_ïÖ L׎G¯+ƒ‹š}1h5Ú9\dʰ­¹IoÎxË!j¼ ɳC\ðЪ1—ô…/AÖØbòÎç1SÌ¡µ¥=&B€9.½òI­1Çûu®ÛЈjY®Ë߃+»ö®‘d¼]£xÞʨ7+:KY£f:\oÓ)Ge²|IKÖ”²ðLÚ¤»É¦¿‘I+MöyÈ’ì ÆqÊÔtp792ƒ¶º½G6/A$Å$Àî® —yql™£25,ëÛÝZ¿ßkž&y]mVÔÿUöc¨×Ü7U5›Ã¸|© §„»ZI*ßä&œ¼ê`ãXÒpÕ<újФF>Sæ–VyþüÌC£Þdò‹“Ú@ÖqºÑB4듉¨èËÁ÷0’å0®Þ9Ê;Ç÷pøsr¦LŠQ1íFy¯§Ä—×x•Žëâ¿@X²÷”ïáý•Ó¬±U$]}%:ÂV4*$e Ù5ÜËÌ!ª\üÒ¸Ú¾>£#æS;t\šVKÄ ²9Qe¯>M?öLhf4ó¼‡äßC6ïŸÅ ©rÿôžXOg%1*ôKÿäS]“ŠZKÏÚ YâlIØjaG§k\Êdë¤æÎ‚¯€¦S"óhú†ÃW$ÿ¼þ ì ›Vxœ{–Ò½ƒe²:+ÿ&Ö#LBŠÅ%Eɹ‰ŽEé: JöJš›/±—°lŽáubžü\ðçæ'Bw96ëÊ3rr†zú…)äLîd±eRP˜|œEyòYïÍïe›¸&ŸÓ¾?YQBbò˜I:›è¼c„òM'OÒÒ˜¤£8ÙAObòÙÍòú_¹3’‹ŠƒRS4¹&oªÛ¤)˜3¹V[_Äš‹‹33MA¬"¼(³$ª$I[¢„Ñz3a#LäDºxœXmsÚHþ ¿¢Ã•ÉÆ€suw)“알3U(!œuåRÔX`j…¤ÓŒ0lÖÿ}»g$!ÀëK>¬™™~}æ™îÖ¶ÏêpÞ’C?J°nøš‡qÂSˆç ð`”Š…ˆð¤„DIÅÓˆ)ã.©_gRD\J¸gþ’~¡hšÄ©iÁ8Né‡?åLñž¶Ð¿¾'ÍŠ°”ã:Ù¢»¥«gÇNçûÞJW¤üº7' Á%\.yºæA ¥Mš}’Æ‹”­(‘yÊ9Èx®žÑw¶q>‹ å*O™Â|°(hÇ)¬â@Ì·d÷²(@„Œn% ¬zñj…©Œ³§Pø0>$†^iG.uòdó¯†Ý.P?…5O%qYXÌm4#°˜¢ ñfR²É‹¶"ª¥ê_%»Ë)iÛK¼füV1£gÀ=qÈ$Ÿga“L 0|í{w£©Îð¾:®ë ½Ç. «eŒ§ÈcJ¬’P eD2e‘ÚbøúŠnÝÞª8×ýAß{¤$¾ô½áíd_F.80v\¯ß›ÆSw<šÜ¶&œÂ↠¯:××| ¸b"”EÎxƒ X²5Ç›ô¹@™õæ-i0Ã8ZèäPn_Ä¢X5 ;Ä„j-ø3W¤»T*¹j·ŸŸŸ[k$ñž|ÞŠÓE;4dÛOÂËV§•, ¸]¯ÿMD~˜á«úŠ•P²µü¥²ÇÒ„µ‘àŠ¶wû •¬fJ&¢µlìfŠÀ8ڎ־ΘNêu©r>\FˆÖ‰¼™I®ºÅAI±ˆ4KT!ÐÝÓB&«Y…ÛnÝ›Lfw½ÑлýÕƒe/ÆÇºQð:ÝÒ™IX*¹åcPzÍF ¢iÖþ’¥pÆœta×Ôë5‰øûK$;ÊØð£^ó^ù{ñþª^«áEXÚØߌÒî‹ -RnÂil:M˜ö‡ÞìÞùµ‰Jµèáƒë܃jØðôé8å*K#¸¸Ä kµ &˜ˆçNo»¸[æŒ{_œÁäVË>aEû~™#cU´Pß7š¨è|βP‘z%šÚK½X" /»Ë[Ç)ÎÃÄÚaˆôí­°Æ üyGçz¯«·†}Š7Fº~Xùþn£q5á₸ „ž†nf5F”é7„ "‰ë'“ï Yäºl5lû8ÜÄOûÑ<ž,±Ü™„lkyãûÙ¸çÎúÃ/£Ùänäzp¦!÷¹¡¶ ×yÑ¥^þkÐs¢Q÷ra5МHÉCîS>WÿMÐÚ$EUÃZ|rtñ †5)ZRüÎGs³Æ7ýÏÏ5 5ó^Ñ(ßÐt>Úßá¬Køô‰|Bgó/Û6´‰w¾¦\2`̲WРÛ02"Íâ,IñíÌ­ÆI€{Âìùççô÷…¸Rßiºˆ€Î}}û,jë(ãFÚ¦w$Ÿ²Íå<Ï¢Œ|`v`ÀœÁÀxÃh€‡¨÷¦xgsҹܘú‹ÀŽÓKƒwL.wÈÞ¹¼j '›Ò_ \ªÒ[ˬ¿‰ïÚÜ>€Ã!ó]2™ !Ò–^²2åçï !M^’po'Ó‡}I¢MCî§l>ç).é- f7ŽçÌÆÓëA¿gÑÌi8 ªD¯²Ì°N2[#ZVÂ"RF¯hjÁÕðá†)fÚŸeâ-NµË’3¤ƒu’bŸL{=lÜè"V1`ÿ'©×žµ1¢_ ¹œ€,N鯹®ŸÐúš …sOã™þ‚¡± ³ÐOá…wäçšh!-«Ú¹ìÂŽgBêÁˆ©|’XÖà­¤´&ãÒÞ+/¥-¹º,PÃ%˜Ø)yš;­Ý²Lê𖟸‰×C~¦äïDVÝìþÔjôtwiäÅÝÒX²G†öNÆÒ.þ¯„T=}ÕÐÎÒKíq´€…€nö  §$x´A¦êZixe Ý£õŽÆ¦š~D³ÇЉÈÒCHºð›y‹9Ãź|¦åCîšžƒ/9 ñk;ô€£©Úõ£w g‰Ù*o®FV…KmIwï½IJàNà63¾Ã»®üö¥©¬ýh˜¹„rjb…ø_&ðCd†qe+á´D>š4½4µx¥Kç Fñ±x”‹Ó2{C¼CÂ/úñãç ~z…“­´Êj°àO…qßáGQÈÓ|<° ”„!>Xq_ÑêüÊ ‚Zk<·ô¦2_ïAb7ͤØÔ³ÍnB«ÖÝ ÌœÙÓß“Öi1wÚÿ§TUUã(¦mýŒêÌcÉ ü‡+äG©…“øòSf ,U%ìIPÏË«0i"õzΘ:Á ?ñô,«ï¦®ÇØÓ ÑgÎÀ#·šQ‡ŽËFZ¨{ G<úÿó8 ãg,¨ÕÑÎ|N=qüÚË?š­l;7zØ{+A¶ó{6ÏÈ® T»™Ȩ}ð™9²Š÷uŽFÏ`ßæäkÙ”¦¬ÎAÙõŽ&2bUôÓSÐá|†Â[ÑFá?êÅçÄ»ŠJîºv0”½ÕÌj‡C…žnÊ Ç-ÆY(êš¹8¬nii¹£lUôª,tT€¨Øý ºmIàÈzxœ•VMlUVÕ4´D4uš8»IvÛ¸-R!n¢º®C£ºvâŸD¥T«õzmokïšýɰ—ž¨à „àˆ8p©âˆ!8‘37€Ä‰+óÞî:k'E²´»ó?óf¾yO|ùÚWON·JS1X}ÙVT©aUd¸!™»-¹›T•T³ÑM²TÅ0+Ý4c×xÙ0E“RÈ!³ÕÔ-Ik655Vy8ä‡ÓáúfÈ}çúµjÕM²Þw!ØÕšYOø©-E‚[¹\lš@E¾ï%¿œñ¼ì–h›r£qWÕ¶U*1M)Ûš^é6#×ùõL‰,ô¿Cb/œRIº?䯠öê²Xçû“³wûmÿ”uÝ~E&TDS ñ0½qÞïóùtÙ´t¢Wøu1,A1_"þ"†HÐ×ßnÍ-¢ˆ# ˆI½Fµ”*pØ™QOȶ¡4•“†|œ»’Ì»«È8â”1³Çä»ÿÒ^o ÙR&s¢²ëÔ[½÷}—ÈiÿeòîàµvE1Z q÷6–ƒ[YͤaÞ0ÑM3¥ÕlñÚU§¸u¿ˆLZ¶Ë.ïß÷û,ÕPjª\E5)]sN± ¾SåaÞÆg¢G´-y)R]Ô¡lU\¹þ-ìC<‡ ¿ßWÕtà$$Å Á ê_xØw ÜYÛÑ’{¤-=T¹ÐLüÕ€P5œtxj”êµ9ÇM„ó¨]Ý¡Z4åÒCžV‘¹RŒš.¶êœË`Î|4l'»ÃdJî÷ÊÌÁ\› •èö±í²G)Î4ü'¦MŸÝVfŒ7UÌmð¶þQÙ™«-<ÜìÛ‹@”|:toº¸v YÂYÑ2뚮졜¦:ÓÂ'ÈŸçÇV6 EРПÀ…rÛª¬žRv#Ÿ¼"¶tÚ³"·dµ¢¨5@S-Yo*†V "œKMd­f™ªV¡¼kʘ°®êZ“|qîò’ŠÑEícëvÉH š°]W¤:UÄ´t“©Sg®òÙù©änëŠ)³TP6†éFçÈäcˆvbËØ®ØäɅĺÓàVƒÎEÆÁ4Ÿ=z­L©ydgð°rBvC¸,&…µÒ­Ìj æÕ­–UvDÈÈX”¬Œ]!¿M s‡4‘ý“IŽM¿¨ºÄª‚QˆM9DÖ/òn±É7§ÈÏc¾AË£ˆà’V‘‰˜ôY®@¼ùzˆNÒ”ª4@†hXï=Y0Y Ḻ4ž:«.V[‹‹äóqaHÝRÔŠ¼Ãšˆ\¿™â0;³ŽpïÖÝþ…Hl"<ê­:²‡èÙþÄýS«.ÔØíèÁ)áõtq-Y(lÞæðÓª)wZF’dÃè4Í"¶fI ȸ4r78=ä•&oãÃëL›$§_"?o®8#ÒêŠÅ&9g£oC…¯CYÂ&Òñ¥£FrS³a—a¬œÝ |Gî·à(B@M ’¿¦*ÌŽ“Úôþ '²> Ë¡¡ÿiòñÃ2~Ü®Éfvƒ~Í*7‰«[ÖÎbÅX×ñ@7[±P ¥T*](ØÉ7´ZZ×5Ö>¥Y ¨š h‘òÑèÎá90ëˆÑØM1Dž?• ‡ÇÚ ØÂ;Ú•´’==Á‚‰.Ó™+`&%Ξ/ÞîXî•;mãs¤´¢e ^CŽ…MûœbIoÃÎX6¼°$XÉùìI¬'Æ….0x^Èÿ>D¡ÛjÂßqW4ZŠPÉÇ—cäÇðí;6sC˜Ù–Ì©[¹ò#YÂUì®äY¯;üô ½ÙøiLÏZùQ‚Üœm3HÐŽ9f"6ó¹læþANÀÛB6…ÏT>,F  ¬æK…ü>7ñÉ»·´B'Ǩ“›ŠúêWƒ =Ê Z‹9õ÷‘¯ççÛ aP Ñr\ªê²Ìy›9”Ö…+6ŽÐŠ;Wc%wµCÿ¿ègÒ·«xœÅZmsâFþ ¿bBj½ÂÁoîîÞÝ+Œñš[ v|¹”J–˜¬‹7þï×=/zls—ªd?¤ÐÌô{O÷ÓãœWÉ1±”ô–0Ç'—tEý0¢1 g$QÌæ,€nèQÂ8œLh8 aÉ/RÎÊ9¹qÜþ‚£qÆâH“ŒÃpâÆÔI¨G6¤qƒ”…sĉ)|G·HˆÑ­“w­ÖßËÒ2QH¼_ZÇ÷ÉYp2¡œÆ+ê5á´4´âp;K4dSJx8KÖ ûœl”¸N@bê1žÄì!MÀÞ„8wÆdzl¶A>°–xÝÚ-¹öU7\.Á”qúà3— ˜KN‰Rq…/„ñÈì/ª}N(ú˜¬hÌÑgš£âÑ  á$¨$D&B¢:2r‚ ñÁ«ésÆæ6y„‚÷ ?€+X´fà¸JRNg©ß@p˜Üõ­ëÑÔ"á=¹ëL&¡u‡“E»+’[F>ÎàÉØ ’ ¨/BÔ›t¯¤sÑô­{4âªo {¦I®FÒ!ãÎÄêw§ƒÎ„Œ§“ñÈì5 1)ªEe‚ìsèL„òÅ£‰Ã|®m¾‡rPÌ÷ÈÂYQˆ¤K$qˆ ™õb”„3ý0˜ ãà\î¾sÂf$“†æƒY®Z1ºFæ Ò.’$jŸž®×ë&¸5à'—6Ãx~êKüÔü³f«-"Tø´Zýž®ŸÂ­zÏ7ü4ÙD”7·–yâ$åÕ4€Xzåµ™$~yÉgK–†ùb-‰–v°r…š‹ÚÖNÂ#¶»š&ècX®¢.ಋÑh@‚ƒKðÕæ49×iÀÙ<–èû7ÃÙìYBŸód‘íáÒ ²såø)%ÈÉY¶åBYIˆ»pbr Ghà,éyIËÈáüŽúþç \å-‡Ãî:Œ½½ £M±ì9‰s^­Z¦i_wGC«÷“EÝÊÔ×´kÁ^Qóȉ95$_üvF$RQŽÓ‰çõê·jµÂ!õÜÜs8S'ߪ×lËÞ¶«• ä !˜]Ó¯£ø’ºléø7È‘òuƒ´dÚZöMç§U*Dü« o'"Õêä;гŽÛ1MÒ8.…ÏBHÁ¹öEû þ’ºð×u‘á{^¹—]ùŒ6;‚ƒ×Ëœz^ð:fPÑå©CÅzB,*  ꥑW?WÚÈ­d8 DÌ*?œ÷â8Œ Û¨RÌu²¤P¯6ÿ juAXù´+v&Äê”Ñ(szËW½b”®Öqý(»Jè²÷:êödǃHKñ¡þ‹„‚ú* A¿Óë‚Má>Â9k2íá9êCmÞÙ½ê L±]ºß°‘ïl)ò¸­l/-ù‰[|SÁºæ4`."¤\õì¤GgNê'x°è+ˆ»ú„¢ñ”UUÈ Q?2ò*½©»ô°J`vÁÏkÜkçbII‡…‘†ZÏj' rr²SO¾ ­µ, O§`Ë» “„ 4óHã«Ü]o0°?GwCÛìu'=«Žˆ©5¾!œ¬ƒ²–"ˆÙ£ÄròbïQ!BtJ ŒÖbΘÈJˆÌ!Y´< -ÕcМ9`Ó%ãˆux&cxÛÇÊõ¢ùesöHKr‡éòA‚]i{Y'àÚ˜«³× ™ª’R2G,6 ëƒšÜ ¼q"˜£!p0Cº”D\Á"p!r.¶Ÿ )h({Ù‹pY_bQûŸy-•ªþ‰,EŽ8b ƒ‘«¨"e~t ¦p°P-¢_Æs·¡:å1|¬d«íóoaEËsõ=¼5­Ñ¤Ècôð+uµ~5è|"³áª“$1‡5l?¾#©fT·Ñ·Â;´¸M^Ü[=rÏð ÚË+‡9 úÝ{¡Å8¤·iž–xj|coíËŽÕ±ÇÓ 8MŽƒÌ9#4“M\m¤T¼¦¶¸¦¶¼a?ÿ‚•eßuT"¾ölHÍšUê&jV ˆ<°E}«I$ Ëz€òo)ƒ¹Ç§KȤ†Ð­Øã©!ÄÅ!¯pM .Å«&Yx€Od·â‚Y@¶¾ÚËKMU*!AºÒñw "M}à$•¥¸ÖP¶á.Aª 嘼Dð¨ð³òÒÉž{ÊãMEüç!©L™yYŽ`Tí\áx¶¸Ø®XÀ»}sñŽVE¯žS¨ÏÌ…4º†Ø§±ºÜ†¼ x3¤ÆÚ¼´½ö¬½lGíöc ^©—ՔΠ±X'§ú»”­õ†„Í Ñs¤1¡zÀÜ©u*áU<#’»¿p"\¦ÐDa”[1èÎ0¹ 1C–kP3ƒg¹èÑR”­I‹‘"èƒïª0-Gk»zxA¿ïjÙ“Ã?rmÁÚ²Ã~˜c.i žµª„d5e•÷¢êÈVÊ,V< gAc¹/°þ®¡†¬•uµú¾T4jÛâ©g7„:ÛuÓõ´.'¨ U«*øDêá¨mhOJ­q8[¨¯Z¥Æ.ìîŠG˜Ù‰ãºø4%¼ùö ‹žR˜6# yÁs‘ï8KHlòÄÆ”ý3ü Þ]£ÄBCçíÇ Í&Qðé¢àç‘=¹ ÷™X8ôþ‡# éî7\Ü2,.€x^’×Ð?@è’ ²å퉜T#¿ÿ^:‡ ¢ƒ’ŸÜc€ø`ͧZcq!_RÛõ|ªb;¯ªåLVWÿc–¨…¬ÙïˉhL¨f–BFBã—Ty&­þò¬²m8õÙØf>†nÇUûoOÅjÊš+Ÿ\ºâQÙ8ÒO0¢$ N2§ÝnÏ4÷õ M DãR[Äz‹Á'šîËè¡.!<ŒÆ£êÉh×$ asæ¢f!ÛÑÅ¿z]˶îÇ=@–r]s“_G¤Š”]˜ve¼ £²ý©g;¦yw)n ¾Èë¾)««>Û&P\É‘†¢B187HaBÎÒ-Ÿÿw3ìÊ›èá¸0‡î¾WZžvÛ6‰Ü{ªª‡eT†Ò¬ŸßÆH€uˆ¦ñSa”~Ÿ÷D³$IY#–4(¯ÞJ*˜®úoFvžQ Ñ&MLýât±M$#.¡˜ê¯¹{tßç«ü¾½*ÞêŽ;¶yÝ9³ÏþѲ¯;æµ=è ÷(±3À¬vçžÛ 1g~ã¶/„œÇäºümOÍΧ^†? ãÙ î¶ŸrÎMœŠòÿÄ@Y™¨ãŒ#kŽLyfyË%F€^¬‡ý¯ö&•ÍäÝ–ú¨þC_bÉzóROþd-<<a–Ù„÷ŒM;ù¶)K(‘´pw°m²‡)ÌÅ?¾3t†*Θ'–9îXÖ¤‘åœÚleâE†½Þj¥ ¾øÔm èNPÜŒ@\ý}L*[¦ø f 9[oÅâ-"©\}|Áo5x;P¯ï=:c%w“¾Õ³»×ÓágÛìÿ»BÎZïþV­Hl\Ö声êMÍ]¤Áõ¶Nm3­bûÏÝÂf»ô0§Ã3VƒÓR¸ïeÀù3ì©wÚ_êªø¼Zü•g*åˆ|2P Öù7&$þ ŸcÚ›©À+³Ô÷7d‡@ûÆSÏÌŽþ(.ÌÂßç0ñó¤o}}ó•oÒºNyµQ~½ÔúÊÊÎJ‘AâmQ Ìæ&™•,nW+ºõâÒ6ÍËø.ùiެ‹GáþŸ[^[\.ÕpY³Qq5X€)øDü_¥@‚Zl–xœÛîºÕuC¢Øæd±#ªä<xœ}RMOQM„ª3)m‰Ú©p;¡é ¡R6´¤`ý-tŠCB†™Œ óš™ÁÒqË7Þî]¸dcŒ—.LŒ.å?(®Üé›~Ðib|«™sî=ï¼sïÛÒ¯‘ãÃ><é{Œ‡ý¸Ò‘5j9.h›ª c´n»¦:Nw\Õ54˜+—ehˆiÞ³Øg/§:[e^ðºp:ð#ŸÑLžç¸39˜µhof¬ƒ˜:#$†p~ VY­,•¼Jb:äôÍ¢¬4ù^W~f O.†n5ºüUùÿʶM?X’eœà>ðqÈf› žr‹­œÀ+ªS[$‰5štãLo~[/×\ƒZ"~ä‡ðE0᪊²Z))Krl¢zœò°Û eùÎü2lVkÛ Ô4´3,ŒŠÆ,d'Û¿5§®¯šÄ£~C ¥bFæ`œyÞju Ð9(†G®Ò×t›­³ ²[^>'6í½üÂÉó9<ÀÁH±Ÿæó T#:~ŠLŽˆ©ÈI°Nmp7 LÁ×*à¹Á ¾~ò§+Áž?WLÅcV–7âÓ>|qø¾Œ‡B½éâìµ8þI’ÌÏ7÷§;¢ý}hO%®„¹^•ÄD°»i££½·s-óâÜrµcR·óKô2þH¼Æãh_Å ÌÅø{¸‘n^ ²ñy»ñ°BL¢:D©©­§åµ'Ds% &¯„6¨KšI‚wSÃSv«\÷:‹÷Aµ‰ *³¥“]Èí¦wALëÒõK˜¹ö,>§Þ„lâîØ–·þ€ÿ šû.xœ›*ß,¿á‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚Áæ,r,“Å8lVæ2eâtw p wÙœÈc ŠAr±†xœµZëoÇÿlþŠ_Õ»RûÁVt…1.¨àæZI„ÖË«ì«;»æâÔÿûý™Ù°ØNn[µÉ2{æ¼ßÛÆq…Ži²Ôõر\º BQ0§/‘³p|¼i3AŽd,"ߊ§|ý*‘Ž/¤¤[Ë^ò@£0ˆÈ) ƒˆ$Ù‘°b1£‡5u¯nùfެHàw¸¹eLÕV~>;û¥ÎþºI3#È(Êi6]—FŒHÒHH=ŠÙ) µ°!Œ‚Edy,Î<‚d0Wàà’ÖAB¶åS$fŽŒ#ç!‰!uL–?kyÁÌ™¯Î=±’À'Sµσ@ÃäÁulê9¶ð¥ TùD.• ´Pdû’„ƒû=ŠH²JÎSŒGÀAÕŠ™IØ'äK5Fdùkr¡Ûìê>as™fäø ÷ÆÆ°B¢•Å=J¤˜'nQ˜>t'ÁÝ„šý{úКýÉý%€ãe€·ðÊñB×fh2²üx ö•‰Ú£VWšWÝ^wrÏBÜt'ýöxL7ƒ5iØMº­»^sDûÑp0nŸ³%´›”)t®Ì¯™‰Ør\™Ê| J0æÎhi= XÒ€,²á_/ZI)Ó ü…p¹ú.É™“Äõ{ Tõèˆ#ùî2ŽÃ‹FcµZB­¾„lqD‹†« Ȇºç§g§á2d†•Ê¿ßvÄÖazÓ$fQ–‡[DZ >­4”Œ}è<")b²—–¿€¦š[®Œ“þ°Üj „ôŒÉ³bö VËíö©IÃ;¦p¹–7®µ ¯• ‹èØ·=ÿõlÚiŽ;Ó^»Ïæf Ú½Þô÷þàC:n·Fí ü$Eô8ðwá†UQ/¢Íjy³Zå+ûØ~¯Î.ÕÑïØ(½8¨Œ_5çùÁቬÓÉ Iä!”{@üŒ1€d',_{¨²i9|GÈÓÃZ R‹‘Zå3>¬3¶¦zÖÅšy( *=ª)Ga3 ÛV¤1´ø‘4N®pÈÅQÊP9š޾ ÁØËvÈ%É‘:>²¡ …í̹)÷àÕ‰çÙ`{“³‡BL–m‹0¦x Ô{P£Ô–â¾Æù߀Þp¾\½Êx–@vH¼Âùî=Œ3zdï×d¦]Ãâò#»ê<‰T/¤. MÝ…‰ïPúäŠ?Åi’åÿ¶²¦Ç(¯kàI§;¦fkÒô OÃöè¶Ùo÷¹Ç¹¦V³Oýöí]µé®=è·Ë…Y³¯ÅfÐ5“8ð8Þ¡®5ÚàPJk.G_€2%Ñä |@ ÙÒ<©v]÷ Ì»Lð‡iWÒVB(gW÷ª«¾ÍM`,þGèO8r…Œ@eœs›”VMUÓÊ ô_&ÙKÆ9ïDå¼ ïÐ}ý|†Ú u2O" $UK³__&Ɇ“3rG‚Æ1rž´QgVlií>g‰ÒádeER˜DÉ¿-ðV§ÄÙŒ*qJtkö­1@jª¼[`ñGù㸆`×â!YT9ÿpñ`%x<ÌÀJS¤3'.³Vs/«ˆïæwö:¿&¯ÿ3 »õÅ›5¼L“ù>޳î}/LjïVñòí*þg8þvǯ³Ì£XV²nJ \Ûáfæ¢ý!—|·Ž×oH­åÕòå mÂZÓ·îþË)<íP¸“Œ¾´zzªZ‰¬Œ™ÊèmÎÛdgbn%nÌTQü’ȧ“s?WÒŸg˜òÒ§ìÀŸ;‘×3 U¥µÓô'íÿLhÙ |.ôzÆê0GËIèq%Ô3»”¼Y:«Y:§?Œl3Ôw†ƒ^·u¯® ×±y²×55\±qúw½ŽT–«ÙÔ~ Éðã/ŸÍK‰É»$~ …ˆM-¥U# è¦aýQõ¦Ùíéüô¼ž.g†Í1ü\ª9UãÐûMÄcu»ÊŒÕi'Ù¤{ˆ:±x5z÷¾¢ºj|×jµÇc}ð×_´a!²2„0ŽºwÄ c¼E”ª¥È\Æ4BÊst~âÀ¼tüíF-Ý‘m´<¹ã@nG‚µ45«¦†­i‚NÊVFwÈ*ÍÏ È¼ÏÜ;ÐF¬j‹ÖòÉõR¿5ˆ„[ój¡Ñ>“p+Y£>›VµBÒ6 Ñ߬‚hV ÛùtÆÜ¶y_»{A¼8J©×u:Ó• ïBV½&ʲßJ%ùå¸ÈP2»WŠ-×ÁÁÁ"ÀK¤[#ß³¡’ê'TW0Np”{ýŽ¡+[è6qŒáNªƒ­æ(ê” TU‹‚ãË‘:Ô+”~7¦5)õ¢'§x_ ‘0•Í(9Ø'Z«üúå€y5d6‚æ[ÃF¥[ÁŽë§f?-Ø}SÊêêhá<Š)*äóÔ•¡fä* L9IU¤d:×(L•Ìõ*¥ ›epV~rlCšµ óªí”Ìöf:-›XÓi•èÖúbFÁt.´ïNpÅhÎKV¾“©mC›…Ê%å±­ÅδeÊ¢‰º–ÁÀ~!.2àðSüƒ¼ $^ðbgÇ yƒŒhøU¸UÏ 'RªGåo@Vpº±ë‘’ód eg_4X+ð\h¥Ò¦Ogm{25¯-DîeÏ• oŽi8m¡áR~«/&>ÏÚ0WÓ*³OèjÜBrwüDüûãºÑÿœRÈ*(gc<Ï«‡?ü"¡ÔÙ' j£¥höǽæd0_覆Á¬9w pÊGtnB­ûÕ’n…ÙÛlÔRGY[µéê'$âXÕßyô‡WþË|䡯‡éîü` ¶^8Ö‹uÞC©/‡Ù.½ È2@é¶¼ Æ60zkZ òÅ€7Û¥€žÜØS—BÎ6QòZ¸NlaÜ ¸2€%›àRøØÀ«Ek)ÄÚ@–¥€O ðYE£ïÄ]?vÇkYÍÂs!àÊŽ=ãò»+"“øµ_²CÖéвåú ØꦎšNšjÔHnx J˜ÚiÖÕ' Õ1q쫦á¢g(¸¬øæH‚ª·ÕÜÙÚ[ꤨeóBI—YDZ¼ª±Wßruj»(‹[Ð*"Zªù ªÚé·£1«Uôï¶—Ù˜ÕõçýÍ»˜G¤«­j{þÙÌ{Æ W§ âôÚ ´Iñÿ…Ô$TÀWè¤ß:mkÞtÇj$úž‰h×’oŠòÆß G¢½X.úîW2=·¤ *€gVØ‹;gw’9Ò_…_ 75úbóê¤Mk6…QiûªIšÞœVK– ŠŸ~J‘(±2dbÛèÞLb¤ea3Êz;—ïÒpÊ·o@¥c|óŽfö`G„ŒñìüQsÇ÷{éöOµ7Ùô¤vqˆöíVž@Tþ¨i=§=fŽ&¿Õ„[ îIÛQDÙrQhŽ«\;æÜН|îÜHZ”cm¬yâîWp>˜í·¿ö ‚ù/Ô`bÐsuzüxö™1éÖÝJ~Eù,.¤%€æ y¡UK_Èg»Ýj±Y¥"(3`ºVGw­ÿ5çAã™3xœ{ð `ƒûdoviÉààxg¿׈… çü¼’ÔŠ[ƒÍ)ìÏù8Ý]CƒƒÃ]&Ç+›lîÛǪ“œ˜çœ_šW¢`g«`¨ ¦¦P\R”œ[ QT\ £¯¡T©¤©©` 4AS¡zs¢LÓæ÷ré,“6Ç+3± (Âã€xœ{p.`ÃrõÉkÕu'?PW™Ì¥_B:¾®xœµVaoâFý ¿bšª’I†Dwº†K%BÈR¨!Š¢¶B޽Æ+-»ÖîD«ûï}kl¦­îŠZgÞ¼™y»‹Z§Sš¦Œ†’[ ºfK&TÆ4©„,^Œ4Ÿs‰7}3âž–iZ®`uáW¹á’Cwa”º\u¦táÒ¢±Òna(Ò,´,¦ç5 ¯î\䎅šá9[#]jÉë7è¬Ý~×t¿ï÷sn:ˆã9{BPà€ Ì0½dq Þ›bQC¦Õ\‡ WN¢#£»ƒ.­UNQ(I³˜«ùsnQµ¥PƾҴP1OÖ¶\Æè“kØ-LÕ±¾Z,PÐ8<¢[1i…Èê,&-Zà Ð…]Ú]bñš–L×’N…Xb4 ¼Ð:’˜Oæ‚(”kèí6ôïŠ}©)&. ìÃÆ¨¨hÅѸgF¹aI.šÎô8œ~=L©wÿD½ èÝOŸºp¶©Â[(fÅ™à@F'u(íô‹ ‚þg„ô®†·Ãé“+âf8½L&t3 ¨Gã^0ön{‚ñh2hM˜£Å629ÖФT3raªšŸ0Ab"¦4\2L2b "èëÍ)ÍJ΋âà÷Ò¾.ñ„¤²Í Ç©­Zr¶ràÖŦÖf¾¿Z­Zh«4˜SÄZJÏ}±I`ü(V»•¥™#ì׿ç29¶ÖGcc®ZéÏ»¦µñí:cæÐllh÷­I$­Ø7å÷mLkù: D!çû6É,ö•õ¹tö:—–!—^ƒþ¬×kQjmóì×ßéF*?µv“:?7«gò¡ÃñÝlÚû4 ~y˜õGww½ûkW{­rAÈæÛ9k–!‚É9FpÜë]_‚ëÙdCåµ{‡v>pŸLgýÛtæü¾t·…0‘Xfì7­¤ýo*ùÐÞ.*—)¸ÜäØŠ[š®ýIÜÝ,0Ár¥#î8‡$ÆÊiΣ?fKßf‹öI“F³àú1 † HÈ}¤6¹)ÖjÆnD<ÈðY`¿©¢ØÀ€d[¿É“"¸6WîmngREBÛä$^in™oV¢À‚ÿÁTâ•Ï ‡Rrp1ß]VU85öH ´ÆWQ”kw¨¤ ]"Hµ`XÅEØÉ8ž/è‡l›T|ŸtA¶V±Å=ÿ3Ù=®ƒ–cç€_³ÓÌäÂ:rÅ×TKžŽƒfË+ž‡¼+ÚÒªTxtêy98œŸÍ,6*Ê?¾o¼b}yIç^³†ÊpÀ9žë C\Œ#.³îÖP¾ÚkÁnûÂZmãa‹QmZ“G®sÜ8%•:¢.Ži«Ü§/ó* o©«tùïòª¿F_oþZ…Uÿw‰•‰5ö ”ALà2w[ì(¤*ñ@"éâ ò’¸”Lu4]lOpÍl®ñg.êÖáÿk!NÝë‡>xœ{':QpÂÂ˳˜'k²\Ÿ¼‚µ›Éšs³ [6c½¾–‚«Ÿ‹§£Ÿkp°‚gpp¨k°‚‡k«‚–>§¾~njnrA¥†‚ZjQ‘ŽBqIbQIi¶™Ž‚‰‚¦µ‚¾~Z~‘B@€³™ ''²bmc冚ÖhòF`y/°sl X`‘GÈZBd'_d?«˜œ“_œª‘–ä+@AQjIiQžBQ²5W-£åN/é €3xœ›(x\`ƒ kQjqjÉdu_FƒÉ¥,*¢– úZ !¾ñþA.ñA`ù[,k„Á*uŠ3«RóÓ4 úæ²JCMØÏje}gµÁªÖ‹Íªb*ÛB(Ë–]ÊŠ…³jÙÅ¡¬Ùì:Ìyù%“ϱ7±BÜÎapÐ?Yæ €xœ;.°Œ7‹ˆrf^rNiJª‚M^jI&ëgæMfgQõçä4ÐQ0´4ÖáäÔ×R ðqt wö÷õuôsQÐÒç+‚ CœԼô’ 49KÎÉsX$6ofyͨ‘ZT¤`«W’Ÿ‘£¡ ¥¡Qš™Wbl_¢ ¥©Q”ZœZ¢m¦©© i=9žý,ò+î倥xœ5Êÿïì°Ô“a = 0³Ò”³~h“ 3“ÞG GETPASSWD“.æ³UïÀ3¼ÞxœWkOãÈýL~EM®.k£ÀJ»È}ÈÏ‘!Qì,Í]EÆîÄÖ8¶ÕÝ&ÿ}Oµí<˜ì.ù‚»»êTÕ©G7½³‘ f‰N‚”nijHóBHʤq0–É2Ép2È#A‰‚¤2 t’c—Õ¯K•dB)ú„1AT¹4"]šä’?…RZDô´¡áõÖÜ“£@ ¬‹ ÌÅš¬M?^\üthmkŠ•[sÒ”¦ ¡h*”Ï"êBº Þ2_Ê`Å,¤¤ò…^ÃvŸ6yIa‘Q¢´LžJx5YÔË%­ò(Yl{e!¦Þ­TÃÕ _­ʤ|J“FI(2%(€UÞQ± ž!ÿ¾Û} ô%= ©˜ŒË±Æè<°ÍN"3+Ù dJÁêVõÏ‚ÝÅQ’ìiÆPÑ:qO‚J%eÚaÓÃпÏ|rîéÁ™N{ÿ±aç8E­TPɪH ƒIdz÷MŠÜéà*Îõp4ô9ˆÏCÿÞõ<ú<ž’Cg곑3¥Él:{n—Èì–¨ ä¡ “ÔK$t¤ª‰ùTp,(ž2Š@…¨¬¿Ì’!3ͳ¥ r;úú”,(Ëu§Áá*UωX3¸fÝXëâª×[¯×]К)ä)Ý\.{ie@õÂ"½ì^t‹¸`‡{­Ö?’,LKtU[«¹VEÒÛïvKÍîoÿk)4* ÿ§ÕêõÂ<Ó2OÓª¯’¬@ZªúP-¥Q]!]Ç#zÄ"üFÿ&:sûG‰ziz—åë 矑ßóæ·ƒñ½ïþϧx+âwã‹~«QN2ME •°à„ÒfŒ ðT­Ã8t8ri·^[­fÃe ›^['a€dþ ~¸jœ¤ùòF<•Kknµqaæ,¹çP 9Øw6[ªîÿ³¶m÷¡ò.$l`À|ë7¸òïq¥à¦€«¨÷Ž‚0Älù¿¦ä½—ï Ì£3uîh4¿»?ÜÏ=w0u}6”h™¼˜ò&òD­V˜/[“‡©xW$A™j¶*….eFç—Ø~k5K$çm›žçˆç£)­î°*~V¨Þ¿i)¢ðÊ@0žõð¬#cÔ·ç;þÌ›ß =çzäNf×îÝÔun¶“ö´Â;æÔ^©ïÓ_?½Ü,ÊÑsÕ–[N-BƒŠcX_‡¶7Û+ ûûd §Öj‘ÑRN’P9‘–€øR-Bí§K‰>àBì¦$’§–›¸â€\/N©g«=%&†RMÕœ0­¥б~NÊõìû€æ>è„=?¶P:àKçþà,ãËú•ríÌ¡çê⯵·oM¤Hâ“€›€ÇŠ'ßaÃn¡—Ÿ4aB#AzàózÃÖ v^ŽÊ.®¸m™È¸u¨UÃLŽPÏ\¢©1ò¦MK>"âAè‡ûA´µøÝNoƒ¬Òïø[3ÝÄ?ë‹/j#i­“ÛXÈÑC=jÁ#qèKi`—Ÿä&c‡‚ÃqbÆ«p#¿/³^0E÷­; é Ûê\\Ï.ëBôs2Á9™ÿÉââÏÇ+@àWõ%l¿î^.ð£(RóUüla ß[¸‰ÔÏT I?& gÎßF„ê#€¹Exœm‘MOÔP†SzÇ™lGrŒ"í F¢ &:œ H¦%QcBšr'½éL;é½Á­ wž‰‰Ä;lܸ31úܸum[Üxw÷|½ïyΛ›ï+žgðs&‡Ï2ø5SÇ}…« ¿Û&0 wN,Ó\¿W°b-pë/èÓ8=‰Ÿú–ðeÿüqrQ]";6§0ÎÆoYf<™„¿³—ð «áâÀÙ<‘C*z¡“:ÙÃÃ!eªI7žšˆX«Ë`¯»V·£ÁZcÅš™†nÎÛÂ6w4¸ûÈ2 \©¤]þFrÚ¡¾X¢ÛjÚ‰«r­?)Àò;|L~b=·–ÝbÂ…1þñUΓðí©Q¼¿ˆG…9,syæ `M'Ú©6¥£W,ã·bMÚÃ…Òõ‰Ô@” Õø£éc> _´Ím®Vu‚û¥1‰á÷ÒµtíÈ¡“J,Ÿ>7ËZ ¦d"ÆÕšÇBjoÄ“UÎvhÐRÿiU5¸âà™Ñ»ƒáó3[.s\h±6'º…Í|Â¥À©Ñ¤F“ áÚã84<"Uq_QðöÈ4~QŽfE“ò^;>£èvޝðýÿ<¤Pª¼þÓ·ø·®xœVmoÚHþlÿŠ)'¥&r€ôt_ÂÝI„’‰¼Èõ¢^…Œ½Ø«[¯­Ý5)­òßofÁDɵù{<óÌ3ÏÌÎÒ?wáÂŒÁLrÃ#Ù–‰¢d Š üp¯xÊ%~ ®ÑÓ0%#à ´Røu¥¹dZÃmgô„®ª,”uéÁC¡èAC¬XdXëÌ®o)²å‘bø^î0]fÀwáÃ`ðÛi¶C* ~=ÛHBCÀ4S[–ôл.Ù—ªHU”S!Åèbcž0÷vEq$A±„k£øº2X¯H&ýBA^$|³#´U2A…Hd—ëF«q‘çXÊCµ<†9™Ô "ÌJÙâ ëoÓã¯`Ë”&1.Ä=†ÈÀ‹ ‘ÄΔÔ% Hî@ ª‡Ð·Š=Ö”—;Ã6ã¢bEO…[3¨4ÛTÂ't†O³pz¿ at÷ŸFA0º ‡èl²¿â¬ÔPŬW¨´/꺗â²7è•YI„ûî/\Æ¢ÂCõ{Ê ö´—ýÙ²i“¾F›ãôûTqÂ6=`_¹9:uL™¯Œ.y/븮Ûï iT!D}ʸ,±Iõ´hWœµ…Ñ•07"Já¸Í“¡ë†‹Å*˜,–ó4›isS á‘}>ÜB´ÊÂ2ïºß]§å[c!NˆÍ `Êj·ßªûïG…SË✰©´Þã ï\ôé’Ž#¼yÞ«÷X9QýÈÖ•mTÐБbGŠS)ÎÉ‚ ƒå„Œk<6ÿâ.ò¿^Y?«!0çù éÀ·Ç>¸ô,W•Æ~ÃR¥ÛÏ_¬”v›c¼Ý«¸YöôOþ‚¹ÑÅùÞ9Ê(‹FW9“XùÝr>÷©¦gÜ]χöŠÃ þð‹öêD”2ÉQ)þ&Ly5)¢ãCG!<åÝo_û§ù7Vl<2w¡ß¼žpíúu_NÂÚcD‚ÒYS1º½Á‘T{/Z]_N¶¨Îÿý˜€Áäˆxœ{.zSt7‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚ÁfN–SŒ›_³fœ¼]eócvfÔ§°Éxœ•VßsÚF~†¿bCgá‘Nû`¦2‘ AŒ$Æõ¤,tÐiîN&8ñÿÞÝ;Æ!×/Öíí~»ûí£wÚ†Sˆs£’kžðž=°BTL‚X€Æ‹@ò%/ñf æ ¸BMÍd™j.PJæ×µâ%S >¦YN_¨*+!Ê9L…¤™d©fs¸ßÀèú#Y>ÓƒT2îÍ+  BAÈ“l~ŽÚ6MŒ¾’b)Ó%²Œ ½Fß}؈²´Éæ\iÉïkùjHËyOHX‰9_leu9G†ˆŒn¥®bµÂT¦õ}Á3󌕊AŠ^I¢r“fQ‹'t|}û°nâS<˜zI4ô.“Ë_/’¡ “±?¡PŽŽaßðÂ5>ÂE´Qf®q:KV2É3lÔ!¾Ž“íàŸc©%N]èývúå :]Ì,œvOšvvÍ®À*àŸ­Ã~ã|ûF¿ šu Äúµ1Ð.ö¥’<ßà³ÌÌ ]2ý}•v}Ï@‹VѰÚAfŽÈî®—I·‰ï·=µ»îš­v¤'‚ûžW×î®àú'ñÝÔOì<[¹ýN‚©zqvNö“þúÖ¨Œ>n­È<_Î+1MâŸßu÷•pÌØžv~_ëå 3PKåøcvj@œ-Òòb©YÓƒýn·ðÿÎÓlO|@Z;1¾3 ùtÜÏ”UºÚ-k´¥Mý/ª ç ¸mxœ{':Ctƒ 7'§Ž‚¡¥±'çd}Vim‚ t8õµrRóÒK2´ô¹8‘äL&ïcgkê}Ë¢‰n–&’zÜfYpnî`=ʼÙs#í»á›.xœ[(?Q~/«dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚ÁfnVy¦ÉNìÕ›/±ë2N®áâ˜ìÉe<ù?‡§»kH€cpp¸Ëd/ÎéH¼Wœñ“[¸ž0;8nÎâæ`1&gqkožÏËÄÂ?"гïxœXmoâHþ ¿¢–Ñ̘c {wÂd%BÈ º" ³íc·¡wmÙí0ìiþû=Õm›¼\tiwW=]õÔKW§{Ò¤ZnMB©¤Ð¥xA‹„"Ÿ6f‰\Ë;£È$SH*‘„Ž’VYý"Ke(Ò”nwÿA4‰£D‹Øt%üKJn"%N¢uâlÙ?‚ÒÈW;œ= }”‘ë„”O¦*‘™‚¿ŠœÐëF m#Oú{ÆÁZz`ˆéuÛ´àjm·på6{¤K×Òa*ÈÁ©¼’n´ó ÿ«fHHè'ô(’”Éèˆ9F‡`å(6‘‰Y©Í@N¸§¬–ª/9{ðÉ#jì ÂŒ_€ vÄ=ÊRágA‡! L¿N–_fwKNïé×á|>œ.ïV›»È%·q &'T{˜¯C4ž¾@ex1¹ž,ïÙ‰«Ér:^,èj6§!ÝçËÉèîz8§Û»ùíl1¶‰‚Í&Až#Ô×á@¾xB92H ŸïÁ†mœGHºB"È!™õj”4™A®µs;Ð7 éS©NÃYª¥Ø1¸bÝRñY·»ÛílЦˆ“+ì(Yws@Úuã o÷ìx³ÁÝæ;ºA†¢úœîÓnªeo~9ZUûX¤õåP(¤½êÊðH\y|ÀZ£Ñí2Ežðmߥªe!òÀ«)¶T¼]©4–ö¦Õl6—‹ÅêËh6]Žÿµ¤Í(Bý}WtN½A³Ùí¢¨< ^QÈ@‰ù˜©Ù "¤Ä–³:Ù“/a•%¨°‚ÁX‘åy<¢¢Ã¸ŽŽ/òÐDB„ÞÊub@ˆ•°ÚvS†ŠŽW›ÿiá¼Çþr³ ʉ•¢@›|N^[‹ååx>_]M®ÇÓY{À">Y¹Èg굉!‰Ð“(±ZOuZZ‹jì#}êóç¦1d†DÐ4˜*ËK̶‚B±«Æ`'äÃ*µYÁ*Áâ9Mﮯ [Àa*róà óJå×­ý‰Dàóè™|GØòˆ™s{ô StjñbY~»Cu× ƒ|c‘ŸŸùŠ}ïæu[u)‡^`о´åH\¬è{¡žîñuCr8cÇ ù#OÞTqßÈ=p!çpD‚=guäš[*ó}Q°ƒ,ͳͫ'½Nð´ Ê÷Iªe h b7Ý“œ<—ʇ”4ék¡F&êì w†‚ãÿy"oÅ6•ŠA³žµÈ–Oý"4°í¸Hh›¥Ê´G½ÌÑ4B·CãCý&† »Ïyß2*"s%Aß›hLwcÔ¯š@>Û\¯˜}HUû¸°Œ`™ ë`¼•)s&î‚–TÙ©Zé¿P¿¨“bÿsU ÂÃUgÜôqïùJ\GüÉCÃ7³ÇýƒX ¥x£ßëá¶V©å$RqSkÛ5³uôPN~í Û†À,U,>/÷?Q¿ðíÿÉ2Aßê ,Üi?a*ß™*ž9"a*ÅåªjX‚Tˆ?ŽÃÒCaŽÇÿ\-ÆË'‡…×ÂÃÐ7:×¹p|\ìTÃs|ŽÖi×­^³pÃ|vܧLþ¿Ô¤j-è¸çÀ¬ª YëbÇ f³´³Ž»õå´õ¾škÎBPr\Ùtâ¬Ò?G[‹½¡oÚåí m–ñvÐlÜM¦ËŸO)“‹ìaäÄX¹¸_Žé$.¿K ’êZ„!³„o>]Î]:×½ßpÉ5×øHOàÖ‡âZos ØŒÅÝh„©¬Ýl4tpudëªQâÚ·Þ¢ºÒüC(¸Y꣰Ûoy'}Œ2Zêzr±š,VýÓfj>þþW\ò~*ØuMé|¼¸»^–$éåÛ›Õhx»ú:ž/&³éj2½šSÈ$ô#–1ñA„+Í—óïÂÜì…#Cn ;}™cªOQWÜ1òÁËÞFÿ@´œHµ·AB£{B—2uPA´^ç½£IëUzƒwU«PÖs§‹· ŠüRði'>"ÿù‰D}»Op¦ƒ‰ý£áÍèÎKÛ(èéÇs”sl¦~×Iõ“†ç—C¤;` ®A¥Ô‚O0ÆxÕ£¡ÌÅ£<ðPz]Z’O@˜ó¯¨Ìñ“Ë–÷®ù÷ }xžµÉåo½o÷úßÞpú ÀÏßù\§˜˜GéKw‘Ï•ºw¹g…”îÀg”'K~ßÿêq`«ûÆ2S{¯Jq²s¾?)ð³æ;ÈJß\Êok—¯µJ:tÊ7ÜáÏdB½¤rªr¢ª‡Qµ!ÃWͽÏnW7ÃéÝÕp´¼›ç@ŠKAËLHmúP­ÞÀÃŽçË{̬Oä[…z;g ?ãˆÿŸ˜'Ì|Çå[$1=éÍʉ¯g$™ëŠ4µŠiS?ù§<ø¬Ù(;=Ì–c]UBùd t=ÙêÑv‹9H?\dívŠÁ6Y?þöMϵ¼•¸%RMB,ö©¹êWߨ¡H¤;‹ÕýÂO,ƒÇH¸vZEæ•)¨ÿ ’G.q™Lþã–Õ;@V†nmOÏTtîD¢}ø/L•%û¤xœ340075U()ÈOÎHÌKOÍ/ÏK-J,-É00Ô+Î`(¯¿2¡´ø$cU³•ÐŒK¯ŸJ.<žëK*°¶xœíXÛnI}f¾¢2öƒ0ÙìF›h1& ÄE^K–¬a¦V†îQw‰ùköSöǶª‡Ëà —$Ø~ÙHŽ€©®>UuÎ醃ÅX«â€‹"û1ß@~èìéŸs½1ƒºà†{!\°[ʈ)C0ø ¥øˆ |R•®1Ò0%<Ã%~Š«ÏcÍÓ>yþ˜^a¤Š¤²hKE/4øŠy†0¸ƒúù'\˜ O1|ÝáfcGÕcxuzúfu¯ÅN¸6{¯JB‡2hè0ÍÔ- NR!”)oB5 c åÐLqã3¸“1øžÅ®âƒØ`©<¥‚‰ øðÓàG±°7ÔD6Ñó.Uåd‚e´ãAÈ}hpŸ ÍÀÃMé=¶uc¬< ù Çå n™ÒÔ‡Ò<á,Å àþGž!ˆ8’ˆcOÜAˆí\¬Ì®sYN\ØÄc.¾À”XÍ”cÇ b͆qx‚0.ë½­~*Í+¸¬t:•fïê cÍXâS$H’‰O¢cbì¡ò„¹Cè4™Z§úWTÎëzïŠð¿¯÷šµnÞ·:Pv¥Ó«WûJÚýN»Õ­ºŒ@1ËŠ¬Ní$3uRîÎM#¨0€±wËp~>ã8tðÀG2m51”bdë°eã΀AHs2OCÔÀ&Ýr6¥Ü—މÊÅât:-`?…Æéø¬ Õ¨&éuÑÂRá´# µ“üe0ÑäÆ{bÄäT0åÅf|Z*è1ÅÄHÍÊÐcÚ€ÁÆjžègÀÌ”aë£Ð£Q²/0Ü'Y"QaÊÂ0ÿY`FLCýjQnû¨Ûù‘§õTª@ã*”Ñ( êBNèAÞH’Î"ÏÿìXÁ¢gùªA§¼&=LbÄÝÒ áKlá¯Í7 °!SÅBX0Ôƒ%À¶ª‚h¤*CÇ£Éc‚ÿ‘ð§¢÷£Á_UàƒIÁ—“w}J(CSÞOßàÛýy£c«àFÄÏ—ìÛD„¾¹yí‚›—›v ‚ÐD¢œ+ÅÛ&-ª¦"ñé%Ž >Ò¨°Mè‹Æ&žŠVdÀu¿O¶.—ý¤`6×}Êà ×&ú rÈ•iµçdÀE"¸Aù+pkd¶+è“σËà:Éù“,ÈãüÜ£ÂËãká&¡pÀá,wT:!£ãÍ»¥mÝ ƒ7î”4Qò€„å–àD1íõð¡QÂábžŽ“Æ£àí[ ñÞã§¹\ õµ¸¿D)¿’qö¹ÕûZYâÓ"+oËö³Øl¾{`!Zî¾+ÿ…Ú[—ÍZ籫_ÖD@»#Û"ׂü»¹Ìœ\£¦´ È\kÑ¥ãLØ×.ñèÚ-C•žPu åZ—m7*õf¯öw\²ß¬W[µ² NNGúBVNË̼€|ˆÇà alÈX%'7»ÎTµê®%FÜP«-uz­¨…Ù´T°)‘0ɶ’o¡Å$Ûr!C®&ó%×Ü;³ÿRôË@`±g`ø®¦Pd¬Ê-l4?zˆÌY$µ©\œT cßÇ{i –ݸ§#~ƒ»‹nª!ë#ÓäÍ"ع'<€n¿Z­Õ. 0ãiZÎ}IH^â݈Œã}¥ÞXƒþH@3b¾¶JšŸQ¨£h.ª,%½úI%Í1"Üö]”tHSþ_KO¢¥'UR!žCI[qlVÒ­HËd–’~ÛÇ™tYk4àcÏÞŽ%õØR’s)¥îÊù¯îÓúò²)ÏnÍk ìÌ©‘*õMdó5çõOR*…òÇî9‡Éˆ³¯;–IÀ‹·–÷s6mâÛZ²%ɶîMνÁ„×8æ†ó-={³eoôÞíÛgøõʷЬ»Ð’E)½­‘ÛîO1<“.[¤fAåœL¡=ˆïD6oLníÕg³cÿþëwŸóëäò“iÚO!.¹øj½êåǬÌNí¬=k;†µÄrRÆýжíÍò ˜‰• ìô³Š¦Ÿ?ˆ1š~LÊ"Ý{ñt{(•Ý ý¹ÜžÃÎsÏé绸õþ|Òòà‰µ Áz9-Ô„Êú°¿Dué‡âxœ9Æÿàà°S)OëOˆÿSÍ50B‡fãDû+þ“gFß­ä‡Yd@ 3(ËCP#BÕ›Ëq™“ÁÏáïî†É/xœáÿéé®üJ„jêI›˲=êàõOü‘Â'åZ-á…ébxœ;—¸/qC‹_¨Ïæ4 Bi­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å e-ïÅðÊF­qkÌýtëÉñ†é”Ä’ÄøÜô܆Ïâzë•‹{ef|Ÿ÷0@„ùI¬c4DMIA.DÉvQ¥_³ ÿX¼ê…Pɕ噛*é8v샛xœ«­`+²H´Þd£¼¨È× 3d¯U„÷2Éü¿41P¥Û èკ=xœk øè¿Á]•Å/ÔÇgs´ê2&>Hàjxœ ßÿàà°S=Ϫ5&KÆ—&úºLÕ˜ÒåsUý¨“gyóÕÃïPxœ{Éø’QÝÐÀÀÌÄDÁ71;5-3'U/1—áàu†É’'wI§í¹ÏzÇÀ]âfîDõC‡Æã‡¤}xœÛ%±Qbƒ·ƒ§_ˆ§S°="tï€ xœ{Àü€y‘eëüù›®&Z)$%§mH̼ÌrHz2ã ß Cn‡—_xœû¨üQyÃGfF‹ÍŸ˜ÿó5óºéGxœ9Æÿàà°S#öéöÕÏäú.‰{èd¿“gF͆ _ a\ò9âüá ó̃ɓÁæçËî€jxœáÿéé®NŸ–ê5´—ìQç‘Aº!Öh‚s‘Â'óňà…îxœ;—x8qƒ·†xrI…5§kX@¼KjrQeA‰g^f‰†ÚæJ(FFµÉŽZâ“_i†ƒY«Ù4Êò3S4'¿ÑÚ en^®íÀ¸ù¥ÎSf~lÖèVxœ;œ¸3qÃu­Éwµvož§íÀÈ¿ùžÎSfšê g­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å 1‚W…¶}P2Iµ‘-üÆËS&^"’X’Ÿ›ž[ÂðY\o½rq¯ÌŒïóˆ0?‰õqŒ†¨))È…(Ù.Ê 4ãákvá‹W½*9 ²Áÿààñin‘ó`êžçP‰Öq(³i§öÌ‘%b“gFÏ5gíZþùŸŠ 0uô‰ºÅ“Á’EDï„ixœ{Éø’QÝÐÀÀÌÄDÁ71;5-3'U/1—áÜ·E¿Utf¼Ö‘ž!_U·Jna擉ê‡Ê(⇬PxœÛ%1AbÃKÖÉ_X—o^ÆVÏÊÈO:­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å }Ç8¬¿Ú„d´}ŸÊ‘ýFõòÖIPé”Ä’ÄøÜôܱóŸNÏÌû<¯çÉ¡Ðìx…cS_l‚¨))È…(±TÖ“ùâØÿ“‘i«'ÏÄ‹ýjmà8‹­xœ340031QðMÌNMËÌIÕKÌe¸Wüæ{¡Hß¡Òÿ žv \Ûiâ¨dQVR_œš˜“’X’¨—Ìаõû¬Î½;·ßÖ ©zà‚ÿOxœ{Áü‚YÝÐÀÀÌÄDÁ71;5-3'U/1—áÇ~ÇS‡vè»ÆëŸXh}Bò”¼†®ëFõƒŒ¬¢Gl‚ýxœ›À×Ê·!€us4ëVFIàƒExœûÊñ•CÝÐÀÀÌÄDÁ71;5-3'U/1—A2~×ÔM/¸š"¹Vh§j…OòiݨîÇ“>á‡É xœ›-vCtC7Ëæy,ờ߲ë1>h-àƒsxœ ßÿàà°­|JéLIËô~´ðAœ˜BK £î”“Á÷`ë‚yxœëeìeœP)²/•w÷ÊEi§Înø_²c¯Îêàk®y Þá€3xœ!Þÿõõ°«þ+yyV­go$ØîŸŒ9…SÊÜ|ˆs?#³s€ãäfne0½JŸåVÓ_ |Iß§ LŸàQÒñ®ÁñAÁŽ®ÁÞÎÁe“ÿð@T+ò.ÓGxU„Aª‚Áª‚ƒAÊ Ë&ÿâÕ‘Ä"nhïâ4™‘O|s(Ÿ;ȈÍÍ¢‡µrãJràxœ ßÿàà°­™Ñ'ø¯ƒ¾¨£\¶Þéú“h8ÖD“Á@–ë‡&xœëeìeœP)òmƒ™Ô±ÒE­gËÖÔˆÅ'tÎ0¦C #ì‚(xœãÿõõ°a#xÛ®b¼ÇÚß$Cðâ`o 1ÛïÊk&è²/xœû¬{CzC7óä…Ìþ“YX´7‡qû3N^“W¢P’[à“Ÿî“Z–š£`« c[sqqrêk)¤d'&å¤*ää§§gæ¥+¤”¨’ŒÌb…äÄœ½É yµµ´ôÊ3‘ òñw÷q sõ‰÷ó÷s›–™¦ ¡1y?_¿¨¥—æ”hjN“BÖŒä&k.ÎÉ[ù™€ÔG~Y ÎÔœâT Yœœéù%ù ù¥%ñÉ9ùÅ©@eœµhN@6es•@%f»Qíçƒ\xœW¨ÿàà°52’‹Š´aÛh}aLPvý´^40000 libñ©+½à’{Ö-ëF]"“gFªºÏú¿¡‘¯’þÍÊÂQAmº“Á %Sꇈxœ{ÅøŠqÂuáÌ—<s×müVŸù¯'íDš]bÀK¼ë0l†ëxœ{"{@fƒûæ3ìì"4b©xœ340031QðMÌNMËÌIÕKÌe8÷mÑo¯ud§gÈWÕ­’[˜ùÄ¢¬¤ 7>'?]/™áéWçד¾ß•œÅ·aºÂ߬ßþ‡d'ÕåFå´D=zdp­RÈí‹ÑŽR¥EHêJŠ 2ªöÔ»,q9ɯ½õÅ£«WfïÖ±ÙñÓIUi^qjbPì‚–ï§ÎOœ²Ã¦ÊV]óå§K—‘Õ•dæ•-›:aómͰ9QFÑEéÈÛ?ÔG^™à’Wxœ;œ¸=qÃu­Éwµvož§­Ê Laéê…Óxœ;jüÒhCÇæ*Ž\Öɶ|‡63ò«°oV›Ç Œç ëxœëeìeœP)¢1»êpÑÏ”7g™-ŠÍ~ß[ûc¢Ö¨û ›é„^xœ9ÆÿõõåQ]~ýÛ9ó5¡D,5É¿¢0Ôî±ù`äÁ|9#ýŒš6V؉>ijm(±ç ƒ)xœ—hÿàà&100644 .gitignore¤ÞLÚ>¶lH óHmõƒG[Yî‘&Î2l­”¥M¼ÜòŸ¬^Ñã7îš“K2sC}ÒŸ9ÈøäYF;P°Š¹;—40000 man ÅÕéý7=uOßt}5î(Ê“…(¿}S”#yç3±W4ïÚ¼I“ÁÒÔ?íj‡úxœ›ÀÕÁ5Aq£æs £¼Ÿxœ•W{o£Hÿ;þ5žHkçlgf¢Ù"Á$Aƒðfs¾hÛhxÝ$±n÷»ou7Æø1Y­¥DP_u=»øØúA–.¢eY%J[‘ ‘F,òc‘g9) [C†UDË(EŽ–…"Š’Œ©Ï¢ ©5ÆMI£”P c?Xñ'”/ò¬r L³‚?P â3ÂóŒ›q­Þ¿ øž¯ÑðŠAGëÂÅùù—ÿ¹k½¶Zã·®Æ1Ø‚M()^H¨ìønåE¶,ü„{¸(š-Ø+å ÖY ŸBAˆ²"z.‚Ÿ†ƒ¬€$ £ÅºCF™†?< <ú÷a<Ÿ ””,ʸWã <î½5sA<ƒjÛêÄ}¼B ¶Ê‹Å%ñ¢$#„Ç~ÊÖèÌ6‡º­Ý£žzc˜†ûÈýº5܉î8pkÙ ÂTµ]C›™ª Ó™=µ]p? iTÔ±h/D°ÀBÂü(¦Í0)_{ÀŠ sTÐ>#ÁêßXcŒ*t¡¤„u¹ÖÔÖmý×Î…2¼è†iÌIš5¹5î<ÇÖF†ÝûßÉ"Љâ'¨0Þpïuu¤Û9M”U·ÕЫšmy\yž|~f4ubM M5=Wµït—#ñ{ê̵Æê7½3Ç´h‰E­\¢N«5Òofw×í6W;wžv¯kߌÉÄÜ=—Ë>Iýç˜÷LÅ¡´„ðž>QoL½#dz€Ä{ÝœzŽk õ~¥Öü§Ìå@´ŠD“•Ž›—82$#Á1ã/ }êöZ0Çl2B´O%Þ‹·áÚkBÛW¼LÒOfå§Š÷Ê[wf¦Û™¯92HŒÔO³£âi&¤Ñ?ÂŽìIÈ`È¢åe€UMy % ´[S½szf8邵ŠeëçX®ya@ZÜ=OJ]Ÿþ_>ü 5ÿlm}oÈ´áÃ5®œ?Ù ‰sbpv£srRa·ûÖ9ô—ÐIÁÖ‰ˆFƒ<ë鋨Eâ¿ÅݨÊ؇G”–,~ ëJ«‰ãª¦Y¿›ÆkY¦¬m^~‚ìt4kú؃ ïî3tíÞê6ZvÀÆèAò=ŒŠ¦=îA‘ð&{w“™‡âê¿»ÞoºíÖ¤3?W†_žº{ìΜ¼‰›0–yV‹`4'A´À©DY¹X´'Þ)ó‹%&oü“³<.?ŸÁp–g¯¤¨ßÞ¾^zÕ#ýôóùÛY·‘€:’ÉågLÃÉÕ"uå¡~€ñÄL²´OÞ‰~‚…“ËqLˆ³@Ü^‡}ü®ø¶›ùuÒsâEsR5Å^KóiÛ¯„®§ª{ÏûÚ¬°øØ®xGÏt¥A\†²‘àÜšê4% ™³‘ΧzÍQ±­7òm) a¬=AD¯„6Eúú!œ‡~¶Ç¬àêîh´¿nÛŽÓ£88 ÷!°¥IúÞµo8ï?`(VÕT?B’uró½o;H{‹íÌn„ÝÓÛœC /öcÓío@0¯O]x‚n£-‘×a4zàâOËpC|ñ$æ:*¸ŽÃe®ÛÃ6×ß *Ãó&Æâ"ÃÅíþÊá*gèì¸Ó±ç†¥‹ ZV¨%[UƆ[›·ó6m'—$‹ûbXÏ-y½Ž {^5;Õ©=ƒ‹ò›¼$êð ÷¼6µjŸç³»¾ýÅŽƒêx™^ Y™ø÷Ñ> ýsø!Âã8­#Tí›­c€ÁU6AÁZùqVÄçs# »ò2ÛÉDP¬s–õ`ª=Ìtèýþåüç4+渽Æ,ØËº„<È{åU¥7 /¹pªÑï:tnJúÆÑ4ûqêZß ^/{ÛLþ= Ã¡GË¿p‰lƒ¸¶‹ÕF ÷+a~°0ãA®6¡Ï|/Y& ÷Ð$ÁLa>ÉÂ/cv=ø$Ô‘hÞ®éí.³×½gggxTFxÁlíà*%Ö‚ü¯ä €¢èt½®[âíô¸9±U´ßv¶ªc‰‘©û ¤z MH›Y:¤‹öÜNíöé¾Èn«nnm¾†m±–‰fØm´ùqfÓ©e»ÜøxUáÒ)ÌêH“ÏáW>Ó˜è‚îxœû£üIyCˆÀäÝÍÝ…Œ=£5ê“xœZ¥ÿéé8sqñ§výq“M†sT©oLNr‘Lb;ï{D\ˆ“[FGÔûb+Ä X:100644 tpm_utils.c•bñ7~[RþRɈçõCƒúÙôž'',o¦ xœ;œ83qÃ%v&#ÓÍÿØj9¶à…úxœûkò×xC+KY~fÊædÖ5ŒLf&“ËØ‹€ÔfŽR!ÌÌ ›ë…â-xœkalaœP "ý<3eå⿺‡}¿È•³Gb}Rªé ë…°Mxœ{„ÿæÅ'100644 Makefile.ammÆ™Ÿä3÷l¹âõVBçþ»®à]‘'·"getstatus.pod+úõúfÆ7îá§ó›Ó…¾tna‘ý"CŒTøeÌÚÐ\éÜÁ½Cùn“Q<“µ-“ +³a€‘7ê¼PxœmTËnÛ0¼ë+öæ°Œ¶è¡‡Ä¨“¨Ä6,åPE@Ik‰E²|Øqàï’ò«H.‚´Ü™‡ºn‘Õ_a6yÌ’Äéî¥AgsÞB 5·Z°­.WÊtÌq%•Ê;p-B±xXXyY…& &ÉuOšÿžÍù4O’›«ÿ©Ÿç‹b:ŸåÆÇæ»,¿]NcùCÿøs%+£º3!ô|YdËÇÉ,›/¿&÷9ÔÌ1’e|å¼ÁÔmئ¯sÏu`[µ‘Ã@%#—5_óÚÓ–V‚5°f£f´áÒa %³ôT}ÿ1ð©Òhz…“PÒ:’^œSôõ×s¢¢™h€y×*Ãß#`H£aÓòª%¨ÅH^©®c²† ‚Æ«N; âZO¡™µeHÒÆ4‘Ë&6Eeä³ZSïwzá;¸¹JÛ!¤i‹BÓ)Üõ§yËŒnÎë€ KZ?íW>ÀD€ ÕÀ³TwhŒ2»Ð´«±ôMHAލ£ ¢®Qœã}À{É+U#õ>‘3EžÃÓlz;¿Ë%-`°å`† V“0-¶dki-xm¶‰·¡?h¥½†R½¡=›¸ £»é…H_%}ìGS °2¤W­€Ñ™¼£Q.¾}rë(&TŽ¥K`ötJÐv¾1ÆèM­Æp¡ôþifX‡Íe’™à“Ó‰wä>¬¦^jiHtÌh²Ïh¨{KÊa=ÛÁÁ€pýKV½ž~Y“‡|~ö оÄ×ñÅË!ô5¹Ñ •#l™-æËb:»‡›§{úß,Q+〲cpåŒ RlŸ?·Îެò¦ 7¦Á‘D7Nþñ ºŽ­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å V›üN?º~o*[ĿǓ2'túÊN@¤SKãsÓsKÄÎ:=3ïó¼ž'‡B³ãŽM}q° ¢¦¤ ¢äðÚùkîŸlìØÿð#φĭó79|!N@ì§'xœ«­`+¢ïP¹eÇ ¯¶¾ï¦EoW½™’ð¥lb Â ôïƒÌxœk ˜ã¿A…›ÉÈtr·“¡Ùæ Ü$Å“K*¬¹8]Ãâ]ó’‹* J<ó2K4Ô&ç©NdT›ü_µ€Qms¾Ú$F{ w¾°xœ¥Y[sÚÈ~†_ÑËV¼"Á×ìÙ“ì)!‹@YFññÙÝR 1À”…¤’FvËÿ}»Gˆ‹û%¨gúëëôLwÎßWá=Ø3Ý€ îúpÃÌ#C8 f̧<À-3à î,\ÁC¤{+MxÀ’î\oF¿pk…±Ürý0¦ x1sÃhÝÖq–ö3üŽV(n&@Ñêpuqùq[ÚZ1–¦ú> "KX¼`ã3Ü™‰ÚGq8Ý92‰ƒ$œˆ%ÊnÂ*LÁsˆÙ˜'"æ£T ½Ü`|Æ0Ç|²"¤¥Á=DîAíæIá+-œÏÑ”~:ò¹÷X0pQ*Q’™4ž Ðþ²ÚM`ùcX°8!g\ˆ9FPŤ$F&"¦:¹Á |ôêšõ9c76{†aƈŠ-9:nÄ MØ$õ›á¾kwÌ¡ jïîÕÁ@íÙMÜ,f!®b®dP|ù‘Ñ“±ˆª/C¤´²¨­®ÑµȈv×îé–ms*ôÕÝÕ††:€þpÐ7-ý Àb¤ËäC'2˜/c&\î'…ÍÁóÇ0s #é1Ž .x˜Y/FI:Óƒ©4÷mÜ×> ‡²]µàlIà‚xgBD×ççËåò Ý$'…ñôÜÏ$ç^ä_ž]œE³ˆ>¯Væç§xª>ù|ÎEr6û½DsãÈ=ÇDÞÐk"š;"‰øÙ¬¶CM9c,2áêåöªÄ»g¾àO\o«†¥7«<˜ÔÉrìøŒÈ§ÈW0ÒZäÆ S2ÍèÛ5#ŒFYSW§õê?ÕJ‚áófxVpK๘1¿„¿\W+•µ=(ƒ8šHÃØ*?­êH©ìa†:íd>¦ÉþrnC¥2ÂúöˆŠç"W‘e“ ´².½¡aí•È©DÆ“: ¸GUyƒºÞ‰avS_ÐÆ˜‰4¤S+OÕâ÷T]{yr<4Ì”Wñ@hó±ôªNñg‡Ö%­)I¹x$˜²")9}C¨®pz*m=]¢NÉ µªôç(µ!štu…Q0YHÿfq˜€B w¯†sÛ3ï{Ž¥kÝ®S1¥3\+jvÿ.Ë,HÞ1¢V? GŸÈÙ¿“:Ñr~Î>·4‘¾¢/Ãx,aÐEå4…¡ïˆÐÁZªP"ޤwrŽà¿¨ ¢×P“Á«IéÜF¾r¨€8ÃnÏþx¥¤ññÊxÐRÑHƒ„O,(™¨÷#?ÌàiCœä¼JëÁÖá}=Û†öÊðá3$üoNâÊ OtkhØU¼"ß]9ß& é%%ÈÃÝ7®ö€…,šG!­Uvº+Û'ß+ŸülüO\9M*F±vd¬,(üEYz(¦”­kOðfé#IGžå°kêØ.ÙXзÝÒIy7àSfžÙ»-<Ÿ¹q±P•e ·M“ï夰µ?eª[CMû‹jÄ4! ‡Ï¶ ó„r4À&ìh¾æoÀ ù÷õ0YüE!¾œ=#¾dS©Œf¤uþ²T–«6 üQâ#¤’>–Ìe£NcS÷é$â_‘Ø%ñûï©\y*ÏkM_’hk}Õ±:ê¥sùÛ…ÓQ­Žcè½ñ{ üJ5rçM™ÐÜÈqŸ‹UbƳ¢©}§m¨_ðk”ô­ŸdIÚÀÖßI‘öMÊñ=u¤éXôî’©‚µŒÅ1¾’P ÁñMƒb¾>¸S{zÏ–Ò­³?ƒ¬P>oÄú¤¡¨+|ãä•¥8Dõ–ÙÀ‡3ûáÙ@ƒ ]B~_2>g÷äBy°p}žI|YX[³ðVLÉpM¸LN…Ë¢ó¿p~}ø°¥TíÝÅÕ7¨5€Ôþƒÿµ9ÞÁåodÉådþ¹Œ§ê¥Z9pmœlJZ‘ Í÷ªÜfoµrŽÁDàSšVÀg=ÇûtÊÜ}dòÉEa7¸†¦âÕˆÖÊF8ú¢ôñé½ö*["eQ(g›6VWáïµ#õ.îÈg×ð.ù3{;Ðá(ßÅ%=N@¹$9ºíÜt-µeèõú¦,/ÉŒGG¡âí¥¬N·¿‡;f®'ø‚ÝãôÕUÍî~Umýfï¥1v-ìñ(ä®Þô‡-ýv_çÌ¿òù£Q´6ø¥ ôCþ–Ò ]ìIs}̨;‹ ÜÀco¦†y§b¶ë=µ§íG9š­î¹~?f CYŸ0Áç̽Ç7Èíw¬®¦}|Vé(×è¶u»{§¦¶ïÝ]:÷zpt:ïJF°ÞÁüÞ•ªÝÝìŠ}³Ù„yXº¦ßöñ]ÜÌÖüÇõ(LÄQ øOß´ìç0·âÇqF¾Ýí[G㚉û]ÆÇ,¬²ªmîŸF&“bÀá#ÓoßY& ô¯æ­~ Æ rñ‘Ñûꃟ)‰Öà«âÑ5‘؇­=d|²éØçs»78†‹­[6º§kuîð¢ku÷óp¾)ˆ7að–SZª‡7f/;›åwm³lY›Ÿ¿q_u‹mßíe5¬—/²üÂi‡1¦W]8/‹Ê9ÀštðÎÙ­†o“·[¿í¼æºù!‘ëÍ苎\ÿ;µìE9_ ³E·jŽ^]?¯«•¢»¥ÏMoKÉ•@Jíˆ<Є„òZŽJÜxê5ŠÙ~,ääVøÀËg~øzŒSOän˜™‘Häà€^×ÿÔhnS+7E|§ë;ˆ˜ÎY€½25 šø=5$×þð)çÂ}®UÁ•&ì4Íæ[µ\Öó\©äz’sÀE7¾µJ”zsÝ ¢ ÜCs:n0öYœ”Ì)äÔÒUxÊI«×c©¼ç’Ä:œß[Žª7² iCNðdgxQîë 5ÊãŬc)!/ºÝW-ëþ†Ú*þß%«±k¨¡¨“íŽ]ιPšFÖŒU¥4ÊUÚ5Ðv¹] jˆ½ÛŽ u“V2¡BÝѺ3ÝšcjÍó”ÄÜ’ÖË»ÀŸyòz“¸r×Sõ_õ@¸è€Ú(xœÛî:ÉuC™ˆpZQjªFQz’KbIbH~xQfIê䑽8ÄÅ'Û‰šMvŸü@´qs²XèÁ䀣bxœ{p/`ƒ½§‚­Bµ‚ŽBíf{‘XvF“És¥ðDÄ*ØÚ*¨WªkN¾'#¶¹Gæ 7Ãøä €¢|xœ{':Gtƒ1‹FY~fЦB5grFb‘BqIbQIiAt¬‚-P“Ó@GÁÐÒX‡“s²>«´6ˆ A†F:œúZ 9©yé% Zú¥P9S †ÉûXÄÙÁÚzß²hr£™¥‰¤Þ·Yœ›;X2oöã\Àä`'áãxœ›#ºŠÂÂËg3³¥§N~À"liÀ©¯¥àïä.™ìÇ:EÇš“‹³–‹‹3µ¨HÁV¡¼(³$UC!-EG¤³DG¡8³*5?MÌ›,É&Í aY³BYÅl6B˜j'«qºB²'BY•ìÚÌyù%“W³7Ùƒ] P\šœœZ\œV𓧤 iÍÅ•_ZbÅÅ™œ“_œª‘–Q€‚¢Ô’Ò¢<…¢dk. {)åHá°Ixœažÿàà&100644 .gitignorey·8 Ž…ÖHe´ Ÿ˜2Ë®ÜÖ·±&Kzƒº„EŸ"bŒ ¼#³æ~)µ“…(4“xM… ËjP#Sœ±{®á9“Á-%û놂 xœkalaœP ²´AµµxŠ·,oͶÀY÷·ý³˜ •U Yë…Ð@xœ{Æ1ƒ}ÂóÉ‚ŒZ““x+£îd^&í͉L¬L‰§Uë˜YxœëeìeœP)·¾õu²pá”…¶¹=>5JþWÔlæ fâ‚´7xœR­ÿ  õ'100644 Makefile.am_º•²è ‚Y ¨+e*W’I…]±'/“« “ŠV¬ìëë­Jã—¿ã Ð(\Ø-šâ2³ô¬Èí Ôå€þxœëîÞp›/ѱ(=Ú VÁÖVAÝ^}ó[¶õ,eù™)›çð–º Ÿà|xœ ßÿàà°q“EØ)ù¾ú냂µ¼¯¸.='Ô“…[û¹ï/xœàÿààô[í­hõC v§¤Àûú^àì‹™“Øû rl²exœû£üEyCˆÀæŒ&¬ éDxœ9Æÿàà°SËP›—&ˆñØ’ƒVTà±J“gFn5¨·÷eq¯~‰**ÂÙ”ÞýN“ÁÂMôâ¸xœB½ÿéé®;è¶?MÉ Ê6qâ æ$DÛ…î)á100644 tpm_utils.c컣T¶±½Ï=Þñd$Ã+óÇšëÄDxœëeìeœP)òÇÚ+¸Rè”vñ¬…7eÌ‹»·N˜x Ìê¶@xœ:Åÿõõ°a§_?f‡¦¸a@Y£‘!¿ø¬À©Ø“uäÄ:6j­I¬$Îyñ)áo‰`Í0 ý³m'ýïæ¥^xœ›n9Õr+?§¢­‚zº‚šÚd>~yFÅÍzü·'¿çã‚KpMà—Êx úqr8 ¢àExœ{Àü€yC0£ÈÜùRì†Íé©ñYÓ÷-Í9YÈRYtr:c%Õ& gë+xœ{Éø’qÂU£eS'l¾­Ö 'Ê( (ùbûG¦- –àUxœ ßÿàà°­y~Òbv$˜… ðœ«wØÆáדÁð*çëÆtxœëeìeœP)âá³™í¾ÑÓ··þ|ïØ¿èù?ç8ª™ ãà¸pxœ ßÿõõ°a§_?f‡¦¸a@Y£‘!¿ø¬À©Ø£uïÇÜà€Zxœ ßÿàà°­ªºÏú¿¡‘¯’þÍÊÂQAmº“ÁWÓà/xœ{Àü€yC0£ÈÇ•Ú{ÙLbîe꯾¦ûÚ%VIdr:c%à ´ï,xœàÿààôÚ àà¬Þ$⟿)‹7þÝ“ØêµƒçYxœG¸ÿàà&100644 .gitignore4íâ¼í0øgì+zÛ÷^ï’Æ‘&ÎÚ àà¬Þ$⟿)‹7þÝ“Ø#‰¼fˆ´-xœ›ÀµŸqÂ~vªïgxœàÿààô“)Gôå^êžqþ¨KàN7U¦}“Øù¦òn¹7xœû£üGyÃ^FÃÍkyýY2kšï€-xœ{Àü€y‘)½Ž^ª_VñÏ™tç¿4gƒÎ¥¤ÉŒ7íegn¹|xœû£üGyÃGfFóÍŸ˜¹ø5"ÛéExœ9Æÿàà°STAq§¢¼Ú6š£h®úà}\ê“gFƒð__@ôÙ›½»Ý¿Ó÷–\“Áô2¾ï¿xœ{Éø’QÝÐÀÀÌÄDÁ71;5-3'U/1—¡à‹Î_o3¯Pÿ¸ ¦ î}ìNz/ós¢ú!’–^à‡îxœë•è–Øp„…¹¸(yóIv4O×ëËexœëeìeœP)ÂÑ5ÙuÍÎD{¥®Uá7y8Ü$þŠÐ Jà½axœûÊñ•CÝÐÀÀÌÄDÁ71;5-3'U/1—ã©[ñ±V{ÎÞ¯Ûæd_Ù¨îÇ•[q刓*xœ›-¶]tÃæÉŒ,]›ç±È3o~訂 Zã‚à(xœ{Àü€yÃZF‘Ô+ïf+qÄË÷®Ûq½2–Éà— ò䃌òç! Oî€5xœëeìeœ&Â{3Wý›Û\—-^sâ<Žžç™“Â71K¸” ;àƒË|xœ0Ïÿèè'100644 Makefile.am´¡uN~1äu­¿ïÈï‚Ï¡ðª±'Á³‚äè.ˆ‹Axœm‘1NÃ0…ÔÁ@â–  Dô¢&¢U«¤lH‘ã„Æ4±­ØÁîЋpÄ98;Iµ8νüþþ÷ÞÿuþqúùsR'”Åëpuz˸@‰Rñ]ÆbʨàpÔd¦–ò5诛ŠIõ&?¦XèÍ-õWm¹ÿgÕÒšÀ?T÷˜é…xœ9Æÿàà°S(1Cw$o_ÿqœ™…–Rzýõ“gF¤À¬?x¶9ŒåQû“Áà.áHxœ{À¼‹y£Z;£HzДŸÍÎò–~rÓùÛ¤uΨž|QÙg î…Axœáÿéé®R‰â²mŒ-fËŒ“ôßÇøõ(‘Â'ò^¸ëØxœ+ÔÿÃaç_°o³¾¯“°³ÑÄ“V“î*ªbioRc = ³ž+%¦{4­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å }Ç8¬¿Ú„d´}ŸÊ‘ýFõòÖIPé”Ä’ÄøÜô܆™¿÷-:²„¿0@kÉÅòÂ)Ñì•›¼ jJ r!JøîN¼£¼¡£bö/=.í,9'š“¦68¼è„|xœ8Çÿèè<ì}×,ο^¸´ËkúÄÊdÿù±PZü`a“hk‚C+£÷‡,b"Ñ–Û(Ó¾**Ô%kƒÌtxœÛ(øV`Çd?ŽdÎã‚áxœÛ³7fƒ—‚FJjZbiN‰ædAnñÍá\ª “¥¤x'wi%0ç—–L~§¦Ý´ÓÀôm0ýGûýäpQþɹRì“™uc&§èÞºªá‡jxœ!Þÿõõ°«%]²/÷ œaEèÌo®¶÷³¿¶ï‹á€Ö{xœ{p>`ƒûdoviÉààxg¿׈… çü¼’ÔŠ[ƒÍ)ìÏù8Ý]CƒƒÃ]&Ç+›lîóçØü^.!¾9^™‰]0àŠ9xœ ßÿàà°­…[Sºï𬇎Å÷‡[½yP¯““ÁâÊëˆxœëeìeœP)rÑ÷券ß?Î×,0Ú*þø¾÷Vu¶} ·á‰Hxœ!Þÿõõ°µ6ÜãCL¬ñôÅY”¹°öhôN³É¬#ð1ä“xœëžg¶¡ƒyó:æ2ÆÍ7YýX67s{1MþÇg?Ù†ßuòÑ“ÅÅl®”pbœ.å¾y‰T.×d eààxç `Mdž¦‚¢-§‚‚ÂdY¥Åý:Œ•·ë„:xœëeìeœP)búswÖ‘ÄÅ'¾‰bš2ÿ¹‚O¢>«Y ìá€Axœ!Þÿõõ°«%]²/÷ œaEèÌo®¶÷³¿¶ï‹h†nxœ{À¼‹y£Ú.F33á‡xœ{À¼‹y£Z;£HIÔæÌ¥ªE,°z⦨™Òô{‚À䃌òì. é­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å FëMoÞ)N‘ÖÏw“ŸðzÉëFé.é”Ä’ÄøÜô܆™¿÷-:²„¿0@kÉÅòÂ)Ñì•›¼ jJ r!JLîÎ:’¸øÄÂ7QLSæ?WàIÔ'Û8ŒéÙ xœ«­)Â÷;û¸§Jí¢‰ÏW? ,Ú¦.Ü—| ­oƒãxœ›#:CtÃSÎÉÏ9ó&‡s¹4Ï'éˆxœ9Æÿຑ&Î2ÒÙõ3²½ÅyÔs\l€ÂC “¥tZ³i¥%Ñø :äF!)d‚û“ÁäuânÊoxœû£üGyÃGfF³ÍŸ˜¹ø5Úàaxœ ßÿºº°KO¹ƒÝ¸í VÈx”–ë5ãw»Ôî“_[ü<ë†YxœkalaœP rso´OlÏ¥b㻟«”¤Ó.DŸœ©¤ Yä…ëyxœ{Æq€UÝÐÀÀÌÄDÁ71;5-3'U/1—aû„¤P®7 ÜRÜïš\2ß•Îõn¢úöÍ-LßGHç€xœW¨ÿºº°2ºêNˆŒš'ë4 TdQy{iü40000 libâþvÁôiÄ{#Ø*ÌÑ댡õú“AF,õ.Ä5}¦ÔÜRÒñ’j 1g†“›6%Ðã‡Ûxœ3Ìÿêê‡U—mB?)ª7gªÖ"öþyº&_‚H‘›;geéì@‰#lÉÐÆ:©-§²Ù»Œ`›ÆoÒ!xœ; Ó(³á/»rj^Jf/Ïkæ‹Gxœ6Éÿéé8¼:c„9•äë§ËÀä„ׄ|‘L:²ãl=ÿN].Eš#˜*m:>‘šO³­òl‡§ xœ[,÷YfÃ&žÍI¼$Ë#àØ(xœÛÑĸ£lƒ¡5»rj^Jf6ûÀë…xœëeìeœP)¢_sÝ…¥ZüqÉÑ ÓMs¯8Ù?“8 ªå†xœûÊq™MÝÐÀÀÌÄDÁ71;5-3'U/1—ávKÚæzÞ×rŸ¾®3ßÖiÔlè·Q]ŸqsÓ_F:Þà‚&xœÛż‹yC;£ˆh©EjeÐ{–›wX5ÒóÂ Ž¸ öOžÍ(Æz â­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å 3T/7îP¼¾\þì9‹6n7v¦ƒ[ò!Ò)‰%‰ñ¹é¹% 3ï[td a€Ö’‹å…S¢Ù+7yAÔ”äB”è×\wa©\òEtÂãtÓÜ+Nö@8­xœ340031QðMÌNMËÌIÕKÌeØ´%IwöÑYîß9Íû.ëVøÂgQVR_œš˜“’X’¨—Ìаõû¬Î½;·ߨ?4ÈÙ5XÁVYX/™ Õ24u  J[Bùï‚3xœàÿººíöÇþ2¥ÖŸkí”–SÑ›ºÚ“¹ëâ xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMf˜ô1……I;%òvuñO®ó[_¼ûÆM X¥^fÔžù'Ûd'Z¾Ì³Ì|ë¹læcfн&Vä‡ô'xœ[-tˆwÃÆÍë]7f)d”TÐÕMÉ,NLÊIÕ-ÈN.64Ô-.-(È/*ٜ¶qr3Ç ÷˜#à‡ìxœ›)6Otƒ Óf¦ƒì“¸v/š¨î€jxœáÿººÎH{a|êQRàäèý}©ì#´‘âØÚM¿nÕxœû£üGyÃGfFÓÍŸ˜¹ø5Ùªxœ340031Qðñtvõ ve89“«nIìî”òÕ¿Îåò—ÅN;ÐfQâ›˜š–™“ª—˜ËPq"=_þœð%û»UÅy]Ëv×6X…* rutñuex’°œÁÛ6,>ôÚ— ÿ_›‚>þÑ…ªHÊÏ/).)J,Ð+Î`Øu|ß®õ¹×¼cæ­ZQaxg׿†—@u榦 É9©‰y¥`U)?^žÑø¬»ðsš”[¹Ü•^—sPÓ’óóÒ2ÓK‹Rõ2ó<ªk^J=xòâooíÊ7BÊ[L €@!%³¸„áÛñFKÅ® ÎÏ~;eZðÅÙõl»nA¤3ó’sJSRv±¼òëè™Å¡þšß„+$%°²:óDENfãe¿d©V¾¡uæâë‘…L_Adsó´ïN­d‰š¹ÿLU釃)WX)@d òãnf‘žÆ¸í@5‡_uý¾['Öjÿ¼‘-.Jf-µH­ zÏró«Fz^¸Á7Á~ˆlI*ÐáÊñb§RW´½È’¡}çÑì ‹K з‰ë†ªmxœkalaœP 2½N³ôë’oïž._Õ'²æš»Ïm¯· ¿ïŒxœ;Àz€u‚‹ÈÔ×ù±kÖ Ô\—ûz»\¸Ê@†kÅÆˆ &Ùà óã…ïtxœ;'rXdƒÇd+Ž““Ù9—L^ǹJ¢wæƒxœ6Éÿºº€@<Ä1b­©#QһؙèÞæï ‘”:Co.,ò߸„‚ÄÖ‰¿ìd{²h‘âØ©›0ꈌExœU±JC1†¹·Ó=K'Å1ÒMɽƒDQ뢓‹‹ˆ‚¤izohn’S©Rè3qò |WgÄÓ[kÂÇÏŸÿ?'ù€÷¬ÝÙfE_Û"VÐN6ß8J²ùõ>áùð™'ÙS;9#Þ&§Ä·ä|+ö*°{¢v6oÊOít¹J{Ä×ô„ø•î7[ÇÄ›Öñ¥µ7ë;‡ƒðy³¢BÆ'°ÂJ…¨&¨‹cï]@¨G÷Ì»µ®»€n,+&ê2^`õcÕ#m# c(AzÆ/©{Wì ÀY"y!Fj¨Êµ¥³*w×¾¨áÏ{¸dœ]$¹u\V–ʸ’M§LM4iœæ×0ºÎ™¦½ªÊÞꚣ«iÛr¶ x­cÔ¶\Æ•.íÿðâ·ð ›¨‹¿ï†3xœû£|_yƒ0Ëd53GçxgG??OgGŸøÇ w×®É],J›×²31;GDLgWTª òw÷ñ‹æâéñpuö‹k8é($iN¶`¯Ø|ž]— H¦¥æ‡xœ6Éÿºº€@<Ä1b­©#QһؙèÞæï ‘”:DNu<)Éj†”ðÃú¹>/˜÷‘âØ¤Ôn€+xœ»¯|_yÃGfF“ÍŸ˜ßò3ã€à_xœP¯ÿººXP’»œRuª4ç†Ù5I}o'ü$¨K‘lßðhvŸ­Þš@¶Ú¥^Âi;:öI“_(‹*¢Ã؉ÛÁ ½üI.Ê“›ÙÏ$ƒkˆ«#xœ;È}€{ëdnÖm.°ë…4xœkalaœP ²Öósþýòœã~e73"f\öM£- ðá…3xœ;Àz€uÃ,F‘0Ï%§NÔdØ—íãjvN¶eX]»y£#å" ‹ëŽ`xœëeìeœP)2%Z²Z‡3Ufb Ófͳ‚‘lûZözŸ {ïwxœàÿÓÓ=ûnèy´1/êDÕ÷зµFÝ¥JF±Qüï‚Ú#xœ;¢¶ImC‹dHpp¼‡³¿_ˆkDˆB†s~^IjE‰‚­‚Áæ4–Ù¬›%¹ô7ÇrÛ0qº»†8‡»l^Ä»ˆ¸ænxœ†yÿºº6ô(r_RÝÊÂeíä• …×A‘J„Í3Ã~$á:Ø;=qé¹Á!˜:‘â-2“h°»"ù\ s>oÚN¾î#ñŒ!;40000 lib}å€D"ªÅW{®`,VíÜQNâ “AFže¦9u–M˜rG¯ByZCV“›":O솯Uxœ»ÌucÃeæúàP'Ï `NN[Î\Î.NNÎ̼äœÒ”T0''3 "Z\” aäCèÜÄ<..GggGŸxG_7G÷`[]O…\..׈ ÇxÏà Xr~^Zfº^QAbI†Bnvf^qIbNN KfQ1ßW%¨â…Pxœ»¯|DyÃGfF“ÉŸ˜m7{±LåLœ+ï•,xœ/Ðÿêê'100644 Makefile.amgÄæãS“‰¹J¤Ö¸Yt÷¡å‘'àòq&xœ»Àµ”cÂþG…™ƒKóŠSs2ó’sJSRS2‹lT4\Mý’‚Üxˆ"..Åñ®Ž.®AÁ@5z\\§"áKxœ[ʱ„cÃwfÖ’üüœâÉ™5?6õä•txœD»ÿéé'100644 Makefile.amœõÔ#PÈZÀ’ˆ<††·Ô‘'®ÍÔ`’ k‹hí7‰‡êXx¦élçxœ{itÕhC;óæÙÌçD(‘­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å Ñ>1Ÿ¢õó•å”þÅXÏØêB¤SKãsÓsKޘ뮱ZZ\ó´}ñß?¸–˹@Ô”äB”lžù/~ò®-²*Sì~g»q¸ÔmPÊ9 ­xœ340031QðMÌNMËÌIÕKÌe˜îp„Õg"ÛŸ-—“Û/˱'ÁЋâ(ˆ¶kxœm‘ÍJÃ@FÒÅ ">À@À] u)¸U»ihIêN“I¬cç̈è&¯ Ôñ ¤‹¾“K'™´¶“n?.ç»÷Üõù×éçÏ÷æâ¤Ê¨Hgñt‡Qn€QÜÈe!R*¨àðŸéÂ(¬õ[îå2{)ˆÑ^J¹’e‡¡Jiì0„ ÐHžq.Ê^)ËÑà ½Z÷®Féäö~ŽëúLªBò]YE}f´¢«ßÞe¥–D‡†¡ãÍgš×5¨^ŸbF?°¡¶€HαÈáÁyi2}ˆGw °96¸ ÄG‘g,j.—e¾Çª|/;b tié„!Fµé®ÖÚôY.>`Uû0§ûÈ¥MÞ½µ‰-ÎÜzoÄ;éþú5ÙG^ן<ª·ýrLJ‹m놚نæ5xœ›Â;™wÂ~6#³û¯1OÞÉ¢+¦ ›“_š—\TYP’Ÿ ä–dn~ÆâÍ(àèâÂÉiË©¢áãdj*L¶b‹P¬lQxœ›ÌÛ»á4Ëæ[,; §üàŠ$xœ»Ìv™MÝÐÀÀÌÄDÁ71;5-3'U/1—áeóñeb6×þj.J;x§ôªŒ\ÞFuf®$xà‰fxœÛż‹yƒ.£ÈÓ-±SíW_>õYZã—@Ì[¦àä ÉŽŒ•çª ²î†2xœ{Éø’qB‚ȶðvŽŽ?*câ7üöø”d§»ÅÅsbI)ẆàŠ>xœÛż‹yƒ.£H~èó<•å '›'¥Åå6ŠôŸ0i²#c%Íà oæ‡ xœ6Éÿéé`¶W‡ˆðøy\_°ûHòb>-´DI‘t:"`À+ŸÊ+¢¢Æ×#|t[–‘Â'®·Zlª]xœ{>~C·öæÅÚ.,+É¤à€ xœÛż‹yC;£ÈT§;" ŠsoíËëïs­«/WW_>y6£<Ö· Ûî‡)xœëeìeœ&òýõŠ û»¹‚Ìf‹Ÿbõ¸éxÅb–2Êp ï…Qxœ{Áü‚yBªˆÆQÆk§¾.WMÔ¾ªzÅße™¯óÆÊ|FઠNè ƒðxœûsŸñÉ}Æ “R'óN^ZËœ_Z2Y1ÍLǦyL¶Tà™¼)­ Ì7H·‡òµ'/Ow‹}H·ŠñM¶ÍHž¼;…kóê F°ÄáÌ,0m˜µ løÏ¬ù`þœìe“Õâ'‡äÔ€5ÞωgŠ[O^˜]ò(“Q‡ì®ìcšÈ>NØ\ÎKöÍ×I*›Dð£¿û¥!gÑØæø[ÅžÙšë̸5…«…F¸µµy´¤±e/|:<á¹2ú÷ˆX9Òáß¶M}ÙB/m\ûïðg…€¬6KØ0Ky†Vn¿•]=’ªÒ¼âÔÄ ºÚSßvò-MÉÖu«Qû±ìc¯Ô=‰{ÈêJ2sŠÊÎ^I˜Ä“Ý/ÓÛ-—ñÖ¼³}‚è«ß]÷ä ³Fxœ{¿+fƒ ëæpÖ«Œ !ÁÁñ¡¡ž. ÁAÞ†-\,(6Y‹Ýkr/ûWg¿׈… çü¼’ÔŠ’ÉU«6pº M¾+ǹÙI&ˆuòtyÉoå”'ßPÒŠ²N‘!® Zš å©99Þyùåyšš Š¶ “?¨Øo~£Á¾¹@KšqóbmÁ28­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å öiÇ/¯µiÅ£¹_c拚J~Jœ‘NI,IŒÏMÏ-aøþzEýÝ܃ Af³ÅO±zÜt¼âQSR Q²yæ¿øÉ»f´ÈªL±ûíÆáR·u©:9écxœ«­)²ÔÛ0;]¾áÓ­f­Ë;ü¦m­é; –j ½ã ­Nxœ›!ºCxÃ=–ÉѬ›²ò0NfcŸ4y»Îä¿ì^“Ý84&p̘,Æ©!\P”™W’¦¡“§ 1yJšÖ“­9 ±ˆsqr¦¥¦j”ǧ$–$‚EŠRKJ‹òŠ’'7sf!ñ¾r¦JÁy@…µ\œiÉ9ùÅ©i@+*¸ï4‰à‡@xœÛż‹yC;£HOÃý@CÙ7"_KŸIx±¼W4Ÿ<›QÔè Œ­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ngOq:Êu…¯‹d0ôà¬ß\ÿÆ"’X’Ÿ›ž[ÂðýõŠ û»¹‚Ìf‹Ÿbõ¸éxÅ¢¦¤ ¢dóÌñ“wÍh‘U™b÷;ÛÃ¥në<†Û6Êéixœ«­)¢Êm°þ×Ò¯/§Ÿ|ð|rfšMµ6œ) §áixœÛ!ü^hƒçdNEFëÉÝœº4Óà€}xœÛż‹yƒ.£ÈÍ(ë•}¶«D_÷~ËúœoóÔðÉŽŒ•ØÙ Àî†Hxœáÿéé®@*.0”T‹gïÿú·³Ïþ‘Â'ÉlYï…)xœÛs6zà ŽÍœsÅ'óËÙ *è(ø…úøhj*pq‚Àä ²ª“×ËÉlnVÜÎp£Bà€xœÛż‹yC;£È®cËÖêN[¡Õ°ßE݃oæo›¾²¾É³åé ß­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å 1›b¿ð­L¿tõü9»ÊÕGw÷C¤SKãsÓsK¾¿^d7÷ BÙlñS¬7¯øCÔ”äB”lžù/~ò®-²*Sì~g»q¸Ôm‘W:¡xœ340031QðMÌNMËÌIÕKÌexu³í¢h£Á¤ÙŸÿßy¥ÒóøU¦…!DYIAn|qjbNJbI¢^2CÃÖï³:÷JìÜz|ó„.Õ×o-éMd$So„·=xœ»Àõ€sÃWæÉœ,‡'ÿcÑ8Œà1xœÛż‹yƒ7£È›ü•aòýÚë‹K.5+|¾ó‡ajcùäxÆhç(o¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró ¦»kõ™ÅœèÏ©·Úðmß ÿ“ífÀ¥ôóÃfÈ6šNa gëMÇ}’A .mÁ°Öósþýòœã~e73"f\öMøÏ2‰à†Ð7xœ»ÇtIÝÐÀÀÌÄDÁ71;5-3'U/1—áÓ絜]vFkç.×VK7~l~ÈXg£º9#£ö©î†ÌdxœÛÈ9•s# 'g 'çdY–bi.׈ ÇxÏà[ÜÄ<Ãx_G¿`M.ùp øà(xœ ßÿºº°‡¹ Áå4ªò<é’_bé-¹ö“›åö9ëƒ[xœëeìeœP)bgwÑçï S;‡Ê¯»'NÒ¿’-Ó“ eï–xœ»Ìv™mÂSù \T³õNhÝ+fª5Ÿ_ѦrhãÏ(&Úi Àè‚“Sxœ›g9×rÃæÉ …D'ßeþ?y ³Ìæ»,ņ½ ¤à‚Qxœ ßÿºº°‡ÈÇö ‡À8/m^d^T§úŸÄ¹õ“›÷ý“ë…xœëeìeœP)²¢°ÿ~¬™}Ý« ¶×¦Š§ž¿rø›ù vì€)xœ»Ìv™mƒ=³È„ò þà½'2KMTÕÏ¿¶¼Ôì¦ G >l€‹,xœ»!}PzC;óæyÌV\#“¢çƒixœW¨ÿºº°2Rö‚£¯ÄK-0Ê›¡g‹Þ„ºÂ40000 lib-òßì¡™òRñ¤î½ŒÈÜ“AFµH©Š<ª2ë¹–X®Y/Òå“›ŸÞ&Äë‘Txœ{ÅøŠqÂ5‘†øÉ’®Wú™wþÉþšfåÁ6ù¶} üà¶Qxœk”Ù)¹aÇä}œ^›½¸¶38ëEãˆ,xœ3Ìÿéé†o„sFå±tcøXáÀ:N\˜D·^‘š;T¬ýHšD¸Ä/èv²êë£äÖL(á¶9xœÛQö7gÃvæÍW™ŸlŽ´¼ÏWZÉåŸmxœ»j´ØhÃ;æÍ,,<“&l¾!PË_J­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ÖJSîú¬~¦ çãåÔ}Û]Òe­D:%±$1>7=·„áûëAöws*™Í?ÅêqÓñŠ?DMIA.DI…3ç'Öÿ‡¸–X¨u±ísɧŠ5µ¨d8H¡xœ340031QðMÌNMËÌIÕKÌexu³í¢h£Á¤ÙŸÿßy¥ÒóøU¦…!DYIAn|qjbNJbI¢^2ƒÂýå‹þ0q,wcÚc:±Ëÿ ?2. Ì£5xœ340031QðMÌNMËÌIÕKÌexÙ||™˜Íµ¿š‹ÒÎÞ)½*#¤gQVRŸ˜\’Y–X’ª—Ìpã‘y€]ctáŒîebËnôX(s!©LÎHÌKOM,-ɪ=¼ñÓÏZóŒÉšÙsÙÎîyì}Îñ²ÚœÔÄ" ²uÿÖœ¸ÍVk%ï§Þ¿s{ôœ/öèÊ“r@¶Ï{ _´«çát¹a=7ÚŽlé™vHYiQ*Е©Ù@•É?ß;~|ëàög§ý©ïNÜ\¤25jböþ=럚œP¾ó©ó$ß½ì ÷#©KO-)(M›èðüyáݺ¦üNékGvÌ­–1*ER™_32tû‡7µ{÷Ÿoþ}󤣨ËS¿mH ŠR‹SóJ€ _Dl˾`W¼ïGy몔Ç{} ½8‘‚Ô”ÉÅOyүР·`bÝ–Êî“RVAte)‰9ùÉ Wî¿Á6ùtìÞµ­ëJœMCÌ~9…\AU\R”™ ÷›Péþû‚¬ºûÓúÞßÚ#7oç—Ÿ±(/.)¾¼¥‹ÓãX[ª¯ß÷ª·'6ìíxsEqY~6$ô×ÞÙ8¿ªµûíËÍFSO¾‹ÞôoïŠx$•Å©9i%@£A8Ϊ!Ú¾gÖ±ÕÎϯ/âçîà@QY’_Z”X’_MTGêz7ÇJF0ˆ<È4Î÷Ó²*d %‰E%¥@…Qâ›ü÷I}‰™ZÔ¡û0úeØ-1$…%À䌳ԢâŒLrÞ·Skªø7Æg}¨Õݾ_öþ ŽãHÊË€ 3óó€ c9 ™ú¯îÍ\WÕõ!»Ð£èdH ¿Þ]àlƒ‡xœ;¢¶^mƒ÷æXîçì!­Ìî‚÷DxœÛ§¿ZƒïfSÞffçÇÍ‹š™À ái,™b *l‚Äxœ;¨¾F}Ã/®ÍüÜ›8$¶÷l‚¦nxœûªú@u+÷f)îÛì"Öšl‚™xœÛ$1WbÃR¶Í»Ø*X!ûËl ,xœ{p&`ƒûfov1E%wá€øxœ{#ýRzƒËfS–0fg¿׈… çü¼’ÔŠ’ÍÍìÌœé©%‰ÅÅå)›—py0œØ€á€ëhxœ»+wKnƒËæP!g¿׈… çü¼’ÔŠ’Íñ ™9ÓSK‹‹ËS6sò„0œí>á€åfxœ[+³Jfƒ*Ëf6~g¿׈… çü¼’ÔŠÍî\Ϙ«º à€â3xœ{.zMtÃ:öÉØU6?fga?__á€Øxœ› Ù+¹áófNkfg¿׈… çü¼’ÔŠ’Í6ìS™8ÓSK‹‹ËS6ßâÜÆ—`'怘xœ»!½WzC;óäyÌÞ“YYtýýB\#B2œóóJR+J¬7k±¬ãå Ãà‹pxœÛż‹yƒ7£HPû) åGzæú&s]g†tåëíÏ ¿œ Ĥxœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró ¦»kõ™ÅœèÏ©·Úðmß ÿ“ífÀ¥>h—G µÞ=Ç»öfßô"¥ÇVÍÊípi †µžŸóï—ç÷+»¡˜)è4ã²o:}ß5¬î†»fxœ[˸–q‚È«½\—g~ÝzG¼jÃ%«÷y ò ƒ¢×÷ ¥àKxœÛż‹yƒ7£ˆXÝ)žåÓµçIÊ/úuSÎØsýœ]“ã£ËÇ ©¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró šŸÌœÚôÓçoüªí_×ï* Vûl —6fø ]-Ôz÷ïÚ›}Ó‹”[5+·Ã¥-Öz~ο_žsܯì†bF¤ ÓŒË¾éçû6äï’4xœàÿÞÞ= Á6Ý4Gޯϙèâ§ÜÄó±Q Ò4Zë†ÞxxœÛÏ·‰gC)#£ÂæRÆ=ŒF%™Å E©…¥™E©Å %© ÁAÞ %ù yù%0q…ÄÒ’Œü¢ÌªÄ’Ìü¼Éþ̧DÒbÒ‚tbÒœbtctÓ2sRós'k³¸1”–l.eaœ¼†m2%ÞèsxœÛij‘gƒ‹PfLZŽBLšSŒnŒnf^ZfÎd'7 º¹›e9#H à‚xœÛż‹yC;£O]¬y­Zˆ‰Óc.~Ö7Ïdl·ê'OžÍ(µ† ­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å î5¾oÛ×ât”[_ª»•ϱáTJD:%±$1>7=·„áûëAöws*™Í?ÅêqÓñŠ?DMIA.DI…3ç'Öÿ‡¸–X¨u±ísɧŠ5µD3:¡xœ340031QðMÌNMËÌIÕKÌexu³í¢h£Á¤ÙŸÿßy¥ÒóøU¦…!DYIAn|qjbNJbI¢^2CÏõªsÙ5ySÎ_œ­¯lå:éZЏ3Gê".瀬xœG¸ÿïO“H°°“Œå³³n³œ #³ ¼“0 g³™ \ “LSrkPolicy, 0, NULL“Q&“Ú ³Ú¿æšà„lxœÛż‹yC;£ˆèù CÝ™Ó<¬L¿öñ/˜+Í.Õ5y6£<î lëjxœëeìeœP)bÑwïAÀÇ sÕ¶nsåçèLÍ› Eáyxœ»Ìv™mƒ%“oG‚Vç¦ÃõÞNKϼºýPÿéf_&6FÙ Eá‰Hxœ»%÷Uvƒ׿ \®L›¯ñ´0B g€!xœÛÅ<›yÃlF ‰¨à€3xœ ßÿº›°-N¡³*ü¢ãîPIvþÅt;Ü©þ“AZßÈî“nxœáÿéé†Sbiòp´m±Wä‘â ;ãŽÆX‘šOç pè“Yxœû›s1mƒ°òæ@eKþÉ&ÿØ•SóR2Ó¸…g ~ì€xœ›Í<›yC;£È—žj£M·3|¨jb ɹ)Å Þù„n^tàù½/1%?V꼬…H§$–$Æç¦ç–0|½"ÈþnîA… ³Ùâ§X=n:^ñ‡¨))È…(±h»Î÷ àㆹj[·¹òst¦f‡¦9–¡xœ340031QðMÌNMËÌIÕKÌexu³í¢h£Á¤ÙŸÿßy¥ÒóøU¦…!DYIAn|qjbNJbI¢^2à ù½oóóv7çnXº…ó§Zn½ÍyEN"Ÿç"„xœ›ì±ÒiCÛä©l.&œ¡ž~!ÆF ÉEñ™)Ö\œN‘!® ZP~|YbP IQqfÕäëlO 2Ó42’‹ŠlmüB}|â=œƒ‚5ª¹8$R\W’ZQ?ÙP@¬, `ïïäåêàÒ¯ƒªÄ¯¶RSAÑ– &2%8ÔÙÙ58X¢8©(51ÛÄ®P¯(Ø*'–ägj$:¥k‚¥áŽ ð”š˜¢‘R« 5¨§¡¸)t&3òˆdÂíD1h¢s~nA~qfIj|pj –˜Sš 7„/¢ÚÚòÝä½’âNÖa—ÚÌÌñŠqóNÆÉë¹÷O.d™¬Â]!ކœüt×¢¢ü"x %Ï< ™) ù%™ùy“ûeÌ6·ñÔ2nž/ôL€ ¸“[•UaÌUÊ™œš—Ûomxœ[é4×iC¿Âä© ª“(d6Bsèxœ›ëôÞqÞÉñ¼Ü\œœéù%ù ù¥%“?ˆŠN^ɳi²Ž×f9¾ÿB6«ã…Lxœ3Ìÿ››Î*zòkúJP—˜ÉY4l´Gcx‰ël‘â¥ôŒ{2²á·ñÏ ôƳ€ãˆ|sî¯xœ;¢|DqC Ëæ#lœ›SX<'×±)+(8»ù8ºÛ*©@ º..®N¡î ºé ºþ ºá‰99@2µ¨(¿H‰+-“k³½@+#”ÎLì€xœ›Í<›yC;£ˆWó³ïÿÊ(ø]-8Ó~éJ¡Ýa¶²) ë…cxœëeìeœP)r©4(*në´5—ëV]}e!Ô£L á™ xœQ®ÿÓÓå4†Ö`½že@êh©€Á?7¹ù±ù@ ˆ`*‰Ì|1¯KB¥ÌêÛá/å“Mqíƒe¡Ë< ó&Dù‹#>*Ê‘“Òùo$’à‚³xxœ›e9Ùr'SfÞf>®f =™K|ó&ÞµŒ›ø­x¦& ¶í’-xœë•ü'±á§€ZAqyJ|NjžŽBHP¨«Îfq®2&©ˆ ì‚xœ›Í<›yC;£ÈÇ'M!OÛ'oºÓò©ù^¨áƒz§ ÉÁQë‡ixœëeìeœP)òÀ}Ó–ß ·_°e½Ö¸ÿÊrk_ °q “îxœ»Ìv™m‚­Hú ÉR¥ÔCÕVï\}ϳoëÿظ‰i¿.|Z–nÌaRê,·¯¶æ`ž¤¡™‰‰BIAn|rNjb‘^2Ã|ƒí¦3ê:fé_¶ 5㾫儡,1)'¨Ô^PýùQ—æWˆ]`–·]hây;‘‰úºË›{%ŸÛ !°~âB¶«“ÅÒtŽÛûoÓ *Š[ücÓùC+ÓïIýB2;¿<jòÉQ¡†³ýÒwZ½áŽä vÃÆ¹H ŠR‹SóJ€ »·Æžxº×èùÌþ˜-Ýwd2Nê=Ÿ<—ñ˜Èã·b´V_\-ß}žÿÁ”)Å e“Ë™æ‹|ÊœòSòÖB¾rÇòs–¯œVl8Y‹YßWˆØo–"xœ[%³\fÃ6¦Ì¼ÍÙ<Ù2çßì…7xœ›Í<›yC;£È•£ÚïÎKíÑû`¥¯tþ¬Öñ-«Ñ É­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å –Z™o<©ÃDbfÚ”§dÉÜ‚H§$–$Æç¦ç–0|½"ÈþnîA… ³Ùâ§X=n:^ñ‡¨))È…(yà¾iKƒï†Û/Ø‹²^kÜe¹µ/‘ú;L¡xœ340031QðMÌNMËÌIÕKÌeȯ¼Vp9 ÖR¢î‡JeÞuóF™5ý†e%¹ñÅ©‰9)‰%‰zÉ 7ä÷¾ÍÏÛqÜœ»aéΟj¹õ6糜Öå„á>xœ»ÀÕ̹á+3#×äD£É3YŒ'ÿcÑTRdå‡ixœ5Êÿ››°Ïס_ˆÖÖç(ÞB_õ]9Ä )&“#dà$Å+îÏr¼.ð:/_"ÏÍ*Ç´fZ¨î£}xœ{ÅøŠqB»Hov½æ¦žµ}ÊÏ~šæÚ)ʨ~™8ÛÓb 눟xœ›¨üEaÃ_þɧ2ø•SóR2Ó¸¸ 4œ Ùà€xœ›Í<›yƒ.£ÈTI“;Õ ±ÿ®þ»'ùRúKZy†õdGÆ(Ù¤ µîExœ{Éø’qB‚ÈÏo—Ä{w¿àÏ]P£¯·]¸Æ*ÆibI)âà ¿n…›%xœ;×Ît´iÃÍo5ÇMïsxœ›Í<›yÂ[dž·õO_ã2ôL;}öhEë™ÉŒŒ³ä‡é×4xœKH˜à#òy¿@é­ƒ ~_aZ¾tÉ~³«Ÿ  ãÖ¨jb ɹ)Šצ+ÕéjšøµÎ¶W²–ÅÿÌÍLˆtJbIb|nzn Ã÷×+‚ìïæT2›-~ŠÕã¦ã¨š’‚\ˆ’î›¶4øn¸ý‚½(ëµÆýW–[ûH§:[¡xœ340031QðMÌNMËÌIÕKÌeȯ¼Vp9 ÖR¢î‡JeÞuóF™5ý†e%¹ñÅ©‰9)‰%‰zÉ å­– †0y®þjÑ|óÿ»Í÷#¦Üçã‚xœ3Ìÿ››Îe~º¾)Þ.)› Ú’òW™ïæ½5û‘â¥Vx¦?gï—ZA1­'¢ø —‚²·$n xœ;¢xDqÃGfFƒÍŸ˜/ñ0¦&ì\xœ›Í<›yC;£È¿[Óõ¾æ ÿ÷ÓÒq­ÚO磉G¿4 ÅëhxœëeìeœP)ròçB“Ò#:ǾíÉ.s¹³ƒm:© ÇàŠHxœ»Ìv™MÝÐÀÀÌÄDÁ71;5-3'U/1—AãuÅ¿o·þœÉ‘á}xMïñþ¾„üsÕu˜ÆZ²âˆÿxœ;(ô_pC6ë䃬†›×°&13rICbì xœ›Í<›yC;£Èœ>÷+Ùÿ"Y§ìñ·¨ø¯xxBß«È sëƒxœëeìeœP)ÂòcÿõNý¸<{fYÓ’mK­: k€.xœ»Ì¶Œmƒ.Óä(¦ŸMìpxœ›Í<›yC;£HÁÕ<í[õ ϱ;±gS’]6-f*e 'ëƒ}xœëeìeœP)¾p“|ºÎ¡§,›ØvœÒ¦,|Sx2H òäxœ»Ì¶Œmƒ.Óä(¦–…I…?$ý?K6rM²*ªŽ•2™|‰©èP §èŽxœû'ñSbƒ(;[¨§_ˆ±Ñf öh–ÍÕÜÌŒh€ ãƒxœ3Ìÿ››Î^¸¢/J-et u±1JÔ)%sÜ‘â¥pÕn+±µ.qÎBkÆ"¦–\•Dèl‘ xœ;¢xHqÃæÍŸ˜/ñ(†òìZxœ›Í<›yC;£ÈÎUÜi›ÿ˜KÊ­n«Û¿Ú¾¥Kž Fë…|xœëeìeœP)ò}þ'•?%>¿‹-eŸtOCûÿ”Nyµæ Jì€xœãÿ¦¦°̒ɘ)Ì\“êIbêé ýÊ·±© ûæ¢oxœÛ+½BjÃ<ÖɆlM“ϳEoveÊȤ¯?Y‹SZT5#£Çä)iêlVçœÆ{žãxœ3Ìÿ››Îëcë2[{‹Šñ•áQ¢˜Q«ðA²‘â¥ì ª f³ü7¨†~¿«?„ŠÕÁá“.xœ;¢xPaÃæÍŸ˜C7Ÿ`ýÃK&îã`xœS¬ÿ››°2šcÇiŠG‰j]Bq[‘šÃ¢,40000 libw‘½ð»bó=a$îóÇí¥•!à“AF]Òåæû®*Þ'&PCÓ•öØXM¶o%'î°?xœáÿêê‡m¡²²L:ä+ÃâSöºËFJ<@‘›O᷻ራLxœ›¨Ü¦°á/?'—rj^Jf5 gî‹xœ{Éø’qB›ÈÔ˜¥ï–,k0ælïTx¦¥oà7q–?м §æ°.xœû›ó:eÃ"~Μütßât ¥˜<¥Íóùg°£ˆL6Ôßì-~‚{s ²%?#,Gçë‰wxœëeìeœP)þÕÿÜÎ÷”u˜hÅÇ©<¾4Cè-´ ¤ì„zxœ[ƶŒmƒ³ˆùùd÷Ôí³÷¹I´ú<Œ‘S×: ”B ‹ï¦hxœÛ+}]`ƒëä}\»y8sòÓ}‹Ó5”bò”6—qË0¢Šôóè1…çûà‚xœ›Í<›yƒ.£Hÿ½›ÿùêïQ-X\ãþÞÚÝ¡”_w²#cÚ€ šïxœ{Éø’QÝÐÀÀÌÄDÁ71;5-3'U/1—¡rýuç‹·š«tÜ´'³Ÿ;>áwFÙž‰ê‡Áºlˆì&xœû+~T|Ã_–ͦ¬'Ø'á]ì€xœãÿ››°‡xÎàIgüªÚ¤EÓDðì5¡Û¢Ä¿;ëŒ$xœëeìeœP)ò0,3ðÁärúE)ÆÚÒlf9—Å å‡&xœ5Êÿ¦¦°`™:)¤@f{dž¬n:‰Ed“tž7ÏcGe·›¾G2…Lá\'*Ë[ìl?xœ{.úTtÃ:öÍØÍ™&§ì/xœ›Í<›yC;£ˆãô¹”‹kvY°w¿0W´à¯2 µëPxœëeìeœP)"µŽG#’íÓaÕT/+?­Á×¶­}€ê åà€-xœ ßÿ¦¦°é3‚³@êÁ‘|ë-žÕj¬—Ø4“ý)䃔xœ[(¿P~C,÷ätÞå“§r‹l–àédPsñã‚Qxœ3Ìÿ››ÎÙì _0Gwðh—ý%r%‘â¥A—T dѬº8‹íX7 8}"?êšoxœ;¢¸XnÃ{ff#=Ó͘Ã7Ÿ`}È´ù4çO6I Èìixœ›Í<›yC;£Èö3=ym¤Ë3º_ˆêÈ÷;¾£¥ !ëZxœëeìeœP)b>Ui!—õ¼k‰ìÿ×çßiï9 ‡Œ –à xœ0Ïÿ¦¦'100644 Makefile.amÔlækK½§Îo±ð¯k+•ÿÓª ±'ÿ­@äì€xxœ›Í<›yC;£HoÌ>ŽWÁ~1guE$2v,\ç©—¨ ŸëjxœëeìeœP)²ÿÐêÖIoÒªv=M:§çjº~Æ67µ4 _ï€xœ[ƶŒmÂS‘­lé¼—.åyåþù§vdÇ,þã¢?u™ß è‚Ðxœ›eùŸÃfÉâ’Ä’Ìd…̼œÌ¼T…ààø ×àPŸ…ÉWùg²rÂä<—â P™—Yâ™W’\Y¬¡iÍ5y£Êä q…ÉjÂü“y$x6ßWadæâäœÌ(©¦õ$5'7HŠL~/-1™Cfû¤"ñì‚rxœ›Í<›yC;£ˆþ­uÑáô®ýÝÇœ¼tÁ,Uñ⯖ ñë’dxœëeìeœP)²NôJ÷;.Î~%·9‡œýbÛ–¿ Ö¦2xœ340031QðMÌNMËÌIÕKÌe¸’ó,Û{ïòsùù>¬ÏÖžúÿòª†e%¹ñ‰É%™e‰%©zÉ ^v‚{yÌyÎ1­Zw÷šƒ,Ÿ#©LÎHÌKOM,-ɪ?~„ñÛ­¶ð‹_O©ŽYzñQ=²ÚœÔÄ" 2{ËÅ|çøšM.¸päÜœ  ^¦Èá…®,1)dûߘ=nŸ—*éÛ׈MÚ·=-¤ëŠ5²Ò¢T +S³*·²¥ó^6º”ç•ûçŸÚ‘³øŒ‹T¦æAM´æ}tŠÝA äÍe»?SÖlÚ¾ÜjÞ1$ué©%¥I`§Y5U ¼Óô vµ²^T•b˜T莤2¿fä¹Ýe>_>ÈÄ¿=q¸8wZ¦m‡l ’‚¢ÔâÔ¼ ÂÚ¹BKØ^ú*Ÿ™Þõ›¹vki‹G6’B:2¹ø)OãäL¬ÛRÙbRÊ*ˆ®,%1'?äÊâ7Ø&ŸŽÝ»¶u]‰³iˆÙ/§+¨ŠKŠ2“រʩ6«±=~‡•Þâf=í°ý§vš¢(/Ëφèã·b´V_\-ß}žÿÁ”)Å eH*‹SsÒJ€†UδÒ\âÀ17­Zÿx›Øš<«Nו%ù©E‰%ùEÐt²0©ð‡€¤ÿgÉF®IVE±R&ÈJ‹JJ € £Ä7ù;ï“ú3µ¨C÷aô˰[þbH K€) ©EÅ™ åö×k:80ý_̱÷ÆÚ¨£WÚùn@R^T˜™ŸTh~>Ù=uûì}îF­>cäÔµNGÈH6à탿QxœM²ÿÄ&¿"°G³h¬³—æ³ô}“v I³À e“‹ Iif (!szTpmPasswd) { “ê -“¤}³1°“ñSK­ï·}xœePËJÃP%µ‚¹h“’)z]„V‚øX˜*bEÅêF)ém¬¹5½¥jÉÚµÌNp'H¬¥«‚ u!~Ÿà¦?`úP‡Ùœ™33gÎþ˜x¸èƒ«¾‚_qÀ…5ÿ¹¿Å…<ZxÙ_ä§9ÿ s°6Ø„ÔÐë g „{ÙÈ<\GöCv¦YÁ5^×Ê,Û)à2)“‘¬ ã` q]ßvéq‰á·èæ?\&L“xƒó³-ví ƒ€rxœ;¨~UiƒëæY¬Œ›Ù¹7oáàdb¬¬Áí±¹»•qò~“ÉyÅD2Ó4‹«B r‹‹ËS4ª¹&ïåÕåOÏ/ÉWÈ/-‰OÎÉ/NµÞüŸ7II¡‚-'(((L># Ëª@Å' JM>À«=ÙTHdr© LÙæù‚O'OÖgZ/(æ ‚ä[xœûª:_qCËæF–gŒ›_±=bÜìÌÙÄÈÌÅY;Ù˜Ûss-w ãd{N7GŸ`WMk®É…’“ÏðJˆä—ç¥)$—ç¥Ää)ijZOVàÛÌÇ·ŒQF_? (?· D!-¿HU)×dY§É+xÕe\‹Šò‹4â5”Ü3sRSJòÒSK Ê'?æÕÜ|Y`?ãäEBÁêú8ï‚ØxœÛ$±ShÃfæÉ»X<'·±™|•M_A#±(=YGH–é(ø…úøÀHcs8{;ãd7NùÉiœ^™i ŠÅU!¹‰ÅÅå)“í¹”6KqÝbœÌ£(Fꃄ+xœ:Åÿ€ï°Á³âŒ³å@³¨)}“' H³p =“5 J“€ “˜ *“… ³Ú i“S-rÔ·ì à;xœœcÿáP²J°þ³f¤³Ž Ÿw“á"³P³d\p“Q#Gpwd““ü#*³a³…4³À “õ E³;!…“H#J““#logError(_("Failed to get owner“±goto out_close;³ê#& return iRc; } ,Ø6ƒîÀ#xœ{)ýF|ÃOæÍR,LŒ›'³²0n–bgfdæâ¬ÜÃá¾ù ‡1#“¾þä<.éÉ]\ža™i ŠÅU!¹‰ÅÅå)š Õ\œœ9ùé®EEùEñJn‰™9©) %ù é©% ùåy©E  µùE)1yJššÖ@ éù@ùüÒ’øäœüâTëÍÜML“wñêdú-t⃜Uxœë“&¶áóæK¬—9¹ `r‡šœFbQz²Ž,ÓQPRÒQð õñÑQ0€0&Ÿâ™üŸCn²§»rfš‚†bqUHAn@bqqyЦB5'gz~I¾B~i‰5g-×䜲“÷qºŠ@Õe#Ônç’eœüž‹mr·üdV.N3 ød&ÏæâœìÈcÊÈ9¹Œç4XM#¯üd~>6 EZ“ù2D!NÚŸŸ”Ÿœ“_œjÅ5ùŸš B&ú—OJ.jÅÅ r²û¹&òË BD.嚜įBzX–ì•9xœ›Í<›yC;£Ï:ñÐÕÓ›:=ο.ÿkz]Š×£?£1 -ë¥+xœëeìeœP)2ME°ÎúÈõGj¬* OÿØ<´ö•]Ž5 Îã‘Gxœ[Æ6uÃ%ÆÉÿu&‡2iOÞÈT Mbàqxœ ßÿ››°KÔó¯ü¥í{Pœ†Æ'ŠÔ}¬Ûk“_<ò[FëÀxœkalaœP rH‡iÞçªyn'âÎmàœ±ô'‘ð „àô xœ0ÏÿÀÀ'100644 Makefile.amÙú·ÄV·•aÍó[U÷¼…ÿ±'™³N?뇢:xœ»Ìõ›sÃ=fF…É÷˜ÿËrrq¹F„9Æ»x‡(Ø*¨hä&æYÄû:úkrIL Và?xœ›Í<›yƒ7£ˆ ˦9vGæ„ÏtóÒkÖú-~áÊäxFÁé yëÁRxœkalaœP rSö`üÒ]k þ\kñ…9¦=êÝãªt èâ€Mxœ;ÀºƒeÂÃÉ|Œ:“S7MvgªDvÀà‚3xœ›Í<›yƒ7£È{ϰ ¹"·9Wd9 ¢!»liÉ×ÉñŒ6É ÐëÂFxœkalaœP òÐÜÜ´vÕ§ËÓ:^ŸUr߬Wò†©ô .¨#xœ340031QðMÌNMËÌIÕKÌe¸ù«~û‘°íSEÅÏ~Žåû¾§õ¿!DYIAn|rFb^zj~y^jQbiI†žÃí¢éÇ»µØêÎ{up<ž'a¬!'5±¨ìÖÞ•wŒOT¿;~vÒ¥6¯wªœ7CVV”šX’šš T9]ýQteª—ôiw—.›pø‡¼®’ÊôÔ’‚Ò$°ÊƒÿLÝÿ_äªóÃ'8òàÑ…²Ç|T¥—e&Õ»|›¸ä•À„¸U¿qóËpë·NGR^œš“VÔT)1§ö²ûN× ËÎ…X‡_8ª=ýŃõ(*K“K2ËRJÝnf­Ú{÷Ûá}Ò÷Ìóþr¢*‡@bRHõÖë[/ .XÃð6pÕûäǯ^ïÒiEUšUºÄákÑçM¯n'ñ¼ÚºªÜÿÇ4T¥ÀX€ªuß`»BdÂÙïvVì»=»á~æï¨j €‘š— R,>ùŽóyƒ¶æÐ‚È·¿ŠOý-RDR\L àø-ÎÈ,…Å’š¶’îjn‘mŸç=Îç_³>ê  xœ;,r‹o‚øF¹ÅÌ‹ÍX™'/æ\BNœk†éxœ;,0ƒÃZ¶Éì¯%»k†á#xœ[È¿sƒ&Ëdö©oæ†ÙpxœkæùÁµAŒYQA£,3Q¡$#U!$À7Þ¿µvê¶3“£Ê> î£xœáÿé醨lDµ&›ØyAޮݯ–R:ù‘šOâVâ¥)xœ{²+iÃ¥Ér¼“ë•ux|=ýt¸8@Aa³²ŠÕ ¤à†`xœ›Í<›yƒ.£מIL˜{S~_½¡|0PêÇnñ7“£É î€xœáÿéé8âBãðš4 •µ¹ÿÏ]ž9‚e‘‘LÝ_…l€/xœû,óXfÃ+–Í¿X*9*êàç‡Rxœ7Èÿ››Î¥Ý»¬{ü/¹*)w!ÍÂÛ–áSë‘âK ¼’°dûÓØ#ÁQø»ì“AZù`Þì½1xœ;¢Ø'µá=3³‘žÉæOÌÁŒ“pHLàˆÜ|š3ŸÉßÇÓI#¿ 5/¹¨² $?;SGÁ9Þ3/³$31'³*UG!Ú?ÀÕÏ9(2 ÄßÛ3¨ÚVÉP)«¸R¬æd=žb^ OIÁV¨PA7qóDžõL“ùOOVXÑŠ,é€xœë“š!¹á#3³©žáæOÌÆ,“8Ò7³pr±sLÄï€pxœàÿ››€·xо˜Ëý_yÑð’ ¦¡MÜ«±”ïcFk€† xœÛ̹šsCËä"G¬ÙïExœ›Í<›yÂ[Ÿ%5v]g×Gþ9'$T¸Ð¿y»vÂdFÆYß y£xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMf˜ô1……I;%òvuñO®ó[_¼ûÁ#Ïï€.xœàÿ››íµ¢œÜo8–YŧˆàÊ(ŽÆ“šÝn ÄꀎxœKˆà!ÊðþâöH—[ñG*˜^H XyÛ˜î ûåVxœ5Êÿ››°-âµZƒ¯ô–lÓ9¨ÆBŽkÓAFNz!vô,‡NU’ÃǬ›|&L2Yæ…xœ6Éÿéé8âBãðš4 •µ¹ÿÏ]ž9‚e‘‘Lbã°2w€nT=¼[,€Ü1)‘Â'™"îáæ3xœ;}:zƒëfsÖÆÍ{ØÕCm[­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ÉÝ™»ü²Mµ}-ô3mey®÷ŠÕ^é”Ä’ÄøÜô܆ï¯WÙßÍ=¨d6[ü«ÇMÇ+þ5%¹%‚µÇöÞ}uNw’ðŽÂUÍ)!þµP–9e¡xœ340031QðMÌNMËÌIÕKÌeȯ¼Vp9 ÖR¢î‡JeÞuóF™5ý†e%¹ñÅ©‰9)‰%‰zÉ ‹ÛÒ^MÐûƲ?´qq\åÓÃË6/´ ½æ£zxœF¹ÿ¦ž°°ˆÐ2ê.ðiI~nçøÿµö“ñ:“U+tartup.c¨ïþtÀiRÐáßnÎøô·û;“ÎXzf"qà‚`xœ›Í<›yƒ7£ÈÙ-ÿí3´sË/ûßW¶Í¶Ô“NžÏhÈy ¨¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró tŸ^5HXüu‹xÙþ‰¦eÓj?nK3tz//éü¼ê໽žê¼ì©Ü:w³\ڂ᡹¹iíªO—§u¼>;«ä¾Y¯ä äL9GäÒmxœd›ÿÞÞ“_tm}X¤éý_1ñÌã³ÏiΑ§E8œºè ÆŒ4*OÉ,£;8”’½Ñäú•ƒbÛUÿk3fvfé ²“.ã¿€å sÏéÚ¡IBI„<‘m.È-{!xœáÿ­­>ýëI½©ðøÖóõû›‘ˆ>LS‘R[öÖæ‡oxœÛÇ»“w‚›Ž‚‘ÙF±eL›3}gN77ìuxœ›Í<›yC;£È–Ô™9z2¯Òö™ÎçPÍ_﫽âØ,ž žë„YxœëeìeœP)ÂüàËþ…S®¿èH0ÍwŽbk³¸? àƒxœ›Ç:uC"“ˆ“\„/»´@ϧeá/Ô×x•ýÿ¤~r)“&»0 ¤l˜¨jb ɹ)Å Å{[:=¿- Êõꬮ¬HYµŽsK6D:%±$1>7=·„áûëAöws*™Í?ÅêqÓñŠ?DMIA.D óƒ/ûN¹þ¢#ýÁ4ß9ŠI¬Í:cž:¡xœ340031QðMÌNMËÌIÕKÌeȯ¼Vp9 ÖR¢î‡JeÞuóF™5ý†e%¹ñÅ©‰9)‰%‰zÉ 7.¿ý¢k¼9YùÓõߎnWÚ¶ÈK"*âÐ0xœ[étÏ~ƒ¾àäb\›Kk'׉±qº§–hdx§VêLö[ºYGä X˜,ìš—œ’X’‘²ÿÈ 2@àƒ.xœ ßÿ››°-2FR))´Ò׸<´r4Ù ûÖɸ“AZÍ ìîƒxœ{Éø’qB›ÈWÝSÍ– ³o­]Ç{Yªò}ˆÀÄYþß =l‘xœÛ•t?aC–âfW¥¯|)-´àqxœ›Í<›y?£ÈùמOøóJÛ—û$yΨ ¨õá~=Y™±ÌÛ rîê&xœ{ÅøŠqB»HMÒê•ßët»ôŒwty»QŽØ|°câlÛÞRl¸exœkSØ/¿¡sóYNK6 çŒç€_xœ7Èÿ››Î2W-ÐSŸî„žÞìR×:æÖ5‘â-ÏëIänu†§LbI˜}P}L ë“#xÁ{¤çkxœë“š&¹á#3£éæOÌÆ,“8Ò7³pr±f×aìjxœ›Í<›yC;£C‹hœ¹‚ºÆê•‚“U-ˆÔËxóë„xœëeìeœP)r•éeÍ«Û Ú/ý=wíGÕî]+lºÕ,à‡ xœ›Ç:uƒ“H Ö…“K=—Ú•ùÏ ]!#.1a‡Îd7¦ÄŒ Ôoèkxœ{'ºT`ëæ¬ß˜&ïçÒ5¢Aìxœ›Í<›yC;£Hã#æ_W›ŽÍ¶1n²UL؆8·ŸF¸Ú Fë…6xœëeìeœP)âóuÆÜ”{Ÿí™>Í39#nò/öéO¨à Oä€xœ›ÇúEÝÐÀÀÌÄDÁ71;5-3'U/1—A‚£¬oߪϦ}Žæ5‘ŒÕ­ëN\ߨÞÂ8ùãÏÇ«á‡Åxœ»Æ¿”ÃwæÍl, 7Ÿ`åc@ß2ì‚4xœãÿ››°‡ÐÐý˦»QùOäø¬Ž5ã«oÁÄP­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å «ÿä¾)xyçuºJïê^Áå~'C¤SKãsÓsK¾¿^d7÷ BÙlñS¬7¯øCÔ”äB”ø|17åÞg{¦OsÅLΈ›ü‹}úÐv;Û¡xœ340031QðMÌNMËÌIÕKÌeȯ¼Vp9 ÖR¢î‡JeÞuóF™5ý†e%¹ñÅ©‰9)‰%‰zÉ ŸÎüì]šI@dsóÎ6hùoŸ¡[~Ùÿ¾z°m¶¥žt2D¶ ?žáfÆéiŒÛTsøU×ï»ub­öÏkÙâ¢dµ‰Ý=µþ1¿Z|üÇï±Í7êʨŽîˆ:xœ{ÅøŠq‚µˆß"»€WË~|ˆJ(»œïþ÷y(×DÿÙÛ»@l‰…Bxœ[®ôMqÃgæÍ*,̼$€r©xœ340031QðMÌNMËÌIÕKÌe¨\Ýùâ­æ*7íÉìçŽOøQ¶Ç¢¬¤ 7>'?]/™á‘Óã³Lø8§neÜùÿ|ì<˦ԉHŠ ²“‹ êJ]ÑP3+z&q8èþ§=¡‡jzúÔ•dU½öc¥×½Ig¶EþTüt'½5Pv ’ªÒ¼âÔÄ ºžV5Õ}N5ènõôáÚÁâpÆÀY]IfN1PÙ„)¡—Û.ÌüÊ~橺|¥Æ‘iõcç`5åxœÛ•t;añÉX´|üt¸899B‚ƒãC‚CB‚<â½]#Arñ¡N>žÎ îdyþðÍRâ\›]•¾ò–Vxœ»j4ßhÃ;æÍ,,¬Ì“¹ÙÍ7»°¿à˜ì$0aó Z©Ü œî‡#xœëeìeœ&¢·y÷oi‹&ÿ˜Éo¥÷õˆWÜÎÙ³”Éz mê €rxœªUÿèè'100644 Makefile.amqx­ˆ_Uì¯ù4÷} Ö¬m‰¡û‘'> a6ÜÁÙDuZ ì÷ÛVYòON‘y<z7`H'‘ãœj˜wƒá± ±³‡Èx"“k?ÉXãïçÏ‚h†4(Bô½>¯Àe‘†“¾*aK[ì†txœ›Í<›yC;£È·_Æo÷‹µ…éŸ4V)ÝÖ.úá7«v ÀëxœëeìeœP)òýÌ—¯ùš§œaØ~ú›Ïÿ ÁR éïŠdxœàÿ÷÷åÿ*À@È@¹¥×bN0–ºdºÙ˜±ù~}bl¿xœûÏÿ’Ã6¶ÍgØŒ( ,ï€xœàÿ››íLè)§O"Ø.Ïôz¤Z=\ólêÙ“šâ㉭xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMfèQ¡Ãš#««ö7X$ÀeŽèhZ *_:t÷ Ÿ­î ( v—Íܵ§AŠo%¢² °é ‰¡xœ[-´Upƒ&§‚{Q~iz1×d#¦&.…âü´’òÄ¢T®Éû˜vLîc.äVHI-KÍÉ/HMášÌÅb.®àí¬lh¨’X’¨P\’_”ª ÔÁb ¥ ™_ªœ˜§™[_T¢ZY¬˜ÔºEQaò–¹“ÛX#¹òR“S‹‹‹*¹6¿b-aä(NMÌ89ž]{òav™É{Ùã''²KNöå°ò¥&ïáp`äšÄ)!À¥_œ”™§Ÿ“’œŸ—–™ÎÓñAªä€TxœÛ*ø›gÃÆÍë]7ßa‰`”TÐÕMÉ,NLÊIÕ-ÈN.64Ô-.-(È/*Ùl¶€q²6Gú:~í‹$xœM²ÿ››íLè)§O"Ø.Ïôz¤Z=\ólêÙ“,¼Ú~ÁŒ\ Q>({éýMÜ;=H“AFöTú3í!¿†V/É3$u¶‡ðûH "ðîˆ8xœáÿéé®6¶ÂGI#âÒq/¿÷ÞŸÙ,߹ƑÂ'í‘òä—$xœû~7|ƒ0ïä|ÖÉ„6{ñn•\àÑî€*xœ›Í<›yÂ9c[†C­›®‡K^L—_Ö¬æ0§°AÕÄR2‹Kî•7ñnZ"dp&\íþÂÔkªya³×LfdœbÛn¤1xœë“ê“Úð‘™Ñxó'fN)%ö­xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMfø,ؼէN³brÓï5·w‹ÄÙ™¢i¨Ì¼g»£Ê#âuoƒõa†ösbowš¤ì#Ÿl‚'xœûÍó›g‚£ñF}6!D3l„xœÛ*¸Up‚£ñFý6íï€jxœ›Í<›yÂ[‘²ìâÆíŽS½Ús|?£Ð+iImµÉŒŒ³Ô¶ Œ­xœ340031Q()ÈÕ-ÉÏÏ)ÖÍË/ÈN.64Ô+.HMf¸¹¿âÜïçý‰>¦m{¼õjÄ;Ö•†hZ *?¦dìl/êŒ_Ç|ùÇ›ªƒ+òBƒÝ)I¹bxœµTÑn;}Ž¿bn!ªî.Ññm„*µ¥J /UŽw6kâµ=K(ÿÎx7¤½7¢âEZGgÆ3gÎÌX K¬´E°²ÁÁ€|“‘s&Š_øW Q;;ŒòQþt4(#ß ñ¦W=ªJ„Ê ‚k#ßÜgT$Ä%çÃ)ÙFÌÚ¦‘a=\H+Ø %è’ïB\sÜZ†r%Š=“1ßß’ÚˆiO#a[Fq®Ú„\‹·LÂsΫàÊV‘þªi]ÌPµÿˆ™kƒºC)» “ ùâ»x Ûk"?.ŠÕj•Ç*·HŶ¨Xü*S¼iµ)§ÎQbsC÷’êM±: ìÄÔ¿´:`v’ºQí‰ÝÄ® #HX¤JÀU[‰ÈAÓÉÒ–Ð’6ú;ö¢…6–pâϸ]@'ÂawåÌÿ#.(iA”„ÇÉ…m؈0½†%®£ˆI54kx¼ÒT»–¹"˜cJß¼‹œT[h°qaýä8Ž®ÖLÝIÜÒæ0Btu݌Ĺ8Aº¬ÂÚ“[ék­˜S¬1vù9æ,‹èùˆHm:çIi1TÎVzÁœ ËJåÜ`æ—*ŽFYl½wD#—ȆáàáÕ›7ïÏÎOo¦ïÞ]oàŸWpPÀ'xô>BVžOo d¡Ú·¾ìù¥¯‹$Š8×¶0eOŽQm¹TcxK®kn¤IÛ³Dôº2¸‹ªfŒ‡>¸f«¦¬*ž-,ÿåfYê™ß·u’Á–4œNf×§gÓWûn}¹­Ý+8ÕÉ¿·{<çÅ/Õ’çõw“}(†#¾Sp~v2¹œM`:y}z1CI?öìÒÂôß'À»Å ™þ¦à87¥)%É{Üã]ÿ#&x騟 l1mÒí$¹n÷Òšýv¦ü1rK´œQ£çÊgbÐÚÄ9—¿7™{lÑÝgËŸ¦_òàÇ¡óàsTýùwyÑ#Ú*Ó–¸S«ëRq”×â'Λ6¿\xœµS]o1|ŽÅRª¹k„(¨¥P¥~))¼ 9¾½œÉm콆´Êg}B!¢âE:G³ëÙñ®èf˜kƒ`d…¹ªOÖ–AüÄoÑmM§3HÉáöX¢ |c ÄS__@p¨r]"äÖämø68o¿¢"!.™cØétï#ÙZLꪒ~5ì\H#çX¡!hÈ·%n¸n!}¶”ŧVÉïoD­Å¸•±¢µ8× MÄN®ÏÅá˜óÚÛ¬V¤o5­Ò ªÚó1±µW$õ•NHúd~'>ú’㑦ér¹LBž¤tÓTH¶)Þ×ºÌÆÖRT3¥Ê9IÅ:Ý-Ý÷œÄÒ¿ÕÚcv¶¢»AyíˆÓÄö-@0€Í7‘…ª± ¤É &]ê;lMóu ÌàÄVŽq3‡Æ„^íL~3”4 ÃÞ³{žÈéûgç§ÓñÕÕÍzžÁ^º_àùsø ý vrÚ˜¯ ïóÝè»VFüÚ@" 3mÒ2k50ª wT–¼ 7¿W—dè4jù±TÁ϶·ÕÆ4™çžN`±6³X˜˜§Ÿ3H,V“+3M¡$µ¸DAII½’‚­‚’¡’‚n"’8PTÜZ¡$#5KAn¥¡WZæä÷lFLœœ“•ÙµY²üØMRRÓKs€þ)VÈÏ‹ÕÔJE§d'&夯d'Æ—ä•Ø*U¦ƒü4y1{9#çdŽH YÎ$/p¸JsBltŠ ñ÷ö[Ë™– ´šk²!§6/Ð)—Oåü-­«›š²I7%5©4] 8O.æ2ؼ„Ëš ¤=káåJxœ»!1KbÃKff#=ãÍo˜½7—²>fZèÙãœ[xœ3ÌÿêêaKÞµóñ’>†þßÄÌR#ð”‘uaÈç‡Gºœ¥yÆÊÓÏ¿˜ú¢ôø›¼o扌?xœ»ÆuˆkÂÂËÍ™'?`ÖŸ,È¢?Ù ˆ‹x ‹îäË@š…5A à€ÉVxœk”Y-9aáÆå¶¬ìJ†zzJ›?³eš¼Ók³×vf»ô <©xœ340031QðMÌNMËÌIÕKÌe½=Aðð6ÆrÍÝ¿ži Ný{úž»!DYIAn|N~º^2Ã#§Çf™ðqNÝʸóÿùØy–M©‘d'Õ•<º¢¡fVôLâpÐýO/zBÕôô!©+).Ȫ:{!íÇJ¯{“Îl‹ü©øéNzk ì$U¥yÅ©‰9@u»ú²UÒ7ý/mnس`±ÃqíÅ:ȶ––dæ•M˜z¹ýàÂ̯ìgžªËWj<™V.aBï‰Ìxxœû+¾D|ÂÞ‡­X6›²v³±å”d*LÞÏ-Áb`eÀË= ¼ç˜­rxœ¥•ÏO#eÇÃ*ЊE tEŸ°@g ¥.…&»µbi‡¥ ÙeI¶ïÒ.m§Ì ëÖ ¢“§•ç°îÉÄ“†£zÐÄ“‰‰žô`âzõbüð}Û3S0Ù®“4é¼ïó}ÞçÇç™÷äÍû™¾úüŸnçzt;»–HIÙ5)¡>èfqñ*~Ù3ÞÄŸzî÷hº¬ê>Üê…ndk½pÑ*Ão{òÐz2étv5¶‘ÊHÛ(Æ”ªNîêaÞ¶-¥bñh& E©š§å¶í¤tŠiu×Å$©››ø¡cxÂxÙJ¤2ÁyÐêj³Fª³/^g˜çJUT¢eµÒ{ÿrL —{ˆ¿s \á÷.ÆÐñ>ê8U/ {p´ïý®2>ìû-Û\䨙JtµDîЋ„Å »¤û)€®@šÈe˜ ÐCo‚®i4ª8M "P‘Ëe%/0 Í,—V¢[k™l:ñ–8çïNm¬Kë¸éöO›º4 šjÏÑ„yìs«Ðè µXNlduR. 9VI1Ìó\ã>ryÙ`kFvïKe‚ æiÉ"L«¹€ð—pi°;"Üã¹V@£¡V0 kº÷*´HÍñÓÁ€Ã°Á®Íh6Òܤ-áè¯B*ùZ]°ø¢òæY ¾dŸq SAœ:1R90ýä¹¹CžkÖƒš BK2 â켆! ÈÉ -@¾(«šE0~*jSMÅ6YM.ØN±*Þi$Ά‚b ´Ð¦¬–iS(AeEÙ-Uwà–¢‚ôÆ&Ðìa•–Ÿ¨§è°Žh„ì6»ékvY„W°æºÒ»§%)‰ß9‡Ž\ó]€ûÇpÔó< ôãUOÖ]~<àñ§óÈ%\?pãk®ÃC î6Ž5Ê-%˜EC'©Â¶ò&Ø,PRÍ«õš^Rª¾ÉÚY¾©“3|‹"D"ÂE·Û‚¹)oa~Ž´‰ùå3˜C΀š³>m,>è4žvÐÛBd 'Gl ïàã7NŽ ½}.Ý–Ͷ8‡nãäènI:¤Û®zºM…Ü9Ý©4Rÿ_x'‡%†ô(½+2Ñë¬\; ýÖ*ûô>aµ>þÈsû‚ùáþû…Í—{ã_›/{—†1ÜñÖ‹¿tÙV#ð½¹r4±8ö‡³½áµ‰×—þóÃ˱˦`› j«ksšÞ¸ƒü %Þ¾,;9ã^¢¦/7Hß»fÑ8iÌ+›±J'$Kl®J7²±Ì6äõ»– Ï9¹é26''‡¯T )ÐIf ȵbc×öµ¢ -øÀˆþÔYÿ ÿäÇØ˜Œ´Æ„šØ(E2å§ý9šZÛy5ü+5æÞê÷שëv[^;Ù®zMÅvÇ ¯(ŠþÔüžŒ1~Gjƒ^ã+™øóKn¬L—Ñë½y|èýàÙà¬M¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró tŸ^5HXüu‹xÙþ‰¦eÓj?nK3þ`§ªk»àù²ïUë£ûØDÓNÀ¥-š››Ö®útyZÇë³³Jî›õJÞÐbæ6î‡ÍCxœ[˸–q‚H¥<·ä÷eY霹r 'N4ud/ž ¬È ä­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ûÕ;ßÿ~kõì¾dL›ñTÓâ_‚™Ï Ò)‰%‰ñ¹é¹% ž¢+jf_ý¹xœ›ÄÙùá 3GIAn|qjbÎäwÌUj0NJbIb|°h³k°‚­²°^2§±Âk6xœëáìæÜp™yòæëÒî#·mxœu‘OKQÅI¡!ªùëí„›4˜BhM¢(±6P­¨;cÓiæ%y0}±oÆ„¶ß¡×/àJ܈š…[qã.tÑe)”î»­RªæE º<œwÏïÝsLîç6¶¶¶½ùJÝ`1NW2™Õ¬¢$ãIƒi8”8”ROz•un³§&ô^S^)tý•Lºý¢¯ãƬï~ó-àãþ˜r¸ˆ!ëÏÇYÈtñu¹F›¼c<ÑÃ$ÀfŸh£J¤ÐuÈA p/ö êF›êÔ0©Ã/¾è[™¶#*ï×ÈÕôòÂÜÒÌÔ«òËÂbyiy±8?«C>ß Ñá³WQ¬FmFˆ† e¢yÓ°˜y8UfQ0,Ñ•Á¦†EM Á!¿Çþ ÜQŸ!ø‹88‡u²½£\íᡞ;¸9"\ &?ñkxD»…Ïz¹æÚº\S—­Ä5|œWï4ÎCiüüå‘BÏb'ēШG‡ù;¤Þ7zvŸ¡áÃs› <Œ<‘ÿ/ׯ«w„EùUõø/2öZuY ÁÈ#L@ªû'Ñ?AÉh æP·( x =ºA/½ké¬^xœI¶ÿèè'100644 Makefile.amÆ›æïÔ€A3‹`˜kdýV‚±'ƒò[y&`ÄžBÚ]$¤OYå*'“¾*òÿíí„ÈQxœÛÓ3aáÆåk'_RßÜ Äͼy¦ªÓæ¯ê^lÌÐ 6â«Vxœbÿ÷÷'100644 Makefile.amÛP5c£u~Y”± f›úV|$4±'bØ)רÔOT(¯(®Å¢OÜ<µ~Ï“n£W>ºò)Ã%ɽ£2$©H“XA¢&´äÝ#xœÛä5ÁkÂÂË …6¿ªfÛœ/y˜d|Úî™"xœ›Í<›yÂ9‘#jv{Üzî(G½Ê®Žï,=ìã½ðÊÄG;Ðbæl—dxœ»!1Kbƒ9ëæRÖÇl ]¥ãBxœS¬ÿ››°28y·•l||gá¸Úþõ¬š40000 libë-Ÿ½ÜvI6ôãBFs¥’lÏX“AFò5€žŽ•Š“UºÍâ¸ÅlÀ{Ÿ©'Gî•pxœáÿêꯒ_­ª ­Ç{af}yY@¬–Èó‘Ã'à{Òk€ºxœûÃù‘sCËäx–¹ä›î•xœáÿéé®#¦—'ËëuÖ¡”’ 'º@º‘Â'ØÔ›á“Fxœë¹¸ÁW`r €£õäA­Éº*’›¿ ij¢ ý[ăÚ¬«Ͳùª†1#¸èh­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å 7OÛ…;žwýê÷*ò½þI‡)=ß Ò)‰%‰ñ¹é¹% ž¢+jf_ý¹¹1|=?à Ÿ™Ýž÷-K3þ`§ªk»àù²ïUë£ûØDÓNÀ¥-š››Ö®útyZÇë³³Jî›õJÞÐA¼5ž®xœ340031QðMÌNMËÌIÕKÌeøtãy-g—Ñڹ˵ÕÒ›2Ö1„(+)È/NMÌII,IÔ3dà=hÆr×D^ØýÞzÙó3_䳩7Îî…€Nxœ.Ñÿ†+ê'°A= FALSE;“˜¯“æГ'Гù-³Vb“’³â ¤ ަXê„ØpxœJµÿ“!˰S“T6“‹@’®³M³¿+“ì.³J ©³þ ñwhile ( ulCount > 0 ) “@³‰ ÃFn„Ñ=xœ{;}Ãf¶Ô¼”Ì4.+)é„Ð{xœ)Öÿñ$é!°–“˜"“ﮓ<Ó“„Ô“Z-³·r“ ³S vï ê ‘4xœkéŒÚPÁ6y [ûdö©“¯s(OþÊ.<™ŸSlò> ß|3?ç"ÆÉJÜß'KólØü“G…·^93-%5MÁÅÕ)Ô‹³š‹“ÓÙ;>ÔÇßÏ]A!ÓÈMË/RÐPÈT°U0°R6 ¥9þIYÎù¥y%@¾¶¶‚&PgJfqANb%P&5¹DC!1>#8µ¸83?OG¡ (ê“Y\ Ô«£àæè쪠 4»V¡\(#3'h¾H@95/%3m³´Tÿd#QµÉW4?o>£eÍ ²”C¾æ€\xœëŒú±aŽÄf}Éù,9‰™y›ÏjÚ0p.ÕìxœL³ÿ››¦Œ‘úBó’1š|œ±ÆcfO¤âmR‘ºs?b~yï}µ¶Al~å$î>yˆ>“AF¥§T^²û£G>XR5‰uîXn„?#kî‰ó xœ»Èu‘kƒ6«Z^bnª‚^JjA±‚.,ÉPÐM­HMVP(ÊUÐ-JS¨®Uˆ±ænAÉê§8xœZ¥ÿéé`m¯¦VÁj¾ÓßsƒÆÌø{]Fבt:;ø—?€X4½„+Þ¸)ጶŒ100644 tpm_utils.c O–G ôÇŸÝ?ë¨{†Ëœqc(dãŒvxœ{ÿ…±ã ãVÎɼœI“pÊL–朜Ë!½y?ç=¦ÉAÜ"“wòØNþÇ“º9›÷çæLqFæÉ³åe6O”úÏdübƒÍW'?PTß,¤%[ã’@xœ»8?pÃlv–äŒÄ¢ÉóÙU8A ­’ââÉÿÙE'?dKmþÅî!4YQ.mó©LæÍŠr L“7)|ܼEQ–få4ìÅjxœ›oôßpÃK‘ÉE$¸ Š«‹‹ËSt6ëˆ~fµt o­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å Z‚Ë.M¿âú²FýG¦Ì³‹;VD\®ƒH§$–$Æç¦ç–0”^ØãXô~‡Õw –+Ž ß¦Ý=QSR QRåãò}c«ågý_÷¾„~}Èb2ÙñÅœ<²¡xœ340031QðMÌNMËÌIÕKÌe°®Rª¹d7—»ÿþ–Cf ¬SŠo¯2„(+)È/NMÌII,IÔKføÓ8µ¥õŒÅ“«9ù+u3¯õÅ»±J é’}xœ»`µÃjÃB.©Ì¼…œÔ<[…Lk.ÎÒ¼âÌô¼Ô…Í ¹–³o:Á¸YAä<Û$i¯ÍÑÒ_EõlFxœÛaµÜjÃB®Í›¸Ú„%`6ï‹Zxœ{Áü‚yBªH½Þë:†mOl¯M5Š+úbdû0kce>#ïÛëŠCxœû|‡ñêÆ ìœ“K9¤6ëp® ›ü$~ýæÙ 7x®Ê p§'xœ340031QðMÌNMËÌIÕKÌe¸ jš¼¸T¸.rÊFδٿÂjTL !ÊJ rã“K2ËKRõ’Š6eíÞÃñ€ûÂá]yI«¹ iCR™œ‘˜—žšXZ’TÛi×uRÌðíËËç+D_;eñeñdµ9©‰E@eŸôü6Um}±}]ó'V]Kþ…© +KLÊÙþçõLö“[·úšý=Ç"}ºÓr«¢®²Ò¢T +S³*ÿkp8á°siýõ$?Ñi»RvÝœ¤25jâÙS‰“ÛLï®s‹ÝÝ·ÄÜ×pé'$ué©%¥I`¯/»þ3 ¸Í+‹ÅË÷ï•#åsO÷³!©Ì/‡Ù·nŽ²Üºô‡[•VN¨`ݨxyï|$…E©Å©y%@…Ë^}xØ©"7ç™Ñÿv=Ûã L·¹‘Õ•e&Ã0±GtßÁ‚?>•ùÇnåç)Ì]ðIyqjNZ P PåL+Í%sÓªù·‰­É³êtMAVY’XTRZT¸8Ün×'ÍÃrª'÷.6RZÙ+&礰˜D€þJ-*ÎÈ)¿—ôgîSù¬»Ï8¨þÐæm9ýÇY IyPaf~P¡ùùd÷Ôí³÷¹I´ú<Œ‘S×: æñû‡l€ƒqxœÛ¯´]iÃ^žÍGyªX%p6逃,xœÛ­¾Z}Ã&¾Í»øÌ˜&ïⓚ¼@@j³Ž`?…¹ +k€€Fxœ;*¾W|Ã^ÎÅG9™šåÿTxœ»ªtTiC?Ïäü ›·óüdÚ¼ƒ.#jr -åþ\xœ›¯Ø¯¸aÏd~…Í'x|˜6Ëð73T:âlýXxœÛ)´QhÃ2öÍëØ»"¡àìý xœ{/õ\jC 7wqUHAn@bqqyÊä‡Üª›§pßf« åžIxœ›àÕàµATt³¬¨=wqUHAn@bqqyÊäƒò"“ÅE6OW¬dñÈ –lûrxœ{#þD|ÃÎÍ{8 ˜'^äúqxœ{&¶OlCÇäŽÀÉ/9>o~ÂÙÄ`} ïŒxœàÿ››€¹ë­P+hežp<7 œš®½¿ lý±”×m £á€ò6xœÛ̹ˆsƒËd}+Áš…ÔŠÌ®ÄÒ’üÜÄìÔÉ,Ú¶L öî\xœáÿ››¦U)!”äà ß( ÿˆ¥þ¯‘ºá¾økkŠ€Uxœ»ÈuŠkƒ6ëd#VyÊyîCxœ›Í<›yÂ9‘ãâíUÏn¶ÇLÐViäYjÁ’Ò4ñÑNÐ Üì*xœ›Í<›yC;£ˆJd׺5¶JÍŸ‰…^ÓLõrsþZž ­îŠ:xœëeìeœ&ò¿yÖɈš÷ÉšG¦†6ÿz§~u÷Ä,eÞ}àˆ"xœ{Áü‚YÝÐÀÀÌÄDÁ71;5-3'U/1—Ag}O³¨Êæ¹ ]N¦EËDE_>ܨ~ŽC²l€æbxœ›ÂÛË»aËæí,w ìã€RxœS¬ÿ››°2bøM[%•qh¿ðXЊpÑE1W540000 libûó"Ë· ±Æ2`Î|À%Š“AFߦ‡ \êH°4û­w»)Þ‚Á‘3"óëœxxœ{ÅøŠqÂ5Ù+ìþE§œœ¨4+2VùÕbÿY²Œ Bl·hxœ[-ùRbCÇæ-ß™$;Yëxœ{Éø’qÂUƒN§Iµâë»ö+éKk¸öL= ¢P Dl,xœûoøÝ`ÃþÍ29)Duîxœëeìeœ&ÒW«qúãEÜi]RMúïn÷œŒI㟘¥ É6 Sá`xœ~ÿèèe¬ßgÅ:eIVõW÷ÜnúŠÒ©‘y<Z·Æ.Rm¤…g?–¶Þ›š5€,•‘É<Œä¥`‚X`¼¨åc?·ž_“>Såo-¿Þš)„0äqý·Äp`““k?o“é2…ó5Z‡Å…é»Hñ7o“¾*Û¿<Æà—)xœ ßÿóÜÐܰ “u³, ­V“ä_¯³›`V³ög}òCvæ–Axœ{¥~[}Ãiî͸™6«ñ‰1ov\Éo¹+l–&xœ;-{LvƒÏæ`ž &![bá•Ixœ{©x_qCÏær¦Í3ø™BO9l•-xœëŒú±aŽÄf}É[Â'«~àƒ8xœ›Í<›yƒ.£ˆ¹BOúoÛ…Ñgã2Ýß/øåvËx²#cŇ ûî‚Dxœ{Éø’qÂ:õêðV×Þÿ®³{w9Y(l÷,jšxHËâ å‘?xœ›øÀoÃg¶Í¢ì9Œt44JŠ‹}Ró´L6ßâWg–Q‚’‚ÜøÔ¢¢¼|[WGwGO?k.øäF!ÍÉ=¼‚›ƒ…µ™ úSË  ú'ßâWݼ]´u³ +T:%±YºKI” c#&<à€Nxœ›Í<›yƒ7£È"­£KÂ-¼ûŠ3V÷æ¬ÒÕ«u›Ïhȱ ðë ExœkalaœP ¢"ÿ1AÆF-Ý`½jF–ÃãÉ'&4‰~[ ¨#xœ340031QðMÌNMËÌIÕKÌe¸ù«~û‘°íSEÅÏ~Žåû¾§õ¿!DYIAn|rFb^zj~y^jQbiI†žC͹÷ ëß]>¸øÙÚ-"e³Dî#kÈIM,*3g‹ß²VýÃEñK^éÚªýB‹O9 ++JM,IMͪœ®þ(º2Õ‚KúÇ´»K—M8üC^×IezjIAiX¥ÎŚˬ©Fßo½wY»+sßÔw¦H*‹R‹KŠ2“áÊ£×X^µ Ÿ1áÿ¥‹—]~ì6÷GöZqjNZ P P¥ÄœÚËî;]',;b~á¨öôÖ£¨,IL.É,K*ÝÁÚ)³7ñežâÑ—þ:¨?Yrº;U)8“r@ª3çwÞÞ¾ÕifóÔd»ùõF—2£ªN̓*UênÚ¹ÕôÃiÇ íûr2à†ëgxœÛ(Ô+°á?ëæ ¶(ÆÉµ[8ømà†èxœû-r]hà ¶ÍŽì{'¯ä¼@ÎGn†áxœ»+°“oC;ë$¶{“;Ù¯/B^à†ÞCxœ›#ýCbƒÇ打™'Ÿç9 7ïµè†ÔIxœ[Ã{s‚øF¹?L“g3û0*L~Î|pòwÖ­xò -ã…BR™œ‘˜—žšXZ’TûÈaoù{)‘}«v_Idµ9©‰E@e?³Êo¯{Ųu‹¢íÂÅ ;òVh£+KLÊÙÃ|£t}´{s¬û”ûí‚Ïê”EVZ” tej6På­'v.­¿žäg :mWÊ®›3T¦æAM\É(Y–ôbóÉ4Å S«µu³3‘Ô¥§–”&M”={³ÿ'G‘Ó^µ¯¿çþLÞ¦™òIe~9ÌÈ º7*^¹­û„eµÀ+Ÿ®M+¥§æ•ú„k¯ É8¿%ûã©×Ò9ìÑH êJŠ2“á˜<µ ûS‰]4÷Ï;«íÜ7ó¹(’òâÔœ´  Ê™VšK8æ¦U òo[“gÕéš‚¬²$±¨¤´¨pq¸Ý®Oš‡åTOî]l¤"´²WLÎIa 0‰ý•ZTœ‘ R¾_°5?æÃ¾¢ªUw^í_½n¶þ+$åe@…™ùy@…æç“ÝS·ÏÞçn$Ñêó0FN]ët4¿bû'瀜SxœÛ¯4YiC Ëæ9,æ,›r|fš|û¼LqIQNjžFqUHAn@bqqyЦ'§l>ÊSÅdß¸ä˜ xœ[­>MiC>ëävÖ2ÆÚÉì7Ïá8Ï8¹ŠkçäùÜ^›_s/eœ<‘W}òzÖÉOxð—夿i$—§hNÞÀw`r!¿KHP¨ëæü²Œh 6ß8ËÙð&þ瀚xœ;*>M|ÖÍ⬑Œ›ëÙ˜&ßâ¸([\R”“š§Q\RX\\ž¢©ÃÅ  @°ø('9.æ˜xxœ;ª´@ià æÉ3Xx6ó°,aÙ¼Ÿã)ÓäõÜׄ‹KŠrRó4Š«B r‹‹ËS4'÷òìbŠ)ÙìÎÌ8y)ßlj6Ïå_ÁÔÂ!ØlSxœ[ 4Oiƒïf%ÞÌ;C怙xœ›¯øBaƒ+ëä¬<›3YU™7Ïåbž¼‹ûªLqIQNjžFqUHAn@bqqyЦ'§L–áWØ|‚ÇŸq²ßY*!J7Ëð73Ö ìƒñ]xœÛ$1EdÃfæú̼œÌ¼T…ààø ×àPŸ®’‚\÷Ô’€Ò$×l °GH€¯Bb|FHA®§€Düý}€¢iþåy©EHâaŽ>ž.Ž!žþ~ Z@ù‚°Ä—Ä’D°¤‡·k$D8Ãhwje½&W5'Âz…¢ÔâÒœ[…â‚Ìx ÝñP×ä¥ä§æ¦æ•õi@„ìP@¶Ef§¦5g Ðð  MÖ9%JxmRÒ: ¤­(µ¤´(*0¹…ÕeòuÖâÉWÙôÕ4‹Ò“Î)J/ÓQð õñ‘ÈÜͱ쌓Ý8å'§qšJ¹9ú»‚ŒåÌLSÐP,®ú( ±¸¸ÁÉ#‚©è¾'œª@E¢Lœµ›e¸¼ˆÎHì€2xœ»(¶RlC Gtd€k|pˆ£»+§Ô(„Ç{»FÆûù‡Äûzº9†8:ù`È{F¹Æ˜X ‰9††xøyF9†xúûYO^ÇÑ4y;÷ä(N•ÉûÙ9'ÿâäž|ž]|òjN½É"ò þf.OFDá)¶è~xœ[)vCtC gp@|p·5çæ5\Œ,œ “Øe&Ëqñm~ÌéÆçþ cã–fxœS¬ÿ››°2{ŽÍC—4‰Ãéx¦5*tA"Ð40000 lib¨{zÉÕÉâÔXå§ò ùakr9™“AFF†°—CúÇ߯ÒE(]¸ž9s½¸t$תxœ340031QðMÌNMËÌIÕKÌe`I?òìqðäÎ^K$¯íˆ,ù>aáSCˆ²’‚Üø‚ìäbCC½ †]»Ôü{Cï®9ŸSùù˜±åßgšo‘Ô§&æUyß“Ý*-þYæã$»¶÷œ Rþ0IUIqA&PUÕ¬GÜïfßÛíÍ.'q°´aÁZ–?$U¥yPÓ–‰lÎl;¥·¼ç°LF¯u¸=;²º’Ìœb ²k&kÌNož,Ú&°¥óù»ž]ÏŠÓô_)ã‰åxœ›¨d0$©xœ340031QðMÌNMËÌIÕKÌe½=Aðð6ÆrÍÝ¿ži Ný{úž»!DYIAn|N~º^2Ãyž¹?Ü]^‡Ž“û°=úª\C ’¢‚ìäbCC ºÜõ’ËÂfí»|_¶¸ùؙձnבԕdUÝ `;z|÷¿fj‹$ź߹®ü2;IUi^qjbPÝ­O ‚“Ô^²”•^ x±çöǘÓï4‘Õ•dæ•=(—éuÑÛ¨Ô¯z<{Kæ[÷©Óe¹`‘löGxœ»°#aÃTæÍ;˜ë*Ùé4xœ{àwÌ}òfóÉíÌb“O3woîgÙÇĘ¹Ù›ýº”xAQf^Iš†‚’jqLž’ŽBJbI¢¦µÂfy%GVtÜ^àFxœ;æ¾Æ}CžÜä½B›7ȉ±? c­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å <¯ßóZ\qütS¤ÁU?}ã=î—C¤SKãsÓsKúj5N¼±ˆ;­KªIÿÝíž“1iü5%¹%S»©;Ùòù–rݾâÇœ9Ktš9õ¡xœ340031QðMÌNMËÌIÕKÌe°®Rª¹d7—»ÿþ–Cf ¬SŠo¯2„(+)È/NMÌII,IÔKfœ¼mÏä=†Â'JÏi|Te5 ö¿—G/ì‡ xœ›Í<›yC;£HÃßu)bb3×,Ó›À­îýôoFÅ‚³¥ž ™­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å å’¬r¥¶¬{\æ9NgpH·ƒH§$–$Æç¦ç–0ôÕjœþxcwZ—T“þ»Û='cÒø!jJ r!JVµ˜«ÒZh¢sÙöÔúÉ 5J{o­W5€¡xœ340031QðMÌNMËÌIÕKÌe°®Rª¹d7—»ÿþ–Cf ¬SŠo¯2„(+)È/NMÌII,IÔKfq6/0¹¹ýÊ2ó`Ùê•¿bž¾®yš 2å±nxœÛaÕk¹á3÷fžk,“µ…M6¯œÀ aÀà—}xœûÎòeƒ“ÈܼÇßÍçI]Ù°¥°²õ÷ËÌ,{µÉ~LšKëì‰~xœ›Í<›yC;£Èûø³=‘“b_°ž[ÂØ/ñÖWá:®  ]ë^xœëeìeœP)¾6¬Ð5£wuVw~–¨ßV¯7JZ޶ 4ä}xœ4Ëÿ÷Î'100644 Makefile.am¨wÔ§¢¯b24ÊÐÚ ‡+'u±'Ú“*Mû/çj€xœ›Íü‡i‹ÉìŒSDã€'xœ›Íü‡i‹ÉìŒj"n}y,§jÅ3Ùž”ç_¼U±qQÞ““£i›î‡bxœáÿéé®·¹¹ÓùDøò3üÚa°lr€š]=‘Â'‚ŠäŒxœ4Ëÿ›üÎð”@~¾Ý(ôø×//*: ®÷“†µ…š!µ=uKè† v ¼äA@¹z”+Ïìåmxœ»!qDbC GJbIb|nzîäN60GÄÙÆæŽábO„s6W°?`ž È­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ÛŸõëüñ:_´Àký¥m7}Íz°"’X’Ÿ›ž[ÂÐW«qúãEÜi]RMúïn÷œŒI㇨))È…( _VèšÑ»:«;?KT‰o«×%-A:.¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKfq6/0¹¹ýÊ2ó`Ùê•¿bž¾®yr?sà]xœ ßÿüü°.Uaý5>YÉ»DÿŸé½èš®å<“"ZðÛî‹xœáÿéé®\Û¥þÂÝS#@Þ4NÎÆ]®v0y‘Â'ò)ä‰cxœ;æ>Ë}C)çduþ°ÍÇ90nÞ½šusŽ`7HÈerÛäõl¬›¤u˜'ïÒØ¼ANŒòVç‚yxœ7ÈÿüüΤ·W~é%süŒéJFûRÖðp‘â,.Uaý5>YÉ»DÿŸé½èš®å<“"Z/)¬ïéixœ»!±YlC!Ûä~ö°É§YE&ÿbwžlÇá*¤ ààêçâïíi«d¨´yÇ>f’Të€xœäÿüü°iä`ëÿÔÉAš÷‘¿M¤’À„ yëƒ.xœëeìeœP)²¯ã·€{fâÕÿº{º+u”y< öï†xœàÿÎλ?N´±2Z¿k΢Ë¢G™h¨rl±Ïæ7ëäxœ4Ëÿüü°-:¬$PîŒä¥YãfMKp“"Gä`ëÿÔÉAš÷‘¿M¤’'k#îŽMxœ{Éø’qÂ:‘}› X¶E+5DûÉgp<ÕݺâéÄCêÏ÷ ¾î‚0xœ›å¾ÎmC)'?'§¾¾kQQ~‘BFjQªýä@~åͧ9ƒYÑ%6òOàÆPýžWf³tȇfì€,xœûÃô‡iC£È3–ù;‹MK Cwü3ÞÉ¿$çF…ÎT·Ž à­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å üAa //ëp[pæõåˆ&ãzÞ$ˆtJbIb|nzn C_­Æé7q§uI5é¿»Ýs2&¢¦¤ ¢d_Çn9öÌÄ«ÿu÷þtWê(óõ7‰¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKfخŌczâÏö¼P-›~£¯žKq$ÿä‹ xœëµœk±a!—›§«‚VfZfNª‚­‚_¨Ïæy\±Œ›9xV2NVâ“´áâä„É—¤dæYsq¦æ§*d¦)hhÀdÒò Ró42óâAü¼ÄÜT¥"%ÍÉøÒÓÒSKŠ5r2ó€¢Å™U©ùi`ަŽX»æfYþÃÜJiE©‰)PU†Xn’Öc„Ú¨¦RP»*¿´DèδäœüâTˆ’ÉŽ2>zH‡âƒnxœR­ÿüüð2+裦)þãÒ̃ù˲MÀ|Ð%40000 lib†*³þ7ø«¦LdŽD}í¿g>“"F‡é ¢ÿ–‰ õ†U–êjÓlˆ6†_}k'©î–jxœáÿêꯗx§š¬C‹ó™ä‘j«ý<Ü‘Ã'ã×lk“xœûùŽcÃZæÉÕ,ʯî”xœáÿéé®u‚—BÐ;¡˜Ÿ®GŒ’áJž”§Ö‘Â'è]Yåµ×xœ¥VKleVÓPw7–“WÓ&öØ©_±'†FÁ–£Fµó ®ü-MYö:YpÖfwSB«4'DO€˜Þ+„zA¢*Š'@pÁ 8ÐBêÊü»ëį$DlVŠÿÙùgæÿæûf÷‡—žÆðÞÉ)¼ÕÎã«í.üúä½W ÿ>Žç9±^o±@ËAò¥Ü†§ìôù …d6‘ðá4okÀì½x‡÷ ×Uñrj.ŠxK(µ…/À~ÃOà?¼Ÿ%Œt8Y¢8ÇñŸ$TQååÑü# 2¬æã3±xŠª94ðÇ#øK‡øa_Ž™;#tôÕò¦ºš/•¡(–„Ïmž+I-$çx¿‚~¼aVG'h·VVËП˜Çb`\o¬“…Ð’óKªÌ;¤XÏ¡ƒn7…Ç÷º†ñ³.Ïk®ÈˆÇ’TgB”(­IôGå‘;ø¡Ö?L³g‹Â›1²¤©2Ñ9®"S¾¢œ)!W*•ó0% ¯‡ÁUÐïÉ0¢ê‚âù"øgw/&-CæZ7¬X¦m:~"ø½å¹ºó‘ó6ÏCÃe€Ë\®‹7xž•qu&É£ÍØÄ5áº7s%­ EÉç$­%/æ3ÒÓ5Ú¢»Éŧûퟖ´ ô‹àBH?H55 G{Κä<5×`h‡µó•# õ­§ÞÓàÙãèáz˜µúqÓ:ZÕ÷֮è1õ`Œ1#>¶>8\ >;v© µÑ0Ðå=–’Ö>s7ߤ’B½ôÝJ k£BÇVÁ[=-UÀqÿ™÷†¢[3üH‚Ó!^Øg¸~ÐÖ ×’ìó›k&¶+Üšfól¿×økŸdm†çÑP>x¦+ýIN7S‹ð‹þOkVê™ïjVÞ¯[Ã'YtجÎÞ…=‹Qfp2ë¢t«ëñêà5ÛX1‡*u±Eè·mw-õ¡qÌî<¥ƒ€Y»«‘ßµœémf ò‰½'á5sfér:>“X]X&v}IÈ7 ÅCµU#-0´…+Ãf, Ú:NÕ¿phÓ‡¶jœÇbbãø®^{ô¬FÝiLsiŠ\e²±Ñ+C¾–ü­7Œ×¼öƶƒßßèMs×&õ@Ç\÷Ö¤! Ê*k ¥;íW¼9žêVæÜÊ—o"ÁoÃo“ Â4úµ}šQ(ãyx7vO°±ß]^6öîá™…äòL"¬ÍʨnÊx—7é+´’SˆãƒE,hGœTЕ2)ÈŠ“v;pÅíÂÏÝø“{-žIŒ{¦vïxÒ'þÂîS›éˆ^xœûï²Ùe‚ùDyVö’â‚L½ ¥i¾Ì“ÿ2/ä,Í+ÎLÏKMQ˜0ùEÁ‚1~³Žb0#üÀ$íxœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ~gv<ùeÈ]xÛ4}[ýäºFé”Ä’ÄøÜô܆¾ZÓo,âNë’jÒw»çdL?DMIA.DɾŽ?Ür왉Wÿëîýé®ÔQæN%8f¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKf¿™òy-S‰ªÛTÿÇÿ9]óYsvyâ€ë%xœUÏOÓP!’¬šÝpLßf -kÌ'ÙÀÀ8Ùæ²–˜ÅM3^¡q´KÛP±WoñèÑ3†ø7xôèÁ“‰G=`âYßk÷h76Íìéûóó}Ÿïû~_ßg2Ç¿†mUk¨¢ HÕ¼°YÁSx3 lÁ xÀûÝ| ÈÒÖyà7<0ä&12üçsÜ•\U þJÝ09æ9ð¡Ðl5,°È8 ¢m6U cH^IZÉWà ,Ã,œQu@Ø„x.;Á·+PZ-Ck2Ì!Ø–l©uà‘¶é¹¶dK Üpç˹Õeq™ÔÍkuâëdîc½Y(‹óill@+51f±æä´Cz6ÅíŠÝ»-„×*Fœ#ùOáuÇ©×.ô×ù›ÓîÎE_{N¾I¯Š˜ª¨ Ay³XäÁ¬îSq U³. )¨è-Þ|b˜¡“Ø%4„âÁÉ,&NLkKÕpl˜¨ `YêQô&ÔXU“ˆ®É» #Á¡×Áíx\Ù†–É’kâ©>ƒºâ(®GÂ945º4bZøÞwQmÔ¦âçÑ=*–Æ4*Ç_PñãxŽŠ¿Çn 6P%”¢&;TöÒ#è[ˆõ VPéò:U‘'ö€¹?ñŠŠÚ•(:xé©GAW”ê Ý„ý¼zsI÷š¥·,·â¬ÞÑ.ìö÷k/™àH/¦Ðqð: ϳè<ô¥iàS\$œ4m>Òèk8b÷ôàQ¯”„ürQ"*ˆÕByËŒ£€UÉ­g€ ²ÀÄ3…‡±5¬'“À«~¾X*½!Sûkk`†¦¿­ÈKs40000 lib»ÍøÄ½p€æÕ)âÈ7k8·ZÜm“"FÔoªQ#jMq¶?Ë w xœ›¨¼OfÃfæÉÇ™Ý'k²„9—$–d&+„LJ†zº(yC¶ Õ :(CÀP¡V¡ÖzsK ÓfWvG¦Ég97nfãÖeáàRNÍKÉLãR©xœ340031QðMÌNMËÌIÕKÌe½=Aðð6ÆrÍÝ¿ži Ný{úž»!DYIAn|N~º^2Ãyž¹?Ü]^‡Ž“û°=úª\C ’¢‚ìäbCC ºÜõ’ËÂfí»|_¶¸ùؙձnבԕdUý{óÏG.¼H/ñ¦ÂíÝÍìÌ7u¾GRUšWœš˜T×óP§ðÇËë+rïÍvbò—ï×!«+ÉÌ)*{P.ÓꢷQ©_õxö–Ì·î/R§ÜCbòg†Jxœ›»7rÃ^Y¬­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å –Æ+‰%«ì^/ö‰Qt×/¶ùÖÇ!Ò)‰%‰ñ¹é¹% }µ§?ÞXÄÖ%Õ¤ÿîvÏɘ4~ˆš’‚\ˆ㯕Oo_»ø:=tùQ}Ñ/»ë.\:L¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKfà˜åþÄrﲿªwWwKô÷¼(ï€Ââ£rxœR­ÿüüð2­= ò;ÂÛu$ˆrº*@ÈuÁó40000 lib!zâÔ3Ž›ø_Es>®ÇBJ–Ʊ›“"FÔoªQ#jMáŸxœ[DZŒcÃ.f>ïÔJ·ÌœTäŒÄ"-Éç˜U&ÿfÖÒQ hZsq)§æ¥d¦q§0·k;xœ[Ʊ˜cÃ.æÉ{™3¥ƒî„%xœáÿé鮩ô!¡pÄG=ü›e›×n³»n‘Â'ÙD‚é%Ÿ=xœûïòÔrC3³²cˆc¼«Ÿ‚©©%—rJjZf^ª‚kX€·kd¼ Tnò:æ†Éæ,mv%ÅÅÞ©•.‰%‰Ñ!ÁÁÈJb­¹8“3‹RË `JÐL‰,Ízz²[Êæl'çðªLŽâXÄÈ5™OZ|²§Ääûœ63ó8ƒ¤¶LŽŸìÁç9ÙŒ-çä—Òz“Û_n®êdgÖ*)žÌ.¥Ë ¤‹ãS€VM6d(e’ÙÜ)ÕÈ$®—ÓÔ†°‹3«R5'KË*q#ó]eMõq¨ÕQP+É-ðIÍÓú YÏÙôÉså”'Ÿ”K™ì&/Å­£ò¹–BqIÑäùÙ“ÿÈkOÖPPWòËW“BFjbJj‘BAQjqj^‰ÒädU~¥ð¢ü¼t°tIbºÒä™1`°AÄÎ+¨ @Å@adST›¬«(i t'g-FYbiN‰ˆŸ™¦ r†‚¦B5ˆÏY\P”™W’¦ÓQc¢Ù䃊*“Ÿ(*NfQ’c+%9΢ԒҢ<^¸Á0±’â‚ÌøÔ¢¢ü¢x tf^zqtIA.H$/í@µP•JJÖ\µ\Øç½j¬xœ340031Qðñtvõ ve89“«nIìî”òÕ¿Îåò—ÅN;ÐfQâ›˜š–™“ª—˜ËðEƒ©¨1^.èî©C©oŸL•_Ðzݪ,ÈÕÑÅוáb%GC÷çAÖgÆ«Ø2.6ûn¸U‘”Ÿ_R\R”X WœÁ°óõÚíŒÔy6æœsf­Û»Ÿ3ç/P¹©©BrNjb^)XU¨f?¿â”ú'°Ý×áúß±ôßz¨iÉùyi™é¥E©z™y K¶×‡××½T-þ#ßóÒËíwе&@ ™—œSš’Ê «x鯫$Ç1à -³ïÅ.ÜýpeDENfÃF†ü¢Çö\mµÂæL‰*ùÚWOCdsóXî_ÿeá'êÂqWså¹ SÞïsöo„ÈäÇ3ÜÌ8"=qÛj¿êú}·N¬Õþy "[\”Ì´´q‘Ë ©y—Ÿ®Ÿx|ŠÃÊZk™p˜§â†\xœ{Åx„QÝÐÀÀÌÄDÁ71;5-3'U/1—á½e_êwUžˆ‚R“~«Uuoµ¯›?QÝxbCÄî‹Cxœáÿéé®ȯN ¼§¢„± qɆY'ÿÆ‘Â'Ùý åã+†xœ{j¹Ùr£˜)ãæhƦzå”Դ̼TWG× %]pru÷ôS Vâ‚É»ùû‡Àå]ý\PeœøGw¨4§àí f#Ô¸† ©qõs©ñFSä₦(‚¦&ÀßÇÓ92>ØÕ9È5DA© ±¸¸<¿(Eiò*foâ’Ä’Ìd…äü¼â…äŒÄ"…̲hC³X[%O'_…`WG(c 4ù3ó/°­Ô¼d—Ä’D[¿PŸÍ¯X,˜D!A¢£P\R”“š§áNögï…ø.ñýd?vµÉú‡Å …KCø›å8Ë'{p¯ƒú.áoVæ9Å"ƒâ7M.N€ˆnæä`Ô/.I-P(ÏÌÉQHKÌÌQÈLS()ÊLMQÈÏS(ÉHU(/ÊÏKWÈMLΕ–þäüb“kø8&ßaâÝÜ Έ׊ÉÜ‚“cE³€Âcòo)f]…Éb¢Š\55 Ð0šìÈ%:ÙYtSfÙä¿¢µ¢”÷ „;y¹ØX j+¤$–ø¤æMîŸ1YMâ¹"Ðå034®H+JME±ÞÌ-éÇ´y†´/#œçÍè¤xœ340031QðMÌNMËÌIÕKÌeØÆQûôóùÒC3xÌå¶þâ-û³\ÀÄró 4ÎsÏŒ_ÇTi&7o^‹”ÇŒ{{5·Â¥0SÕµ]ð|Ù÷ªu‚Ñ}l¢i'àÒ *òdlÔÒ Ö«fd9<ž|bB“¬Ø11ïü]xœ»Çti‚­Höäi.m1~‡øreÃ|<$ùôK‹7ò2¼ œ­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ‘^§/:Y_oÙ{äƒè¬ß†woþw†H§$–$Æç¦ç–0ôÕjœþxcwZ—T“þ»Û='cÒø!jJ r!JŒ¿V>½a|íbàëôÐåGõE¿ì®»ëù=1¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKf¸©ò¹oÒê‚ôÅÝ쇻Ž4ÔÖmj8Ф '³éxœÍksÚHò3üŠ[!ÂVlœ»M]™äªË6 ”$’x½)•,  t’Àáÿ÷ëž½08vê>IÙLOO¿_3>>¨Ã˜ ƒÀK=Û‡3¶f~±Â¤¸1޽¹àN?tx b¦,ìÔ JÇ{«Ä X’À•í,è¢ÆQs”#˜„1}IÀ‰™2n70è]ÑÉØ1Ãu´Av‹”~ Þ´Û¿W¹å¬èðnn]ßH$ ³„Åkæ!¶P¥âpÛKRd3I8Kïw6á ;€˜¹^’ÆÞí*E}S°÷8ŒaºÞlCt¶ \´™¥[&™­úár‰ªLV·¾çÀÐsX0°‘+A’WžH þe±;À<<ÚŠã$£(i¨€(vJB¢g":Ô"Bv°­šݧl¡“ ^Ài/ÐÍø©¢Fwî–Á*a³•¯ D†Oór<5¡;º†O]]ïŽÌë"§‹w1V)oùRFKÆvnP|î"Mï_â‘no0˜×¤ÄùÀi†çcº0éêæ ?vu˜LõÉØÐŽ Fb1 » :ãîÀxqYj{~’é|LP0ß……½fèI‡y`ƒƒ‘õ¨—¸1ý0˜så¯0_¼aªft(JÐTkÝñ”Î.Ò4:=>¾»»;B³ úÉaGaOÙl£üòƒv ¶µÀµ eÀ§ØŽ य8q­ú÷z­D4fÉÊOá=Ôk5E¶ðœU°É¨—‰JR­N½FJ꜂Òxxº¡Jò„³tЩß?¢¨k§¶Ál_(©úg]³KlµÀ¡½ª²\¦é`dþí .}¨Ð»65 «„\6Ù`§ê5ÀWä Z\ˆ2ßœOÆá1‹ä„ÊÖxÄëÐÃta~¤8X¤Spv vé¶€|ç‡sü~IØÉ@c^…”Æë™ ¯_Ï<”Ð^2äj)s¹Â| 0Eó à Ò­µƒLHd°ªD«t‹žº‹=¬Æt3NPÂJqÆf6s•;!d[|÷¤$ÕNf1‹œXpâ‘*eãÑð€|‚Zî7—Í(‚&]óÒºê~†7¿¿ÍäeÃÔ£ hà÷F¾ÑÓ.£|ë5}8 mtVE@@iû¬k\V÷¶—Z÷LÓ¡!Èræ…¬ãá mZ_×LhDv’Ü…±ÛÈÀ»Ý ¬Ì7™v_0Wh&ôÌŽÍ÷F''QÄ·¾9yËOR§3´îPþþ³]ày"JÅ{M‡Cª"õÇ#Sûl¢áľ¥Õ]sr 3ZvJ)žBdÇ “1Mk}¯–dÄ|íÆsã´;(Àë ™Û–ç~C€Ho¹¶Ö¶_EJ¼ÿ  ^K°s8 …µ©Ö›Õ«Ù«Sü^âp– 6k5lÈm”’ÕUŽ¡æ¡E‘‹.[›¿§·Xñ¾vraÆaƒ²ë~C´O‘î+û/Û'¡xY’ž“Åz|ûsR%ó§ ?äÑqï_Zß´Ìë‰f±Òv[…¦¨}ðâ½H¶i¿EK¢ä‚KEjÒm¨ž†žÂÞÉeç²aYHSg¶«P ©™¯‘™tp!B³{„2T™ <¢0ÁB†õ9ÅõGÛ_1…«Sb™ëš³®p”Û?e¼Ï£÷E/px9«Sô/±H+m¡Æ¦u5¸Ð1hzC cäç„ï{¾±I>´Pò8¢Dˆº¡4³’±+õæ!öp …í£a”«ÍcG-ǶEà‚¥XJÕªIUâédæ,`±ç`_¸DWù,VD–Qz©Ð˜†§Ñ)µXÌžÿ˜õ,œ)´nËE%]Zªèo*ŸÜ¸$mQrqÎÑâ8ŒkV œîÄ™?1 =’Jõ…Ã`F7*m©ãax·‹Ë4°o}>¤Ñ¹Òàu /bª–Ií“@XŠ'Vµ!6³\ZÂcðÜ|¾–Ìð\г9K…’XiZ %Bm=*V×ØÃ›1ºÆvY|´Çƒñ¿dZÌs»˜eŽN¹Px{Åq7rH~WY’–¶ï‡Ž’×´£$¥¶Ã€Ž%j/Ú!h'V0¹Ôtëq¾r¸BP›%NÇ–së(-.°/gýã¼ÈÊÝ%ÇèE¼±/^õ7?Uç¯YÂØWÄ*àœ`hÚxÍœ«‚@áMfR@ܤNÔ Ióhÿ‰£m—“yª‹ñBŽ¥DÇ.å Q2bºåÍÓÅÓ‰± )KýÏKd]¯•ôÍÏà¤ßdŸI—‘è „­;ÞD)=*MÄ‚UDP³>ƒÙ´nUÏM#—g~Rz3W°P¥©Q·RD ¹/v qN¯UZ‡Å¡œì­Ã‚˜06šsÚ$po3ΊòM†›²Ë]¦v¥ú‹Ô&Í7Ï0ïƒõ`²Ýhu£‹MPÍû.u“ç¹”xF|¨ÂhRÄASŽYO&S+ÓÁqÔ`NLÔÊŠ¦TîÕõsdV*ÏIBj1L–o Ï2Báâ½§Ò¨í÷žx–yćräraÑ-WGÑrþu·æo@ÿÿ®%A+Äyz}Ë«ËÞëÝc^Ä~ÝMé›êR}¸3 ¼ìšú —»ª7÷Ô:`E…Ý„ ° )†oQ€/ŸŸ®[âåo¥cŒÃð’0|Žnƒ=GbñôèȆ ŠòË@‹nðØñð “ÔåÓtù £GpåEuF¬>,4î± þt@wµ­­"H¥“¢¤Ì^–gUìôQŒ-l&{}ãeBÿZyeSKqjùõŒl‘àÏiˆhoþÄ"4TÁ{ßî€÷®tïðP虑L”ö›o(FûÛù94³ëÖ÷…ë$fPïð¤/ñŠÖâ÷-Y$ëûBf2íãöѳ äSå1^»þ×bc¾í»t~(ù>ÁéÄ/KÎ=Tš*Ä™‡\w«TŠÃâ)÷Ñ(DŽzöNƒ)c¬‡% ]×7mÒAÞ·áTŠÊ³±Ù¿_d+$æˆ\´*¢œ"‰åîÀA&YsäHùý¹ŒšIÂ'zÎ7f,[vª-íçâ/5h ú»ÄKôNþæžPxœ6ÉÿüüÏݹÂa÷ É Ì¾=!ìëwUÅ÷‘âJŽ9ÀÊʨHb±ÂXBuù?LGNM“@<K§kËxœÛ,6]l#÷dYn1s¥xœ340031QðMÌNMËÌIÕKÌePÚ×»#ÿÅ«KY}9·C½/0¬¿nb ¹‰y† 6“ND‰úÏî|y¿²uÀ³M'å„áÒ *òdlÔÒ Ö«fd9<ž|bB“»i&íj‰œLxœ{Ãþœ}ÃSf& .¾à€•hxœ»Ç´…IÝÐÀÀÌÄDÁ71;5-3'U/1—aAÖ¬WË6–»2Ÿw½0mÛ1ÛŽÓýºyª—kËxœ›ÊÙÀ¹á1óäÌsœéå/xœ5Êÿüü°“W?¸…ÎÓy–ö£ÞS‘´°[†¬º“"F›mê7ÿ~Ô53¹¿þTèÆýÄr°îª^xœáÿéé®<ÄpÄ×¢ôÜ¡¶±…ê'z)ÝÓ¶‘Â'cÊéžxœÛl¹ÖrC#3³‘™ÅæfmF‹X[%O'_…`WGŸÉGYb'«²ÎÞ|5œIM«¤¸8>%±$QÁV!71''?YC¡¸$±¤X¯¸$¾8³*UAÓš‹s2¿¨D½¦B5''gQ2P©®¡5ˆ]RŸZT”—rõó÷uõ §ç—ä+€ Î/- ÔrrIØD[…´¢ÔÄ ¸Ý: †:¨¶ê(¤¥€,æ,J-)-ÊS0°æš,Ä)µ¹†#“g²€¨ød+Ñ¥Ì)©Å›Ÿ‰60ò€Ý¯­ ‘©o¤9y—ÌdQqÁÉ‹Å3S& Ht3rNž-³YJr&3&JS@å€xœ[k¹ÄbÇd N ?ÿà`— É…ì"Ìœœ\“ëx$6?â8- Ï< Ü­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ‰É³4ñSù¾l‘òÊåW¾;èÙß„H§$–$Æç¦ç–0ôÕjœþxcwZ—T“þ»Û='cÒø!jJ r!JŒ¿V>½a|íbàëôÐåGõE¿ì®»˜?<¡xœ340031QðMÌNMËÌIÕKÌeàÒ[¦6oËϥ݅û•ê蔉2„(+)È/NMÌII,IÔKfàõ+³¶ú`Ÿí²­%kOئ´ívœã›Vxœ›l»ÓfC4ŸE¬‚­‚’§“¯B°«£ÏæbŽHÖÉ—y7mnã»ÅÌ’’Z\±9]Ȅ̚¼H¸†Èج*bÃÂdd²¹S¢•…‘sò\iõÍ~²®Œoë2å‡xœ5Êÿüü°Vþ®s”E`>×™b ­jÒ¤ÿ“"FP’…$ÓîÕÔ@Öäû‡H½lõçf’Bî°Cxœáÿé鮥ó'\¶ö¬âAP"cÕa–OÑÂ'æ*"­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å 5OjÏ*ú ‘Ô®Ú³W¨ë¿×Ó‡é”Ä’ÄøÜô܆¾ZÓo,âNë’jÒw»çdL?DMIA.D‰ñ×ʧ7Œ¯] |ºü¨¾è—Ýu·*ï"Ë´øÐ PÈÉLbȽ±\Y»ažy¦q|cþéé™ñ“•ÝD®´Þ~ÁVÂÒxSáÆß –Ç»kÌT#î§ xœ;Âx„qB§ÈI¦Å¿;î^±ëçÛ—áª,÷p«ÏĹêÚ å©xœ340031QðMÌNMËÌIÕKÌeø¸N•;çxYÆÚõÕeé9kö¿í,5„(+)ÈÏÉO×Kf8Ï“Ã!÷‡»ËëБcr¶G_•kHART\lhT—»^rYØÁ¬}—ïË7;ó£:Öí:’º’â‚L ªoþùÈ…é%ÞT¸½»™ýù¦Î÷HªJóŠSs€ê–ìØ8;°àÚ9ñÍS”Êo¬*ÑeFVW’™S Tö \¦;ÔEo£R¿êñì-™oÝ_¤N¸ö_Và€¼|xœ["¾wƒëd;nÏͬbŒ.A•î‡xœ[bqÉlƒ.#Gp°Oˆ£»×fÆûL¢@^<« ¤ @ž‚·käd –-ÌÞ©•“ï°È ç¸$–$ê(dæ•h)¤™“9X˜‹‹s6Û²:1n~̦ÂȨ0ù<—ôd%‰ÉòÂl“çórnväha†š®£P\R”“š§äo¾Á-ÀÈ dL>Ï¡´™——er €Ød>!ÁÉV‚m“_ ‹næêabY;yŽˆ„qFÄŸlµœèLy+ Š2ËKR²S+òRSSRSJòÖ$•L>$Zvž£3#ˆ1Ù]Ü‚ê Mm -°AÝⲂ@9ŸÔ™Cj؃¥$@ôæ³RáŒvÖéDxœ»dvÁlƒ)ãf3Æ.þÉÿøE'¿åáØ|O „ †Ð à­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å âr/:Í'©vêxzEìÊÛe›5ï΃H§$–$Æç¦ç–0ôÕjœþxcwZ—T“þ»Û='cÒø!jJ r!JŒ¿V>½a|íbàëôÐåGõE¿ì®»… ;ý¡xœQ®ÿ100644 Makefile.amðÙªœÆaË-xàCÔ€¾é°ç†100755 seal_ssl_key.c#³¶-!Ç5WmBdë.¯Ëê¿$u!〵pxœ›ÄÙùá3[qN|vjåäOÌ5 f|°h³k°‚-gqjbN|1DX/™ ô„xœÍksÚHò3üŠ[q„­âÛMm…äª0È6 ”$’x})•,ÐFH:I`s‰ÿûuÏŒ^¼bï݇s¥MOO¿_3nWáÌ9ƒžï&®íA—­˜„,‚` n #wæú¸Ó & Ü1ùvâ¥ãçËØõYõíÌé Q£0ˆ8Ê)Œ‚ˆ>bp"f'lwkè_ÓÉØÃu¸Fvó”NΚÍßÊÜ2Vtx7·¶çN$bÐYÌ¢›œ"¶P¥£`Ù Rd1q0Mî‘w ÖÁÛ‡ˆMÜ8‰Ü»e‚ú&`û“FÁ"˜¸Ó5ÑAØÒŸ …È<(Ý"NmÕ  Te´¼ó\ú®Ãü˜\ ϹòDõ/ŠÝæâùV,ŠÉoRŠ’† (b'$$z&¤Cu"dûkðЪÙÑ}Êæ:MÀõ9í9º?*jtï¢áî,c6]z*‘@døÜ3¯†cÚƒøÜÖõöÀ¼i!r2pcEr¡ç"e´ddûÉÅç.ÒôÎiŸ÷ú=󆔸è™Í0àb¨CFmÝìuÆý¶£±>Ú)€ÁH,&d—A§Ü/–Ø®§:ß cÌ›ÀÜ^1ô¤Ã\ °ÁÁÈ:è%nL/ðg\9ÄËÍ×w ~¨)Š4ÕÊe÷D<¡³ó$ ß5÷÷÷§hV?F?9ì4ˆf O0ˆNè½9mž†ónTq}Ç[bR½×q#Y‡,>ÿ}'vR†N?ñJ Z.¬$ÝÓymºLÈ>Eð{.^ì5Ø*$*Uâ€vp}³ LðtÍ÷MøÆÖž²ÙZ!øÕGílkŽkŠ€Ï‘æÀQG7:r¢êÕïÕJhÄ⥗À¨V*&Šlá9+g“R/•¤ê­j…”Ô9¥¶}º¦Jò„±dùЪ>Ptb'¶ÁlO(© :ݶÙ&¶šïÐ^YY.Ó¸70ÿv†Kù*œß˜†U@.l°ÓÕ àW¤‹G-.D‘onÎ'åpÈ"¡¢5˜c¸˜.Ì ‹tÎÜŽàØî,&u ßyÁ ¿¯[)hÈ«R{=Uáõë©‹Ú †\-¥v!W˜/>¦¨ïb^a8A@L¢Õw ˆ V•p™lÁS÷‘‹Õ˜ÎbÆ JX)ºlj“!1W)±cB¶Å·ë# ©v2 ‰YèD‚T)†-ò~à Bd¹_&lJ!tÝþb]ôúÚ }­YFï Î~{›íŽ´kË0õÞàÒÒ6Ôè×Hï}j›`(Õv!v ±»±«éj;(ÄRüÎ7εËÞ ÛzM?9Š6è–PØî¶«ò~¾‡šaÚ´Q<¨ ²{uín¡îÕV$c•«”›mØïun,Cëèš µÐŽãû šÔ²Èæ‘ìúVš·[þúŠu¨†!€QwëC­ÖʈæIâ®n稛Z»Ÿcå%@TÁ0÷ûTFê ¦öÅ„y3…=$å]st s3\´ Õ+ÐŽb&Ó•Ö6†µZ KQ;š‰ô¥ýÈA^¿Á,e ßr'•K®­•í•‘b÷ߨVblŠÎ\!Fu@ªÇÆ>üjúê~W°=*œ%ˆÍJg ß ×JÁú*ÇP·“†²¸MþýH¿î°ªke¬‚”ÕNEþ—¬Â}ZqˆthÑ£é>IÇk°ô¥ìLû?™“(©‡UÈøC>žÿC똖y3Ò,"VØnªp$ =¼ø ’{ÜéàôT—(™àR‘Št$ªg'«ð0he²sÙ0¤,¤©3{¢Ph©©÷‘™ty.ÂQ!2ö!e(3A8e…AŒU›Q‚ëO¶·d W§À2Ó5c]â(·ÊxŸGóÆçˆÚMù°ÀޤðĉfŽ*;Þ1.Vy§æÝ~nDßT Ü’Ðt8H[t Ń#Àq°‰¼«g‰‡aºt9¹Óñ-•Žïð½Vèœû×ÒÅû‡…²,ÌÇX¡(S)ÓU®éw¨e=r?zP@]n?nøêQDÊ8&iry©èð_ÖÝr*µšNTàÓˆ‹Q'].üÙ-zS¥Üúê_SD¼nß¾ÍÖǼ׊TÊ`Ìwº%01•À>óó…0±E —ÂQb‰÷‰XKtjî(‘ éÄ‹~û’f‹ ÏžQÉ&FHMÃêíK ~d`*(ÖYó×ß~TÓl¦OÃ~Û$cæ¸í1^£ôÞ6ÐCÓºî]êVç}­UùƒSS‚·_ÏXÇ á(»QCDaQŽÒš²+7gN4+›Gß/–£CG-Ç b¶Aà’%X6 åìˆÊÈÓÉ̘Ï"×ÁVr….òX¤ˆ4¤üS¡6 ¨!c‚ðâ ŠÖõ†\”r©®Šv¨ò–KÑõ'>-Š‚HÁ¯çc9Á9Wœù§/fÂ-±^‘†¸R ° `Õoi–v(·R»ÛÕ}ª¼)„„6¥«˜R>U‹P6x¿K‰±oßy|¦s… ÷¼ŒI§’‡äI]nÏGiž #Â!x]x¾–¬.™/¦3–Ä Õ¤{i”µ~P¬ì‘Ëðž?Ç^Æ¢Ó=nÝbŠÎÃ’i>»3áZ>¹¤5MÝä‰ópNئÕ-Òú©î&©%ZùôKr5p¤‹c¬Ût€»†ÃÿŸÛt1‘êÓ‹Â.–ù¥!c·/;¡'˜Q–í…íy£d â4N¨‡c¦§¬ŒïE;íÓÈêôFW(ãâ|ãp… ?XΣԹ0ÂBœïð"í;âcˆ1LaÁA´þ©.8ÛNcƾñ”T'.CÓ>â¥Â̸*Δ¬ML .àoÔ-mdÄòÜýIØÚNæ©›„ ¬¹:Ë`!G¶‚ݰaÑãÀ,™oÚMLWG²þ¼@K¾ÕJzÇüNò »p²Eû$ œ€¢u˜Ðñr„8B*ä/Ø«iÆ¢°ª—όà o_ü”t% A^•6F¥ qÔçNØ%À½N—iä‡2²´NrbÂÊhÇ~`“Àçëñ¸×ÍmdÈ1àÆ0µkÕÐ?Z„¤шø Ónõð­ËÁæKN j6˜P¿}ž;‰gÈçR #E<(ÉIõÉd*E:8Ñ̉ˆš CéÀ;féRŽ1P^?Gf¥ôü(¤óxñâõ,#ä..Ð{*Ê~ï‰g¼>”·±!½¨â(ºCÞ'þº[³7Ãÿׂ’½¸æb œýZ¨{ヌüƒE;¡?uP¦+å'\ÓµMì…ç™ÎûÃsµ X'a7!,8QV/ŸŸˆâe¯æ9cº†[ð¢0ùu&_\{¿Œ~!-µô|©^9U(:ù %±Û ÈŸ,ñ$½1òo’ÐP!÷C³îûÂÜ“¡uJRÁšg(QóáâŽÒ ä­û•k(¦P÷äM^⥳Î+6d‘¬·„LeÚ!:†ãÑÓ»ðSå¡[;—þ—bFÿ€Ø…[ý¶äû§Qòí8Û-z9úò—ñ§Æ掞¾HaÚKÇaqL÷ÜÕm“$——üÍd wÇ)ÿâ’”óü}‡ $ÖdRI›GÊnúEÔwrºå#5ÙŒþž.ÓÑ7›²³ý ’ÿ… U¥¿'ýSÔÎåxœ5Êÿüü°L„N:•Ÿ Àõtê‚/~,g"D…“"FOÚžÄ\˜b¸·3æêMÀ){F8îœ;xœ{Éø’qÂ:‘ä.)»Ï_%dÛñ¯¿i:cåÔ¨‰‡ÔãÖ­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ³whÊ› ¹0^޼Û`´àÂ&½ºãé”Ä’ÄøÜô܆¾ZÓo,âNë’jÒw»çdL?DMIA.D‰ñ×ʧ7Œ¯] |ºü¨¾è—Ýuù:=¡xœQ®ÿ100644 Makefile.amðÙªœÆaË-xàCÔ€¾é°ç†100755 seal_ssl_key.cvQ&#—E:¬JkäòË;7[¿Œ%¼ ¶ê—Yxœ;ípÝjC0ëä4Ö@.¿PŸxç àÉûXÏ1Lîe‹ÙlÄ®Æ4y§Ýd ®¢ÉK¸&?౞ÜÄ)ÄÏïà«Rk=Y„÷øfv¾UŒ“K´&/H›Ì+x{ó;A&..ΔÉñ"ò›ÃEü'oä?Õp}Reï¦ZûgåúÉ“•ÝDεóqÏ]²Ìàè‘ÿõÆå?&”ü½ ÖÎ@ðk‚–5xœ»Æq’cÃKæÉߘ Ç8où-xœÛ,Ö$¶Á–kr×úɲÜb*úÈiÊ\xœ;ÂX:Q=jâJiÙ¢â¢;xœ{ÉxQÝÐÀÀÌÄDÁ71;5-3'U/1—Ç>t¿¬Þ:K+Ñ HLõh»¼|¢zýÄsÒ¢Û‰â€ß)xœ["¾‘gƒËd;KFÎÍå,÷5ùk­xœ340031QðMÌNMËÌIÕKÌe¨;&sè{܃cNâ:ë·7,ñ>¨jb ɹ)Å ÎZ½Å‡9uÏâ38£¤Æ›^Ò ‘NI,IŒÏMÏ-aè«Õ8ýñÆ"î´.©&ýw·{NƤñCÔ”äB”­|zÃøÚÅÀ×é¡Ëê‹~Ù]w{´8¡xœQ®ÿ100644 Makefile.amðÙªœÆaË-xàCÔ€¾é°ç†100755 seal_ssl_key.c+Ùk>+ ‡MTâQaw9˜:ŸDÈ*B Æk…3xœ»nuÍjÃ=™É÷e*% Òæƒ=xœV©ÿüüÎ6âÏRžÙ•~Ñ¡.Éô40000 include¿²Õd–¦§ß…ÜÒo"==úÐo“dL4.¤º)Þ…jÓ:v%ò âáZ“†¡' ãýxœÛ,öFtƒ-×ä .§É«¸Â'Ër‹I(b¥xœ340031Q()È/ÈN.64ÔË`صKÍ¿7ôîz‘ó9•Ÿ[þ}¦ùÖ¡®¤¸ ¨jÂáOÿ§ëÕºÌpt{ÿèX܇Ç[m‘T•–dæ•]3YcvzódѶ0-ÏßõìzVœH3ëxœÛ/?SzÃffñ’âb} Ö˰ãRÎÌKÎ)MIU°))žü‚YmsKÓfWöOL›÷sé²pp)§æ¥d¦q…_®xœ340031QðMÌNMËÌIÕKÌe0~ÅêýüÇÒþÞž¥ë–y\Sÿ¾ÛÎÄRKãsÓsKúj5N¼±ˆ;­KªIÿÝíž“1iü5%¹%ßîöò/`ëÎáÎãÞÃ~DãÏŠÙUü-g‡·4xœ{Ï1™cƒ0 ùZéâ®J: ¦_¨ˆQkÍ5y"·°=BgnA~Q‰BIFªB~RVjr‰F±¦Br~^Ibf^jŠBfžS6GðüHÝ æ€ÆSxœ{©xOqC.Ûæ<6¶Íå<2L›gð2bä^î‚xœáÿÚÚ¬ñòôòP#V‡J¸ —„Ç,†—‘Àšæ¬ð쀅2xœÛ,6Stƒ&Ëd;–Ÿ›KYO°Lârš¼Š+|²,·˜“ ¼ìWxœ»Åt‹iƒ£ˆjÄÍG™˜í¬…B5äMdR5—{}ç®xœ340031QðMÌNMËÌIÕKÌe0~ÅêýüÇÒþÞž¥ë–y\Sÿ¾ÛÎÄRKãsÓsKÜ>®N˜ÄðïC‚¡.Ëñ/vâÍj‡¨))È…( òåˆiÿºùÎ?Cé,ã{sºg9Å]T-½ï‚?xœ{Áü‚yBªˆ€¦Zï¥Ë+uEyç%ª/{ͳûÒÆÊ|FÁK ˜í#‚$xœû~›q×UÆ Áb!Ê™i)©i .®N¡î\œÕ\œœÎÞñ¡>þ~î ™Ö@nZ~‘‚†B¦‚­‚5²QÐJŒ/(ÍñOÊJM.qÎ/Í+ kk+hÕr¦dä$N65Ö©Ë€(ÓŒêŒÕQpsô vUÐ[«Pž‘™“ 4ÙÄWNÍKÉLÛ(¶˜C>ÂÔÀRA‹«(51ÄtN-*ÑPHÎÏ+.QHÎH,š,(¯>ÙRž›EAS¡zrµ|ÀäD³ÜE©%¥Ey ~¡>>“ç+äM~£89JYo’‘ÈäUJv<@·¥ç—ä+ä—–XofVöaœœo):¹×Rœª±dÕæÕ*R‚ÚAÁŽP냊½S+‘-{¾¸Ê ätõ fúX¬Ÿli>è„@¾Z..ÎÌ4 /ÁÚ&wXÊÀ” ߼ߒU‘lµ‚íäQŠL š›Ù£orxBÅP!f·ŽBHP($ 9AAUÂÜ›Žpã䨔IêDš6Ù µC¿q›?¤²sW[³†n‚xœÛu•qÎÆ Áb›?Š 5Ïñì„Ixœ»Åt‹iƒ£Èœí3tq}˜<—Å,ˆIõlA¥Cî-±' 4éƒsxœËË›%²û¬”PèúšÓ¶W”õm¾YüÄ”± êèŠ"xœ8ÇÿÎδUdÕâGž™þ¹ÉÄ‘±¤m£&ôD"N8ªk qÝ,c«jøý“%)Ùဦ:xœ›&>Q|C>×äB®¹ŒJ“…¸[5èî€4xœáÿÚÚì„}¦”²ºèùÍ…b>b™M’îRxœ»Åt‹i‘m‡¬B%Tþ¬~áÚ¾À_ì«TTà¦õ“£ß± ôî’pxœáÿÁÁ†ºbê±)ûž(ËŸñ=:¬dGÚ9r‘š'åûÑl€xœ»y-rÃÉÍlR×…,lêâ‹$xœ»Åt‹išàä«}«{ÄÒ’WïñL¼Ýþ†ùÞs PÈÌKÎ)MIeðtÖ®µÙk̽fÏßÑÂs—ìÏ-|Q‘“™Äðíô«I¬ß—sõÏò˸Ʃ_™z{âw‘Ó¬wÿÏù¯¥´¢ ìCÚ’¼#¼Ó§Þ4Ýä€ xœÛ,Ö ºA“e²ËÏÉ¥¬/6ç±Å3O¾Ê™19ˆËiò*®ðɲÜbÿx ¥xœ340031Q()È/ÈN.64ÔË`صKÍ¿7ôîz‘ó9•Ÿ[þ}¦ùÖ¡®¤¸ ¨*/X«²iÕ̕뫨¯ã8éKe•’ªÒ’Ìœb ²k&kÌNož,Ú&°¥óù»ž]ÏŠÓ¡—1'lxœ›)ý_jÃIæÍ™·q&Û¢î•kxœáÿÁÁ†ý/¸îa·¥þc|„?ðÒåŽûyd‘š'òÄ?àƒxœ»¹=rC¡ääRɪ͂Rg„AÌØ®xœ340031QðMÌNMËÌIÕKÌe0~ÅêýüÇÒþÞž¥ë–y\Sÿ¾ÛÎÄRKãsÓsKüÞpµGÝ[(áS+|vk>³4ëòæ5%¹%GìŸZé1ßùÂ3»Ö°ò{ýœ²R%=,\àŠ xœ{Áü‚YÝÐÀÀÌÄDÁ71;5-3'U/1—á^×îPGí7¦!¬{×=â;uøåôê«á´â‚©dxœ›ÂÛÇ»á23cñäËÌw7og¹ËG&Éï†@xœàÿÎÎijžÙçu]âÙ+» ÂÚ±}Ñïw_îÌxœÛ­~YiÃ9æÉw™«(TûÅk(y+iÖê@8ùåy©E®Ž‚A­Âd.ÖÔÉí¬eŒµ“3ØnžÃqžqr×ÎÉó¹½6¿æ^Ê8y"¯úäõ,¬“Ÿð(.)ÊIÍÓ(H,..OÑÔQ˜¼‹ok}r~^q‰Bf^‰PNÁ–‹““S jvºæ•¤)䥖+€5æ¥(¤åY)(ij*hc(O,-É(ŽÎŒÕËKÌM©P0´)JÎH,R((ÊÏ-(‰ªŒ çX­NÓ€Èè€Ü £ ¤Z¬Z¬¤RÁ‰Ç“Cù•ÅÒSKÀþêºù ¿,£šanù[jò©Í:‚͌¾Åé o:g$楧*”ä+¨O>#T=9H8»€î†0xœ»Åt‹iÂõ’¶—e—ý™»¨w»<ëʹIŒQè¢ î›xœ;ÈxqB›ÈÃm†Ç ã9œKX P©ò¶¥ëàÄYêØ¶+å„"xœÛ9/rC¿¤EIqq|Nbej‘Fb|fPjqiN‰¦'§H"µ¨(E!ºùäu!š@oî€xœ»Åt‹iÂ9‘Gø„âõ¤ë6/öNÙaÕÈ‘R8ñQÂë ¡é†=xœ+-(’{SpaÒ9k‹™•…—8e¥TW¶ˆ5 $à€¹xœ;!Þ-¶a-óäýÌɛϲüf<³ìoxœ»Åt‹iƒ£³ ûÆYONg¿wº-¶q‰€ s=+ â Æ®xœ340031QðMÌNMËÌIÕKÌe0~ÅêýüÇÒþÞž¥ë–y\Sÿ¾ÛÎÄRKãsÓsK¶5ml½ðAÖ”÷ĹЉëc%‹‹!jJ r!JŽØ?µÒc¾ó…gv­aå÷ú9e7¤Z¯-Kè…Zxœ8Çÿèèe½¹«³ö·v’=Gºóf°IŸ±y1Øä„{þ_"`àl‚˜ PŸC‘Ž*“¾* ÕãPxœ3ÌÿÚÚìïíÝÎ²Û $У֒˜“Ú¤“™‰’FÚׯ%.ŽŠŒ›1uù[Ó”¨s‹ËÚ÷Ãï‚yxœ;ÈxQÝÐÀÀÌÄDÁ71;5-3'U/1—aòÑ)w}÷»´õḻŒšô¿.tuäDõY”§<ãàxœ;*>…gÂÞ‡E˜'»°XZsrq¥$–$¦d)Ø*8@™\9ùɉ9©Q ¨°¦>D˜ËÅÕ-XÁvò=YvÇar-‹Ää5,F›³$2hë ,®xœ340031QðMÌNMËÌIÕKÌeø¢_étµóž”•ïÛˆ™s,Û-÷šBJbIb|nzn ö¦­>Èšòž8:±s}¬„`q1DMIA.DÉûã§VzÌw¾ðÌ®5¬ü^?§ì†r,îLxœáÿÚÚ¬··<ÑRRDR=Å §N7¢”‘ÀšÄœ îŒ xœký)²á³bnb^bzjIA®Ž‚¡žžŽBEE…Cq~iQrjZ~Qzêf–6ŠBîgxœ»Åt‹i‘8‹ ~ ‹&ÉiZþY±é—nâ ¶å“£ÊÐ ­xœ340031QðMÌNMËÌIÕKÌe˜|tÊ]ßý.m½s,£&ý¯ ]iQ–“™TR_\lh¨—“È dxÿìÄ:çøK¿œÿZO³Ì ¹U R˜“Ÿ®—Ìpž'‡Cîw—ס#Çä>l¾*ׂ¤jZ2CîzÉea³ö]¾/[Ü|ìÌêX·ëHêJŠ 2ªn3<^·Èá\ÂÒ¸J•·-]‘T•–dæ•=(—éuÑÛ¨Ô¯z<{Kæ[÷©ÓD„_´.xœURKOã0¾ûW̪‡Â7 ¬¶ªqA‹Via¯•…3Žl‡*ÿž±²pÊÌø{Ì#+°¦‰CÞÚP–Ò*¸•‹ÎÙôõÊOðj,ŠÜ#¡W54ØØ+C2t̸߿,œRþ”[¸(eYU…¬dYn¡*Š›M±Ý¿ ¬vÕÍîz{)V¬ødQ„»GØ?>ƒF‹!v&dËŒxˆÀa‹!äVœg+z3td ~¶(cŸ9'Õ'á„Ð*mÝ€tq})…¶éµ^¯xÏa÷z¶[dæàa†.º¢Š¦åÛμ£ÎêÃÌ«×ߪ²ÀŸühØ/w–!Ì­éãàˆÛËR;%56‡Lþ‡>G`ˆgïÙ™ãó¾‰vô)ÖB±ßMbÕIá!œ-yÊzTzb1ÂZ>åÜø­XJ5¹ÄúÛ¹Ñê´Æ“òÌlÜap>ªÆX'8uHË-ÔQ%¸ê-†[2Ÿ\LYó7_•›qóU6ÚS$Î…´ð¥6oÿÎxl£ãÛÿ_ÞçIˆ:ë5øe$C»tGm|’ø”ÅõÖà„)xœ»Åt‹i£Èùí~"®öxª\Oóò¶œêÁsLz²£ ÌÜ ‘éÕ}xœKM(ÂÂ[Ê4kQ‚VEèÌ;Ì.WoíÜ' rR úã€Ë"xœS¬ÿ¸Ž'100644 Makefile.amftÇ©ŠCd Ž(~þ‡»6“ì{‘'cgetpubek.8FÓ>¯êdÆ<>‚Õ—à ûq±ÓeðÅ ˜kÍmxœûÍùœs?Ëde–hJoÇ}xœûÁõ‚sƒËä¥,i“•XÃ3†à€hxœ»Åt‹iƒ£ˆÛ1Ư?;m¨95o¾À/ÿúŠ×É6Œrò˜®xœ340031Qðñôsu fКüñÕ”ï½iÿR–„}_òÚï~ÿnCˆßÄìԲĢb•;ÿœ—\ļ÷wÄýD=Ùé¬[= jüCÜ<}\ƒõ2óªùôælk\ô[!àø¹Èg .\,< ˜â-ãè‹ëoxœ;ĈŸ_™KYÁ71;5-3'U/1w#ÿfv[Ƕé]QXкeÞÈU(ÛŸ#r—èÖ’’tpm-tools-1.3.9.2/.git/objects/pack/pack-29429031f398a3145035383c0a66cbaa8c60183f.idx0000444000175000017510000010115013735320450024772 0ustar deboradeboraÿtOc  '*-.5<BFNRSUW`dfmpsw|ƒ…‹“šŸ¡¢©°³·¾ÅËÐÖÚÛáæîóõúÿ !%+/48:@CENNU\adhknsx{}~„‹’•˜›ž¢¥©­µ¶»¿ÁÃÉËÓÙÝáåéíðôúþ$$(+247:=>DJOX\cgluzƒ…‹•—ž¢¤§¨¬°²¸¿ÅÊÎÑ×ÝÞãæìðòôøúþ &*049?CGJPUV[^dmosx…Œ‘—›Ÿ¥§­±ºÃÊÎÑÖÜáåìóøû  !%*/4:@GNV[`cdgnry‚-Kðà ªÆŠ$¯Þ.i¿NéR^7 '(«©“âz Y+ms]ûeA*ºNªÄ2#z8a¶³ë€Tßo}kÝAêéLÜ_ô¥|·Có;û"oÁs³LS+•Pƒ"Ô#–Y髺Pýs1òˆÄ" h{d³[6 ‘«BŽ:øÆee;žu7’>è²f Ö_æò[y&`ÄžBÚ]$¤OYå*'Vþ®s”E`>×™b ­jÒ¤ÿïM°jË=yh_ÿ}Q„ͦd¸±šäËkïBÛV±¤"1Våè ¤Å»¬Üê[ûØ=²Fm¢¿£bêŸðÁµ¢G^Øæ­õàfyKð»™ fÜê?€©àô¿øq”×èˆgà–Mœ!bƒ,äG7åJº§¿¸G6¹X´$…`° uš¢`*xU™Ü(DÕÚ¹¾-:¬$PîŒä¥YãfMKpgÄæãS“‰¹J¤Ö¸Yt÷¡å¡bqøOó ’:rx]4¡çîL­„•À¤¤åO&¨^}ÞÜÍ´b.o]ü¤[BÄ¢Jðß×ú8NDÝ)©Îx5 ÷œ¿±Ø®¡^BÖ»*o—®ïm&y —B‘,fàù§ÎKY äJQu¿ß-¿fŽïÚ¼ž¹ôèó¿)îOÿý[-¸æf'1ûGÎñ6ÏW(‡¼šÆ«Cça×¢ ˆTjš—£'…ÇH•RŸÇÒ#ÅÁ†ŸSµNÉžú>w”<gWC•uR¡²g,Âå²¹Á”†#Ù“!n•ªR<&:ŒÅ+•ÌBøGŠ“E¬¹a?"˜EzW‰Ù FýšGä9½¦ý%Ý«‹Œèw‹Çý,l1•øGÜÈÞ Ú·0’‡â†ùRh´GËj”—© –@Q©åFp3Æ…? ŒJÛ7Á23ÇÔùM@“s3°²t¸$¾¿2ô( 3¢š£CA‰YX]VqT+‚" 4 5túÔh'@%xŸÿ_èoG é÷Û*KXF’ë·–KÂ8ÈLìøO µéôýNJQôód`«ôq ¼’°dûÓØ#ÁQø»ì Å yO„lB}+Û­òÛW O–G ôÇŸÝ?ë¨{†Ëœ ?U¿.®9:üà•H†ÚS§ h­#þ«6ÛfʵÇ;Úóîæ`À ~]7}&T4Bã ìæ=µ/c ˆ¯B–¼ØØºâ^ÜŽtªÛ·Ç ­éÁ„àûA)¨‘›a…Õ6÷±? ®U«–ã5Bão×ú—~dJâü ëï :ɨÇË‚Y0ÕN/3¼Àßw ˆ`*‰Ì|1¯KB¥ÌêÛá/å  ¡Ÿ1E ^ã³ “òôRª§Á ­?€†ö» ö@CÜNž)T¹ Á6Ý4Gޯϙèâ§ÜÄó Ùm'öFD´Jœ^HÅÏ œd íY’W"•ä›ðÂ÷^(Û( í•|{àO_jð}-·¿ߨÇ•6Dì€@Pl;¦à <­o^.¡V&ž´ù¥‹q¿"Á,,vÊê_r¾—ô¼é§ï­á®XY[¯…ëc>q”¡=mŒL|"OÔ&<Ý‘Ü#°ˆx›ú. +jœÈƒb•ûkÇI>$}¢‘ç«æQr¶-W‡[í­hõC v§¤Àûú^àì‹™2í‚ÿ¶Áu Õ|–ÒxRV€é3Ó,Æ ÌëÓX‚3 bTø¿Ü¯B±3 røÓ›™v‚¤¶¥ì}×,ο^¸´ËkúÄÊdÿù ŸZúi}{ÁŽ=¦µt­È=d†¸·TIúOa¯‰FæK•q£T»#_Êe¨†ïáh+Üâ›°£u0)&”"Ó‘y- ža'¦ë »Ò8[ÀòÇ”*ùê9”£ÐÌ=-fÖ.5³ä­kg+¥TÔWoð íúò(õIµd6ê:UQeKD/mäJ¹qª¥É™]ûO»ÌK‡zFÙirª½ÝöþQ0Þ7Aný }ƽßUêÎ-’¸qªƒpdTO}‹¾X³¯äã`~¤â¨‘ ûw1ßÍ‘~C_ÒúCý;–9hTTÒhH±T/þ¡CØ~2„k½èˆí·€¶—ÃØÇ&w…XvÕ•( ?‡aþ*“/»c³§Ò‚ÿgí’£X8ÅW5qyºO\ «1_ÿnœPÙC‡õÇ Jž¦N?àV@`¬£SȨ,ngÁÕfhhq·9—vƒ2õö¤ªQ*¡u8eyRïÙÜ(gnW0ÄFyeKm Úæyùy$~À*¨Ð¤À¬?x¶9ŒåQûÏh1-™–H:5õŽ3 ŠáFþ8¯«3ÝFìc‰(H ­}ðÜ‚i– ˜¿ëÄ^;¼}—ì‹‹Ù~Ê §—+ž¢úÙ3I¯œº‡WÜB#úáÕ%Ï.xM‚܉Ɍ^äbIµ{1ÛrUS b3=bèÏòË™nóžŒäÂUk_ Æ•èÁ‚è‰7’%‰-ÀåÔÔí¦³)ÝžžÜCÏ0†ŒUpYíúsÊýr!v޾ªó5ŽA7|Y{…®È× !+D{$q—’á÷ÍÐÖ²\_FÓ>¯êdÆ<>‚Õ—à ûq‹ˆÃ2Ò]©þ ÈF8m`_Óœ}ÓG¹E¦ÎT;WÐÅ+—è௤|†t‹{(‹L¶óžãoW¬®Ïס_ˆÖÖç(ÞB_õ]9Ä )&;‰V9H²øT ‚ŠTr_º•²è ‚Y ¨+e*W’I…]“¶˜ “¼1ÈuÎ(ñ%1SOÖ|JéLIËô~´ðAœ˜BK £î”¢ìPü @TÑûôxà¬ñ® (YòÃ%eJ:NµSÖ¶­î[·‹@èêò×GŒ½øª9K&WñÂm¡²²L:ä+ÃâSöºËFJ<@äwÿj’]ßF CÓ ×ùçid©£ðÁõGV÷Ñ l¼¯b€R6ÒT£Ô£d44Ðu®ª²œ‰>ÄœW™FJ.‡S*ûÐÔèÁ/¡‡h+ÐyàŸ¸üò# C7p4Ù·Ô¦7S{©ú\åë|âCo.,ò߸„‚ÄÖ‰¿ìd{²hRRMO…i‡–ÐÞúq6|âX „èa”¸ a6ÜÁÙDuZ ì÷ÛVYòON ß|#ñ¢ü§C¼5‘ŠOÁ ÷0ñ”ö8ôÉcžî ÞË›3¶v!RÅ'˜‰ð5»ªÜ „BŒ=d!zâÔ3Ž›ø_Es>®ÇBJ–Ʊ›"à×]÷ÒÀ³ù¯ ˜†‰×TO"9Ð-‹ÔÓP74“ä½ýßJ) "`À+ŸÊ+¢¢Æ×#|t[–"‹‚³¢6±ÚÛˆ×töÞxŒòg"CŒTøeÌÚÐ\éÜÁ½Cùn"¾¸oèêÒpjŽlÛQUKЯ×#¡6®ù¿.ã÷:µ8+çÖ<[#'¥í ú–cÄáÛa´„Ãí#xÛ®b¼ÇÚß$Cðâ`o 1Ûï#¦—'ËëuÖ¡”’ 'º@º#³¶-!Ç5WmBdë.¯Ëê¿#¾Ôå,ŽÄ|£<ØŠþ {J´X_-#öéöÕÏäú.‰{èd¿$É—#tÓµDöåWQ>œÔ›ož$ñ`<&g0¯%hj@ã“È‚$YŠ®¬="ƒòâUÖ)eJFCõv$Ûnƒé}àÝ×ñ%ŒÊA“¢$ÜÿÄÏ¢½î Xßa.—µH%XÙâá>;U(4e)§H%]²/÷ œaEèÌo®¶÷&‘‹Œ}O\Ñõ8ñàcüNã<ö't†évÓNÃR6ÆÛlQ.ÛwjÔÎ'{W…EÿEšºB8 ·OQr‚'•:a’„ó[U÷í®cÆá)ûË '™T«h·ÔßÍBéѳݘ; a'Ò(ËËZx2M@©ªÒCœ}ý&q'åËi›R‹" =…g0¦¹'üžõ'ð†Juk»Š?Î)|9ð(YûÍñ õtÕ©ˆ0³CBã|1Ô(›zÃrùdìÍ8s6ûÞ­ø‘*¼(§ómŒ«fSÿj ɺ´þèôV(ÅÖÊõ§%a+Õ eÔOD¦B C(Ï ™_®y6žž„H˜Þ½)µ(ëxþöÚüÌl áÖ.㿎`oÎ(úmÅiÈZŒU˜)ÔÈÌ/>-þ")OëOˆÿSÍ50B‡fãDû+þ)^¡èvš¿Ø~ºÜ*G¼¦µ0­m){ŸÆ\e‚Y[l…Ë˳ö.*¦Ò—ÔEé|'øiæÑ¸¨XÓ~*ôÈjÔ§]jüžË›Ípª#*zòkúJP—˜ÉY4l´Gcx‰ël*’Sñê”÷fþd¤V÷¤ëNß»+裦)þãÒ̃ù˲MÀ|Ð%+2Ä4fÊ»CjÚß–´«Óüù+M­ú¥øR2ÂøÎèáéö<+Å‘yÑ!Óå©ã¹D|‚b+Ùk>+ ‡MTâQaw9˜:ŸDÈ+ÝUyZ™¿ÌzuðÁdÔà: +úõúfÆ7îá§ó›Ó…¾tna,õ.Ä5}¦ÔÜRÒñ’j 1g†,U 0¯üJ¥õé—Éàç“if<{+,q™µFö‰Þ9IBž ƒƒ¾,¯Œƒ$³pЊB5rp¦éá,¶wœ[®Ù.½CU1¾ø§K#O­,Ç?O¶.Rr^£ø²Ï©gÞrú,ô¾«¯pb9b%¡½@½”Ò:Ài-!ÒÎ EÆ1Є›Þ]¡»á©`-0­Vò¿Û™0Q»¼„œ$Ü@>-GvêçËdIàϹgLX—Ðg-«k1›éwNRfë.™M²“Ò-åÕ0`£õ´v¿‘5v—á+ã€-òßì¡™òRñ¤î½ŒÈÜ. ;Ë¢4Ûd¹§Þ™ÛsÃ.Uaý5>YÉ»DÿŸé½èš®å<.pÝ É‹"+³þ¬£"÷øxÊh(.³»û(–¢“ø™:.áÄJ^¹›.Ù„(eOŸ°üØñ>Ç K}þ(/@y´¸ØJ†Ž÷5ríªì”`ôv/Lƒ|+<´ðANY£}7L={=,/oV˜5”W‹gî Éu/|×D{ãtôãg5mÔB?ã/Ú®[Wà.Öý¾c¥ š%øÐ/ñ/䯡 ǘ|TD!öŸª ßò0<’ÈZÄZÿCÓ¿#;Pæ²É0‰B’á+ _Š¿"/(EŒ“UÉ0Ú%`¾«^7W¬?³ò},”0æÂL;Çãâ•zUÍ©…}ìi1&-ïÓoð.šjŠVãh§g2FR))´Ò׸<´r4Ù ûÖɸ2W-ÐSŸî„žÞìR×:æÖ52l­”¥M¼ÜòŸ¬^Ñã7îš2¦•³Û)V€P!Yè·ñ2¯5ÙÜsd/oFë¤ë¨D2ÒÙõ3²½ÅyÔs\l€ÂC 3k÷‘÷Ìì€ór€úÑ5ä@±3l ɥ߄„d¿ø9Ü©–c3‚³@êÁ‘|ë-žÕj¬—Ø43êKçÎ¥Œ¥®¦HÖ'÷»>3õyåØ3ÖÑQëgU§Å/ô»~Ñ4 ›Mj[ãHfIËìuY–8IZ4†Ö`½že@êh©€Á?7¹ù4([´-[‹ ¸T³µ;ž/Îáj4“xM… ËjP#Sœ±{®á94”{Ë`ôa@$0°Z²€OBª™4´¿RŒuIra à…I%4JU·4ÅÍûIüœYÆý–Z¨KM 8ù²â4íâ¼í0øgì+zÛ÷^ï’Æ5 ˆ“n½Ç•1¯by²}?æw/c5H²v®a?x/ÎJ½vk_LTØ·5Â}€êãìð>ÚžiTD¶hKg5ù»jÄa£È¡ìZ”Ÿç  a/5þÌ•×â¢À‚å6øÕ²":âu6 a¦,ýµë7|¬<õ²î›Ö6¶ÂGI#âÒq/¿÷ÞŸÙ,ß¹Æ7_´­'ðÑ<ÒJg+%£Ê@7 ŒgûX=¡[Í^iGï úFÚ377—cÆ{?}%# ªºœ][°¬7W•"¡ ;ž„$;kÿן܇ŒÉ7ÏcGe·›¾G2…Lá\'*Ë[8y·•l||gá¸Úþõ¬š8…^×àPñ°&µ¶E‰ekW8œºè ÆŒ4*OÉ,£;8”8»È¸Æ9žÿ²åò /4FæÇ8¾ըD/…‡ø¤rïÉÃÛ4Ǻ#9#.ûkdAùµ ‘Ñ&:²NËâ×Þ•XþŒAÉÈ,ŽvÈ; âÊ@TìÓ>ü”¬²·§:žÆ;"”ÝL«æ "^LJB‹ÛGD­*;/2 ˜u{ÊÿÈ2ÝÀp˨óÛ;z"|Ò> ß´Â6`”sÛ¨R;Œ'ŠdÏÂcoCOp s;¼¬= \‡R{AÒ„p„õ;ÊN`ž¤Ê øöRþ¿i°îF´.<ûŸ8Kù1Ô’‚0÷_ËiîB<4öÊi_&˜Òˆ¦Xªhâ|áø<¹‚vž{Q·byé†ÒMQA¹<ÄpÄ×¢ôÜ¡¶±…ê'z)ÝÓ¶=Â…³P×WÑg¦ƒ&@œq€%=®t4M•_¼{ÞýÍ ’ÄÉËb=Ϫ5&KÆ—&úºLÕ˜ÒåsUý¨=äPôÒ/]ÁI>>¯ Ê­•¶Ì=æPB•×ücÆSƒw}'¤êåOx=ôhWaCkdáí'ñ¾DIÀÊŽ ‰>>ÑLÎ ¨5>@yõ»‘’/Ôk†?'çÅD‹ ›åoÇ&] 6n·?9£Îƒ4ÐDlÙ 'v!J?N´±2Z¿k΢Ë¢G™h¨rl?b~yï}µ¶Al~å$î>yˆ>?fÇÓ­š²¨âõ\Ÿ6qòa–?Öã)@@ÿ£½Ø­ZÅÔ‡Á°@<Ä1b­©#QһؙèÞæï @*.0”T‹gïÿú·³Ïþ@ççqÝ~`o‰Öĸ{S2uA„ Y™>ÕÁ«ŠÏŽá3å#¿ˆA—T dѬº8‹íX7 8}Bb(žúªý=”$êí˜c˼ªBXMŒò¦Wè'¬JÍÿäB‘âÆ‘ÔFsjh™­Õ]R>­ÈKsCr;ôoc.PYyÉ2â€ïÛTC*sà -ÎRÊ2Ì"& gt‹Ciå5…ÍJÍ=E@$ï¨dº©ÏCqL×¼“€²ÕÙ)NuÜ™)dfôDNu<)Éj†”ðÃú¹>/˜÷D^)ì¸ÑðÜA)ŸËËYßZYDjxyn CX>´Ó}Í72 ‹D¤±ñÜRÜß¶²Vx&íDè]Èãk=ÇèÕEIÖ¯Þ`Dö‘¤ê^ªÑö  /‡ÂgE Õ*è èCÿÀçkLÌÒÑ ¤E:JÔ+Q éœÙ¼ÆDåwwP¾G8EJŒ.„]/ðI¬v…+šÈ%Ùâ £Ex„ ¸ýV›ŸEzå¶ŽYY%)ïF†°—CúÇ߯ÒE(]¸ž9s½FŽnÊ}iäwoÑÚx±¢nøÉFÆøëóB°|ÊžŸÔJOxpEFÍÊ AŠW®Y1H ³ìAFñ«`’þð`1-Çô¸Â j‡G0'ÅÚÝwXšýTÐÓb|)Ð.ôG{ú˜¤Â Ç-j¿Gg8ÿ1WG°=¨Í÷>0°¨¾Û›¡¿÷GÉFâ3{ÙüQúœ×¥ÿ#Ÿ»HL³ß2å푵ùïCQ¢çþC^H{a|êQRàäèý}©ì#´I þaÒ¡.„‚16/tIì®§)I "„d— "'ãÉ>:9z7óI© |›Õù§Q¤÷l;$²{×IôÄhÀÁ#èÜAPÌù -IC+}<½3 ¬¼ýPqÎÒ?ΡæIÃùÀN‡]=ÛÆ½¥êˬ¨aJ>üS àœç–{-»¬ÁòÀSJƒæÈïý NÕ›™?¥©»V=J­òÁ»MϰJäîïÊÒ{]ˆKoü2¡³¢Àç.ô\tø©,é}KÞµóñ’>†þßÄÌR#ð”L4.¤º)Þ…jÓ:v%ò âáZ“LW+®ThËo´kñÜlël[L^ÀÌ÷›ÞQnZXpD,;¤L„N:•Ÿ Àõtê‚/~,g"D…L¤|>ŠÍ¯YüÎRq¡Oƒ·+`L³¥[@sa[.Ÿz÷Z%ˆÖ/l/NLµªÒvÆÅlºƒòâ’/–E 4Lè)§O"Ø.Ïôz¤Z=\ólêÙLõ˜dÞó?ò4Ì4þ]åùN¡³*ü¢ãîPIvþÅt;Ü©þNy¼ÚCûf¨öpíûÁ&†æg ßNz!vô,‡NU’ÃǬ›|&L2N¢>Pê¦øðZgvÓoGö çU NŸ–ê5´—ìQç‘Aº!Öh‚sN̸äú1 ks_QÛ5g¶“~¹2Nì ‡ZÞ¡L}͵o§ƒèO…1m^øYdËënZ ÆÄpO}ÕÖò3ÐèÉXì>V6åf;O°âD%k.È*Þs}7Ÿx†$ÂOlÑ|Óe2÷Úï_D­ºi¾•î5O¹ƒÝ¸í VÈx”–ë5ãw»ÔîOÍ…Hý¦Ü5§˜X^oh^á4ÎýOÚžÄ\˜b¸·3æêMÀ){PF̵M5©¨´|ÈúK‚6W†#½P]#Ê@$4žk¤/5yÛ<ŠP’…$ÓîÕÔ@Öäû‡H½lõçP’»œRuª4ç†Ù5I}o'ü$¨KPÕì)Ú6=‡™úSŠky³ H[Q6îHÉUT˜ÍÕ€Ïìs¾ Q]~ýÛ9ó5¡D,5É¿¢0ÔîQ|š]jºœ,{ê/ùÿhÀ‹ bRM\‡õ³Üþ1j3Þœ‹šÌÊR‡Ê4,h#â.7/4E™TŠo.½R‰â²mŒ-fËŒ“ôßÇøõ(Rö‚£¯ÄK-0Ê›¡g‹Þ„ºÂSbiòp´m±Wä‘â ;ãŽÆXSåo-¿Þš)„0äqý·Äp`“Sòh˜/ü´˜b[F¿,ZžÏK¦nTAq§¢¼Ú6š£h®úà}\êT¬ýHšD¸Ä/èv²êë£äÖTÜzŒq?§¢c6[æ" àKU)!”äà ß( ÿˆ¥þ¯U—mB?)ª7gªÖ"öþyº&_‚HU·ðì}½¿Ï€ûÙÉADÐ5N¶UÓË)qF2‚·V¨Ã ý|LS_Uþqô2楒U`Пm¹ñ_AÝ=’V ¶ŸrMgý¸"kέWX–½„ëVT„µ¡iøÎe¶…Žy â’ÊVI¤ÊÈ|h?v¾ ƒCc=«u]Vx¦?gï—ZA1­'¢ø —‚²Vxº´x ¢þBºôŸÇ˜^£3W­VqEh«j‹oj"µJì"*WÙdó­t%F•Oãÿ EolºsWõOιïðàvˆ4*_^$ãÒ˜íXp®¹wóÞzm«‚ý: £VºXµÚªÓHÇé>#ÎÓ]K±êàYJËÑB8sׄ½Äðšû1ÝÙÿCZ²OC¾ô\•rˆ-á[éVÚOZhk ã¨*Ç9/–,Z»]òvZ·Æ.Rm¤…g?–¶Þ›š5€,•[$W˜ÿÒÑÓ!Dø»7Oÿ[Ô2.m@üzÌêugνÁÓ\Øu¯[Gƒ](”ñ¿>SÍ,wÅ\6ðÇ?ä^HŬ#§F‡\Q&¾ß-©y5ŠÜûŒCÈn}Ðî\Š&Ú™ &Ÿ“ígÖ‡:^Õ4÷\²]ô©gÒÕÏÐD>y\%âÝ¿\Û¥þÂÝS#@Þ4NÎÆ]®v0y\üSªU†ð"4e<qö vÛ] 1Õ½i®zŠðkqHrÉT|]Òåæû®*Þ'&PCÓ•öØXM^8°N ¢’)9ü¨²ú-aا^‚8ß÷G ¥½¿MØ)oÖ/Ð&r»^‹;M“DÞ©û¹2ŵõ ¹& ^¸¢/J-et u±1JÔ)%sÜ^ä¶%/*r‰ÝŸëªVþçV_tm}X¤éý_1ñÌã³ÏiÎ_ÇÄîFÄ*†WÑõÊ'Ã\¥Ñâ_óÄñên>cÔu'é‹ÍgÞ¦Üa`|øt©ì.ì‘F‡Œ‡-˜%°”§ë`¤f•FàéÀð”Û±~}ý [`¤ÉÊ¡°£ß@–uÇ(,hÊa%Ou8éy¶ÒÍ¡OAmƒiòNacJÚ§à:Ù_´å]Ü“€]2ñacš(ÃôN$÷¦¢#©§Ô÷@.?Ùbm5s½Ê=kV;JŘe-"9b¥¢DÈ,•nÓ寑ǔ@©};bøM[%•qh¿ðXЊpÑE1W5cPùïAñí@HVü¹?ÊÀîÈܨcˆ:¾á{Œfc«¼IaÛ‡ìÞçcŠ>àçaê`k?ôOÙ5˜©•Zc‹iºNj¢•=ëùf©wmK¨«JdjÐÉ¥I¥>vOšU¨¸,d5°'Mw«’ÝØÉ_2–ílpdùPéÌ(ó-¡ófFwÔŒ DÎe~º¾)Þ.)› Ú’òW™ïæ½5ûe™r”B#¼;I°ƒ¡Þ’,÷òÐeÔ8î›"_®¸×y]0ú#eáÇÕHú!+8÷hLjªTf Î_¹ÄES_Ÿ¡Éþ¡«Ü¦‘ftÇ©ŠCd Ž(~þ‡»6“ì{f’){1™-„äö! {D©€ÜfŹ]ÛA ª4¸·¶'`a8ÊggR”ùƒC9N—†-ãóh{geéì@‰#lÉÐÆ:©-§²Ù»Œg€ þG˜çŠˆ‰Ó¦à«²Gigƒ£<œ²ÕÆÅÔC°Í˜ýg— ‡Ä|ýUvL¹ Ï%]uïî2g¨u"eÂ{:‘ßPÕï ¾µÿ]^g·’ÁÉ”uŒèÛ8˜°#ƒgÁè9v@^Äæ>Š›ŸX MÈ hŸ—¥¸vÅ´’ÑãŒSäXjðiEáO@HÅØ·æú–uG[¬„’Eiié ám®±öiþŒfÈf>aPéiŸ‰ÛPS·µB™ƒ•c>Ÿ2Òi£i»gg›6ÕîCþ2}¿Æã.bR4iÞ=¸zHXë€;ÇÎí¹4djžÙçu]âÙ+» ÂÚjÓ¬ri*i,ß;Ðà§Yä¼jß.Ùv¸Å”—y¡ \}åä…$…jìÊ“¹ÙNkw?–~×[pÚ®k“–D†\NÂmaVLH/usk¿¼¯å4È#Üò‰É¤.k˜¡¿lا#+€ž7i3_oЗi_lŽ Vò¢¨;›Œ,ÎLLû^K+mZl„Zââ0ÖyFô2œþurmgÄè\ò6Û¹œ;=6 G¯m¯¦VÁj¾ÓßsƒÆÌø{]F×mÆ™Ÿä3÷l¹âõVBçþ»®à]mÙ¡bÎ;48™yqÒ %ªÃ>mÚõàÒ¢@ÂÀ7’ÐQ¡C\ùñÆwn5¨·÷eq¯~‰**ÂÙ”ÞýNnS*y‚ª™©®ã$'®á’ôyzLoJa‹¹Í¹C‡ãéJC ”Þ¡}oUçn$§¡“7bf^mÃ2[O’oYï¯o  ÒkÀuQéâÑoyÖpÓP]9~ø$yn×7¬o„sFå±tcøXáÀ:N\˜D·^o“é2…ó5Z‡Å…é»Hñ7oo¸£Å­;Ææ/h•¤üóTª)´òoÜšÊQƒSbʇ.dO‹½;„pþvQì7i£­¨&þ—ÏpGuƒÐo‚¶…³±¿©0ø>p–Ç Ì;Ü» D0Nz(cp¡î„›<¹fçáaÛút'Êú,vpÕn+±µ.qÎBkÆ"¦–\•pô,ýK6JUO^5 Þñ‹bïùqx­ˆ_Uì¯ù4÷} Ö¬m‰¡ûqŸÅ°CÎ bÆUéDJ|zÀ»£q¥øs¶Çâæ*¸ˆhèâ(E˹qô#à„7CDâzA›—¯¹ä·]rU$X±~ƒèÓB'c—ÿ‰×r5Zs¿uÆÔöhÀ­¨rO[çÇa©“N$Æu‰Oý*[?žr€²j»¼à Ðúnb« Ã+ÆsC}ÒŸ9ÈøäYF;P°Š¹;—sqñ§výq“M†sT©oLNrsŸ ÎÕC{³ÿ.–”¶ gCs½„‰Iö¥RmJ‰{yxdª® ´ktZ³i¥%Ñø :äF!)d‚ûtg©Žè%*¶üÜ0î]4ÔtØb)À¿Z{š œÝÿÆÐ0ÝŠtâÔ(&6ræÃRßòèŒUÂ|ŒŽu-ã!Tq×%Œ¢Æ H¯ÇjX i²uy1è‘ Øír:ˆË~Ú€¼u‚—BÐ;¡˜Ÿ®GŒ’áJž”§ÖuмArï¸:÷ÔA ö–ÝÎvQ&#—E:¬JkäòË;7[¿Œvk˜3‡A”Âê¼Ç¿ê+&v„áÞ\ Y2¬FmòÚäÇÈh1wÔusÉzƒ:˜Òëå¡ÇjwŒDvS­ivÝh· ;â7¯É.…w‘½ð»bó=a$îóÇí¥•!àwÁ:§TI«õ8ƒÙÿÜ>³HßXxC òÿ ¤À¡*цótòx¬}x ˜ã×r™WðŽð5ÒTè*šJxŸBúœ¬ßÚò `Ä##sb@xÈgoÎÒ?ÝzsnЦ»}€;õxÎàIgüªÚ¤EÓDðì5¡Û¢xÛž$H®5XþZ¥õþ]Þùy ÷¦pjg m€ÈÈ‚ˆk¡y~Òbv$˜… ðœ«wØÆá×y¯×CÑÚƒz,F+“ÎÇûhv¼y·8 Ž…ÖHe´ Ÿ˜2Ë®ÜÖ·zƒº„EŸ"bŒ ¼#³æ~)µz'M!\P}0¸<Ÿ b™ø¯É‹z7`H'‘x[4Ôb­¤ÞDÀ¬³¬€ý®d™¬¦. 'Kåýhx Í&Žu@㈥‰ŽôH-]t,‰ºbê±)ûž(ËŸñ=:¬dGÚ9r»ž°úôûwØÿágB ¸1'âúÕ‚Æ–±^“:\V°^Fù2ûó"Ë· ±Æ2`Î|À%ŠþG»܉}NøI¯ñ— »=‰ƒ¢¦÷Õ‡RXÈ›ŽZBPÕ“¨™×ƒ¼8“Ç蹚×7fù¬c¢Ì׃çÁi•‚ùLý_ª·õ¯ºvS&ó3ƒð__@ôÙ›½»Ý¿Ó÷–\„}¦”²ºèŒÓMöÀµUfX=*œ¸ÆŒ…PeÆ„·,0¢o£Ëêc媅¢ †ZÅyÚ|Í|,ø£Y‘Z4ªþ…¬ÙI¢zº_ÄJ :礱…Ø :QMÜ&Ãb=¹%qG/'†*³þ7ø«¦LdŽD}í¿g>†/îb§‹úp ÚÓjŒÚè&ݰ҇MZÉ”L9„njÉI¯—Å<釽´îª£!5ÑÈœÈ"RŒ?‡é ¢ÿ–‰ õ†U–êjÓlˆ6†_ˆ¸9[žwȼ XŒ1ôèˆÐ2ê.ðiI~nçøÿµöˆö< ï‰°jç†~Eñ|"!0d‰>ŠÉ1í°(Ó§Ÿ [ÖÊ8ô£œ‰K§t‰óªÁî½ðå,éŒyµ³(‰dh½0bˆ ¨ÄlCmÈ?¿ÎŠÑã‘)'~ø=;RO‡”Hâ,ä‹[<5ÊØMƒÊ|“èxtЋ*¢Ã؉ÛÁ ½üI.Ê‹CloÇTVêm¹À+¦KøØÀRz‹i•§ðü(Æ9©¦©€3¿ã )Š‹´Q]Èå½2ç™\´‹ÜhÉ.ç‹Å÷«­uçÁSŠë&Ö}*Çê+pŒ%˜,l-&ýSPDœÀKP¹Œ€ßQ1ŒTìõuæJï!7Œ‘úBó’1š|œ±ÆcfO¤âmRŒ×zÎk|n”ÏÑ›/#:E’ÖdCŒá,qøéð¯xmÞŸæÈ“ô¹ýß~Œä¥`‚X`¼¨åc?·ž_\ðêSN\Í-h@¸¡®I"k)²Œ­Ž#æù5m>!1%ò·É¾‰9ˆµîÉÅ㚀ÿF¢Ùì _0Gwðh—ý%r%ñòôòP#V‡J¸ —„Ç,†—Žòbý=ú©¿b³«ÆM^“Ž9ÀÊʨHb±ÂXBuù?LGNMŽGÞ„>¯'" EpÁw™„ÞŽ[¹PVù½›c”b—˜vOoÚN¾î#ñŒ!;“•pkòt>[ ùÜ«ãõ‰»n™ç“Å”ÝM¿D†Ál9Z’ÿ~U«Y“öù$òKÓŽ<̳+ŒpW£Ìþú”1E ÙOJ ~{"•ß&/ž_”[{, e‘\³)ÍY¾„¾”r®}r|H„4t‚õt)Tª5!”AJ%ôªsÇl’Üÿ €,Òb”¹IoɆ‘9én9iíI¦™Ì3• &š‡_’:.£ƒ.+V¿Ê¹5•4Ü{€]ÿÕþÞéôfwh;•A‹â'B=ÄóVd×?xøœœ¥•BÜ !Ú¾nˆWŽE~w''§•\¥Q€3 „‰ âV*/0N•bñ7~[RþRɈçõCƒúÙô•{Õ<À©Ïi6Î-~Qº™ÓÈ×g•½J<p_¿û:½ôqŽÉ~¡•ëo]¬¯|ÓõÛwz0 ¨–$~;Ä×â&$åü<á;M¡–:Ryî)MSE:;¢zd1bqG—x§š¬C‹ó™ä‘j«ý<Ü—'â[ye8 ø–Ý¥¦Ãø-0—@ÄL‘ü´Óc‡ÓãŠþs—G*Ž6\Èl:°ö¾ø°ÿc>˜—~)uõ¤öîP姪ŽT¬ÖGLÛ—ô”¢&_{A鼟֊8[±Øë"A˜%Ó¸!×§ÍÎ8† FÁ´o˜±DÓ™2fïcÒ;…ýâI*!ty˜²—Ï/ª}´òx•Z±x+ÅúL˜í#©ÆXD/±M«ðäÍH§ô˜õX î@tâ(Ëø)¹Ö— .™:)¤@f{dž¬n:‰Ed™?‰à™l‡åaÞÄç¥ÿØ(‡™Ñ'ø¯ƒ¾¨£\¶Þéú“h8ÖD™òþÿ_ºch“ãx!ª¿_'0C™û¾¢Ä¤qP*¤Ñwq”[y²JšcÇiŠG‰j]Bq[‘šÃ¢,šuõ6òdí¿OŽ7R¡Ù…›'™òìì[Ÿ«³|¿eRÏTk—›+&jQäÚ‚øB¸È+ß ›mê7ÿ~Ô53¹¿þTèÆý›mø¨4 Ö…Øšü»½d?íÈ„›ª4TȾ®æÕŸœQâÄì§Î±›¸)6D×[YÝ€2 Ð².~Ç›ÏI D–ðüËB¬4(Yİ-¥aœ1§w–ü-^Q6§JE!÷ìÇSNœŽGÔkþY”¼O8xÿ!Ã^°œ·™àŠ ð“6R%Ípy@mÚœõÔ#PÈZÀ’ˆ<††·Ônã÷7QžÔ°´qy…ûéij?&Ÿ1ƒge_j—¾¥lÉqyrßže¦9u–M˜rG¯ByZCVžDb‰/Byàêê{Ë_D£ÂøDžàrºŒá—èVŒØ†Ä´Œ–Ÿ0·5˜~ˆš/Ó?ZP6 Ý*B zÿÀà+Z$ôY{èЮ LpùvÒ*êw(.q<ì§ûG jšê¦±wEÏEЖ¶Æ=ˆË- ÅÕéý7=uOßt}5î(Ê¡˜³êª/k³Ea¼áéfÌ@Zåx¡^ó㪺<¥Ï#8zs€\ŒbžÑ(¡Ìfϧàô²¼@ºîò¶ýÔþ¡ÿs ó×c•Ü8g{hv0÷Ù¢4±õИÖxWÿÒ¢*ŤW8JŽsh«l¨-.}F£ ^ž @øÎnÄi“1Åôm ž£t%’w}½‹R&ÆïÇ$Ìw1£&ôD"N8ªk qÝ,c«jøý£W>ºò)Ã%ɽ£2$©H£†fê.ö¿U¬3^yåæ³¡£Ž•¾÷S7ì½ëfW'¤@õr¬C²8êÛb 굪wOø–¤·W~é%süŒéJFûRÖðp¤¸°a›X1pÖγ”"wتt-¤Ý¹Âa÷ É Ì¾=!ìëwUÅ÷¤ÞLÚ>¶lH óHmõƒG[Yî¤ñ$±K¤øÑÃ"I,ÖÇÈž¤÷KY{VÄïÊÙÀä~ÁDRÄÅk¦¥Ý»¬{ü/¹*)w!ÍÂÛ–áSë¥K1kg€òÚƒ*Ó¸Náfµ|ŽË¥€%…s”K |¶Qšßû†Íü£¥§T^²û£G>XR5‰uîXn¥«Ê™4jÍòæ[}U2or:à3¥ó'\¶ö¬âAP"cÕa–Oæ’«g6«#v鈵âXs7¾q¦³i†Ê.§ŒÂhr ;W? G¦®OW ‚Õa: bcf°aiÓ¦ÈèEÐûuÈç¾vpœæ~Þä¦êðá‰$œæ2ÿ‡.=|3°Û §%ß¶Q×±*U–bsb¬ñ\Äò§_?f‡¦¸a@Y£‘!¿ø¬À©Ø§ˆ«ÀÛ ™ /Rò”ˆöŸ§“:ølä`^+†ñ)ð:xRßC‘¨qß]6?~êPë5!Êçê@ñ¨{zÉÕÉâÔXå§ò ùakr9™¨ïþtÀiRÐáßnÎøô·û;©yVeRè³Éf!R5:­~Ñki©OÆ/'2*v‡ÖÙŒÏó·Ùz©v |²†L¸ù¢tÏhÝ Éûþ9©²aZâ'_£%b«†¼©²àíX UÇ‚™Þ¿wåé³4hñŒ©ô!¡pÄG=ü›e›×n³»nªümìpéÜëg$«§Nü£cªsdF5Gß ßïäçG™ C¬mzª„7'ò*¡4,Ó=ʯ“|"½Ú©ª¤üv>^ÃÁ´,Ñ?'LÅH|@:Ī®†Ê„U E¾»í9 á¥.™ªºÏú¿¡‘¯’þÍÊÂQAmº«H‚eû¦…ƒ¿cWÕyŽY¤™s¬+n¢©‹Yn);U4)¡ü¬ˆÓVLkœúk¥ˆ×½ü&{É@¬ˆ¹]I(Y(àCR’º‹åÐûè¬ßgÅ:eIVõW÷ÜnúŠÒ©¬ìëë­Jã—¿ã Ð(\Ø-šâ2­= ò;ÂÛu$ˆrº*@ÈuÁó­IóoßwlÇNvØ!hYB˜ÓMg­Ü±Ÿz…‹íé³2•Éî[²þ½¨_®Ô‹î 0 "FœÂBàÅô0]Œ®=®A^ÜaÑbFŸRÊÓkj”É®mõvkê<ΰôRZÁtGj ¡Ä®ƒüQ3˜þÙÒÑ¢þæ„ÈuAƒF®‰þ¬ÈÛ}:J^'¹·[œô?®™Iær¼’9gyq}kú”ºÅ ¯b ®p–¯)ã+FÓ˜Wd˜3¯‡zöÕ¨$ éa€æQYyƒ<:¯Ä˜·Ÿäı²"Ÿés%4€³©ø¯ó` BûÖcÔüÉ kt08r°`‡?DMyóõª8„'ËÞfeƒJ°“¥³wNL•?'¨g·ð‚/¹6±F€;:Gðý}ý œ¢[pÌßÍŸ±H(€orã? †}7a$o+Õ˲'läÅ!¯iÌ’›§¹A›ã²´b-›ÅšGP÷ 7Ò΋ ô²Å¹²2uØÅÌp9L³Š}‘ÃlDzãl=ÿN].Eš#˜*m:>³ŠÁŒhí`%èöBj'˜V)!ró³™þ_“º˜„$”>ûkFD~µž´e™l.êf¾5Ÿ%o¯M+¨Æš´UdÕâGž™þ¹ÉÄ‘´¡uN~1äu­¿ïÈï‚ϡ𪴼¡hc°Téó[¸tòáQ4³Nnµg Ó2ÒnJmüþ&ĸšP3rµ6ug—ë{#ETD™»—y¶ülµH©Š<ª2ë¹–X®Y/Òåµ€ÿF®QÓHþÙ¤òA‡óëýµ…š!µ=uKè† v ¼äA@¹zµ×µÑ ¬íQªïcãêësº,…µä`ëÿÔÉAš÷‘¿M¤’¶}åóÏu˜ 7Aµú vü§¶W‡ˆðøy\_°ûHòb>-´DI¶‚±…Ðð5 ÈÎU‘‰¯]ss¶Â:U$ü«èE‡ OõZQ²¯·"˜áëø£ªètÀ$§i³·ŒC› Ïõ—Ç¢z¹Ñ¡“·"].fEëãc ™EQeEú+KÞ·/Ô6—aÐI‡nU*<(Åêç·euÁPœ|˜/Èœá¡ãÈǪ·xо˜Ëý_yÑð’ ¦¡MÜ«·bU ì`  î‚DPiîušî··<ÑRRDR=Å §N7¢”·¹¹ÓùDøò3üÚa°lr€š]=·ÌñI <Awh‹èˆo_NÇ¡·×z:®ª×i´1Ý/Ä&Õf»‰·æ,ý˜ëopJ¯Ò¶±²õjླྀ‰½aén!Åéðý@'ä¤Ë‹S¸Èø‡[œ ÖÍ:1Ó J~ï! ¸ãÎðßëœ!vûÏz‰ tâ¹Ø“Ë]½­…®tC5T6úBTÔ¹ Áå4ªò<é’_bé-¹ö¹¤O²‚Óf§øAsXÙ ×e*¹É~n3º¬)–üýSBUÌ¡¹ë­P+hežp<7 œš®½¿ lýºêNˆŒš'ë4 TdQy{iüº §q³mþôZšò5ÍZÕ%‹·º5ÓàHŠ”g½;{òƒÑ€Æï›º:‹‚t^ª˜·ÙÜå N4UK~’ºYÌûfŸ%(Á÷ˆR)‹!Øí0ºŽk$g²ÿsUƒ€¼ £@Ç+£,‘ºº&OUݯÏlyóÆ39ýæ)íºÆ¦­-–¨*€¿D'H™û<ŽvŽºÇ¾œ ¯mÖK\žª¨x1ܺþ€é»Wi`Œ/Yœ=Tÿ–%8MkÎà»ÍU¯|Ë=Á«ÁMƒÙuSä4»ÍøÄ½p€æÕ)âÈ7k8·ZÜm»èçþí<*TÀ’†Ç˜ m¾¼ΨÅ?š¹fuŠ+½Rw|ü«¼cm‰%‡6 dV'›–õ¼D¤DÉ+µèâÕÔ›»,<¸ùM¼†×T(? r¥¬‘ k­uŽ3¼È. ¡1о “¾êòç¥Ì&í ¼Ú~ÁŒ\ Q>({éýMÜ;=H½™sP6´_ç ݇&êD×½¹«³ö·v’=Gºóf°IŸ½Ñäú•ƒbÛUÿk3fvfé ²½ùñ¼cÍoÃpÂÞµ¬Už„¾e »©¸rfÊͰÿqT¸½,«SÖ¾|%blúhãŽïlýVP#0œ¬Œ¾ˆü iaÕÿ-½ùG"ˆvJ¾²p¶["€[NÇPAÊ‹…¨å¾àîÀµ†}ïî3Ðí}oëB¿…o\ðìr˜%zÜê¿«®›/ê¿'‰ïûí:æß\†3•5súiæ¿\œœ¤¾a!qÌ)DkC›^ae¿}S”#yç3±W4ïÚ¼I¿²Õd–¦§ß…ÜÒo"==úÐo¿Â«…’ìfzºåbÎ.LU5¯˜¶FÀQµÍ›€ì¢¸àÔ¥ª¤Ñe2cÀaðŽ‹wƒ寰¯‘¡ÕXÀÄ_.~³£Jd¸:ZdqÀÍô*)>c9KŒµµ›u6(¾Þw`Áˆ°Ógþxßd™bˆ­ûJÎ/Á‹áP€k—¶x—ß7å+Ì” KªÁדɺf¹ßÖ 0GÙmÁþ5GÿÑå,øLSYÁÅ¡Ç`LÂ,žózžFÈ^!ဠ˜¥ùÂ`ÍP÷æ|;†¿"¼$64[s‰™*‚ûR…#àÐŒ Ä|Ã@¬aqâ¾Q }!pæƒóP‹[Ã{wó¨:°,:œèq¡ç º9 í›dc5k¸Aã”/Ýçk×ñ.ퟬßɈ¿áñ °aµŸ°Ä̯̱òù}7h˜c)kͼãKÎAöÃð7^%-= ç¦÷z®[ŽfÈÄ&>¼FŒÜ#Zêk{_‰uÃLK¡ÔÄ:6j­I¬$Îyñ)áo‰`Í0 ýÄ?ÇÊ©HŸCÐæ>…VwÞ °dÄ~³]XÀYÁŸœ÷|5vzÄűëU0†O¶â:“Ïפ•Î’Å”,ö§ Ä¡>å ÀoÐgœ4ÆR„Šyb©!)á%{ö³¼Õ¡ ȳ­-øRivŽöìÈ]•ߨ]nmVù½Ùüy¯‹W ’ȯN ¼§¢„± qɆY'ÿÆÈÇö ‡À8/m^d^T§úŸÄ¹õÈç‡Gºœ¥yÆÊÓÏ¿˜ú¢ôøÉ£ûˆßqÔ>º^hE#áµLÉ Pzo£Ùë$Nõ’ X IÉ¥@s[âI$P­ì°,)“@OØäÉœþ½¯íÉ+„Ô×X)> VDÉ8û}׆zÏ$1îÐÎ~¤è¢ÛæÉXãïçÏ‚h†4(Bô½>¯Àe‘†É€€þ›Ng¹Â«°Üè1É™ ~¤]»dø{úÎmv]–À†ÉóX9ÌåŸäU*¹ÝèψUñ,ÊÊq ½wW°BTo¬ªŠsÎfü_8*§ªžV”ö'8Ô«g‘ñ· ¤¦0ÅÄÿ3wøtýÐι‹vLôð_íÈÃsm–i=ˆQ΀-}*ì›â±5}æ/ )Îö¢û$,˜ë,—hz~ª¡iäÏ;š\ãaèõß_-y×õ€fÏ lü ŠJÂÄÆð·[Õ€dÏ5gíZþùŸŠ 0uô‰ºÅÏLÑ5w.†ô ›·ç¦:ÅñYÙ¶Ï·NEà¼H$×fJK9•H ÆÏëIänu†§LbI˜}P}L ëÏõ‰{›ÂòÈqÐ?å7‹iÚµ(>Ðhb(Ú};KŒf'ÿkaS~æ*ÐX¬ÿŽ © NˆKù÷ì ä­I«Ðˆð‹±!ÔÛ-ä«êLŠT²¨Ð¥_"c$»¯òºú o;ÇÐÐý˦»QùOäø¬Ž5ã«oÑ+×`ý€x3Qšøè¨ãFÉÙÑO»ÓX^ûøÏ| 2´UãßKµ'Ñ’r<[ã¯)"n5 PÛ™4Ñžçp)»R0 Ç”j&´‚»»ékѨmÆ–Ý ôçc 6v¾»øc:ÑíMp»õü}ì­1à-¦ž5Òf™²ŠgÜyPtûµ:tîEÃÒuRZ^µ–¬(á§-zÕëZ9X„Òª/‘•df¨] ¥4oËL­ÒÙ$‰‡2Ù}˜\YýNûüfFÓ“¹¦8Q÷`ûÉœaZQ¬;iMþkÓ›w/ªº·¸æ2kr›ouïÓ¦xÇ+)«[} ×ô‘9E^vŒÓ´Š HƆeMN÷zíȰ½ˆìÏÔó¯ü¥í{Pœ†Æ'ŠÔ}¬ÛkÔ?IVRÛ ¨jÌÀ$(¦¥tõÔlækK½§Îo±ð¯k+•ÿÓª ÔoªQ#jMŒ[q˜T ¦¦ØŒ8# Øä„{þ_"`àl‚˜ PŸC‘Ž*ØùÝËgnëM•y¤sòâM)tòÙÁ_¥º¬Ãù­8ô\‡ZîãñÙ$óŽ’«pg£‹ÊĀ}~²€ÂÙZ;©PŽ=ªëöm•糕WÙa]ÿ®Ff]_ÞŽ åVýBQ'ÙhÄ–¶À{N{¾ÚÈ­+ùÖÙ½[L]ŒÒs3Ýóz"fÐ[É™"Ù¿xÎûçaÀñfņãµÕXî©ÙË>WBqÏEõNêYï/É<@”ŒöÙú·ÄV·•aÍó[U÷¼…ÿÚ àà¬Þ$⟿)‹7þÝÚlY®–äšÎp׬gËøöòë\Ú³‡´´æFîŇÝV‡£ŸGî7Ú½©Ü3È{îÇÍ’Òþ<ë¹$Ï6ÚËîA3W“W¯¨L™‹I±¾¤Úׯ%.ŽŠŒ›1uù[Ó”¨s‹ËÚò Sb&évuÑPè¼Ûñ\Ëî)Û0Æ0t)í$96³Üœ×裨X ÛP5c£u~Y”± f›úV|$4Ûr—Ç‹*€ÏHˆÅAÇn?Û„f³ ë`måë~7¶‰2ƒ1NÜ.+ö€ñ†doÚj#üƶâ÷ÜB¼ {2ïÍ‚òã‹nͪxfqÜPÅÇ»øý6&¢‹îE©ô›XÝ>TTɇt cU¾ŒÚÒ÷µãéâÝX³Œ³x5žHñ¬èÕ€?ncßÝ£4?šîŸÌù¯¤zÈùAiwrݬ‹¥2‚ó˜r•ô峆Z|¯ÝõóÒLœ }Ö’mRù¾÷>» ÞP^Hï(KI§{àµuvÌ ­º2ÞbüåjÝýÌ@%ø+ „ËüCÞsì÷qŽ uÿ å‰Ö¹4A"Þw‚ ²¤0ÌW&ß¡eÖ%nV›¬ÞŠ»UA+ì5T¼Ã~âËZÃé—Þçw…´H¿†„à#ió§+;w¿ß@±Žmñ"÷>ÖíXè†ÔÀ›K3ßi)aÊœUUQ¡ÙÜ7#ÒQúß“óq4uÄH,Æö¼kvDܸ—ߦ‡ \êH°4û­w»)Þ‚Áß­ä‡Yd@ 3(ËCP#BÕ›Ëq™à$Å+îÏr¼.ð:/_"ÏÍ*Ç´àG²´€M°Ûèrjë(ßê9µŽQàw‹UD.±"%Çk´iíGèe—à¤Â©o¢êâV–¥‘¡îâÏRžÙ•~Ñ¡.ÉôâÞ„BÅ /‹…A€ÊdlâþvÁôiÄ{#Ø*ÌÑ댡õúã°2w€nT=¼[,€Ü1)ã+x¦Ä×¼ý깺Fæ+Žããœj˜wƒá± ±³‡Èx"ã¿€å sÏéÚ¡IBI„<‘mãíð*«Ñ«‹Ïà””XsPvä`§K=V_UÖôROú‰²Rñü-äÁ}Ch-‹B»IåG†îÂïBäÁ|9#ýŒš6V؉>ÄåÇ]'ÆõB¨§ß~\ É-<åN)Qy©zÚmI® ìû·Øß¿tôå´]•?ªSÓÊó(ú\íScRåâc¤ o‹ƒ úƒv/[އg–¬åõCëX’÷Øš°— ýjûOÂæŸ¹s5t1U¸þ3¹¤lØx,•æ º3”îP«re#Ž*›nCvÄæ–×bBZD ÈŸM€Ð7Ø÷~ç*Bq´á••(CnC²ïà2¶ç<+UQGàf’›ZÕV§&¦},"çܸ9_B®¿ß)uotnˆ ÞèÜis5ä£~¨¿§* .ŸÀ&VèX¶kÐ>s¾øw…ªdã½L1J è¶?MÉ Ê6qâ æ$DÛ…î)áé ý)«ùc´]וœQ•µá é@‹ŽÍ{ŒPqSGiº¼€©éƒÇ¦<Öý)¢fÎQÜuÕR.êU'FÉì³lœ[³C÷º9V›êžçP‰Öq(³i§öÌ‘%bê½ Ó™ðµÜz°Ò$:ïn€êÙ†ÑL0’›óÿÜê$Œãêi8êè¹7ö 6dª¦ýÙ»­ç që#î˜âBŒÝÚ ?Àùº«¸ãXRìë,8#¬¸‹æ $Ï.ëàØÅo5ë-Ÿ½ÜvI6ôãBFs¥’lÏXëcë2[{‹Šñ•áQ¢˜Q«ðA²ëåêíz–h²ÂƸFãîæbq?ß)ì ª f³ü7¨†~¿«?„Šì7-­\:¥s|凣ýñø P§Dìo©V+¯stÒƒ óÜü•w컣T¶±½Ï=Þñd$Ã+óÇígüÉÃú§¨¢Ÿ¦“ÄÍ@ayãíƒe¡Ë< ó&Dù‹#>*Ê‘íŽcK0Ò0öÍh6yƒU=Eo–í¹Z v§>Ä ‡€»w Ví»sá°Àž¥f\tcžüñ@)Ñíຠ9ê㌲c|©ÇðR”øÀ6í÷êp4°äãÒpR.Vos(óPîjIO\^bþÄ`Ü©JR„ê‘(1Cw$o_ÿqœ™…–Rzýõî·kh|¦8i_Gÿ°~U3k?gîñC{pPTs•uT¸QÚÿYï9Že÷% Xpø’û&z‹µ?~Ÿï_ÍŒY’]èÈV­TíM ×ï{D\ˆ“[FGÔûb+Ä X:ïÑ·Y0DÚ0_ÄxCáÐeP©Û7ïíÝÎ²Û $У֒˜“Ú¤“™‰ðhvŸ­Þš@¶Ú¥^Âi;:öIð+w[…ÝÎ ­ÙŽ—r"ã:ƒ#‡ð”@~¾Ý(ôø×//*: ®÷Âð›(®Ô±ŠJìô·*É·¶wX'ðÙªœÆaË-xàCÔ€¾é°ç†ñdh¹‡r‰_®ÓøìzÁ©VjURñ©+½à’{Ö-ëF]"ñ®% lÇvh­¯{vgl­Åí‰uñä‚T凓²Ü„òƒÞU1ð0BRñçûìLVQÅÇUú}Îz’€æò.N²zµè·®ƒò-9,¡e‘àò5€žŽ•Š“UºÍâ¸ÅlÀ{Ÿ©òi”ùÚ¡wAwÎЧªfs1òÆžòJϹã£MGšaY‰ ˆÈòÎ0ù£»S¸dùv?EÃòØç} Š>2­§+&g3ã7Â3,óƒµF ~)x“xû¬Û»^>7ó.¯#s˜÷žáPä]LA[ó¢w1±ïà í|ž:)*+0ó¿u”*Áãqáð¨5w¥¤¿6ÕóܾódÈV=(¾l\/ÏtŽ<óÿÓ^nøî^w­Ðõ|-nšTéô(r_RÝÊÂeíä• …×Aô/yKRÕ‰Þ:MíX™œ9‡9½1ôŒ{2²á·ñÏ ôƳ€ãô¸³ŸÎEˆ™ÓÐO@®6»ï°<ôÚ?:Q,˜rçE¥– lµ#àôâI®T¶}~ËÀ9yÚƒÒÍYôöiÁÍÇiA§zмNî pߌõAðëBñ‚lœi`r®êÍíHõõee8_*B–Ñ{<¥zãõ °””8ìä¼/qcWZ»±‡©õ-ʃ9hãkÚ­›~ ÓyïTõ4qŸ˜³ßS&È€ä˾ªîõicµ³ã³¥“ Æ@üÉkKõ°ö¸[ýÀE®Ø‘Jy*ö;ݯ,ìG¢tx›µFý†ƒPöTú3í!¿†V/É3$u¶‡ðûöqÃ7Û»X„öX¿P­IGëö°6Æu¸r…Ív¡||_`‰˜7ö¹ÜJá}Ñ<úî¬:b…­ãUCÊÁöÇþ2¥ÖŸkí”–SÑ›ºÚöËê’÷§ ÅOjNhÖ /yeÛcöÝ ‹l n »\Ä(ü¨ñk÷†´©+ä4»`§ªŽ)„® {ÚÞ÷Ÿò$ütLñ÷¥’Þ(+ÿ”‰÷±8«Kax‹r§×8 …:F‡ðPC÷Ìôè냔̷ËöL´4@Ox÷ë¨R?ÝmÁ R6›ÊHÙAÔOø¼Ñ옱— ¯€ls.•'ø—?€X4½„+Þ¸)ጶŒøœÆŸÂxÚ>{\Ï ®Çð }˜‡4ø¿Aʸ/E_/È¡;ÈÊ(-Eøã·~êµ´!=¡£€¸n¨+ù4{RôO½….ïIþRô '²´ÖùŠ7Spƒ Ó®ÑÞ4\"g?ÌúùöÒQ»èm |/.·|:\BúÐò­VoW7S4uC¾}|Ánû_J¸òÒ£º§%Q^<^Q Šûf#›|b¾z† NW›3­î—ûnèy´1/êDÕ÷зµFÝ¥JFü!y€‹óTæ3ªhуM°×ü;JSyÊ+sšðqÙa7s‹µüJ„jêI›˲=êàõOüü`a“hk‚C+£÷‡,b"Ñ–Û(Ãü„Q•„…Ì8à4Õlo©-iÖŽ_Gü¦DHbºš´'NþEt¸Ý •¸Oüë™ɵµM6ýÎˉ9µ!-*ý/¸îa·¥þc|„?ðÒåŽûydý\¼Fó¥"/?|’¾·fTq Ô;ý¶@»r¡ýá5ÐÙ¶$ 6¾uRýëI½©ðøÖóõû›‘ˆ>LSþlKÔç4q—NÓÁö…íòBþ+yyV­go$ØîŸy¤Ô®väðëþËä––ÿÁRK¿wøžwèÃŽ±xÆÿÊeƒ2q–áïÌæµ9« ¿÷O’@ÿÒ¹ƒ|N™º¢oUGKþaþÀ(eÿåô1…6˜º&ç6äïÍLyÖA3ÿüùü% ]{ÍÀkòØœ[C ÄV1Äæ€Ø*aÑèäûýÚ|ØXvìÉ$ 3"†)ké)ÕÁt‰b\cQ¤2äÑõ*ˆåJë·ÜjñèV"8æ*ùˆ¹<(ª€‡\ŠLv—BL»3U#³+Ö@óÏð;‡MÒ€¨Êµæ6àÞü¤g¹“Y&~T _}*ü"ä6³¾6þ¸ÜŠÀð­Í„Côv­™† ¥‹TÑûQ¿?b@NƒŠ.`ĹÆFq@k#á Ù´VgºÍ@™tú¡»&Xä¡¥l35°™Þ±{T™ÒŸm¬Ú¶NU'¼–P–òÑšY¦¢Õ‰ÇÀoίc«MÓ0d•6¥â“™]ïQbä¾Õ/ç÷4¼èB"z¹rS°‚]ˆôJÜvmä6v„Rê8þ>m>idÓ¿åþ |,Ô¥…@yѳéiÚ ü’7pÚùÑ&´•ËÄØ*z3Dà¸M^î‚­ÜkšÚ®»Mžš³!a§2/jh§‚}dÁ¬¯ŽËvZA9T5ÀŒÜ“+Ÿî¼b뺾CúïolOÇr^;p›.h·~Uw.>0ã”IF6}Ûul3SONcæ:9ó!åe¿ª«'è]àñ²FÉ“=Î †ÌLÄÞº]R{æša,\f ´€ƒè>ÿm:Ä/Í·ùK:Kø|\†âÒ±i Ô€oi¾œ®9Vr™å´¾qÜà´éæÝ‰J¥ B|ic6ò€OP¹šÄ°M²B²{wrä±%Úñ ³QÆYàЮam¯Ñ„?SÍàñåëìE`?°xROV?a—[qøOjÞê'@d˜AHÚºÌ5ôµ9Ü$\‹ì"n«Üi];äÛòÿ ½™Ò¶eh’ĈEÁèÔxeBœ=Cn›²›§ƒúNú˜þj°4bƯÎùpÅû­>í{÷döÿFÓX{ÿÝn¢’6A¿ˆc¢³Oç÷LEén³“C« ð+ÒO‘ë¸|#¡©•[Ô¦úù»ìºð\±B³ÞsbSü4„´yëoeØGp9–RÂwPkŒbÌŠ9tP‚ÿ¾>LvÕÙ´ú»]nê((!¬#‘ z€cHÛtÉ4À]L äšgwZB,Ou‚…JQ¡µ•†"DŠ|~%Ûúß¶_õc!¥ÝxÄé¾碵R¢´AG·Ý¸0 ñ¹z‹29xåa€…ßþöÃD+,3¬kö2íêÂ(iôk&wq~.OVxøŽ—¶J"&ro„xÒ¡ë‡×à‚ÃoÖáèPY|Á©éÉ»Þú¿œUL%ÝÇ$dzþãý+Š(t’}ªÔ¾ÖêF#U +)îF´ï@ÿ„M¿»rAf%õ¨W;~@%J~Ò|àžyÎV|@Êx}6âÙôè”®RKU”Øgâ4¬å>Ê¥ømMh8U·2Ë4èhX†v¸ ÜníñGfx’ÇlKJ¦¹€A’"ozõÝÀ^¿ @€} àS ôò y²îÖ9¬«5ŒiWÝrÈëUlÜà:9 ôóÇf8 Oì''I $¬zɂܟm¢£%9ÂÀÜTöÔ#‘1„EP†‰¸É€mùt~b }ú´­ kèÌž7êè®+¡ëXÂ˶TÊ›&Ò[Xƒn±ùS&² =ÎIÜèèræ!uYÈO²¯‡Ø¸83›DuíÍUð—/ŠAoð&&58‚Æ,VpÇ?¼ Ã`p9V Q‰.ƲÖ¤2h53ÎÉG¢1‰‘ʾFébÃ0ï¤vån€Õë¢ÿä°#aš44{¶ ’0“ªÚR€>±ì“ß§©aAKs P°óbtë´->˜Ma⹦]nºkQ}Zc.4'ÿ‡í —\Úú(xO3ðQ…{ XÑD>J/GœÐ‚ÜI4¦®V&¯a#II‰ùî,·ª@žïÉçü‰àC„4‰Çõb0tU k¥÷VãÓÅrÙjñH»‹Hf¨ øs)'Jô|Æ¿ÃÎÅ›\´äÞBz¦ª¢ÑGþÐ[ƒó]̘RˆóÆü¯³c,ÅømSeÿdݶ «øú.äsâ˜Üwõ‹Ð$ÅFbŠKøÝS®Z?Ö‚¶ .vãØ€w†å<æ†Pù94¸ý­¹êØ,Iy.:…8óˆÅ»]w¥‹èY?…Ür-†ht)Z×4>/Ö_c"p,(—,GVP×ßW)T½½ÊÇçÄdo©£¼bÛ…ãu5™î|œ7e j‚­Î&%žËôºØ b)ýLÆc°*?4 Å‚ Þ„fñžØÅD5Ö}TO±„z% NtÊÝùFØá›Œw%|³6ÆGmŠq4Ohçs®c±&£Òu.;¾'2™ò #Ç™iªˆ|Ç9~ä2YzGlµŸ“¾7.5vO^ÉéæÖ–Xú|ùñ2áéd€Ø)cß—"`Ã!‚Bqœ(•ìþÄÎ!j„óŽ®XˆDÞ.XàÂ=0#A`€Wvê(NUÅ>SÄ#~Å ù"V¤ñ/«4üä^e#¹åŸ;mmk­ýè¡—¢û®tÚB$°å Xd…úUãcÉv´NîûhRø jÌML/Ùâ&LÈÞy–bD”Q©jÚÚ5â*“¨ë(ññhjRòÚø%|"íiÙ—^/f—F[IþG¶ýì[˜›³šÍ5A «‰þR÷iE†¶ß¯æa^D%®÷HÅþ«Žža¼¨*ns“ºú3¾guQºéåñngnGÕ ¨Øq}€ìkTêúÉ Ì,§ýqŒãf-þ¶ªDÛ7ñê÷™# i6¡€“ˆ”ÙÝu­5’€ð”eWÆ·3¸¢”ïtSÅÎøƒpƒÈ/d¯£Rbáë"ŽÙ¶C2ΈjŠWß‘ÉÚ<Ö¨Þ„À}Á‹dµ„ÏDNÔ”äÓÓëMLE®Œ¹Í À(ê«y¸,k­ˆ[/œD ãLÈŒ¶J­ê ÁSʽ?Ñ»4+Õ ô¸%:õ3PjÆä4­Ò ¯‚Å€wÄJþ²Ü’ÆLèÆ“ f/U~ÚÑ–|ï\¥¦oòâ`æ#NæX”La 9¾bÔwR2ñ/ òº»ö!S~¦ZJÓôÅ;Rh;•ПˆÞªm\Ài6½~exP7Wc^bË¡éV“©NbDwe¬ÃÔn m{,¿Ñ»¦e4ä¯_Ý·° z-:QDE4—w9JS§¿ˆ34sz RˆòÂyœñ•ô÷AÌ ¤({=A¶Âñ™~ܽ@ «‘Rmµú§F2¾$XAŠyße½=[¥Ë+ÄQ¢iRãb*ÀihܰÌÚ±×:XCTà•Zl½B*­:$Šk¦ýu)¥GaI×MõÛƒx¬_!´‡µñ+` †3÷ß6¤R5ç¹!®ÿLr}œÊ·½™lÌp‹˜áê°9,ÓŽæ32K;.üo|P±ÚWÆE—n§¹Ò߈Ýó﮵ï 5mt Ùmëñ ]æ¯t§I‰C-̽þ"¨²›ºšÒ#jyí.ì:ùäØéEÀ’Ú%ykføqãE$&i3W·«5€¼|Á ô§¯·娧²¢é¡—~ó¹þÒŽÜHÛ*Ñ_ctïj!êÔíøPžg‘@ «}ξƒû§\'¦üd¹‚ò@`@>º«“èÂÖ»@Gh ³"ÆT}ÎnÅ:_Æ/röZÞ¢ºâ½gÔµG¹Íïãj¨shœœª;×q2Êþ‘6½Êpr‰‹ôô€Lfµõ]c0WPg¼z×'¯¿ßùŽ#1EjhÍ™¿ÆûžíYH‰¹ë`x‰'S÷·88NÆŒoÉÄhûàê&¶j[ñK¾|”Ô¼¯Œ²¹Rܳ¾¡be2¢=)ÎEXXÞ2¶}ÍÊâjÐ@×L™ K½¼li6Ó$ü˜çW/©äz& þ­ä¼}&Ó„®.w¿áyÆðÝ´¢RœÆ}ð*ei¾ó‚‰^ØħȈÅÅÞ‘b,,ù¼·Ú7ùN"+Ý]SÆPÇ"Ùï"© ŒÎ7äZawTT gÖCùIþßlÚÂÙ 1_Ä‹Ä3íÇ °á¯‡NÐîA<*Ý÷ñ®¢xW ÀXO%{Œò§F~ÌÛ>þzJ2ïñuœBLPMk Õ$ÉlMQ|_Ææy¦¤pè4½3Ô“#kéƒD‚ùŸFÝ1÷l½°×¯»CŽ6ÿŠep%ò`‰EÅîù¿ZÎë3ÀWÈ=M–²z†M.nÌ›Ã.ÑŽžžlÛºë·cÞöN¦*%IÈQÓ¶óôÜFXÅucCݦ3±á™†s—•Tr W#FyúòçìÞk2¡ü¦=Eã£Ò8R\Ðkÿó÷€#F¬€G<[ö”S+8•î¯gt ‘§ f«Å²( †(Ïú¤æj–n‘[O‚‡ÀN„$#‘’*¯áâOO±.¼g$’¡çHnþ&%ZKŠHkó¸væ+’¦¤,ÏÈ刳LŒõqý@Õ«„Úölo®ñˆgz,$Úƒ pAF ^ìî”><â ùbc?âJ:Ö·"@ß½znT3[‘þeËÁu‘Ó7ZL<‹-Ä~á÷Å2Ò¯ØâÅŽ“Ö`ÝW‰X;ܤæwé;Ý•Ýh…ù׿­e¦J¯PÉ÷€ŸháE€˜27sÓ©ºNP8Ϭ¥Äž`Äì$9Kçî¡{Úô µßú¼˜²]2i> ·7Ö%-›sÇ2€ à&½+fÛ½yl."Ç7 ùÌcw /œ€Iòt;¬Â?xÇl¸QLøXÙ5l3\ ÐðÂë¹›ÀË]ä—çíªZú×qóT”ªqoep,¿ù[¿²óbu¸;˜ o‰k®:ŽÇ_æ§BÏEn¾€1«zq’r©1k¬d~ûrüf]˜¶D84Âf‚`:µ\‡flX-›0¦ÂðzÌîëòGlÀX>-ä ›FH“fá8$èümƒ(DB¸=­Ð\oŒ.öëµ$}Å ª‡l÷‘r“Ìå;Û<ÑËnÂ\ééŸ{oå›"@ÄC’šTN»½þÜ}cþ‚ùEtà¨Á6”ã`²è¾VpuF+qcn“\# a[NÉ,pÚAP~¼îÐ3*÷·ˆW¿ÍxŒ#m;ywŠ2¬LF—o4·Q2Ô5“rÒS(‰(òvÇd¶c,«ñ5i @×v!éÐü9g”¸GmÂ!¼¯éWó¦î,°s#Oå1ë}Zšæ{]~ToÖmÌÇÑ-„?Œ2Rr[ßœîÁÄ#ZY–ãÌmº'3Í^P ÃÒy'úî¾65º©36D6=ßVƒÇ69A.¸¾ Í[?üqéæèF¾aø°h®2ó—äXQ ;,U¶Å Úäú£ƒn2aýáŒHS¤kEÉC(rĶ[3ô§5”{D™KW€è‘D 8“§Ulž¶¥t"Ëmøwïq•íw%ÈÁêQ^ƒU¹o y ÒÙÿÕÕXÕL-&«'eørÆrpAÃNZ«­ ªž(l;CËè°e6Æ=r!ªp¿EˆâšM‰wèÖ¤“Eå4êúßË2§àº·yH3.C²ËDÁYqÖÛGÍæ½òë÷]·e (¯{•G‹k…Ce6¿ÏýOPÞD̉VÅú’Jß¹*nO|‡`Rr6“^eÄáÈùi³0h¹O.@nÜbÛiyËŠÑŸ?;è‡uE—Ò‹Äm qŒµg7¿LGb¶Ú¯?~­$P-T¥Õœå!=†/Ößt ú…ûÜ-½Ñáig‹|F>âÖàs*{|`0?ËSvÂ=·lÏ”l2/x7áåÊŠnøÅç-ý|agfšn@€‡ª¯"b7tZx©Çi‘8—^OMnÊ]ô„—Àz¬\NEa?d|‡×n#ƒK="¤Ç _œªZí.!óm9— j*¼ ï'3 ¾ç…%BaˆÊ‚‘3æðËÆYj…üNʵ[{Á1eþî4g^àçÉa« õãyyÑzm3 ô,Ìá,îv,›sîûØÌ“Û½ðÏ-ì*»‡“1‘§{ƒð£q–ì±K˜8[sÆ¡!¨º6¿¦.ÚåÁbWK:×r¬~z`ðð¾î.ì9¯ÉÒª*y¶ßöò¯P ]‚iªÅÌ:º×k\Щ¶·oa3–WÔzhŒÅ·v‚2:ƒÛ±©©òÚÂôÅF4j‰ÜVeôk†«M¾œ|é·Ù½ìjSÝ9ÞµQ£f´ü} ˆ‡w0É©xVe`š˜>øK€k+"Yv„bϧ*ÔmÉÝ—jóÖ î$¥5>B{^\•/Tä£tŽK‚N±N½J¾o›…píí&€Îëq8DùÐ9Ê?ãnf#×ýOjC‚2#„A¥‹¡еË&Y™ÝƼ†R€ò4¾çÒu}ò"óÌ‚ q±üz#;t+IÏÀñjëê·}\„Ÿ© Qy]ÅУ›º‚Éø•B)¼rJ ˆ¾ÉDQå8Eþ= Çý"; ½¡ó9„i…:zæVòÊûϤÃ#«õ…7:Ï×µ¸&ÝÒH·1¨.b|{’FDíOÞí èV9ZÖÚ͸ :+9îÚ3¶ø4V'Z5=ŽNr©­!yPxƒ•Ì›²ÔPP——}ü³Wbe'õ!ć¯ªT @þÌêÝóE¢FLbéàShFÛAI7¡õĸâËjiñBöÛ¨½8éÁ”+Jk»`5se»€úeÕ…j<õçUâm¿a .ß[·ôdÚ)d!b7 ¯.:/{–"±Ï}¶=EÝ…é¸mðrú’G6%r,jÆàú ?ZŠ ‘:k';g Ðc"š//Ÿ<òÚŠÔêGº\….¡ð{41z_Ñ×~8!L1ZœÄ”W}ÚuÛó® \ß2E²»J·Áq°H9sÊi¸[ø§]?PÁG¼Iu×2ßF•õ<¨Є8 ­ªÜ"¹èY <ÜhO¼6d1pC›Ï¿ÎÖ@íØÌ¡ÄV!À=¾&CÃûFH®e/N¼Öv…á`‚ƤR÷8\ôZN6Þl¶/æg!~èiÏÌÎ){Ù8ÅRG‡ß^):“ð–CñkÙÝ3sjƒæþlniŒþté]QXкeÞÈU(ÛŸ#r—èÖ’’=6^Õ®^ø î—6á ¹etpm-tools-1.3.9.2/.git/objects/6c/0000775000175000017510000000000013737526666015726 5ustar deboradeboratpm-tools-1.3.9.2/.git/objects/6c/301188d6e377d90146bd43725864eccf6cdb3f0000444000175000017510000000063213737526666023010 0ustar deboradeborax+)JMU056b040031QðMÌNMËÌIÕKÌe˜žØµÓÇ>òn‚¸KCä“e‹ŸZC•¥$–$Æ'ççææçée0Ü]lb?ëÝ|ù3?×/©:!úÓ1³¼YafnA~Q‰^2C°ªó÷ËNqÞné|rì}tóÚunXf0\eÝ¢6÷ö—-û_Ÿ<-6+GióšG( ó2Aæí9¡·`¡á…}<“÷½úô|)Óµ· 0”e0çpž\z¿¥¿%eÿKV¦;+§% "+ËOÊJM™ÿùÈÇWyvÉWXJÕ_vŸM¿·ìN"… Ïïì°ŒwZ·_ì¾f©D~I^Çî{È ‹‹ËS€&®,[P³©Íg‡ØÏE%ç3î.8ùûŸ%… ÿ+|¾ž<õŽEzuF™Á÷¹7™EPå—@éêգ׫ÿÁsMY«ö¬ª7),Ʀ2ƒ!ÀíÌV_Ó•+¶Ôœ`þåÝdÞ¦¼ª2¿ 5¯¸8‡‰%À8ÔJøûeRõ×;[_Õú§ #include #include "tpm_tspi.h" #include "tpm_utils.h" #include "tpm_seal.h" static void help(const char *aCmd) { logCmdHelp(aCmd); logCmdOption("-i, --infile FILE", _ ("Filename containing key to seal. Default is STDIN.")); logCmdOption("-o, --outfile FILE", _ ("Filename to write sealed key to. Default is STDOUT.")); logCmdOption("-p, --pcr NUMBER", _ ("PCR to seal data to. Default is none. This option can be specified multiple times to choose more than one PCR.")); logCmdOption("-z, --well-known", _("Use TSS_WELL_KNOWN_SECRET as the SRK secret.")); logCmdOption("-u, --unicode", _("Use TSS UNICODE encoding for the SRK password to comply with applications using TSS popup boxes")); } static char in_filename[PATH_MAX] = "", out_filename[PATH_MAX] = ""; static TSS_HPCRS hPcrs = NULL_HPCRS; static TSS_HTPM hTpm; static UINT32 selectedPcrs[24]; static UINT32 selectedPcrsLen = 0; static BOOL passUnicode = FALSE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { int rc = -1; switch (aOpt) { case 'i': if (aArg) { strncpy(in_filename, aArg, PATH_MAX); rc = 0; } break; case 'o': if (aArg) { strncpy(out_filename, aArg, PATH_MAX); rc = 0; } break; case 'p': if (aArg) { selectedPcrs[selectedPcrsLen++] = atoi(aArg); rc = 0; } break; case 'u': passUnicode = TRUE; rc = 0; break; case 'z': isWellKnown = TRUE; rc = 0; break; default: break; } return rc; } int main(int argc, char **argv) { TSS_HKEY hSrk, hKey; TSS_HENCDATA hEncdata; TSS_HPOLICY hPolicy; int iRc = -1; struct option opts[] = { {"infile", required_argument, NULL, 'i'}, {"outfile", required_argument, NULL, 'o'}, {"pcr", required_argument, NULL, 'p'}, {"unicode", no_argument, NULL, 'u'}, {"well-known", no_argument, NULL, 'z'} }; unsigned char line[EVP_CIPHER_block_size(EVP_aes_256_cbc()) * 16]; int lineLen; unsigned char encData[sizeof(line) + EVP_CIPHER_block_size(EVP_aes_256_cbc())]; int encDataLen; UINT32 encLen, i; BYTE *encKey; BYTE *randKey = NULL; UINT32 sealKeyLen; BYTE *sealKey; TSS_FLAG keyFlags = TSS_KEY_TYPE_STORAGE | TSS_KEY_SIZE_2048 | TSS_KEY_VOLATILE | TSS_KEY_AUTHORIZATION | TSS_KEY_NOT_MIGRATABLE; TSS_HPOLICY hSrkPolicy; char *passwd = NULL; int pswd_len; BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; BIO *bin = NULL, *bdata=NULL, *b64=NULL; initIntlSys(); if (genericOptHandler(argc, argv, "i:o:p:uz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; /* Create a BIO for the input file */ if ((bin = BIO_new(BIO_s_file())) == NULL) { logError(_("Unable to open input BIO\n")); goto out_close; } /* Assign the input file to the BIO */ if (strlen(in_filename) == 0) BIO_set_fp(bin, stdin, BIO_NOCLOSE); else if (!BIO_read_filename(bin, in_filename)) { logError(_("Unable to open input file: %s\n"), in_filename); goto out_close; } /* Create the PCRs object. If any PCRs above 15 are selected, this will need to be * a 1.2 TSS/TPM */ if (selectedPcrsLen) { TSS_FLAG initFlag = 0; UINT32 pcrSize; BYTE *pcrValue; for (i = 0; i < selectedPcrsLen; i++) { if (selectedPcrs[i] > 15) { #ifdef TSS_LIB_IS_12 initFlag |= TSS_PCRS_STRUCT_INFO_LONG; #else logError(_("This version of %s was compiled for a v1.1 TSS, which " "can only seal\n data to PCRs 0-15. PCR %u is out of range" "\n"), argv[0], selectedPcrs[i]); goto out_close; #endif } } if (contextCreateObject(hContext, TSS_OBJECT_TYPE_PCRS, initFlag, &hPcrs) != TSS_SUCCESS) goto out_close; for (i = 0; i < selectedPcrsLen; i++) { if (tpmPcrRead(hTpm, selectedPcrs[i], &pcrSize, &pcrValue) != TSS_SUCCESS) goto out_close; if (pcrcompositeSetPcrValue(hPcrs, selectedPcrs[i], pcrSize, pcrValue) != TSS_SUCCESS) goto out_close; } #ifdef TSS_LIB_IS_12 if (initFlag) { UINT32 localityValue = TPM_LOC_ZERO | TPM_LOC_ONE | TPM_LOC_TWO | TPM_LOC_THREE | TPM_LOC_FOUR; if (pcrcompositeSetPcrLocality(hPcrs, localityValue) != TSS_SUCCESS) goto out_close; } #endif } /* Retrieve random data to be used as the symmetric key (this key will encrypt the input file contents) */ if (tpmGetRandom(hTpm, EVP_CIPHER_key_length(EVP_aes_256_cbc()), &randKey) != TSS_SUCCESS) goto out_close; /* Load the SRK and set the SRK policy (no password) */ if (keyLoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSrk) != TSS_SUCCESS) goto out_close; /* Use the context's default policy for the SRK secret */ if (policyGet(hSrk, &hSrkPolicy) != TSS_SUCCESS) goto out_close; /* Prompt for SRK password */ if (!isWellKnown) { passwd = _GETPASSWD(_("Enter SRK password: "), (int *)&pswd_len, FALSE, passUnicode); if (!passwd) { logError(_("Failed to get SRK password\n")); goto out_close; } } else { passwd = (char *)wellKnown; pswd_len = sizeof(wellKnown); } if (policySetSecret(hSrkPolicy, (UINT32)pswd_len, (BYTE *)passwd) != TSS_SUCCESS) goto out_close; if (!isWellKnown) shredPasswd(passwd); passwd = NULL; /* Build an RSA key object that will be created by the TPM (this will encrypt and protect the symmetric key) */ if (contextCreateObject (hContext, TSS_OBJECT_TYPE_RSAKEY, keyFlags, &hKey) != TSS_SUCCESS) goto out_close; if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hPolicy, strlen(TPMSEAL_SECRET), (BYTE *)TPMSEAL_SECRET) != TSS_SUCCESS) goto out_close; if (policyAssign(hPolicy, hKey) != TSS_SUCCESS) goto out_close; /* Create the RSA key (under the SRK) */ if (keyCreateKey(hKey, hSrk, NULL_HPCRS) != TSS_SUCCESS) goto out_close; /* Load the newly created RSA key */ if (keyLoadKey(hKey, hSrk) != TSS_SUCCESS) goto out_close; /* Build an encrypted data object that will hold the encrypted version of the symmetric key */ if (contextCreateObject (hContext, TSS_OBJECT_TYPE_ENCDATA, TSS_ENCDATA_SEAL, &hEncdata) != TSS_SUCCESS) goto out_close; if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hPolicy, strlen(TPMSEAL_SECRET), (BYTE *)TPMSEAL_SECRET) != TSS_SUCCESS) goto out_close; if (policyAssign(hPolicy, hEncdata) != TSS_SUCCESS) goto out_close; /* Encrypt and seal the symmetric key */ if (dataSeal (hEncdata, hKey, EVP_CIPHER_key_length(EVP_aes_256_cbc()), randKey, hPcrs) != TSS_SUCCESS) goto out_close; if (getAttribData(hEncdata, TSS_TSPATTRIB_ENCDATA_BLOB, TSS_TSPATTRIB_ENCDATABLOB_BLOB, &encLen, &encKey) != TSS_SUCCESS) goto out_close; if (getAttribData (hKey, TSS_TSPATTRIB_KEY_BLOB, TSS_TSPATTRIB_KEYBLOB_BLOB, &sealKeyLen, &sealKey) != TSS_SUCCESS) goto out_close; /* Create a BIO to perform base64 encoding */ if ((b64 = BIO_new(BIO_f_base64())) == NULL) { logError(_("Unable to open base64 BIO\n")); goto out_close; } /* Create a BIO for the output file */ if ((bdata = BIO_new(BIO_s_file())) == NULL) { logError(_("Unable to open output BIO\n")); goto out_close; } /* Assign the output file to the BIO */ if (strlen(out_filename) == 0) BIO_set_fp(bdata, stdout, BIO_NOCLOSE); else if (BIO_write_filename(bdata, out_filename) <= 0) { logError(_("Unable to open output file: %s\n"), out_filename); goto out_close; } /* Output the sealed data header string */ BIO_puts(bdata, TPMSEAL_HDR_STRING); /* Sealing key used on the TPM */ BIO_puts(bdata, TPMSEAL_TSS_STRING); bdata = BIO_push(b64, bdata); BIO_write(bdata, sealKey, sealKeyLen); if (BIO_flush(bdata) != 1) { logError(_("Unable to flush output\n")); goto out_close; } bdata = BIO_pop(b64); /* Sealed EVP Symmetric Key */ BIO_puts(bdata, TPMSEAL_EVP_STRING); BIO_puts(bdata, TPMSEAL_KEYTYPE_SYM); BIO_puts(bdata, TPMSEAL_CIPHER_AES256CBC); bdata = BIO_push(b64, bdata); BIO_write(bdata, encKey, encLen); if (BIO_flush(bdata) != 1) { logError(_("Unable to flush output\n")); goto out_close; } bdata = BIO_pop(b64); /* Encrypted Data */ BIO_puts(bdata, TPMSEAL_ENC_STRING); bdata = BIO_push(b64, bdata); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit(ctx, EVP_aes_256_cbc(), randKey, (unsigned char *)TPMSEAL_IV); while ((lineLen = BIO_read(bin, line, sizeof(line))) > 0) { EVP_EncryptUpdate(ctx, encData, &encDataLen, line, lineLen); BIO_write(bdata, encData, encDataLen); } EVP_EncryptFinal(ctx, encData, &encDataLen); BIO_write(bdata, encData, encDataLen); if (BIO_flush(bdata) != 1) { logError(_("Unable to flush output\n")); goto out_close; } bdata = BIO_pop(b64); BIO_puts( bdata, TPMSEAL_FTR_STRING); iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (bin) BIO_free(bin); if (bdata) BIO_free(bdata); if (b64) BIO_free(b64); return iRc; } tpm-tools-1.3.9.2/src/cmds/Makefile.am0000664000175000017510000000254013735320450016653 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005, 2006 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # bin_PROGRAMS = tpm_sealdata \ tpm_unsealdata if TSS_LIB_IS_12 AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX -DTSS_LIB_IS_12 else AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX endif LDADD = $(top_builddir)/lib/libtpm_tspi.la -ltspi $(top_builddir)/lib/libtpm_unseal.la -ltpm_unseal -lcrypto @INTLLIBS@ tpm_sealdata_SOURCES = tpm_sealdata.c tpm_unsealdata_SOURCES = tpm_unsealdata.c tpm-tools-1.3.9.2/src/cmds/tpm_unsealdata.c0000664000175000017510000000523413735320450017767 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2009 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include "tpm_tspi.h" #include "tpm_utils.h" #include "tpm_unseal.h" static void help(const char *aCmd) { logCmdHelp(aCmd); logCmdOption("-i, --infile FILE", _ ("Filename containing data to unseal.")); logCmdOption("-o, --outfile FILE", _ ("Filename to write unsealed data to. Default is STDOUT.")); logCmdOption("-z, --srk-well-known", _ ("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the SRK secret.")); } static char in_filename[PATH_MAX] = "", out_filename[PATH_MAX] = ""; static BOOL srkWellKnown = FALSE; static int parse(const int aOpt, const char *aArg) { int rc = -1; switch (aOpt) { case 'i': if (aArg) { strncpy(in_filename, aArg, PATH_MAX); rc = 0; } break; case 'o': if (aArg) { strncpy(out_filename, aArg, PATH_MAX); rc = 0; } break; case 'z': srkWellKnown = TRUE; rc = 0; break; default: break; } return rc; } int main(int argc, char **argv) { struct option opts[] = { {"infile", required_argument, NULL, 'i'}, {"outfile", required_argument, NULL, 'o'}, {"srk-well-known", no_argument, NULL, 'z'}, }; FILE *fp; int rc=0, tss_size=0, i; unsigned char* tss_data = NULL; if (genericOptHandler(argc, argv, "i:o:z", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) return rc; rc = tpmUnsealFile(in_filename, &tss_data, &tss_size, srkWellKnown); if (strlen(out_filename) == 0) { for (i=0; i < tss_size; i++) printf("%c", tss_data[i]); goto out; } else if ((fp = fopen(out_filename, "w")) == NULL) { logError(_("Unable to open output file\n")); goto out; } if (fwrite(tss_data, tss_size, 1, fp) != 1) { logError(_("Unable to write output file\n")); goto out; } fclose(fp); out: free(tss_data); return rc; } tpm-tools-1.3.9.2/src/data_mgmt/0000775000175000017510000000000013737551751015641 5ustar deboradeboratpm-tools-1.3.9.2/src/data_mgmt/Makefile.am0000664000175000017510000000344613737551751017704 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005, 2006 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # bin_PROGRAMS = tpmtoken_init \ tpmtoken_setpasswd \ tpmtoken_objects \ tpmtoken_import \ tpmtoken_protect noinst_HEADERS = data_common.h \ data_import.h \ data_init.h \ data_object.h \ data_passwd.h \ data_protect.h \ openssl_compat.h # # Common build flags AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX LDADD = $(top_builddir)/lib/libtpm_pkcs11.la -ltspi -ldl @INTLLIBS@ # # TPM Token initialization command tpmtoken_init_SOURCES = data_init.c # # TPM Token change password command tpmtoken_setpasswd_SOURCES = data_passwd.c # # TPM Token object list command tpmtoken_objects_SOURCES = data_object.c # # TPM Token object import command tpmtoken_import_SOURCES = data_import.c tpmtoken_import_LDADD = $(LDADD) -lcrypto # # TPM Token data protection command tpmtoken_protect_SOURCES = data_protect.c tpm-tools-1.3.9.2/src/data_mgmt/data_object.h0000664000175000017510000000175313735320450020243 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_OBJECT_H #define __DATA_OBJECT_H #define NO_TOKEN_OBJECTS _( "No objects found\n" ) #endif tpm-tools-1.3.9.2/src/data_mgmt/data_init.c0000664000175000017510000001256513735320450017736 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "data_init.h" #include "data_common.h" #include #include #include #include #define _GNU_SOURCE #include BOOL g_bYes = FALSE; // Yes/No prompt reply char *g_pszToken = NULL; // Token label to be used /* * parseCallback * Process the command specific options. */ int parseCallback( int a_iOpt, const char *a_pszOptArg ) { switch ( a_iOpt ) { // Use the specified token label when finding the token case 'k': if ( !a_pszOptArg ) return -1; g_pszToken = strdup( a_pszOptArg ); break; case 'y': g_bYes = TRUE; break; } return 0; } /* * usageCallback * Display command usage information. */ void usageCallback( const char *a_pszCmd ) { logCmdHelp( a_pszCmd ); logCmdOption( "-k, --token STRING", _("Use STRING to identify the label of the PKCS#11 token to be used") ); logCmdOption( "-y, --yes", _("Reply 'yes' to the clear TPM token prompt") ); } /* * parseCmd * Parse the command line options. */ int parseCmd( int a_iArgc, char **a_pszArgv ) { char *pszShortOpts = "k:y"; struct option stLongOpts[] = { { "token", required_argument, NULL, 'k' }, { "yes", no_argument, NULL, 'y' }, }; int iNumLongOpts = sizeof( stLongOpts ) / sizeof( struct option ); return genericOptHandler( a_iArgc, a_pszArgv, pszShortOpts, stLongOpts, iNumLongOpts, parseCallback, usageCallback ); } int main( int a_iArgc, char **a_pszArgv ) { int rc = 1; // Create buffers for PIN prompts for formatting using sprintf char szSoNewPinPrompt[ strlen( TOKEN_SO_NEW_PIN_PROMPT ) + 16 ]; char szUserNewPinPrompt[ strlen( TOKEN_USER_NEW_PIN_PROMPT ) + 16 ]; char *pszReply = NULL; char *pszSoPin = NULL; char *pszNewSoPin = NULL; char *pszNewUserPin = NULL; CK_RV rv = CKR_OK; CK_SESSION_HANDLE hSession = 0; // Set up i18n initIntlSys( ); // Parse the command if ( parseCmd( a_iArgc, a_pszArgv ) == -1 ) goto out; // Open the PKCS#11 TPM Token rv = openToken( g_pszToken ); if ( rv != CKR_OK ) goto out; // Check if the token is already initialized if ( isTokenInitialized( ) ) { // Warn and ask the user before clearing if ( !g_bYes ) { pszReply = getReply( TOKEN_CLEAR_PROMPT, 1 ); if ( !pszReply || ( strlen( pszReply ) == 0 ) || ( strcasecmp( pszReply, TOKEN_CLEAR_NO ) == 0 ) ) { goto out; } } // Prompt for the current SO password pszSoPin = getPlainPasswd( TOKEN_SO_PIN_PROMPT, FALSE ); if ( !pszSoPin ) goto out; } else pszSoPin = strdup( TOKEN_SO_INIT_PIN ); // Clear the TPM token rv = initToken( pszSoPin ); if ( rv != CKR_OK ) goto out; // Open a session rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; // Login to the token rv = loginToken( hSession, CKU_SO, TOKEN_SO_INIT_PIN ); if ( rv != CKR_OK ) goto out; sprintf( szSoNewPinPrompt, TOKEN_SO_NEW_PIN_PROMPT, getMinPinLen( ), getMaxPinLen( ) ); while ( TRUE ) { // Prompt for a new SO password pszNewSoPin = getPlainPasswd( szSoNewPinPrompt, TRUE ); if ( !pszNewSoPin ) goto out; // Set the new password rv = setPin( hSession, TOKEN_SO_INIT_PIN, pszNewSoPin ); if ( rv == CKR_OK ) break; if ( ( rv == CKR_PIN_INVALID ) || ( rv == CKR_PIN_LEN_RANGE ) ) logError( TOKEN_INVALID_PIN ); else goto out; shredPasswd( pszNewSoPin ); } // Open a new session closeTokenSession( hSession ); hSession = 0; rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; // Login to the token rv = loginToken( hSession, CKU_USER, TOKEN_USER_INIT_PIN ); if ( rv != CKR_OK ) goto out; sprintf( szUserNewPinPrompt, TOKEN_USER_NEW_PIN_PROMPT, getMinPinLen( ), getMaxPinLen( ) ); while ( TRUE ) { // Prompt for a new User password pszNewUserPin = getPlainPasswd( szUserNewPinPrompt, TRUE ); if ( !pszNewUserPin ) goto out; // Set the new password rv = setPin( hSession, TOKEN_USER_INIT_PIN, pszNewUserPin ); if ( rv == CKR_OK ) break; if ( ( rv == CKR_PIN_INVALID ) || ( rv == CKR_PIN_LEN_RANGE ) ) logError( TOKEN_INVALID_PIN ); else goto out; shredPasswd( pszNewUserPin ); } rc = 0; out: free( pszReply ); shredPasswd( pszSoPin ); shredPasswd( pszNewSoPin ); shredPasswd( pszNewUserPin ); if ( hSession ) closeTokenSession( hSession ); closeToken( ); if ( rc == 0 ) logInfo( TOKEN_CMD_SUCCESS, a_pszArgv[ 0 ] ); else logInfo( TOKEN_CMD_FAILED, a_pszArgv[ 0 ] ); return rc; } tpm-tools-1.3.9.2/src/data_mgmt/data_import.h0000664000175000017510000000413113735320450020300 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_IMPORT_H #define __DATA_IMPORT_H #define TOKEN_ID_X509_CERT _("X509 Public Key Certificate") #define TOKEN_ID_RSA_PUBKEY _("RSA Public Key") #define TOKEN_ID_RSA_KEY _("RSA Public/Private Key") #define TOKEN_ID_MISSING_PROMPT _("The subject name and key identifier can not be obtained.\n" \ "Certificate to key association may not be possible after " \ "the import is complete. If the key does not correspond " \ "to a certficate or the key can be associated with the " \ "certificate in another way this may not be an issue.\n" \ "Import the object? [y/N]: ") #define TOKEN_ID_PROMPT _("One or more %s objects matching the subject name and key " \ "identifier already exist. Importing this object will replace " \ "all of these matching objects.\n" \ "Import the object? [y/N]: ") #define TOKEN_ID_YES _("y") #define TOKEN_ID_NO _("n") #define TOKEN_FILE_ERROR _("Error, an import file must be specified\n") #define TOKEN_RSA_KEY_ERROR _("Error, the X509 certificate does not contain an RSA key\n") #define TOKEN_OBJECT_ERROR _("Error, no objects were found that could be imported\n") #define TOKEN_ID_ERROR _("Error, unable to obtain the required subject and id attributes\n") #endif tpm-tools-1.3.9.2/src/data_mgmt/openssl_compat.h0000664000175000017510000000230713737551751021042 0ustar deboradebora/* * Getter functions for OpenSSL < 1.1 compatibility. Based on code from: * https://wiki.openssl.org/index.php/1.1_API_Changes#Adding_forward-compatible_code_to_older_versions * and therefore: * Copyright OpenSSL 2016 * Contents licensed under the terms of the OpenSSL license * See http://www.openssl.org/source/license.html for details */ #ifndef __OPENSSL_COMPAT_H #define __OPENSSL_COMPAT_H #if OPENSSL_VERSION_NUMBER < 0x10100000L #include static inline void RSA_get0_key( const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d ) { if ( n ) *n = r->n; if ( e ) *e = r->e; if ( d ) *d = r->d; } static inline void RSA_get0_factors( const RSA *r, const BIGNUM **p, const BIGNUM **q ) { if ( p ) *p = r->p; if ( q ) *q = r->q; } static inline void RSA_get0_crt_params( const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp ) { if ( dmp1 ) *dmp1 = r->dmp1; if ( dmq1 ) *dmq1 = r->dmq1; if ( iqmp ) *iqmp = r->iqmp; } #endif /* OPENSSL_VERSION_NUMBER */ #endif /* __OPENSSL_COMPAT_H */ tpm-tools-1.3.9.2/src/data_mgmt/data_protect.h0000664000175000017510000000237113735320450020452 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_PROTECT_H #define __DATA_PROTECT_H #define TOKEN_AES_BLOCKSIZE 16 #define TOKEN_BUFFER_SIZE TOKEN_AES_BLOCKSIZE * 256 #define TOKEN_INPUT_FILE_ERROR _("Error, an input file must be specified\n" ) #define TOKEN_OUTPUT_FILE_ERROR _("Error, an output file must be specified\n" ) #define TOKEN_NO_KEY_ERROR _("Error, protection key is not available\n") #endif tpm-tools-1.3.9.2/src/data_mgmt/data_passwd.h0000664000175000017510000000166613735320450020301 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_PASSWD_H #define __DATA_PASSWD_H #endif tpm-tools-1.3.9.2/src/data_mgmt/data_passwd.c0000664000175000017510000001114513735320450020265 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "data_passwd.h" #include "data_common.h" #include #include #include #include #define _GNU_SOURCE #include #include #include #include /* * Global variables */ BOOL g_bSystem = FALSE; // Set SO pin specifier char *g_pszToken = NULL; // Token label to be used /* * parseCallback * Process the command specific options. */ int parseCallback( int a_iOpt, const char *a_pszOptArg ) { switch ( a_iOpt ) { // Use the specified token label when finding the token case 'k': if ( !a_pszOptArg ) return -1; g_pszToken = strdup( a_pszOptArg ); break; case 's': g_bSystem = TRUE; break; } return 0; } /* * usageCallback * Display command usage information. */ void usageCallback( const char *a_pszCmd ) { logCmdHelp( a_pszCmd ); logCmdOption( "-k, --token STRING", _("Use STRING to identify the label of the PKCS#11 token to be used") ); logCmdOption( "-s, --security-officer", _("Change the security officer password") ); } /* * parseCmd * Parse the command line options. */ int parseCmd( int a_iArgc, char **a_pszArgv ) { char *pszShortOpts = "k:s"; struct option stLongOpts[] = { { "token", required_argument, NULL, 'k' }, { "security-officer", no_argument, NULL, 's' }, }; int iNumLongOpts = sizeof( stLongOpts ) / sizeof( struct option ); return genericOptHandler( a_iArgc, a_pszArgv, pszShortOpts, stLongOpts, iNumLongOpts, parseCallback, usageCallback ); } int main( int a_iArgc, char **a_pszArgv ) { int rc = 1; // Create buffers for PIN prompts for formatting using sprintf char szSoNewPinPrompt[ strlen( TOKEN_SO_NEW_PIN_PROMPT ) + 16 ]; char szUserNewPinPrompt[ strlen( TOKEN_USER_NEW_PIN_PROMPT ) + 16 ]; char *pszPrompt = NULL; char *pszPin = NULL; char *pszNewPin = NULL; CK_RV rv = CKR_OK; CK_USER_TYPE tUser = CKU_USER; CK_SESSION_HANDLE hSession = 0; // Set up i18n initIntlSys( ); // Parse the command if ( parseCmd( a_iArgc, a_pszArgv ) == -1 ) goto out; // Open the PKCS#11 TPM Token rv = openToken( g_pszToken ); if ( rv != CKR_OK ) goto out; // Make sure the token is initialized if ( !isTokenInitialized( ) ) { logMsg( TOKEN_NOT_INIT_ERROR ); goto out; } // Open a session rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; // Get the current password if ( g_bSystem ) { pszPrompt = TOKEN_SO_PIN_PROMPT; tUser = CKU_SO; } else { pszPrompt = TOKEN_USER_PIN_PROMPT; tUser = CKU_USER; } pszPin = getPlainPasswd( pszPrompt, FALSE ); if ( !pszPin ) goto out; // Login to the token rv = loginToken( hSession, tUser, pszPin ); if ( rv != CKR_OK ) goto out; // Get the new password if ( g_bSystem ) { sprintf( szSoNewPinPrompt, TOKEN_SO_NEW_PIN_PROMPT, getMinPinLen( ), getMaxPinLen( ) ); pszPrompt = szSoNewPinPrompt; } else { sprintf( szUserNewPinPrompt, TOKEN_USER_NEW_PIN_PROMPT, getMinPinLen( ), getMaxPinLen( ) ); pszPrompt = szUserNewPinPrompt; } while ( TRUE ) { // Prompt for a new SO password pszNewPin = getPlainPasswd( pszPrompt, TRUE ); if ( !pszNewPin ) goto out; // Set the new password rv = setPin( hSession, pszPin, pszNewPin ); if ( rv == CKR_OK ) break; if ( ( rv == CKR_PIN_INVALID ) || ( rv == CKR_PIN_LEN_RANGE ) ) logError( TOKEN_INVALID_PIN ); else goto out; shredPasswd( pszNewPin ); } rc = 0; out: shredPasswd( pszPin ); shredPasswd( pszNewPin ); if ( hSession ) closeTokenSession( hSession ); closeToken( ); if ( rc == 0 ) logInfo( TOKEN_CMD_SUCCESS, a_pszArgv[ 0 ] ); else logInfo( TOKEN_CMD_FAILED, a_pszArgv[ 0 ] ); return rc; } tpm-tools-1.3.9.2/src/data_mgmt/data_protect.c0000664000175000017510000002750113735320450020447 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "data_protect.h" #include "data_common.h" #include #include #include #include #define _GNU_SOURCE #include #include /* * Global variables */ int g_bEncrypt = TRUE; // Encrypt/Decrypt operation specifier char *g_pszInFile = NULL; // Input file name FILE *g_pInFile = NULL; // Input file stream CK_BYTE *g_pbInData = NULL; // Input file buffer char *g_pszOutFile = NULL; // Output file name FILE *g_pOutFile = NULL; // Output file stream CK_ULONG g_ulOutBuffLen = 0; // Output file buffer length CK_BYTE *g_pbOutData = NULL; // Output file buffer CK_ULONG g_ulOutDataLen = 0; // Length of data contained in output buffer char *g_pszToken = NULL; // Token label to be used /* * parseCallback * Process the command specific options. */ int parseCallback( int a_iOpt, const char *a_pszOptArg ) { switch ( a_iOpt ) { case 'd': g_bEncrypt = FALSE; break; case 'e': g_bEncrypt = TRUE; break; case 'i': if ( !a_pszOptArg ) return -1; g_pszInFile = strdup( a_pszOptArg ); break; // Use the specified token label when finding the token case 'k': if ( !a_pszOptArg ) return -1; g_pszToken = strdup( a_pszOptArg ); break; case 'o': if ( !a_pszOptArg ) return -1; g_pszOutFile = strdup( a_pszOptArg ); break; } return 0; } /* * usageCallback * Display command usage information. */ void usageCallback( const char *a_szCmd ) { logCmdHelp( a_szCmd ); logCmdOption( "-d, --decrypt", _("Decrypt the input data") ); logCmdOption( "-e, --encrypt", _("Encrypt the input data (default)") ); logCmdOption( "-i, --infile FILE", _("Use FILE as the input to the specified operation") ); logCmdOption( "-k, --token STRING", _("Use STRING to identify the label of the PKCS#11 token to be used") ); logCmdOption( "-o, --outfile FILE", _("Use FILE as the output of the specified operation") ); } /* * parseCmd * Parse the command line options. */ int parseCmd( int a_iArgc, char **a_szArgv ) { int rc; char *szShortOpts = "dei:k:o:"; struct option stLongOpts[] = { { "decrypt", no_argument, NULL, 'd' }, { "encrypt", no_argument, NULL, 'e' }, { "infile", required_argument, NULL, 'i' }, { "token", required_argument, NULL, 'k' }, { "outfile", required_argument, NULL, 'o' }, }; int iNumLongOpts = sizeof( stLongOpts ) / sizeof( struct option ); rc = genericOptHandler( a_iArgc, a_szArgv, szShortOpts, stLongOpts, iNumLongOpts, parseCallback, usageCallback ); if ( rc == -1 ) return -1; // Make sure "-i" is specified until stdin support is added if ( !g_pszInFile ) { logMsg( TOKEN_INPUT_FILE_ERROR ); rc = -1; } // Make sure "-o" is specified until stdout support is added if ( !g_pszOutFile ) { logMsg( TOKEN_OUTPUT_FILE_ERROR ); rc = -1; } if ( rc == -1 ) { usageCallback( a_szArgv[ 0 ] ); return -1; } return 0; } /* * makeKey * Make the 256-bit AES symmetric key used to encrypt * or decrypt the input data. */ int makeKey( CK_SESSION_HANDLE a_hSession ) { int rc = -1; // Generate a 256-bit AES key CK_RV rv; CK_BBOOL bTrue = TRUE; CK_BBOOL bFalse = FALSE; CK_OBJECT_CLASS tKeyClass = CKO_SECRET_KEY; CK_KEY_TYPE tKeyType = CKK_AES; CK_ULONG ulKeyLen = 32; CK_MECHANISM tMechanism = { CKM_AES_KEY_GEN, NULL, 0 }; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tKeyClass, sizeof( tKeyClass ) }, { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_PRIVATE, &bTrue, sizeof( bTrue ) }, { CKA_MODIFIABLE, &bFalse, sizeof( bFalse ) }, { CKA_LABEL, TOKEN_PROTECT_KEY_LABEL, strlen( TOKEN_PROTECT_KEY_LABEL ) }, { CKA_KEY_TYPE, &tKeyType, sizeof( tKeyType ) }, { CKA_SENSITIVE, &bTrue, sizeof( bTrue ) }, { CKA_ENCRYPT, &bTrue, sizeof( bTrue ) }, { CKA_DECRYPT, &bTrue, sizeof( bTrue ) }, { CKA_SIGN, &bFalse, sizeof( bFalse ) }, { CKA_VERIFY, &bFalse, sizeof( bFalse ) }, { CKA_WRAP, &bTrue, sizeof( bTrue ) }, { CKA_UNWRAP, &bTrue, sizeof( bTrue ) }, { CKA_EXTRACTABLE, &bFalse, sizeof( bFalse ) }, { CKA_VALUE_LEN, &ulKeyLen, sizeof( ulKeyLen ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); CK_OBJECT_HANDLE hObject; // Generate the key on the token rv = generateKey( a_hSession, &tMechanism, tAttr, ulAttrCount, &hObject ); if ( rv != CKR_OK ) goto out; rc = 0; out: return rc; } /* * getKey * Get the symmetric key used for encryption or decryption. */ int getKey( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE *a_phObject ) { int rc = -1; CK_RV rv; CK_BBOOL bTrue = TRUE; CK_OBJECT_CLASS tKeyClass = CKO_SECRET_KEY; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tKeyClass, sizeof( tKeyClass ) }, { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_LABEL, TOKEN_PROTECT_KEY_LABEL, strlen( TOKEN_PROTECT_KEY_LABEL ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); CK_OBJECT_HANDLE *phObjList = NULL; CK_ULONG ulObjCount = 0; *a_phObject = 0; // Search for the protection key rv = findObjects( a_hSession, tAttr, ulAttrCount, &phObjList, &ulObjCount ); if ( rv != CKR_OK ) goto out; if ( ulObjCount == 0 ) { // Key doesn't exist, create it if ( makeKey( a_hSession ) == -1 ) goto out; // Search for the protection key again rv = findObjects( a_hSession, tAttr, ulAttrCount, &phObjList, &ulObjCount ); if ( rv != CKR_OK ) goto out; } // Make sure we found it if ( ulObjCount == 0 ) { logError( TOKEN_NO_KEY_ERROR ); goto out; } // Return the handle to the key *a_phObject = phObjList[ 0 ]; rc = 0; out: return rc; } /* * readData * Callback routine that reads the input data for the encryption * or decryption operation. The operation (encryption or decryption) * determines some of the logic in this routine. */ int readData( CK_BYTE **a_pbData, CK_ULONG *a_pulDataLen, CK_BBOOL *a_pbMoreData, CK_BBOOL a_bEncrypt ) { CK_ULONG iBytes; CK_BBOOL bMoreData = TRUE; if ( !g_pInFile ) { // Open the input file errno = 0; g_pInFile = fopen( g_pszInFile, "r" ); if ( !g_pInFile ) { logError( TOKEN_FILE_OPEN_ERROR, g_pszInFile, strerror( errno ) ); return -1; } // Allocate an input buffer g_pbInData = malloc( TOKEN_BUFFER_SIZE ); if ( !g_pbInData ) { logError( TOKEN_MEMORY_ERROR ); return -1; } } // Read the data iBytes = fread( g_pbInData, 1, TOKEN_BUFFER_SIZE, g_pInFile ); if ( feof( g_pInFile ) ) { fclose( g_pInFile ); // End of file encountered, indicate that there is // no more data bMoreData = FALSE; } else { // Not end of file so make sure the buffer was filled if ( iBytes != TOKEN_BUFFER_SIZE ) { // Error encountered, terminate fclose( g_pInFile ); return -1; } } if ( !bMoreData && a_bEncrypt ) { // No more data, so if we are encrypting then we MUST add padding int iCount = iBytes - 1; int iPadding = TOKEN_AES_BLOCKSIZE - ( iBytes % TOKEN_AES_BLOCKSIZE ); iBytes += iPadding; g_pbInData[iCount + iPadding] = iPadding; iPadding--; while ( iPadding > 0 ) { g_pbInData[iCount + iPadding] = 0; iPadding--; } } *a_pbData = g_pbInData; *a_pulDataLen = iBytes; *a_pbMoreData = bMoreData; return 0; } /* * writeData * Callback routine that writes the output data for the encryption * or decryption operation. The operation (encryption or decryption) * determines some of the logic in this routine. */ int writeData( CK_BYTE *a_pbData, CK_ULONG a_ulDataLen, CK_BBOOL a_bMoreData, CK_BBOOL a_bEncrypt ) { size_t tWriteCount; if ( !g_pOutFile ) { // Open the output file errno = 0; g_pOutFile = fopen( g_pszOutFile, "w" ); if ( !g_pOutFile ) { logError( TOKEN_FILE_OPEN_ERROR, g_pszOutFile, strerror( errno ) ); return -1; } } if ( !a_bMoreData ) { // No more data so remove padding if we are decrypting if ( !a_bEncrypt ) { int iPadding; if ( a_ulDataLen == 0 ) { // Remove padding from previous block is current // block is zero length if ( g_pbOutData ) { iPadding = g_pbOutData[g_ulOutDataLen - 1]; g_ulOutDataLen -= iPadding; } } else { // Remove padding from current block iPadding = a_pbData[a_ulDataLen - 1]; a_ulDataLen -= iPadding; } } } // Write the previous buffer if there is one if ( g_pbOutData && ( g_ulOutDataLen > 0 ) ) { tWriteCount = fwrite( g_pbOutData, 1, g_ulOutDataLen, g_pOutFile ); if ( tWriteCount != g_ulOutDataLen ) { logError(TOKEN_FILE_WRITE_ERROR, g_pOutFile, "short write"); return -1; } } if ( a_bMoreData ) { // Allocate a (new) buffer if necessary if ( a_ulDataLen > g_ulOutBuffLen ) { free( g_pbOutData ); g_ulOutBuffLen = a_ulDataLen; g_pbOutData = malloc( g_ulOutBuffLen ); if ( !g_pbOutData ) { logError( TOKEN_MEMORY_ERROR ); return -1; } } // Copy the current data to the holding buffer if ( a_ulDataLen > 0 ) memcpy( g_pbOutData, a_pbData, a_ulDataLen ); g_ulOutDataLen = a_ulDataLen; } else { // No more data so write the last piece of data if ( a_ulDataLen > 0 ) { tWriteCount = fwrite( a_pbData, 1, a_ulDataLen, g_pOutFile ); if ( tWriteCount != a_ulDataLen ) { logError(TOKEN_FILE_WRITE_ERROR, g_pOutFile, "short write"); return -1; } } fclose( g_pOutFile ); } return 0; } int main( int a_iArgc, char **a_szArgv ) { int rc = 1; char *pszPin = NULL; CK_RV rv; CK_SESSION_HANDLE hSession; CK_OBJECT_HANDLE hObject; CK_MECHANISM tMechanism = { CKM_AES_ECB, NULL, 0 }; // Set up i18n initIntlSys( ); // Parse the command if ( parseCmd( a_iArgc, a_szArgv ) == -1 ) goto out; // Open the PKCS#11 TPM Token rv = openToken( g_pszToken ); if ( rv != CKR_OK ) goto out; // Make sure the token is initialized if ( !isTokenInitialized( ) ) { logMsg( TOKEN_NOT_INIT_ERROR ); goto out; } // Open a session rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; pszPin = getPlainPasswd( TOKEN_USER_PIN_PROMPT, FALSE ); if ( !pszPin ) goto out; // Login to the token rv = loginToken( hSession, CKU_USER, pszPin ); if ( rv != CKR_OK ) goto out; // Obtain the key if ( getKey( hSession, &hObject ) == -1 ) goto out; // Perform the operation if ( g_bEncrypt ) rv = encryptData( hSession, hObject, &tMechanism, readData, writeData ); else rv = decryptData( hSession, hObject, &tMechanism, readData, writeData ); if ( rv != CKR_OK ) goto out; rc = 0; out: shredPasswd( pszPin ); if ( hSession ) closeTokenSession( hSession ); closeToken( ); free( g_pszInFile ); free( g_pszOutFile ); free( g_pbInData ); free( g_pbOutData ); if ( rc == 0 ) logInfo( TOKEN_CMD_SUCCESS, a_szArgv[ 0 ] ); else logInfo( TOKEN_CMD_FAILED, a_szArgv[ 0 ] ); return rc; } tpm-tools-1.3.9.2/src/data_mgmt/data_import.c0000664000175000017510000007034513737551751020321 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "data_import.h" #include "data_common.h" #include #include #include #include #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include "openssl_compat.h" /* * Global variables */ char *g_pszFile = NULL; // Object import file name char *g_pszIdFile = NULL; // Object identification file name char *g_pszType = NULL; // Object import type int g_bPublic = FALSE; // Public object specifier int g_bYes = FALSE; // Yes/No prompt reply char *g_pszToken = NULL; // Token label to be used int g_bAttrsValid = FALSE; CK_BYTE *g_pchSubject = NULL; // SUBJECT attribute value CK_LONG g_subjectLen = 0; CK_BYTE *g_pchId = NULL; // ID attribute value CK_ULONG g_ulIdLen = 0; CK_BYTE *g_pchName = NULL; // LABEL attribute value CK_ULONG g_ulNameLen = 0; /* * parseCallback * Process the command specific options. */ int parseCallback( int a_iOpt, const char *a_pszOptArg ) { switch ( a_iOpt ) { // File with object to be used to obtain subject/id case 'i': if ( !a_pszOptArg ) return -1; g_pszIdFile = strdup( a_pszOptArg ); break; // Use the specified token label when finding the token case 'k': if ( !a_pszOptArg ) return -1; g_pszToken = strdup( a_pszOptArg ); break; // Name to use as the LABEL attribute value case 'n': if ( !a_pszOptArg ) return -1; g_pchName = (CK_BYTE *)strdup( a_pszOptArg ); g_ulNameLen = strlen( a_pszOptArg ); break; // Make the object public case 'p': g_bPublic = TRUE; break; // Only import the specified object type case 't': if ( !a_pszOptArg ) return -1; if ( ( strcmp( a_pszOptArg, TOKEN_OBJECT_KEY ) != 0 ) && ( strcmp( a_pszOptArg, TOKEN_OBJECT_CERT ) != 0 ) ) return -1; g_pszType = strdup( a_pszOptArg ); break; // Reply "yes" to any yes/no prompts case 'y': g_bYes = TRUE; break; } return 0; } /* * usageCallback * Display command usage information. */ void usageCallback( const char *a_pszCmd ) { char *pszArgs[2]; char *pszArgsDesc[2]; pszArgs[ 0 ] = "FILE"; pszArgsDesc[ 0 ] = _("Import the PEM formatted RSA key and/or X.509 certificate object contained in FILE"); pszArgs[ 1 ] = NULL; pszArgsDesc[ 1 ] = NULL; logCmdHelpEx( a_pszCmd, pszArgs, pszArgsDesc ); logCmdOption( "-i, --idfile FILE", _("Use FILE as the PEM formatted X.509 certificate input used to obtain the subject and id attributes") ); logCmdOption( "-k, --token STRING", _("Use STRING to identify the label of the PKCS#11 token to be used") ); logCmdOption( "-n, --name STRING", _("Use STRING as the label for the imported object(s)") ); logCmdOption( "-p, --public", _("Import the object(s) as a public object") ); logCmdOption( "-t, --type key|cert", _("Import only the specified object type") ); logCmdOption( "-y, --yes", _("Assume yes as the answer to any confirmation prompt") ); } /* * parseCmd * Parse the command line options. */ int parseCmd( int a_iArgc, char **a_pszArgv ) { int rc; char *pszShortOpts = "i:k:n:pt:y"; struct option stLongOpts[] = { { "idfile", required_argument, NULL, 'i' }, { "name", required_argument, NULL, 'n' }, { "public", no_argument, NULL, 'p' }, { "token", required_argument, NULL, 'k' }, { "type", required_argument, NULL, 't' }, { "yes", no_argument, NULL, 'y' }, }; int iNumLongOpts = sizeof( stLongOpts ) / sizeof( struct option ); rc = genericOptHandler( a_iArgc, a_pszArgv, pszShortOpts, stLongOpts, iNumLongOpts, parseCallback, usageCallback ); if ( rc == -1 ) return -1; if ( optind >= a_iArgc ) { logMsg( TOKEN_FILE_ERROR ); usageCallback( a_pszArgv[ 0 ] ); return -1; } g_pszFile = strdup( a_pszArgv[ optind ] ); return 0; } /* * findExistingObjects * Search for objects of the supplied type that have a SUBJECT * and ID attribute equal to the values of the object to be * imported. */ int findExistingObjects( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_tAttr, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE **a_phObject, CK_ULONG *a_pulObjectCount ) { CK_RV rv; CK_BBOOL bTrue = TRUE; // Set up default search attributes CK_ATTRIBUTE tDefaultAttr[] = { { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_SUBJECT, g_pchSubject, g_subjectLen }, { CKA_ID, g_pchId, g_ulIdLen }, }; CK_ULONG ulDefaultAttrCount = sizeof( tDefaultAttr ) / sizeof( CK_ATTRIBUTE ); CK_ATTRIBUTE tAttr[ ulDefaultAttrCount + a_ulAttrCount ]; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); *a_phObject = NULL; *a_pulObjectCount = 0; // Apply attributes and search memcpy( tAttr, tDefaultAttr, ulDefaultAttrCount * sizeof( CK_ATTRIBUTE ) ); if ( a_ulAttrCount ) memcpy( tAttr + ulDefaultAttrCount, a_tAttr, a_ulAttrCount * sizeof( CK_ATTRIBUTE ) ); rv = findObjects( a_hSession, tAttr, ulAttrCount, a_phObject, a_pulObjectCount ); return ( rv == CKR_OK ) ? 0 : -1; } /* * checkExistingObjects * Use findExistingObjects to determine if objects of the * supplied type currently exist. If so, prompt the user as * to whether to replace the existing objects. */ int checkExistingObjects( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_tAttr, CK_ULONG a_ulAttrCount, const char *a_pszObject ) { int rc = -1; CK_OBJECT_HANDLE *phObject = NULL; CK_ULONG ulObjectCount = 0; char szPrompt[ strlen( TOKEN_ID_PROMPT ) + strlen( a_pszObject ) + 1 ]; char *pszReply = NULL; if ( g_bAttrsValid ) { // Search for existing objects if ( findExistingObjects( a_hSession, a_tAttr, a_ulAttrCount, &phObject, &ulObjectCount ) == -1 ) goto out; if ( ulObjectCount > 0 ) { // One or more objects exists if ( !g_bYes ) { // Prompt for whether to replace the existing objects sprintf( szPrompt, TOKEN_ID_PROMPT, a_pszObject ); pszReply = getReply( szPrompt, 1 ); if ( !pszReply || ( strlen( pszReply ) == 0 ) || ( strcasecmp( pszReply, TOKEN_ID_NO ) == 0 ) ) { goto out; } } } } rc = 0; out: free( phObject ); free( pszReply ); return rc; } /* * destroyExistingObjects * Use findExistingObjects to locate all objects of the * supplied type that currently exists and destroy them. */ int destroyExistingObjects( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_tAttr, CK_ULONG a_ulAttrCount ) { int rc = -1; CK_RV rv; CK_OBJECT_HANDLE *phObject = NULL; CK_ULONG ulObjectCount = 0; if ( g_bAttrsValid ) { // Search for existing objects if ( findExistingObjects( a_hSession, a_tAttr, a_ulAttrCount, &phObject, &ulObjectCount ) == -1 ) goto out; // Destroy each object found while ( ulObjectCount > 0 ) { rv = destroyObject( a_hSession, phObject[ --ulObjectCount ] ); if ( rv != CKR_OK ) goto out; } } rc = 0; out: free( phObject ); return rc; } /* * readX509Cert * Use the OpenSSL library to read a PEM formatted X509 certificate. */ int readX509Cert( const char *a_pszFile, int a_bCheckKey, X509 **a_pX509 ) { int rc = -1; FILE *pFile = stdin; X509 *pX509 = NULL; EVP_PKEY *pKey = NULL; *a_pX509 = NULL; // Open the file to be read if ( a_pszFile ) { errno = 0; pFile = fopen( a_pszFile, "r" ); if ( !pFile ) { logError( TOKEN_FILE_OPEN_ERROR, a_pszFile, strerror( errno ) ); goto out; } } // Read the X509 certificate pX509 = PEM_read_X509( pFile, NULL, NULL, NULL ); if ( !pX509 ) { unsigned long ulError = ERR_get_error( ); // Not necessarily an error if the file doesn't contain the cert if ( ( ERR_GET_LIB( ulError ) == ERR_R_PEM_LIB ) && ( ERR_GET_REASON( ulError ) == PEM_R_NO_START_LINE ) ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ulError, NULL ) ); rc = 0; } else logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ulError, NULL ) ); goto out; } // Make sure the certificate uses an RSA key if ( !a_bCheckKey ) { rc = 0; goto out; } pKey = X509_get_pubkey( pX509 ); if ( !pKey ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); X509_free( pX509 ); pX509 = NULL; goto out; } if ( EVP_PKEY_base_id( pKey ) != EVP_PKEY_RSA ) { logError( TOKEN_RSA_KEY_ERROR ); X509_free( pX509 ); pX509 = NULL; goto out; } rc = 0; out: *a_pX509 = pX509; if ( a_pszFile && pFile ) fclose( pFile ); return rc; } /* * checkX509Cert * Use checkExistingObjects to search for X_509 objects * that match the attributes of the X_509 object to be imported. */ int checkX509Cert( CK_SESSION_HANDLE a_hSession ) { CK_CERTIFICATE_TYPE tX509 = CKC_X_509; CK_ATTRIBUTE tAttr[] = { { CKA_CERTIFICATE_TYPE, &tX509, sizeof( tX509 ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return checkExistingObjects( a_hSession, tAttr, ulAttrCount, TOKEN_ID_X509_CERT ); } /* * destroyX509CertObject * Use destroyExistingObjects to destroy X_509 objects * that match the attributes of the X_509 object to be imported. */ int destroyX509CertObject( CK_SESSION_HANDLE a_hSession ) { CK_CERTIFICATE_TYPE tX509 = CKC_X_509; CK_ATTRIBUTE tAttr[] = { { CKA_CERTIFICATE_TYPE, &tX509, sizeof( tX509 ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return destroyExistingObjects( a_hSession, tAttr, ulAttrCount ); } /* * createX509CertObject * Create an X_509 object. */ int createX509CertObject( X509 *a_pX509, CK_SESSION_HANDLE a_hSession ) { int rc = -1; CK_RV rv; CK_BBOOL bTrue = TRUE; X509_NAME *pIssuer = NULL; ASN1_INTEGER *pSerialNum = NULL; CK_BYTE *pchIssuer = NULL; CK_LONG issuerLen = 0; CK_BYTE *pchSerialNum = NULL; CK_LONG serialNumLen = 0; CK_BYTE *pchCert = NULL; CK_LONG certLen = 0; CK_OBJECT_CLASS clCertClass = CKO_CERTIFICATE; CK_CERTIFICATE_TYPE tCertType = CKC_X_509; CK_BBOOL bPrivate = ( !g_bPublic ) ? TRUE : FALSE; // The issuer, serial number, and value attributes must be completed // before the object is created CK_ATTRIBUTE tCertAttr[] = { { CKA_CLASS, &clCertClass, sizeof( clCertClass ) }, { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bTrue, sizeof( bTrue ) }, { CKA_LABEL, g_pchName, g_ulNameLen }, { CKA_CERTIFICATE_TYPE, &tCertType, sizeof( tCertType ) }, { CKA_SUBJECT, g_pchSubject, g_subjectLen }, { CKA_ID, g_pchId, g_ulIdLen }, { CKA_ISSUER, NULL, 0 }, { CKA_SERIAL_NUMBER, NULL, 0 }, { CKA_VALUE, NULL, 0 }, }; CK_ULONG ulCertAttrCount = sizeof( tCertAttr ) / sizeof( CK_ATTRIBUTE ); CK_OBJECT_HANDLE hObject; // Get the issuer name from the X509 certificate pIssuer = X509_get_issuer_name( a_pX509 ); if ( !pIssuer ) { logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } issuerLen = i2d_X509_NAME( pIssuer, &pchIssuer ); if ( issuerLen < 0 ) { logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Get the serial number from the X509 certificate pSerialNum = X509_get_serialNumber( a_pX509 ); if ( !pSerialNum ) { logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } serialNumLen = i2d_ASN1_INTEGER( pSerialNum, &pchSerialNum ); if ( serialNumLen < 0 ) { logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Get a DER encoded format of the X509 certificate certLen = i2d_X509( a_pX509, &pchCert ); if ( certLen < 0 ) { logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Set the attribute values tCertAttr[ 8 ].pValue = pchIssuer; tCertAttr[ 8 ].ulValueLen = issuerLen; tCertAttr[ 9 ].pValue = pchSerialNum; tCertAttr[ 9 ].ulValueLen = serialNumLen; tCertAttr[ 10 ].pValue = pchCert; tCertAttr[ 10 ].ulValueLen = certLen; // Create the X509 certificate object rv = createObject( a_hSession, tCertAttr, ulCertAttrCount, &hObject ); if ( rv != CKR_OK ) goto out; rc = 0; out: OPENSSL_free( pchIssuer ); OPENSSL_free( pchCert ); OPENSSL_free( pchSerialNum ); return rc; } /* * doX509Cert * Process an X509 certificate for import. */ int doX509Cert( X509 *a_pX509, CK_SESSION_HANDLE a_hSession ) { int rc = -1; if ( destroyX509CertObject( a_hSession ) == -1 ) goto out; if ( createX509CertObject( a_pX509, a_hSession ) == -1 ) goto out; rc = 0; out: return rc; } /* * readRsaKey * Use the OpenSSL library to read a PEM formatted RSA key. */ int readRsaKey( const char *a_pszFile, RSA **a_pRsa ) { int rc = -1; FILE *pFile = stdin; RSA *pRsa = NULL; *a_pRsa = NULL; // Open the file to be read if ( a_pszFile ) { errno = 0; pFile = fopen( a_pszFile, "r" ); if ( !pFile ) { logError( TOKEN_FILE_OPEN_ERROR, a_pszFile, strerror( errno ) ); goto out; } } // Read the RSA key // This reads the public key also, not just the private key pRsa = PEM_read_RSAPrivateKey( pFile, NULL, NULL, NULL ); if ( !pRsa ) { unsigned long ulError = ERR_get_error( ); // Not necessarily an error if the file doesn't contain the key if ( ( ERR_GET_LIB( ulError ) == ERR_R_PEM_LIB ) && ( ERR_GET_REASON( ulError ) == PEM_R_NO_START_LINE ) ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ulError, NULL ) ); rc = 0; } else logError( TOKEN_OPENSSL_ERROR, ERR_error_string( ulError, NULL ) ); goto out; } rc = 0; out: if ( a_pszFile && pFile ) fclose( pFile ); *a_pRsa = pRsa; return rc; } /* * checkRsaPubKey * Use checkExistingObjects to search for RSA public key objects * that match the attributes of the X509's RSA public key object * to be imported. */ int checkRsaPubKey( CK_SESSION_HANDLE a_hSession ) { CK_OBJECT_CLASS tPubKey = CKO_PUBLIC_KEY; CK_KEY_TYPE tRsa = CKK_RSA; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tPubKey, sizeof( tPubKey ) }, { CKA_KEY_TYPE, &tRsa, sizeof( tRsa ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return checkExistingObjects( a_hSession, tAttr, ulAttrCount, TOKEN_ID_RSA_PUBKEY ); } /* * checkRsaKey * Use checkExistingObjects to search for RSA objects * that match the attributes of the RSA object to be imported. */ int checkRsaKey( CK_SESSION_HANDLE a_hSession ) { CK_KEY_TYPE tRsa = CKK_RSA; CK_ATTRIBUTE tAttr[] = { { CKA_KEY_TYPE, &tRsa, sizeof( tRsa ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return checkExistingObjects( a_hSession, tAttr, ulAttrCount, TOKEN_ID_RSA_KEY ); } /* * destroyRsaKeyObject * Use destroyExistingObjects to destroy RSA objects * that match the attributes of the RSA object to be imported. */ int destroyRsaPubKeyObject( CK_SESSION_HANDLE a_hSession ) { CK_OBJECT_CLASS tPubKey = CKO_PUBLIC_KEY; CK_KEY_TYPE tRsa = CKK_RSA; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &tPubKey, sizeof( tPubKey ) }, { CKA_KEY_TYPE, &tRsa, sizeof( tRsa ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return destroyExistingObjects( a_hSession, tAttr, ulAttrCount ); } /* * destroyRsaKeyObject * Use destroyExistingObjects to destroy RSA objects * that match the attributes of the RSA object to be imported. */ int destroyRsaKeyObject( CK_SESSION_HANDLE a_hSession ) { CK_KEY_TYPE tRsa = CKK_RSA; CK_ATTRIBUTE tAttr[] = { { CKA_KEY_TYPE, &tRsa, sizeof( tRsa ) }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); return destroyExistingObjects( a_hSession, tAttr, ulAttrCount ); } /* * createRsaPubKeyObject * Create an RSA public key object. */ int createRsaPubKeyObject( RSA *a_pRsa, CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE *a_hObject ) { int rc = -1; const BIGNUM *rsa_n, *rsa_e; RSA_get0_key( a_pRsa, &rsa_n, &rsa_e, NULL ); int nLen = BN_num_bytes( rsa_n ); int eLen = BN_num_bytes( rsa_e ); CK_RV rv; CK_BBOOL bTrue = TRUE; CK_BBOOL bFalse = FALSE; CK_BYTE *n = malloc( nLen ); CK_BYTE *e = malloc( eLen ); CK_OBJECT_CLASS clPubClass = CKO_PUBLIC_KEY; CK_KEY_TYPE tKeyType = CKK_RSA; CK_BBOOL bPrivate = ( !g_bPublic ) ? TRUE : FALSE; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &clPubClass, sizeof( clPubClass ) }, { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bTrue, sizeof( bTrue ) }, { CKA_LABEL, g_pchName, g_ulNameLen }, { CKA_KEY_TYPE, &tKeyType, sizeof( tKeyType ) }, { CKA_ID, g_pchId, g_ulIdLen }, { CKA_SUBJECT, g_pchSubject, g_subjectLen }, { CKA_ENCRYPT, &bTrue, sizeof( bTrue ) }, { CKA_VERIFY, &bTrue, sizeof( bTrue ) }, { CKA_VERIFY_RECOVER, &bFalse, sizeof( bFalse ) }, { CKA_WRAP, &bFalse, sizeof( bFalse ) }, { CKA_MODULUS, n, nLen }, { CKA_PUBLIC_EXPONENT, e, eLen }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); *a_hObject = 0; if ( !n || !e ) { logError( TOKEN_MEMORY_ERROR ); goto out; } // Get binary representations of the RSA key information BN_bn2bin( rsa_n, n ); BN_bn2bin( rsa_e, e ); // Create the RSA public key object rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject ); if ( rv != CKR_OK ) goto out; rc = 0; out: free( n ); free( e ); return rc; } /* * createRsaPrivKeyObject * Create an RSA private key object. */ int createRsaPrivKeyObject( RSA *a_pRsa, CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE *a_hObject ) { int rc = -1; const BIGNUM *rsa_n, *rsa_e, *rsa_d; const BIGNUM *rsa_p, *rsa_q; const BIGNUM *rsa_dmp1, *rsa_dmq1, *rsa_iqmp; RSA_get0_key( a_pRsa, &rsa_n, &rsa_e, &rsa_d ); RSA_get0_factors( a_pRsa, &rsa_p, &rsa_q ); RSA_get0_crt_params( a_pRsa, &rsa_dmp1, &rsa_dmq1, &rsa_iqmp ); int nLen = BN_num_bytes( rsa_n ); int eLen = BN_num_bytes( rsa_e ); int dLen = BN_num_bytes( rsa_d ); int pLen = BN_num_bytes( rsa_p ); int qLen = BN_num_bytes( rsa_q ); int dmp1Len = BN_num_bytes( rsa_dmp1 ); int dmq1Len = BN_num_bytes( rsa_dmq1 ); int iqmpLen = BN_num_bytes( rsa_iqmp ); CK_RV rv; CK_BBOOL bTrue = TRUE; CK_BBOOL bFalse = FALSE; CK_BYTE *n = malloc( nLen ); CK_BYTE *e = malloc( eLen ); CK_BYTE *d = malloc( dLen ); CK_BYTE *p = malloc( pLen ); CK_BYTE *q = malloc( qLen ); CK_BYTE *dmp1 = malloc( dmp1Len ); CK_BYTE *dmq1 = malloc( dmq1Len ); CK_BYTE *iqmp = malloc( iqmpLen ); CK_OBJECT_CLASS clPrivClass = CKO_PRIVATE_KEY; CK_KEY_TYPE tKeyType = CKK_RSA; CK_BBOOL bPrivate = ( !g_bPublic ) ? TRUE : FALSE; CK_ATTRIBUTE tAttr[] = { { CKA_CLASS, &clPrivClass, sizeof( clPrivClass ) }, { CKA_TOKEN, &bTrue, sizeof( bTrue ) }, { CKA_PRIVATE, &bPrivate, sizeof( bPrivate ) }, { CKA_MODIFIABLE, &bTrue, sizeof( bTrue ) }, { CKA_LABEL, g_pchName, g_ulNameLen }, { CKA_KEY_TYPE, &tKeyType, sizeof( tKeyType ) }, { CKA_ID, g_pchId, g_ulIdLen }, { CKA_SUBJECT, g_pchSubject, g_subjectLen }, { CKA_SENSITIVE, &bTrue, sizeof( bTrue ) }, { CKA_DECRYPT, &bTrue, sizeof( bTrue ) }, { CKA_SIGN, &bTrue, sizeof( bTrue ) }, { CKA_SIGN_RECOVER, &bFalse, sizeof( bFalse ) }, { CKA_UNWRAP, &bFalse, sizeof( bFalse ) }, { CKA_EXTRACTABLE, &bFalse, sizeof( bFalse ) }, { CKA_MODULUS, n, nLen }, { CKA_PUBLIC_EXPONENT, e, eLen }, { CKA_PRIVATE_EXPONENT, d, dLen }, { CKA_PRIME_1, p, pLen }, { CKA_PRIME_2, q, qLen }, { CKA_EXPONENT_1, dmp1, dmp1Len }, { CKA_EXPONENT_2, dmq1, dmq1Len }, { CKA_COEFFICIENT, iqmp, iqmpLen }, }; CK_ULONG ulAttrCount = sizeof( tAttr ) / sizeof( CK_ATTRIBUTE ); *a_hObject = 0; if ( !n || !e || !d || !p || !q || !dmp1 || !dmq1 || !iqmp ) { logError( TOKEN_MEMORY_ERROR ); goto out; } // Get binary representations of the RSA key information BN_bn2bin( rsa_n, n ); BN_bn2bin( rsa_e, e ); BN_bn2bin( rsa_d, d ); BN_bn2bin( rsa_p, p ); BN_bn2bin( rsa_q, q ); BN_bn2bin( rsa_dmp1, dmp1 ); BN_bn2bin( rsa_dmq1, dmq1 ); BN_bn2bin( rsa_iqmp, iqmp ); // Create the RSA private key object rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject ); if ( rv != CKR_OK ) goto out; rc = 0; out: free( n ); free( e ); free( d ); free( p ); free( q ); free( dmp1 ); free( dmq1 ); free( iqmp ); return rc; } /* * createRsaKeyObject * Create an RSA key object (both public and private). */ int createRsaKeyObject( RSA *a_pRsa, CK_SESSION_HANDLE a_hSession ) { int rc = -1; CK_OBJECT_HANDLE hPubObject; CK_OBJECT_HANDLE hPrivObject; // Create the RSA public key object if ( createRsaPubKeyObject( a_pRsa, a_hSession, &hPubObject ) == -1 ) goto out; // Create the RSA private key object if ( createRsaPrivKeyObject( a_pRsa, a_hSession, &hPrivObject ) == -1 ) { // Private key object creation failed, destroy the public // key object just created destroyObject( a_hSession, hPubObject ); goto out; } rc = 0; out: return rc; } /* * doRsaPubKey * Process an RSA public key for import. */ int doRsaPubKey( RSA *a_pRsa, CK_SESSION_HANDLE a_hSession ) { int rc = -1; CK_OBJECT_HANDLE hObject; if ( destroyRsaPubKeyObject( a_hSession ) == -1 ) goto out; if ( createRsaPubKeyObject( a_pRsa, a_hSession, &hObject ) == -1 ) goto out; rc = 0; out: return rc; } /* * doRsaKey * Process an RSA key for import. */ int doRsaKey( RSA *a_pRsa, CK_SESSION_HANDLE a_hSession ) { int rc = -1; if ( destroyRsaKeyObject( a_hSession ) == -1 ) goto out; if ( createRsaKeyObject( a_pRsa, a_hSession ) == -1 ) goto out; rc = 0; out: return rc; } /* * getSubjectId * Extract the subject name and key identifier from an * X509 certificate for use as the SUBJECT and ID attributes. */ int getSubjectId( X509 *a_pX509 ) { int rc = -1; char *pszReply = NULL; X509 *pX509 = a_pX509; X509_NAME *pSubject = NULL; ASN1_OCTET_STRING *pSkid = NULL; // Use the Id input file if specified if ( g_pszIdFile ) if ( readX509Cert( g_pszIdFile, FALSE, &pX509 ) == -1 ) goto out; if ( !pX509 ) { // Prompt the user about creating without it. if ( !g_bYes ) { // Prompt for whether to import without the attributes pszReply = getReply( TOKEN_ID_MISSING_PROMPT, 1 ); if ( !pszReply || ( strlen( pszReply ) == 0 ) || ( strcasecmp( pszReply, TOKEN_ID_NO ) == 0 ) ) { goto out; } } rc = 0; goto out; } // Get the subject name from the X509 certificate pSubject = X509_get_subject_name( pX509 ); if ( !pSubject ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Get the DER encoded format of the subject name g_subjectLen = i2d_X509_NAME( pSubject, &g_pchSubject ); if ( g_subjectLen < 0 ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Get the subject key identifier from the X509 certficate pSkid = X509_get_ext_d2i( pX509, NID_subject_key_identifier, NULL, NULL ); if ( !pSkid ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } // Get the ASCII string format of the subject key identifier g_pchId = (CK_BYTE *)i2s_ASN1_OCTET_STRING( NULL, pSkid ); if ( !g_pchId ) { logInfo( TOKEN_OPENSSL_ERROR, ERR_error_string( ERR_get_error( ), NULL ) ); goto out; } g_ulIdLen = strlen( (char *)g_pchId ); g_bAttrsValid = TRUE; rc = 0; out: // Free the structure if it was created for this function if ( pX509 && ( pX509 != a_pX509 ) ) X509_free( pX509 ); ASN1_OCTET_STRING_free( pSkid ); free( pszReply ); return rc; } int main( int a_iArgc, char **a_pszArgv ) { int rc = 1; char *pszPin = NULL; CK_RV rv = CKR_OK; CK_SESSION_HANDLE hSession = 0; X509 *pX509 = NULL; RSA *pPubRsa = NULL; RSA *pRsa = NULL; // Set up i18n initIntlSys( ); // Initialize OpenSSL OpenSSL_add_all_algorithms( ); ERR_load_crypto_strings( ); // Parse the command if ( parseCmd( a_iArgc, a_pszArgv ) == -1 ) goto out; // Open the PKCS#11 TPM Token rv = openToken( g_pszToken ); if ( rv != CKR_OK ) goto out; // Make sure the token is initialized if ( !isTokenInitialized( ) ) { logMsg( TOKEN_NOT_INIT_ERROR ); goto out; } // Create the structures based on the input if ( !g_pszType ) { if ( readX509Cert( g_pszFile, TRUE, &pX509 ) == -1 ) goto out; if ( readRsaKey( g_pszFile, &pRsa ) == -1 ) goto out; if ( !pX509 && !pRsa ) { logError( TOKEN_OBJECT_ERROR ); goto out; } } else if ( strcmp( g_pszType, TOKEN_OBJECT_CERT ) == 0 ) { if ( readX509Cert( g_pszFile, TRUE, &pX509 ) == -1 ) goto out; if ( !pX509 ) { logError( TOKEN_OBJECT_ERROR ); goto out; } } else if ( strcmp( g_pszType, TOKEN_OBJECT_KEY ) == 0 ) { if ( readRsaKey( g_pszFile, &pRsa ) == -1 ) goto out; if ( !pRsa ) { logError( TOKEN_OBJECT_ERROR ); goto out; } } // Open a session rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; // Check the scope of the request, which will determine the login // requirements: // Public = no password, no login // Private = user password, user login (default) if ( !g_bPublic ) { pszPin = getPlainPasswd( TOKEN_USER_PIN_PROMPT, FALSE ); if ( !pszPin ) goto out; // Login to the token rv = loginToken( hSession, CKU_USER, pszPin ); if ( rv != CKR_OK ) goto out; } // Obtain the subject name and id, these are used to // uniquely identify the certificate/key relation if ( getSubjectId( pX509 ) == -1 ) { logError( TOKEN_ID_ERROR ); goto out; } // Now check for existing objects that may get replaced // prior to processing the request(s) if ( pX509 ) { if ( checkX509Cert( hSession ) == -1 ) { goto out; } // If we are not importing any RSA keys, use the // public key from the certificate if ( !pRsa ) { if ( checkRsaPubKey( hSession ) == -1 ) { goto out; } } pPubRsa = EVP_PKEY_get1_RSA( X509_get_pubkey( pX509 ) ); } if ( pRsa ) { if ( checkRsaKey( hSession ) == -1 ) { goto out; } } // Process the request(s) if ( pX509 ) { if ( doX509Cert( pX509, hSession ) == -1 ) goto out; // If we are not importing any RSA keys, use the // public key from the certificate if ( !pRsa ) { if ( doRsaPubKey( pPubRsa, hSession ) == -1 ) goto out; } } if ( pRsa ) { if ( doRsaKey( pRsa, hSession ) == -1 ) goto out; } rc = 0; out: shredPasswd( pszPin ); if ( hSession ) closeTokenSession( hSession ); closeToken( ); free( g_pszFile ); free( g_pszIdFile ); free( g_pszType ); X509_free( pX509 ); RSA_free( pRsa ); OPENSSL_free( g_pchSubject ); OPENSSL_free( g_pchId ); free( g_pchName ); EVP_cleanup( ); if ( rc == 0 ) logInfo( TOKEN_CMD_SUCCESS, a_pszArgv[ 0 ] ); else logInfo( TOKEN_CMD_FAILED, a_pszArgv[ 0 ] ); return rc; } tpm-tools-1.3.9.2/src/data_mgmt/data_init.h0000664000175000017510000000231413735320450017732 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_INIT_H #define __DATA_INIT_H #define TOKEN_CLEAR_PROMPT _("Warning: The TPM token has already been initialized. " \ "Reinitializing the TPM token will cause " \ "all TPM token data to be lost.\n" \ "Clear the TPM token data? [y/N]: ") #define TOKEN_CLEAR_YES _("y") #define TOKEN_CLEAR_NO _("n") #endif tpm-tools-1.3.9.2/src/data_mgmt/data_common.h0000664000175000017510000000426113735320450020262 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __DATA_COMMON_H #define __DATA_COMMON_H #define TOKEN_OBJECT_KEY "key" #define TOKEN_OBJECT_CERT "cert" #define TOKEN_SO_INIT_PIN "87654321" #define TOKEN_SO_PIN_PROMPT _("Enter the TPM security officer password: ") #define TOKEN_SO_NEW_PIN_PROMPT _("A new TPM security officer password is needed. " \ "The password must be between %d and %d characters " \ "in length.\n" \ "Enter new password: ") #define TOKEN_USER_INIT_PIN "12345678" #define TOKEN_USER_PIN_PROMPT _("Enter your TPM user password: ") #define TOKEN_USER_NEW_PIN_PROMPT _("A new TPM user password is needed. " \ "The password must be between %d and %d characters " \ "in length.\n" \ "Enter new password: ") #define TOKEN_INVALID_PIN _("The password entered is not valid, please try again.\n") #define TOKEN_PROTECT_KEY_LABEL "User Data Protection Key" #define TOKEN_NOT_INIT_ERROR _("Error, the TPM token has not been initialized\n") #define TOKEN_MEMORY_ERROR _("Error, unable to allocate needed memory\n") #define TOKEN_OPENSSL_ERROR _("Error, OpenSSL error: %s\n") #define TOKEN_FILE_OPEN_ERROR _("Error, unable to open file %s: %s\n") #define TOKEN_FILE_WRITE_ERROR _("Error writing to file %s: %s\n") #define TOKEN_CMD_SUCCESS _("%s succeeded\n") #define TOKEN_CMD_FAILED _("%s failed\n") #endif tpm-tools-1.3.9.2/src/data_mgmt/data_object.c0000664000175000017510000001021013735320450020222 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "data_object.h" #include "data_common.h" #include #include #include #include #define _GNU_SOURCE #include /* * Global variables */ int g_bPublic = FALSE; // Public object specifier int g_bExtended = FALSE; // Extended information display specifier char *g_pszToken = NULL; // Token label to be used /* * parseCallback * Process the command specific options. */ int parseCallback( int a_iOpt, const char *a_pszOptArg ) { switch ( a_iOpt ) { // Use the specified token label when finding the token case 'k': if ( !a_pszOptArg ) return -1; g_pszToken = strdup( a_pszOptArg ); break; case 'p': g_bPublic = TRUE; break; case 'x': g_bExtended = TRUE; break; } return 0; } /* * usageCallback * Display command usage information. */ void usageCallback( const char *a_pszCmd ) { logCmdHelp( a_pszCmd ); logCmdOption( "-k, --token STRING", _("Use STRING to identify the label of the PKCS#11 token to be used") ); logCmdOption( "-p, --public", _("Display only public objects") ); logCmdOption( "-x, --extended", _("Display additional information about the objects") ); } /* * parseCmd * Parse the command line options. */ int parseCmd( int a_iArgc, char **a_pszArgv ) { char *pszShortOpts = "k:px"; struct option stLongOpts[] = { { "token", required_argument, NULL, 'k' }, { "public", no_argument, NULL, 'p' }, { "extended", no_argument, NULL, 'x' }, }; int iNumLongOpts = sizeof( stLongOpts ) / sizeof( struct option ); return genericOptHandler( a_iArgc, a_pszArgv, pszShortOpts, stLongOpts, iNumLongOpts, parseCallback, usageCallback ); } int main( int a_iArgc, char **a_pszArgv ) { int rc = 1; char *pszPin = NULL; CK_RV rv = CKR_OK; CK_SESSION_HANDLE hSession = 0; CK_OBJECT_HANDLE *hObject; CK_ULONG ulCount; // Set up i18n initIntlSys( ); // Parse the command if ( parseCmd( a_iArgc, a_pszArgv ) == -1 ) goto out; // Open the PKCS#11 TPM Token rv = openToken( g_pszToken ); if ( rv != CKR_OK ) goto out; // Make sure the token is initialized if ( !isTokenInitialized( ) ) { logMsg( TOKEN_NOT_INIT_ERROR ); goto out; } // Open a session rv = openTokenSession( CKF_RW_SESSION, &hSession ); if ( rv != CKR_OK ) goto out; // Check the scope of the request, which will determine the login // requirements: // Public = no password, no login // Private = user password, user login if ( !g_bPublic ) { pszPin = getPlainPasswd( TOKEN_USER_PIN_PROMPT, FALSE ); if ( !pszPin ) goto out; // Login to the token rv = loginToken( hSession, CKU_USER, pszPin ); if ( rv != CKR_OK ) goto out; } rv = findObjects( hSession, NULL, 0, &hObject, &ulCount ); if ( rv != CKR_OK ) goto out; if ( ulCount > 0 ) { while ( ulCount > 0 ) displayObject( hSession, hObject[ --ulCount ], g_bExtended ); } else { logMsg( NO_TOKEN_OBJECTS ); } free( hObject ); rc = 0; out: shredPasswd( pszPin ); if ( hSession ) closeTokenSession( hSession ); closeToken( ); if ( rc == 0 ) logInfo( TOKEN_CMD_SUCCESS, a_pszArgv[ 0 ] ); else logInfo( TOKEN_CMD_FAILED, a_pszArgv[ 0 ] ); return rc; } tpm-tools-1.3.9.2/src/tpm_mgmt/0000775000175000017510000000000013737511026015517 5ustar deboradeboratpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvcommon.h0000664000175000017510000000406113735320450020402 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef TPM_NVCOMMON_H #define TPM_NVCOMMON_H #include "tpm_tspi.h" struct strings_with_values { const char *name; UINT32 value; const char *desc; }; extern const struct strings_with_values permvalues[]; int parseStringWithValues(const char *aArg, const struct strings_with_values *svals, unsigned int *x, unsigned int maximum, const char *name); char *printValueAsStrings(unsigned int value, const struct strings_with_values *svals); int parseHexOrDecimal(const char *aArg, unsigned int *x, unsigned int minimum, unsigned int maximum, const char *name); void displayStringsAndValues(const struct strings_with_values *svals, const char *indent); TSS_RESULT getNVDataPublic(TSS_HTPM hTpm, TPM_NV_INDEX nvindex, TPM_NV_DATA_PUBLIC **pub); void freeNVDataPublic(TPM_NV_DATA_PUBLIC *pub); static inline UINT32 Decode_UINT32(BYTE * y) { UINT32 x = 0; x = y[0]; x = ((x << 8) | (y[1] & 0xFF)); x = ((x << 8) | (y[2] & 0xFF)); x = ((x << 8) | (y[3] & 0xFF)); return x; } #endif /* TPM_NVCOMMON_H */ tpm-tools-1.3.9.2/src/tpm_mgmt/Makefile.am0000664000175000017510000000534313735320450017555 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005, 2006 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # noinst_HEADERS = tpm_nvcommon.h noinst_PROGRAMS = tpm_startup \ tpm_reset sbin_PROGRAMS = tpm_changeownerauth \ tpm_clear \ tpm_createek \ tpm_getpubek \ tpm_restrictpubek \ tpm_setactive \ tpm_setenable \ tpm_setclearable \ tpm_setownable \ tpm_setpresence \ tpm_takeownership \ tpm_version \ tpm_selftest if TSS_LIB_IS_12 sbin_PROGRAMS += tpm_nvdefine \ tpm_nvinfo \ tpm_nvread \ tpm_nvrelease \ tpm_nvwrite \ tpm_resetdalock \ tpm_restrictsrk \ tpm_revokeek \ tpm_setoperatorauth AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX -DTSS_LIB_IS_12 else AM_CPPFLAGS = -I$(top_srcdir)/include -D_LINUX endif LDADD = $(top_builddir)/lib/libtpm_tspi.la -ltspi @INTLLIBS@ tpm_startup_SOURCES = tpm_startup.c tpm_reset_SOURCES = tpm_reset.c tpm_changeownerauth_SOURCES = tpm_changeauth.c tpm_clear_SOURCES = tpm_clear.c tpm_createek_SOURCES = tpm_createek.c tpm_getpubek_SOURCES = tpm_getpubek.c tpm_nvdefine_SOURCES = tpm_nvdefine.c tpm_nvcommon.c tpm_nvinfo_SOURCES = tpm_nvinfo.c tpm_nvcommon.c tpm_nvrelease_SOURCES = tpm_nvrelease.c tpm_nvcommon.c tpm_nvread_SOURCES = tpm_nvread.c tpm_nvcommon.c tpm_nvwrite_SOURCES = tpm_nvwrite.c tpm_nvcommon.c tpm_restrictpubek_SOURCES = tpm_restrictpubek.c tpm_setactive_SOURCES = tpm_activate.c tpm_setclearable_SOURCES = tpm_clearable.c tpm_setenable_SOURCES = tpm_enable.c tpm_setownable_SOURCES = tpm_ownable.c tpm_setpresence_SOURCES = tpm_present.c tpm_takeownership_SOURCES = tpm_takeownership.c tpm_version_SOURCES = tpm_version.c tpm_selftest_SOURCES = tpm_selftest.c tpm_revokeek_SOURCES = tpm_revokeek.c tpm_setoperatorauth_SOURCES = tpm_setoperatorauth.c tpm_resetdalock_SOURCES = tpm_resetdalock.c tpm_restrictsrk_SOURCES = tpm_restrictsrk.c tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_takeownership.c0000664000175000017510000000762113735320450021431 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-y, --owner-well-known", _("Set the owner secret to all zeros (20 bytes of zeros).")); logCmdOption("-z, --srk-well-known", _("Set the SRK secret to all zeros (20 bytes of zeros).")); } static BOOL ownerWellKnown = FALSE; static BOOL srkWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'y': ownerWellKnown = TRUE; break; case 'z': srkWellKnown = TRUE; break; default: return -1; } return 0; } static inline TSS_RESULT tpmTakeOwnership(TSS_HTPM a_hTpm, TSS_HKEY a_hSrk) { TSS_RESULT result = Tspi_TPM_TakeOwnership(a_hTpm, a_hSrk, NULL_HKEY); tspiResult("Tspi_TPM_TakeOwnership", result); return result; } int main(int argc, char **argv) { char *szTpmPasswd = NULL; char *szSrkPasswd = NULL; int tpm_len, srk_len; TSS_HTPM hTpm; TSS_HKEY hSrk; TSS_FLAG fSrkAttrs; TSS_HPOLICY hTpmPolicy, hSrkPolicy; int iRc = -1; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; struct option opts[] = { {"owner-well-known", no_argument, NULL, 'y'}, {"srk-well-known", no_argument, NULL, 'z'}, }; initIntlSys(); if (genericOptHandler (argc, argv, "yz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (!ownerWellKnown) { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &tpm_len, TRUE); if (!szTpmPasswd) goto out; } if (!srkWellKnown) { // Prompt for srk password szSrkPasswd = GETPASSWD(_("Enter SRK password: "), &srk_len, TRUE); if (!szSrkPasswd) goto out; } if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (ownerWellKnown) { tpm_len = TCPA_SHA1_160_HASH_LEN; if (policySetSecret(hTpmPolicy, tpm_len, well_known_secret) != TSS_SUCCESS) goto out_obj_close; } else { if (policySetSecret(hTpmPolicy, tpm_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; } fSrkAttrs = TSS_KEY_TSP_SRK | TSS_KEY_AUTHORIZATION; if (contextCreateObject (hContext, TSS_OBJECT_TYPE_RSAKEY, fSrkAttrs, &hSrk) != TSS_SUCCESS) goto out_close; if (policyGet(hSrk, &hSrkPolicy) != TSS_SUCCESS) goto out_obj_close; if (srkWellKnown) { srk_len = TCPA_SHA1_160_HASH_LEN; if (policySetSecret(hSrkPolicy, srk_len, well_known_secret) != TSS_SUCCESS) goto out_obj_close; } else { if (policySetSecret(hSrkPolicy, srk_len, (BYTE *)szSrkPasswd) != TSS_SUCCESS) goto out_obj_close; } if (tpmTakeOwnership(hTpm, hSrk) != TSS_SUCCESS) goto out_obj_close; iRc = 0; logSuccess(argv[0]); out_obj_close: contextCloseObject(hContext, hSrk); out_close: contextClose(hContext); out: if (szTpmPasswd) shredPasswd(szTpmPasswd); if (szSrkPasswd) shredPasswd(szSrkPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_ownable.c0000664000175000017510000000760313735320450020175 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" /* * Affect: Change the TPM state regarding if take_ownership can be performed. * Default: Set state to ownable * Requires: Physical presence */ //Controlled by option inputs static TSS_BOOL bValue = TRUE; static BOOL bCheck = FALSE; static BOOL changeRequested = FALSE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': logDebug(_("Changing mode to check status.\n")); bCheck = TRUE; break; case 'p': logDebug(_("Changing to prevent ownership mode\n")); bValue = FALSE; changeRequested = TRUE; break; case 'a': logDebug(_("Changing to allow ownership mode\n")); bValue = TRUE; changeRequested = TRUE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Display current status")); logCmdOption("-a, --allow", _("Allow TPM takeownership command")); logCmdOption("-p, --prevent", _("Prevent TPM takeownership command")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HPOLICY hTpmPolicy; TSS_HTPM hTpm; int iRc = -1; struct option opts[] = { {"allow", no_argument, NULL, 'a'}, {"prevent", no_argument, NULL, 'p'}, {"status", no_argument, NULL, 's'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "apsz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (bCheck || !changeRequested) { if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (tpmGetStatus (hTpm, TSS_TPMSTATUS_SETOWNERINSTALL, &bValue) != TSS_SUCCESS) goto out_close; logMsg(_("Ownable status: %s\n"), logBool(mapTssBool(bValue))); goto out_success; } if (tpmSetStatus(hTpm, TSS_TPMSTATUS_SETOWNERINSTALL, bValue) != TSS_SUCCESS) goto out_close; out_success: iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_resetdalock.c0000664000175000017510000000515413735320450021045 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2007 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static void help(const char* aCmd) { logCmdHelp(aCmd); logCmdOption("-z, --well-known", _("Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the owner secret.")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'z': isWellKnown = TRUE; break; default: return -1; } return 0; } int main( int argc, char **argv ) { char *szTpmPasswd = NULL; int tpm_len; TSS_HTPM hTpm; TSS_HPOLICY hTpmPolicy; TSS_BOOL bValue = TRUE; int iRc = -1; struct option opts[] = { {"well-known", no_argument, NULL, 'z'}, }; BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler(argc, argv, "z", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (!isWellKnown) { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &tpm_len, FALSE); if (!szTpmPasswd) { logError(_("Failed to get Owner password\n")); goto out; } } else { szTpmPasswd = (char *)wellKnown; tpm_len = sizeof(wellKnown); } if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hTpmPolicy, tpm_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (tpmSetStatus(hTpm, TSS_TPMSTATUS_RESETLOCK, bValue) != TSS_SUCCESS) goto out_close; iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (!isWellKnown && szTpmPasswd) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_clearable.c0000664000175000017510000001165713735320450020464 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Report current status.")); logCmdOption("-o, --owner", _("Remove ability of the owner to clear TPM.")); logCmdOption("-f, --force", _("Remove ability to clear TPM with physical presence.\n\t\tThis action is not persistent")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } enum { owner = 0, force }; struct physFlag { const char *name; const TSS_FLAG property; BOOL disable; }; //Controlled by input options static struct physFlag flags[] = { {N_("Owner Clear"), TSS_TPMSTATUS_DISABLEOWNERCLEAR}, {N_("Force Clear"), TSS_TPMSTATUS_DISABLEFORCECLEAR}, {0, 0, 0} }; static BOOL bCheck = FALSE; static BOOL bChangeRequested = FALSE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': bCheck = TRUE; break; case 'o': flags[owner].disable = TRUE; bChangeRequested = TRUE; break; case 'f': flags[force].disable = TRUE; bChangeRequested = TRUE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } /* * Affect: Toggle OwnerClear and ForceClear from being available * Default: Display current states * Requires: Owner auth to set OwnerClear and display current states */ int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HTPM hTpm; TSS_HPOLICY hTpmPolicy; int iRc = -1; int i = 0; struct option opts[] = { {"status", no_argument, NULL, 's'}, {"owner", no_argument, NULL, 'o'}, {"force", no_argument, NULL, 'f'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "ofsz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (bCheck || !bChangeRequested) { logInfo(_("Checking current status: \n")); if (isWellKnown){ szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; do { TSS_BOOL bValue; if (tpmGetStatus(hTpm, flags[i].property, &bValue) != TSS_SUCCESS) goto out_close; logMsg("%s Disabled: %s\n", _(flags[i].name), logBool(mapTssBool(bValue))); } while (flags[++i].name); goto out_success; } do { if (flags[i].disable) { logDebug(_("Requested to disable: %s ability.\n"), _(flags[i].name)); if (i == owner) { if (isWellKnown){ szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; } if (tpmSetStatus(hTpm, flags[i].property, 0) != TSS_SUCCESS) goto out_close; logInfo(_("Disabling %s successful.\n"), _(flags[i].name)); } } while (flags[++i].name); out_success: logSuccess(argv[0]); iRc = 0; out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvwrite.c0000664000175000017510000002126713735320450020246 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include #include #include "tpm_nvcommon.h" #include "tpm_tspi.h" #include "tpm_utils.h" static BOOL nvindex_set; static unsigned int nvindex; static unsigned int offset; static unsigned int length; static int fillvalue = -1; static const char *filename; static BOOL passWellKnown; static BOOL askPassword; static const char *password; static char *data; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': if (parseHexOrDecimal(aArg, &nvindex, 0, UINT_MAX, "NVRAM index") != 0) return -1; nvindex_set = 1; break; case 's': if (parseHexOrDecimal(aArg, &length, 0, UINT_MAX, "length of data") != 0) return -1; break; case 'n': if (parseHexOrDecimal(aArg, &offset, 0, UINT_MAX, "write offset") != 0) return -1; break; case 'd': data = strdup(aArg); if (data == NULL) { logError(_("Out of memory\n")); return -1; } break; case 'f': filename = aArg; break; case 'm': if (parseHexOrDecimal(aArg, (unsigned int *)&fillvalue, 0, UCHAR_MAX, "fill value") != 0) return -1; break; case 'p': password = aArg; if (!password) askPassword = TRUE; else askPassword = FALSE; passWellKnown = FALSE; break; case 'z': password = NULL; passWellKnown = TRUE; askPassword = FALSE; break; case 'u': useUnicode = TRUE; break; default: return -1; } return 0; } static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); logCmdOption("-p, --password", _("Owner or NVRAM area password depending on permissions")); logNVIndexCmdOption(); logCmdOption("-s, --size", _("Number of bytes to write to the NVRAM area")); logCmdOption("-n, --offset", _("Offset at which to start writing into the NVRAM area")); logCmdOption("-f, --filename", _("File whose contents to write into the NVRAM area")); logCmdOption("-d, --data", _("Data to write into the NVRAM area")); logCmdOption("-m, --fill-value", _("The byte to fill the NVRAM area with")); } int main(int argc, char **argv) { TSS_HTPM hTpm; TSS_HNVSTORE nvObject; TSS_FLAG fNvAttrs; UINT32 ulDataLength, bytesToWrite, off; BYTE *rgbDataToWrite = NULL; TSS_HPOLICY hTpmPolicy, hDataPolicy; TPM_NV_DATA_PUBLIC *nvpub = NULL; int iRc = -1; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; int pswd_len = -1; struct option hOpts[] = { {"index" , required_argument, NULL, 'i'}, {"size" , required_argument, NULL, 's'}, {"offset" , required_argument, NULL, 'n'}, {"data" , required_argument, NULL, 'd'}, {"filename" , required_argument, NULL, 'f'}, {"fillvalue" , required_argument, NULL, 'm'}, {"password" , optional_argument, NULL, 'p'}, {"use-unicode", no_argument, NULL, 'u'}, {"well-known" , no_argument, NULL, 'z'}, {NULL , no_argument, NULL, 0}, }; struct stat statbuf; int fd = -1; ssize_t read_bytes; initIntlSys(); if (genericOptHandler (argc, argv, "i:s:n:d:f:m:p::zu", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (nvindex_set == 0) { logError(_("You must provide an index for the NVRAM area.\n")); goto out; } if (length > 0 && data == NULL && filename == NULL && fillvalue == -1) { logError(_("Either data, name of file or fill value must be " "provided.\n")); goto out; } if (data) { ulDataLength = strlen(data); if (length > 0 && (UINT32)length < ulDataLength) ulDataLength = length; rgbDataToWrite = (BYTE *)data; data = NULL; } else if (filename) { if (stat(filename, &statbuf) != 0) { logError(_("Could not access file '%s'\n"), filename); goto out; } ulDataLength = statbuf.st_size; if (length > 0 && (UINT32)length < ulDataLength) ulDataLength = length; rgbDataToWrite = malloc(ulDataLength); if (rgbDataToWrite == NULL) { logError(_("Out of memory.\n")); return -1; } fd = open(filename, O_RDONLY); if (fd < 0) { logError(_("Could not open file %s for reading.\n")); return -1; } read_bytes = read(fd, rgbDataToWrite, ulDataLength); if (read_bytes < 0 || ulDataLength != (UINT32)read_bytes) { logError(_("Error while reading data.\n")); return -1; } close(fd); fd = -1; } else if (fillvalue >= 0) { if (length < 0) { logError(_("Requiring size parameter.\n")); return -1; } ulDataLength = length; rgbDataToWrite = malloc(ulDataLength); if (rgbDataToWrite == NULL) { logError(_("Out of memory.\n")); return -1; } __memset(rgbDataToWrite, fillvalue, ulDataLength); } else { ulDataLength = 0; } if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; fNvAttrs = 0; if (contextCreateObject(hContext, TSS_OBJECT_TYPE_NV, fNvAttrs, &nvObject) != TSS_SUCCESS) goto out_close; if (askPassword) { password = _GETPASSWD(_("Enter NVRAM access password: "), &pswd_len, FALSE, useUnicode ); if (!password) { logError(_("Failed to get NVRAM access password\n")); goto out_close; } } if (password || passWellKnown) { if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (password) { if (pswd_len < 0) pswd_len = strlen(password); if (policySetSecret(hTpmPolicy, strlen(password), (BYTE *)password) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hTpmPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hDataPolicy) != TSS_SUCCESS) goto out_close; if (password) { if (policySetSecret(hDataPolicy, strlen(password), (BYTE *)password) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hDataPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } if (Tspi_Policy_AssignToObject(hDataPolicy, nvObject) != TSS_SUCCESS) goto out_close; } if (nvindex != TPM_NV_INDEX0) { if (getNVDataPublic(hTpm, nvindex, &nvpub) != TSS_SUCCESS) { logError(_("Could not get NVRAM area public information.\n")); goto out_close_obj; } if ((UINT32)offset > nvpub->dataSize) { logError(_("The offset is outside the NVRAM area's size of " "%u bytes.\n"), nvpub->dataSize); goto out_close_obj; } if ((UINT32)offset + ulDataLength > nvpub->dataSize) { logError(_("Writing of data would go beyond the NVRAM area's size " "of %u bytes.\n"), nvpub->dataSize); goto out_close_obj; } } if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_INDEX, 0, nvindex) != TSS_SUCCESS) goto out_close_obj; bytesToWrite = ulDataLength; off = offset; if (bytesToWrite == 0 && NVWriteValue(nvObject, 0, 0, NULL) != TSS_SUCCESS) goto out_close_obj; #define WRITE_CHUNK_SIZE 1024 while (bytesToWrite > 0) { UINT32 chunk = (bytesToWrite > WRITE_CHUNK_SIZE) ? WRITE_CHUNK_SIZE : bytesToWrite; if (NVWriteValue(nvObject, off, chunk, &rgbDataToWrite[off-offset]) != TSS_SUCCESS) goto out_close_obj; bytesToWrite -= chunk; off += chunk; } logMsg(_("Successfully wrote %d bytes at offset %d to NVRAM index " "0x%x (%u).\n"), ulDataLength, offset, nvindex, nvindex); iRc = 0; goto out_close; out_close_obj: contextCloseObject(hContext, nvObject); out_close: contextClose(hContext); out: free(rgbDataToWrite); freeNVDataPublic(nvpub); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvcommon.c0000664000175000017510000001622713735320450020404 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include "tpm_nvcommon.h" #include "tpm_tspi.h" #include "tpm_utils.h" const struct strings_with_values permvalues[] = { { .name = "AUTHREAD", .value = TPM_NV_PER_AUTHREAD, .desc = _("reading requires NVRAM area authorization"), }, { .name = "AUTHWRITE", .value = TPM_NV_PER_AUTHWRITE, .desc = _("writing requires NVRAM area authorization"), }, { .name = "OWNERREAD", .value = TPM_NV_PER_OWNERREAD, .desc = _("writing requires owner authorization"), }, { .name = "OWNERWRITE", .value = TPM_NV_PER_OWNERWRITE, .desc = _("reading requires owner authorization"), }, { .name = "PPREAD", .value = TPM_NV_PER_PPREAD, .desc = _("writing requires physical presence"), }, { .name = "PPWRITE", .value = TPM_NV_PER_PPWRITE, .desc = _("reading requires physical presence"), }, { .name = "GLOBALLOCK", .value = TPM_NV_PER_GLOBALLOCK, .desc = _("write to index 0 locks the NVRAM area until " "TPM_STARTUP(ST_CLEAR)"), }, { .name = "READ_STCLEAR", .value = TPM_NV_PER_READ_STCLEAR, .desc = _("a read with size 0 to the same index prevents further " "reading until ST_STARTUP(ST_CLEAR)"), }, { .name = "WRITE_STCLEAR", .value = TPM_NV_PER_WRITE_STCLEAR, .desc = _("a write with size 0 to the same index prevents further " "writing until ST_STARTUP(ST_CLEAR)"), }, { .name = "WRITEDEFINE", .value = TPM_NV_PER_WRITEDEFINE, .desc = _("a write with size 0 to the same index locks the " "NVRAM area permanently"), }, { .name = "WRITEALL", .value = TPM_NV_PER_WRITEALL, .desc = _("the value must be written in a single operation"), }, { .name = NULL, }, }; void displayStringsAndValues(const struct strings_with_values *svals, const char *indent) { unsigned int i; logMsg("%sThe following strings are available:\n", indent); for (i = 0; svals[i].name; i++) logMsg("%s%15s : %s\n", indent, svals[i].name, svals[i].desc); } int parseStringWithValues(const char *aArg, const struct strings_with_values *svals, unsigned int *x, unsigned int maximum, const char *name) { unsigned int offset = 0; int i, num, numbytes; size_t totlen = strlen(aArg); *x = 0; while (offset < totlen) { int found = 0; while (isspace(*(aArg + offset))) offset++; for (i = 0; svals[i].name; i++) { size_t len = strlen(svals[i].name); if (strncmp(aArg + offset, svals[i].name, len) == 0 && (aArg[offset+len] == '|' || aArg[offset+len] == 0)) { *x |= svals[i].value; offset += len + 1; found = 1; break; } } if (!found) { if (strncmp(aArg + offset, "0x", 2) == 0) { if (sscanf(aArg + offset, "%x%n", &num, &numbytes) != 1) { logError(_("Could not parse hexadecimal " "number in %s.\n"), aArg); return -1; } if (aArg[offset+numbytes] == '|' || aArg[offset+numbytes] == 0) { logError(_("Illegal character following " "hexadecimal number in %s\n"), aArg + offset); return -1; } *x |= num; offset += numbytes + 1; found = 1; } } while (!found) { if (!isdigit(*(aArg+offset))) break; if (sscanf(aArg + offset, "%u%n", &num, &numbytes) != 1) { logError(_("Could not parse data in %s.\n"), aArg + offset); return -1; } if (!aArg[offset+numbytes] == '|' && !aArg[offset+numbytes] == 0) { logError(_("Illegal character following decimal " "number in %s\n"), aArg + offset); return -1; } *x |= num; offset += numbytes + 1; found = 1; break; } if (!found) { logError(_("Unknown element in %s: %s.\n"), name, aArg + offset); return -1; } } return 0; } char *printValueAsStrings(unsigned int value, const struct strings_with_values *svals) { unsigned int mask = (1 << 31), i,c; unsigned int buffer_size = 1024; char *buffer = calloc(1, buffer_size); char printbuf[30]; size_t len; c = 0; while (mask && value) { if (value & mask) { for (i = 0; svals[i].name; i++) { if (svals[i].value == mask) { len = strlen(svals[i].name); if (len + strlen(buffer) + 1 > buffer_size) { buffer_size += 1024; buffer = realloc(buffer, buffer_size); if (!buffer) return NULL; } if (c) strcat(buffer, "|"); strcat(buffer, svals[i].name); c ++; value ^= mask; break; } } } mask >>= 1; } if (value) { snprintf(printbuf, sizeof(printbuf), "%s0x%x", c ? "|" : "", value); len = strlen(printbuf); if (len + strlen(buffer) + 1 > buffer_size) { buffer_size += 1024; buffer = realloc(buffer, buffer_size); if (!buffer) return NULL; } if (c) strcat(buffer, printbuf); } return buffer; } int parseHexOrDecimal(const char *aArg, unsigned int *x, unsigned int minimum, unsigned int maximum, const char *name) { while (isspace(*aArg)) aArg++; if (strncmp(aArg, "0x", 2) == 0) { if (sscanf(aArg, "%x", x) != 1) { return -1; } } else { if (!isdigit(*aArg)) { fprintf(stderr, "%s must be a positive integer.\n", name); return -1; } if (sscanf(aArg, "%u", x) != 1) { return -1; } } if ((*x > maximum) || (*x < minimum)) { fprintf(stderr, "%s is out of valid range [%u, %u]\n", name, minimum, maximum); return -1; } return 0; } TSS_RESULT getNVDataPublic(TSS_HTPM hTpm, TPM_NV_INDEX nvindex, TPM_NV_DATA_PUBLIC **pub) { TSS_RESULT res; UINT32 ulResultLen; BYTE *pResult; UINT64 off = 0; res = getCapability(hTpm, TSS_TPMCAP_NV_INDEX, sizeof(UINT32), (BYTE *)&nvindex, &ulResultLen, &pResult); if (res != TSS_SUCCESS) return res; *pub = calloc(1, sizeof(TPM_NV_DATA_PUBLIC)); if (*pub == NULL) { res = TSS_E_OUTOFMEMORY; goto err_exit; } res = unloadNVDataPublic(&off, pResult, ulResultLen, *pub); if (res != TSS_SUCCESS) { freeNVDataPublic(*pub); *pub = NULL; } err_exit: return res; } void freeNVDataPublic(TPM_NV_DATA_PUBLIC *pub) { if (!pub) return; free(pub->pcrInfoRead.pcrSelection.pcrSelect); free(pub->pcrInfoWrite.pcrSelection.pcrSelect); free(pub); } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_changeauth.c0000664000175000017510000001365613735320450020662 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include "tpm_utils.h" #include "tpm_tspi.h" struct changeAuth { char *name; char *prompt; BOOL change; }; static BOOL changeRequested = FALSE; static BOOL origUnicode = FALSE; static BOOL newUnicode = FALSE; static BOOL wellKnown = FALSE; static BOOL setWellKnown = FALSE; TSS_HCONTEXT hContext = 0; //Order important so you authenticate once even if both changed with one command enum { srk = 0, owner }; static struct changeAuth auths[] = { {N_("SRK"), N_("Enter new SRK password: "), FALSE}, {N_("owner"), N_("Enter new owner password: "), FALSE}, {NULL, NULL, FALSE }, }; static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-o, --owner", _("Change the owner password.")); logCmdOption("-s, --srk", _("Change the SRK password.")); logCmdOption("-g, --original_password_unicode", _("Use TSS UNICODE encoding for original password to comply with applications using TSS popup boxes")); logCmdOption("-n, --new_password_unicode", _("Use TSS UNICODE encoding for new password to comply with applications using TSS popup boxes")); logCmdOption("-z, --well-known", _("Change password to a new one when current owner password is a secret of all zeros (20 bytes of zeros). It must be specified which password (owner, SRK or both) to change")); logCmdOption("-r, --set-well-known", _("Change password to a secret of all zeros (20 bytes of zeros). It must be specified which password (owner, SRK or both) to change")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'o': auths[owner].change = TRUE; changeRequested = TRUE; break; case 's': auths[srk].change = TRUE; changeRequested = TRUE; break; case 'g': origUnicode = TRUE; break; case 'n': newUnicode = TRUE; break; case 'z': wellKnown = TRUE; break; case 'r': setWellKnown = TRUE; break; default: return -1; } return 0; } static TSS_RESULT tpmChangeAuth(TSS_HCONTEXT aObjToChange, TSS_HOBJECT aParent, TSS_HPOLICY aNewPolicy) { TSS_RESULT result = Tspi_ChangeAuth(aObjToChange, aParent, aNewPolicy); tspiResult("Tspi_ChangeAuth", result); return result; } /* * Affect: Change owner or srk password * Default: No action * Required: Owner authentication */ int main(int argc, char **argv) { int i = 0, iRc = -1; char *passwd = NULL; int pswd_len; TSS_HPOLICY hTpmPolicy, hNewPolicy; TSS_HTPM hTpm; TSS_HTPM hSrk; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; struct option opts[] = { {"owner", no_argument, NULL, 'o'}, {"srk", no_argument, NULL, 's'}, {"original_password_unicode", no_argument, NULL, 'g'}, {"new_password_unicode", no_argument, NULL, 'n'}, {"well-known", no_argument, NULL, 'z'}, {"set-well-known", no_argument, NULL, 'r'}, }; initIntlSys(); if (genericOptHandler (argc, argv, "zrsogn", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //nothing selected if ((!changeRequested && wellKnown) || (!changeRequested)) { help(argv[0]); goto out; } //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (wellKnown) { passwd = (char *)well_known_secret; pswd_len = TCPA_SHA1_160_HASH_LEN; } else { passwd = _GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE, origUnicode || useUnicode ); if (!passwd) { logError(_("Failed to get owner password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)passwd) != TSS_SUCCESS) goto out_close; if (!wellKnown && !setWellKnown) { shredPasswd(passwd); passwd = NULL; } do { if (auths[i].change) { logInfo(_("Changing password for: %s.\n"), _(auths[i].name)); if (setWellKnown) { passwd = (char *)well_known_secret; pswd_len = TCPA_SHA1_160_HASH_LEN; } else { passwd = _GETPASSWD(_(auths[i].prompt), &pswd_len, TRUE, newUnicode || useUnicode ); if (!passwd) { logError(_("Failed to get new password.\n")); goto out_close; } } if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hNewPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hNewPolicy, pswd_len, (BYTE *)passwd) != TSS_SUCCESS) goto out_close; if (i == owner) { if (tpmChangeAuth(hTpm, NULL_HOBJECT, hNewPolicy) != TSS_SUCCESS) goto out_close; } else if (i == srk) { if (keyLoadKeyByUUID (hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSrk) != TSS_SUCCESS) goto out_close; if (tpmChangeAuth(hSrk, hTpm, hNewPolicy) != TSS_SUCCESS) goto out_close; } logInfo(_("Change of %s password successful.\n"), _(auths[i].name)); if (!wellKnown && !setWellKnown) { shredPasswd(passwd); passwd = NULL; } } } while (auths[++i].name); iRc = 0; out_close: contextClose(hContext); out: if (passwd && !wellKnown && !setWellKnown) shredPasswd(passwd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_reset.c0000664000175000017510000000364613735320450017673 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include #include #include #include #include int main() { char reset[] = { 0, 193, /* TPM_TAG_RQU_COMMAND */ 0, 0, 0, 10, /* length */ 0, 0, 0, 90 /* TPM_ORD_Reset */ }; int fd; int err; int rc = 1; fd = open( "/dev/tpm0", O_RDWR ); if ( fd < 0 ) { printf( "Unable to open the device.\n" ); goto out; } err = write( fd, reset, sizeof(reset) ); if ( err != sizeof( reset ) ){ printf( "Error occured while writing the reset command: %d\n", errno ); goto out; } err = read( fd, reset, sizeof(reset) ); if ( err != 10 ) { printf( "Error occured while reading the reset result: %d %d %s\n", err, errno, strerror(errno)); goto out; } err = ntohl( *((uint32_t *)(reset+6)) ); if ( err == 38 ) { printf( "TPM not started.\n" ); goto out; } if ( err != 0 ) { printf( "TPM Error occured: %d\n", err ); goto out; } rc = 0; printf( "Reset successful\n" ); out: close(fd); return rc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvrelease.c0000664000175000017510000000776213735320450020540 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include "tpm_nvcommon.h" #include "tpm_tspi.h" #include "tpm_utils.h" static unsigned int nvindex; static const char *ownerpass; static BOOL ownerWellKnown; static BOOL askOwnerPass; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': if (parseHexOrDecimal(aArg, &nvindex, 0, UINT_MAX, "NVRAM index") != 0) return -1; break; case 'o': ownerpass = aArg; if (!ownerpass) askOwnerPass = TRUE; else askOwnerPass = FALSE; ownerWellKnown = FALSE; break; case 'y': ownerWellKnown = TRUE; askOwnerPass = FALSE; ownerpass = NULL; break; case 'u': useUnicode = TRUE; break; default: return -1; } return 0; } static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-y, --owner-well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM owner password")); logOwnerPassCmdOption(); logNVIndexCmdOption(); } int main(int argc, char **argv) { TSS_RESULT res; TSS_HTPM hTpm; TSS_HNVSTORE nvObject; TSS_FLAG fNvAttrs; TSS_HPOLICY hTpmPolicy; int iRc = -1; int pswd_len = -1; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; struct option hOpts[] = { {"index" , required_argument, NULL, 'i'}, {"pwdo" , optional_argument, NULL, 'o'}, {"owner-well-known", no_argument, NULL, 'y'}, {NULL , no_argument, NULL, 0}, }; initIntlSys(); if (genericOptHandler (argc, argv, "i:o::y", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (nvindex == 0) { logError(_("You must provide an index (!= 0) for the " "NVRAM area.\n")); goto out; } if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; fNvAttrs = 0; if (askOwnerPass) { ownerpass = _GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE, useUnicode ); if (!ownerpass) { logError(_("Failed to get owner password\n")); goto out_close; } } if (ownerpass || ownerWellKnown) { if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (ownerpass) { if (pswd_len < 0) pswd_len = strlen(ownerpass); if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)ownerpass) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hTpmPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } } if (contextCreateObject(hContext, TSS_OBJECT_TYPE_NV, fNvAttrs, &nvObject) != TSS_SUCCESS) goto out_close; if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_INDEX, 0, nvindex) != TSS_SUCCESS) goto out_close_obj; if ((res = NVReleaseSpace(nvObject)) != TSS_SUCCESS) { goto out_close; } logMsg(_("Successfully released NVRAM area at index 0x%x (%d).\n"), nvindex, nvindex); iRc = 0; goto out_close; out_close_obj: contextCloseObject(hContext, nvObject); out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_createek.c0000664000175000017510000001624013735320450020326 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" TSS_HCONTEXT hContext = 0; #ifdef TSS_LIB_IS_12 #include //Controled by input options static char in_filename[PATH_MAX] = "", out_filename[PATH_MAX] = ""; static BOOL isRevocable = FALSE; static BOOL needGenerateSecret = FALSE; static BOOL inFileSet = FALSE; static BOOL outFileSet = FALSE; static void help(const char *aCmd) { logCmdHelp(aCmd); logCmdOption("-r, --revocable", _("Creates a revocable EK instead of the default non-revocable one. Requires [-g -o] or [-i]")); logCmdOption("-i, --infile FILE", _("Filename containing the secret data used to revoke the EK.")); logCmdOption("-g, --generate-secret", _("Generates a 20 Bytes secret that is used to revoke the EK. Requires [-o]")); logCmdOption("-o, --outfile FILE", _("Filename to write the secret data generated to revoke the EK.")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt){ case 'r': isRevocable = TRUE; break; case 'g': needGenerateSecret = TRUE; break; case 'i': inFileSet = TRUE; if (aArg){ strncpy(in_filename, aArg, PATH_MAX); } break; case 'o': outFileSet = TRUE; if (aArg){ strncpy(out_filename, aArg, PATH_MAX); } break; default: return -1; } return 0; } static TSS_RESULT tpmCreateRevEk(TSS_HTPM a_hTpm, TSS_HKEY a_hKey, TSS_VALIDATION * a_pValData, UINT32 *revDataSz, BYTE **revData) { TSS_RESULT result = Tspi_TPM_CreateRevocableEndorsementKey(a_hTpm, a_hKey, a_pValData, revDataSz, revData); tspiResult("Tspi_TPM_CreateRevocableEndorsementKey", result); return result; } static int readData(UINT32 bytesToRead, BYTE **buffer) { FILE *infile = NULL; size_t iBytes; int rc = 0; BYTE eofile; __memset(*buffer, 0x00, bytesToRead); infile = fopen(in_filename, "r"); if ( !infile ){ logError(_("Unable to open input file: %s\n"), in_filename); return -1; } //Read the data iBytes = fread( *buffer, 1, bytesToRead, infile ); if ( iBytes < bytesToRead ) { logError(_("Error: the secret data file %s contains less than %d bytes. Aborting ...\n"), in_filename, bytesToRead); rc = -1; } else if ( (iBytes = fread( &eofile, 1, 1, infile )) ) { //Test if there's more than 20 bytes if ( !feof( infile)) logMsg(_("WARNING: Using only the first %d bytes of file %s for secret data\n"), bytesToRead, in_filename); } else { logDebug(_("Read %d bytes of secret data from file %s.\n"), bytesToRead, in_filename); } fclose( infile); return rc; } static int writeData(UINT32 bytesToWrite, BYTE *buffer) { FILE *outfile = NULL; size_t iBytes; int rc = 0; logDebug(_("bytesToWrite: %d\n"), bytesToWrite); outfile = fopen(out_filename, "w"); if ( !outfile ) { logError(_("Unable to open output file: %s\n"), out_filename); return -1; } //Write data in buffer iBytes = fwrite( buffer, 1, bytesToWrite, outfile); if ( iBytes != bytesToWrite ) { logError(_("Error: Unable to write %d bytes on the file %s.\n"), bytesToWrite, out_filename); rc = -1; } logDebug(_("%zd bytes written on file %s.\n"), iBytes, out_filename); fclose( outfile ); return rc; } #endif static TSS_RESULT tpmCreateEk(TSS_HTPM a_hTpm, TSS_HKEY a_hKey, TSS_VALIDATION * a_pValData) { TSS_RESULT result = Tspi_TPM_CreateEndorsementKey(a_hTpm, a_hKey, a_pValData); tspiResult("Tspi_TPM_CreateEndorsementKey", result); return result; } int main(int argc, char **argv) { TSS_RESULT tResult; TSS_HTPM hTpm; TSS_HKEY hEk; TSS_FLAG fEkAttrs; int iRc = -1; #ifdef TSS_LIB_IS_12 struct option opts[] = {{"revocable", no_argument, NULL, 'r'}, {"generate-secret", no_argument, NULL, 'g'}, {"infile", required_argument, NULL, 'i'}, {"outfile", required_argument, NULL, 'o'}, }; UINT32 revDataSz; BYTE revokeData[TPM_SHA1BASED_NONCE_LEN]; BYTE *pRevData; #endif initIntlSys(); #ifdef TSS_LIB_IS_12 if (genericOptHandler(argc, argv, "rgi:o:", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //Check commands for command hierarchy if (isRevocable) { if (needGenerateSecret) { if (!outFileSet) { logError(_("Please specify an output file\n")); goto out; } if (inFileSet) { logError(_("The option -i, --infile is not valid with -g\n")); goto out; } } else if (!inFileSet) { logError(_("Please specify -i, --infile or -g, --generate-secret\n")); goto out; } else if (outFileSet) { logError(_("The option -o, --outfile is not valid with -i, --infile")); goto out; } } logDebug("Input file name: %s\n", in_filename); logDebug("Output file name: %s\n", out_filename); if (inFileSet) { pRevData = revokeData; revDataSz = sizeof(revokeData); if (readData(revDataSz, &pRevData)) goto out; } else if (outFileSet) { FILE *outfile = fopen(out_filename, "w"); if (!outfile) { iRc = -1; logError(_("Unable to open output file: %s\n"), out_filename); goto out; } fclose(outfile); //TPM should generate the revoke data revDataSz = 0; pRevData = NULL; } #else if (genericOptHandler(argc, argv, NULL, NULL, 0, NULL, NULL) != 0){ logError(_("See man pages for details.\n")); goto out; } #endif if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; //Initialize EK attributes here fEkAttrs = TSS_KEY_SIZE_2048 | TSS_KEY_TYPE_LEGACY; if (contextCreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, fEkAttrs, &hEk) != TSS_SUCCESS) goto out_close; #ifdef TSS_LIB_IS_12 if (isRevocable){ tResult = tpmCreateRevEk(hTpm, hEk, NULL, &revDataSz, &pRevData); if (tResult != TSS_SUCCESS) goto out_close; //Writes the generated secret into the output file if (outFileSet) { if (writeData(revDataSz, pRevData)) { logError(_("Creating revocable EK succeeded, but writing the EK " "revoke authorization to disk failed.\nPrinting the " "revoke authorization instead:\n")); logHex(revDataSz, pRevData); logError(_("You should record this data, as its the authorization " "you'll need to revoke your EK!\n")); goto out_close; } } } else #endif tResult = tpmCreateEk(hTpm, hEk, NULL); if (tResult != TSS_SUCCESS) goto out_close; iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_restrictpubek.c0000664000175000017510000000675413735320450021442 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" #include //controlled by input options static BOOL bCheck = TRUE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': logDebug(_("Changing mode to check status.\n")); bCheck = TRUE; break; case 'r': logDebug(_("Changing mode to restrist PubEK access\n")); bCheck = FALSE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Display current status")); logCmdOption("-r, --restrict", _("Restrict PubEK read to owner only")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HPOLICY hTpmPolicy; TSS_HTPM hTpm; int iRc = -1; struct option opts[] = { {"status", no_argument, NULL, 's'}, {"restrict", no_argument, NULL, 'r'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "srz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (bCheck) { TSS_BOOL bValue; if (tpmGetStatus (hTpm, TSS_TPMSTATUS_DISABLEPUBEKREAD, &bValue) != TSS_SUCCESS) goto out; logMsg(_("Public Endorsement Key readable by: %s\n"), bValue ? _("owner") : _("everyone")); } else { if (tpmSetStatus(hTpm, TSS_TPMSTATUS_DISABLEPUBEKREAD, 0) != TSS_SUCCESS) goto out_close; } iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_selftest.c0000664000175000017510000000533113735320450020373 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include //for def. exit #include "tpm_tspi.h" //Controlled by input options static int resultFlag = FALSE; TSS_HCONTEXT hContext = 0; TSS_RESULT selfTestFull(TSS_HTPM a_hTpm) { TSS_RESULT result = Tspi_TPM_SelfTestFull(a_hTpm); tspiResult("Tspi_TPM_SelfTestFull", result); return result; } TSS_RESULT selfTestResult(TSS_HTPM a_hTpm, UINT32 * a_uiResultLen, BYTE ** a_pResult) { TSS_RESULT result = Tspi_TPM_GetTestResult(a_hTpm, a_uiResultLen, a_pResult); tspiResult("Tspi_TPM_GetTestResult", result); return result; } int cmdSelfTest(const char *a_szCmd) { TSS_HTPM hTpm; UINT32 uiResultLen; BYTE *pResult; int iRc = -1; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if ((!resultFlag) && (selfTestFull(hTpm) != TSS_SUCCESS)) goto out_close; if (selfTestResult(hTpm, &uiResultLen, &pResult) != TSS_SUCCESS) goto out_close; logMsg(_(" TPM Test Results: ")); logHex(uiResultLen, pResult); iRc = 0; logSuccess(a_szCmd); out_close: contextClose(hContext); out: return iRc; } void selftestUsage(const char *a_szCmd) { logCmdHelp(a_szCmd); logCmdOption("-r, --results", _("Report results of last test without retesting.")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'r': logDebug(_("Results only\n")); resultFlag = TRUE; break; default: return -1; } return 0; } int main(int argc, char *argv[]) { int rc; struct option opts[] = { {"results", no_argument, NULL, 'r'}, }; initIntlSys(); rc = genericOptHandler(argc, argv, "r", opts, sizeof(opts) / sizeof(struct option), parse, selftestUsage); if (rc) exit(0); rc = cmdSelfTest(argv[0]); return rc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_enable.c0000664000175000017510000001134313735320450017770 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" //Controlled by input options #define STATUS_CHECK 0 #define ENABLE 1 #define DISABLE 2 static int request = STATUS_CHECK; static TSS_FLAG fForce = TSS_TPMSTATUS_OWNERSETDISABLE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; /* * Affect: Change TPM state between enabled and disabled * Default: Display current status * Requires: Owner auth unless force( physical presence ) is specified */ static void help(const char *cmd) { logCmdHelp(cmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Display current state")); logCmdOption("-e, --enable", _("Enable TPM")); logCmdOption("-d, --disable", _("Disable TPM")); logCmdOption("-f, --force", _("Use physical presence authorization.")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': logDebug(_("Changing mode to check status.\n")); request = STATUS_CHECK; break; case 'e': logDebug(_("Changing mode to enable the TPM\n")); request = ENABLE; break; case 'd': logDebug(_("Changing mode to disable the TPM\n")); request = DISABLE; break; case 'f': logDebug(_("Changing mode to use force authorization\n")); fForce = TSS_TPMSTATUS_PHYSICALDISABLE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HTPM hTpm; TSS_BOOL bValue; TSS_HPOLICY hTpmPolicy; int iRc = -1; struct option hOpts[] = { {"enable", no_argument, NULL, 'e'}, {"disable", no_argument, NULL, 'd'}, {"force", no_argument, NULL, 'f'}, {"status", no_argument, NULL, 's'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "edfsz", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if ( request == STATUS_CHECK) { logInfo( _("Checking current status:\n")); if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (tpmGetStatus (hTpm, TSS_TPMSTATUS_DISABLED, &bValue) != TSS_SUCCESS) goto out_close; logMsg(_("Disabled status: %s\n"), logBool(mapTssBool(bValue))); }else { if (fForce == TSS_TPMSTATUS_OWNERSETDISABLE) { if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; } //Setup complete. Attempt the command if (tpmSetStatus(hTpm, fForce, (request == ENABLE) ? FALSE : TRUE ) != TSS_SUCCESS) goto out_close; } //Command successful iRc = 0; logSuccess(argv[0]); //Cleanup out_close: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_revokeek.c0000664000175000017510000000705513735320450020362 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include "tpm_tspi.h" #include "tpm_utils.h" //Controled by input options static char in_filename[PATH_MAX] = ""; static BOOL isInputSet = FALSE; TSS_HCONTEXT hContext = 0; static void help(const char *aCmd) { logCmdHelp(aCmd); logCmdOption("-i, --infile FILE", _("Filename containing the secret data used to revoke the EK.")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': isInputSet = TRUE; if (aArg){ strncpy(in_filename, aArg, PATH_MAX); } break; default: return -1; } return 0; } static TSS_RESULT tpmRevokeEk(TSS_HTPM a_hTpm, UINT32 revDataSz, BYTE *revData) { TSS_RESULT result = Tspi_TPM_RevokeEndorsementKey( a_hTpm, revDataSz, revData); tspiResult("Tspi_TPM_RevokeEndorsementKey", result); return result; } static int readData(UINT32 bytesToRead, BYTE **buffer) { FILE *infile = NULL; size_t iBytes; int rc = 0; BYTE eofile; infile = fopen(in_filename, "r"); if ( !infile ){ logError(_("Unable to open input file: %s\n"), in_filename); return -1; } //Read the data iBytes = fread( *buffer, 1, bytesToRead, infile ); if ( iBytes < bytesToRead ){ logError(_("Error: the secret data file %s contains less than %d bytes. Aborting with %s...\n"), in_filename, bytesToRead); rc = -1; } else if ( (iBytes = fread( &eofile, 1, 1, infile )) ) { //Test if there's more than 20 bytes if ( !feof( infile)) logMsg(_("WARNING: Using only the first %d bytes of file %s for secret data\n"), bytesToRead, in_filename); } else { logDebug(_("Read %d bytes of secret data from file %s.\n"), bytesToRead, in_filename); } fclose( infile); return rc; } int main(int argc, char **argv) { TSS_RESULT tResult; TSS_HTPM hTpm; int iRc = -1; struct option opts[] = { {"infile", required_argument, NULL, 'i'}, }; BYTE revokeData[TPM_SHA1BASED_NONCE_LEN]; BYTE *revData = revokeData; initIntlSys(); if (genericOptHandler(argc, argv, "i:", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (isInputSet) { if (readData(sizeof(revokeData), &revData)) goto out; } else { logError(_("Please specify which file contains the secret to revoke the Ek (use option -i, --infile).\n")); goto out; } logDebug("Input file name: %s\n", in_filename); if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; tResult = tpmRevokeEk(hTpm, sizeof(revokeData), revData); if (tResult != TSS_SUCCESS) goto out_close; iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_version.c0000664000175000017510000001336313737511026020236 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include //for def. exit #include #include "tpm_tspi.h" TSS_HCONTEXT hContext = 0; // Redirect all stderr output to a temporary file. // Returns a cloned version of the original stderr, for use with end_capture_stderr(). int capture_stderr() { // Save a copy of stderr. int olderr = dup(STDERR_FILENO); if (olderr < 0) { perror("dup(STDERR_FILENO)"); return -1; } // Open file that will become new stderr. FILE* f = tmpfile(); if (f == NULL) { close(olderr); perror("tmpfile()"); return -1; } // Override stderr with temp file. if (0 > dup2(fileno(f), STDERR_FILENO)) { fclose(f); close(olderr); perror("dup2(, STDERR_FILENO)"); return -1; } // Old handle for temp file no longer needed. fclose(f); return olderr; } // Restore stderr and return a newly allocated buffer with the captured stderr output. // Caller frees the returned buffer. char* end_capture_stderr(int olderr) { char* buf = NULL; struct stat st; int memsize; if (olderr == -1) { // capture_stderr() must have failed. Nothing to restore. return strdup(""); } // Find out how much to read. if (0 > fstat(STDERR_FILENO, &st)) { perror("fstat()"); goto errout; } memsize = st.st_size + 1; if (memsize <= st.st_size) { // Something fishy is going on. Fall back to getting 100 bytes (arbitrary). perror("int overflow"); memsize = 100; st.st_size = memsize - 1; } if (!(buf = malloc(memsize))) { perror("malloc()"); goto errout; } // Read file content. if (0 > lseek(STDERR_FILENO, 0, SEEK_SET)) { perror("lseek()"); goto errout; } if (st.st_size != read(STDERR_FILENO, buf, st.st_size)) { perror("read()"); } // Restore stderr. errout: if (0 > dup2(olderr, STDERR_FILENO)) { perror("dup2()"); return buf; } if (0 > close(olderr)) { perror("close()"); } return buf; } int cmdVersion(const char *a_szCmd) { TSS_HTPM hTpm; UINT32 uiSubCap; BYTE *pSubCap; UINT32 uiResultLen; BYTE *pResult; int iRc = -1; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; #ifdef TSS_LIB_IS_12 { UINT64 offset; TSS_RESULT uiResult; TPM_CAP_VERSION_INFO versionInfo; char *errbuf = NULL; // Buffer containing what was sent to stderr during getCapability. /* Disable logging to of "Bad Mode" during this call. * If we're on a 1.1 TPM, it'd throw an error. * Save data sent to stderr in case it was any other type of error. */ int olderr; // Saved copy of stderr. // Redirect stderr to tempfile. olderr = capture_stderr(); // Get capabilities. Stderr output is captured. uiResult = getCapability(hTpm, TSS_TPMCAP_VERSION_VAL, 0, NULL, &uiResultLen, &pResult); // Restore output to stderr. errbuf = end_capture_stderr(olderr); // Don't print errors due to "Bad Mode", that just means we're on a 1.1 TPM. if (uiResult == TPM_E_BAD_MODE) { free(errbuf); goto print_cap_version; } fprintf(stderr, "%s", errbuf); free(errbuf); if (uiResult != TSS_SUCCESS) { goto out_close; } offset = 0; if ((uiResult = unloadVersionInfo(&offset, pResult, &versionInfo))) { goto out_close; } logMsg(_(" TPM 1.2 Version Info:\n")); logMsg(_(" Chip Version: %hhu.%hhu.%hhu.%hhu\n"), versionInfo.version.major, versionInfo.version.minor, versionInfo.version.revMajor, versionInfo.version.revMinor); logMsg(_(" Spec Level: %hu\n"), versionInfo.specLevel); logMsg(_(" Errata Revision: %hhu\n"), versionInfo.errataRev); logMsg(_(" TPM Vendor ID: %c%c%c%c\n"), versionInfo.tpmVendorID[0], versionInfo.tpmVendorID[1], versionInfo.tpmVendorID[2], versionInfo.tpmVendorID[3]); if (versionInfo.vendorSpecificSize) { logMsg(_(" Vendor Specific data: ")); logHex(versionInfo.vendorSpecificSize, versionInfo.vendorSpecific); free(versionInfo.vendorSpecific); } } print_cap_version: #endif if (getCapability(hTpm, TSS_TPMCAP_VERSION, 0, NULL, &uiResultLen, &pResult) != TSS_SUCCESS) goto out_close; logMsg(_(" TPM Version: ")); logHex(uiResultLen, pResult); uiSubCap = TSS_TPMCAP_PROP_MANUFACTURER; pSubCap = (BYTE *) & uiSubCap; if (getCapability(hTpm, TSS_TPMCAP_PROPERTY, sizeof(uiSubCap), pSubCap, &uiResultLen, &pResult) != TSS_SUCCESS) goto out_close; logMsg(_(" Manufacturer Info: ")); logHex(uiResultLen, pResult); iRc = 0; logSuccess(a_szCmd); out_close: contextClose(hContext); out: return iRc; } int main(int argc, char *argv[]) { int rc; initIntlSys(); rc = genericOptHandler(argc, argv, "", NULL, 0, NULL, NULL); if (rc) exit(0); rc = cmdVersion(argv[0]); return rc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_present.c0000664000175000017510000002411613735320450020224 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_utils.h" #include "tpm_tspi.h" /* * Never set change to false. * Value doesn't matter for the locks. */ struct physFlag { char *name; TSS_FLAG property; BOOL change; BOOL value; }; /* * Order is important. * First must set cmd and hw enable correctly followed by the lock. * Then setting presence can be attempted followed by the lock */ enum { cmdEnable = 0, hwdEnable, lifeLock, present, lock, num_flags }; static struct physFlag flags[] = { {N_("Command Enable"), TSS_TPMSTATUS_PHYSPRES_CMDENABLE}, {N_("Hardware Enable"), TSS_TPMSTATUS_PHYSPRES_HWENABLE}, {N_("Lifetime Lock"), TSS_TPMSTATUS_PHYSPRES_LIFETIMELOCK}, {N_("Physical Presence"), TSS_TPMSTATUS_PHYSPRESENCE}, {N_("Lock"), TSS_TPMSTATUS_PHYSPRES_LOCK}, {0, 0, 0, 0} }; static BOOL bCheck = FALSE; static BOOL bChangeRequested = FALSE; static BOOL bYes = FALSE; static TSS_BOOL bValue; static BOOL isWellKnown = FALSE; static BYTE well_known[] = TSS_WELL_KNOWN_SECRET; TSS_HCONTEXT hContext = 0; static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Report current physical presence states.")); logCmdOption("-a, --assert", _("Assert that admin is present.")); logCmdOption("-c, --clear", _("Clear assertion of admin presence.")); logCmdOption("--lock", _("Lock TPM presence assertion into specified state.")); logCmdOption("--enable-cmd", _("Allow TPM to accept Physical Presence Command.")); logCmdOption("--disable-cmd", _("Disallow TPM to accept Physical Presence Command.")); logCmdOption("--enable-hw", _("Allow TPM to accept Hardware Physical Presence.")); logCmdOption("--disable-hw", _("Disallow TPM to accept Hardware Physical Presence.")); logCmdOption("--set-lifetime-lock", _("Prevent further modification of TPM Physical Presence\n\t\tCommand and Hardware Enablement states.\n\t\tTHIS ACTION IS PERMANENT AND CAN NEVER BE UNDONE.")); logCmdOption("-y, --yes", _("Automatically respond yes to all prompts. Only use\n\t\tthis if you are sure of the current state and don't want\n\t\tany textra checking done before setting the lifetime lock")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data.")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': logDebug(_("Changing mode to check status.\n")); bCheck = TRUE; break; case 'a': logDebug(_("Changing mode to assert presence.\n")); flags[present].change = TRUE; flags[present].value = TRUE; bChangeRequested = TRUE; break; case 'c': logDebug(_("Changing mode to clear presence.\n")); flags[present].change = TRUE; flags[present].value = FALSE; bChangeRequested = TRUE; break; case 'k': logDebug(_("Changing mode to lock presence.\n")); flags[lock].change = TRUE; flags[lock].value = TRUE; bChangeRequested = TRUE; break; case 'm': logDebug(_("Changing mode to enable command presence.\n")); flags[cmdEnable].change = TRUE; flags[cmdEnable].value = TRUE; bChangeRequested = TRUE; break; case 'd': logDebug(_("Changing mode to disable command presence.\n")); flags[cmdEnable].change = TRUE; flags[cmdEnable].value = FALSE; bChangeRequested = TRUE; break; case 'e': logDebug(_("Changing mode to enable hardware presence.\n")); flags[hwdEnable].change = TRUE; flags[hwdEnable].value = TRUE; bChangeRequested = TRUE; break; case 'h': logDebug(_("Changing mode to disable hardware presence.\n")); flags[hwdEnable].change = TRUE; flags[hwdEnable].value = FALSE; bChangeRequested = TRUE; break; case 't': logDebug(_("Changing mode to set lifetime presence lock.\n")); flags[lifeLock].change = TRUE; flags[lifeLock].value = TRUE; bChangeRequested = TRUE; break; case 'y': logDebug(_("Changing mode to automatically answer yes.\n")); bYes = TRUE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } static BOOL confirmLifeLock(TSS_HCONTEXT hContext, TSS_HTPM hTpm) { TSS_BOOL bCmd, bHwd; BOOL bRc; TSS_HPOLICY hTpmPolicy; char *pwd = NULL; int pswd_len; char rsp[5]; int scanCount; //get status w/o owner auth (FAILS 1.1, should PASS 1.2) if (tpmGetStatus(hTpm, flags[cmdEnable].property, &bCmd) != TSS_SUCCESS || tpmGetStatus(hTpm, flags[hwdEnable].property, &bHwd) != TSS_SUCCESS) { logDebug (_("Unable to determine current state without authorization\n")); if (isTpmOwned(hContext)) { logDebug(_("TPM is owned\n")); if (isWellKnown) { pwd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password pwd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!pwd) { logMsg(_("Failed to get password\n")); goto warn; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto warn; if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)pwd) != TSS_SUCCESS) goto warn; //get status w/ owner auth if (tpmGetStatus (hTpm, flags[cmdEnable].property, &bCmd) != TSS_SUCCESS || tpmGetStatus(hTpm, flags[hwdEnable].property, &bHwd) != TSS_SUCCESS) { logDebug (_("Unable to determine current state with the entered password.\n")); goto warn; } goto give_vals; } else { //can't determine values warn: logMsg (_("Unable to programatically determine the current setting of TPM Physcial Presence Command Enable and Hardware Enable states. Make sure you are aware of and comfortable with the current states.\n")); } } else { give_vals: logMsg(_("Current State:\n")); logMsg("\t%s: %s\n", _(flags[cmdEnable].name), logBool(mapTssBool(bCmd))); logMsg("\t%s: %s\n", _(flags[hwdEnable].name), logBool(mapTssBool(bHwd))); logMsg (_("These will be the permanent values if you choose to proceed.\n")); } logMsg (_("This command cannot be undone. Are you sure you want to continue?[y/N]\n")); scanCount = scanf("%5s", rsp); /* TRANSLATORS: this should be the affirmative letter that was prompted for in the message corresponding to: "Are you sure you want to continue?[y/N]" */ if (scanCount >= 1 && strcmp(rsp, _("y")) == 0) { logMsg (_("Setting the lifetime lock was confirmed.\nContinuing.\n")); bRc = TRUE; } else { logMsg (_("Continuing to set the lifetime lock was declined.\nAction canceled.\n")); bRc = FALSE; } if (hTpmPolicy) policyFlushSecret(hTpmPolicy); if (pwd && !isWellKnown) shredPasswd(pwd); return bRc; } /* * Affect: Toggle TPM presence states * Default: Display current states * Requires: Display requires owner auth. * Lifetime lock will attempt owner auth to warn about current states before confirming */ int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HTPM hTpm; TSS_HPOLICY hTpmPolicy; int iRc = -1; int i = 0; struct option opts[] = { {"status", no_argument, NULL, 's'}, {"assert", no_argument, NULL, 'a'}, {"clear", no_argument, NULL, 'c'}, {"lock", no_argument, NULL, 'k'}, {"enable-cmd", no_argument, NULL, 'm'}, {"disable-cmd", no_argument, NULL, 'd'}, {"enable-hw", no_argument, NULL, 'e'}, {"disable-hw", no_argument, NULL, 'w'}, {"set-lifetime-lock", no_argument, NULL, 't'}, {"yes", no_argument, NULL, 'y'}, {"well-known", no_argument, NULL, 'z'}, }; initIntlSys(); if (genericOptHandler (argc, argv, "acsyz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (bCheck || !bChangeRequested) { logInfo(_("Checking current status: \n")); if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; logMsg(_("Physical Presence Status:\n")); do { if (tpmGetStatus(hTpm, flags[i].property, &bValue) != TSS_SUCCESS) goto out_close; logMsg("\t%s: %s\n", _(flags[i].name), logBool(mapTssBool(bValue))); } while (flags[++i].name); goto out_success; } do { if (flags[i].change) { logInfo(_("Requested to Change %s to %s\n"), _(flags[i].name), logBool(flags[i].value)); if (i == lifeLock && ! (bYes || confirmLifeLock(hContext, hTpm))) continue; if (tpmSetStatus(hTpm, flags[i].property, flags[i].value) != TSS_SUCCESS) { logError(_("Change to %s Failed\n"), _(flags[i].name)); goto out; } logInfo(_("Change to %s Successful\n"), _(flags[i].name)); } } while (flags[++i].name); out_success: logSuccess(argv[0]); iRc = 0; out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd( szTpmPasswd ); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_setoperatorauth.c0000664000175000017510000000622013735320450021771 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_utils.h" #include "tpm_tspi.h" static BOOL passUnicode = FALSE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-z, --well-known", _("Use TSS_WELL_KNOWN_SECRET as the operator's default secret.")); logCmdOption("-p, --op_password_unicode", _("Use TSS UNICODE encoding for operator password to comply with applications using TSS popup boxes")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'p': passUnicode = TRUE; break; case 'z': isWellKnown = TRUE; break; default: return -1; } return 0; } static TSS_RESULT tpmSetOpAuth(TSS_HTPM a_hTpm, TSS_HPOLICY aOpPolicy) { TSS_RESULT result = Tspi_TPM_SetOperatorAuth(a_hTpm, aOpPolicy); tspiResult("Tspi_TPM_SetOperatorAuth", result); return result; } int main(int argc, char **argv) { int iRc = -1; char *passwd = NULL; int pswd_len; TSS_HPOLICY hNewPolicy; TSS_HTPM hTpm; struct option opts[] = { {"well-known", no_argument, NULL, 'z'}, {"op_password_unicode", no_argument, NULL, 'p'}, }; BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "zp", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; //Prompt for operator password if (!isWellKnown) { passwd = _GETPASSWD(_("Enter operator password: "), (int *)&pswd_len, TRUE, passUnicode || useUnicode ); if (!passwd) { logError(_("Failed to get operator password\n")); goto out_close; } } else { passwd = (char *)wellKnown; pswd_len = sizeof(wellKnown); } if (contextCreateObject(hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_OPERATOR, &hNewPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hNewPolicy, (UINT32)pswd_len, (BYTE *)passwd) != TSS_SUCCESS) goto out_close; if (!isWellKnown) shredPasswd(passwd); passwd = NULL; if (tpmSetOpAuth(hTpm, hNewPolicy) != TSS_SUCCESS) goto out_close; iRc = 0; out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_activate.c0000664000175000017510000001146213735320450020344 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" //Controled by input options #define STATUS_CHECK 0 #define ACTIVATE 1 #define DEACTIVATE 2 #define TEMP_DEACTIVATE 3 static int request = STATUS_CHECK; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-s, --status", _("Report current state")); logCmdOption("-a, --active", _("Activate TPM, requires reboot")); logCmdOption("-i, --inactive", _("Deactivate TPM, requires reboot")); logCmdOption("-t, --temp", _("Change state immediately but only for this boot.\n\t\tOnly valid in conjunction with the inactive parameter.")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 's': logDebug(_("Changing mode to check status.\n")); request = STATUS_CHECK; break; case 'a': logDebug(_("Changing mode to activate the TPM.\n")); request = ACTIVATE; break; case 'i': logDebug(_("Changing mode to deactivate the TPM.\n")); request = DEACTIVATE; break; case 't': logDebug(_("Changing mode to temporarily deactivate the TPM\n")); request = TEMP_DEACTIVATE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } /* * Affect: Change state of TPM between Active and Inactive * Default: report status * Requires: Physical presence unless --temp specified */ int main(int argc, char **argv) { char *szTpmPasswd = NULL; int tpm_len; TSS_HTPM hTpm; TSS_HPOLICY hTpmPolicy; TSS_BOOL bValue; int iRc = -1; struct option opts[] = { {"active", no_argument, NULL, 'a'}, {"inactive", no_argument, NULL, 'i'}, {"temp", no_argument, NULL, 't'}, {"status", no_argument, NULL, 's'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "aitsz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; switch(request) { case STATUS_CHECK: logInfo(_("Checking status:\n")); if (isWellKnown){ szTpmPasswd = (char *)well_known; tpm_len = sizeof(well_known); } else { szTpmPasswd = GETPASSWD(_("Enter owner password: "), &tpm_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, tpm_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (tpmGetStatus (hTpm, TSS_TPMSTATUS_PHYSICALSETDEACTIVATED, &bValue) != TSS_SUCCESS) goto out_close; logMsg(_("Persistent Deactivated Status: %s\n"), logBool(mapTssBool(bValue))); if (tpmGetStatus (hTpm, TSS_TPMSTATUS_SETTEMPDEACTIVATED, &bValue)) goto out_close; logMsg(_("Volatile Deactivated Status: %s\n"), logBool(mapTssBool(bValue))); break; case ACTIVATE: if (tpmSetStatus(hTpm, TSS_TPMSTATUS_PHYSICALSETDEACTIVATED, FALSE) != TSS_SUCCESS) goto out_close; logMsg(_("Action requires a reboot to take effect\n")); break; case DEACTIVATE: if (tpmSetStatus(hTpm, TSS_TPMSTATUS_PHYSICALSETDEACTIVATED, TRUE) != TSS_SUCCESS) goto out_close; logMsg(_("Action requires a reboot to take effect\n")); break; case TEMP_DEACTIVATE: if (tpmSetStatus(hTpm, TSS_TPMSTATUS_SETTEMPDEACTIVATED, TRUE) != TSS_SUCCESS) goto out_close; break; } //Command successful iRc = 0; logSuccess(argv[0]); //Cleanup out_close: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvdefine.c0000664000175000017510000002661713736447425020367 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include "tpm_tspi.h" #include "tpm_utils.h" #include "tpm_nvcommon.h" static unsigned int nvindex; static BOOL nvindex_set; static unsigned int nvperm; static unsigned int nvsize; static const char *ownerpass; static BOOL ownerWellKnown; static BOOL askOwnerPass; static const char *datapass; static BOOL dataWellKnown; static BOOL askDataPass; static int end; static UINT32 selectedPcrsRead[24]; static UINT32 selectedPcrsWrite[24]; static UINT32 selectedPcrsReadLen = 0; static UINT32 selectedPcrsWriteLen = 0; static const char *filename; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': if (parseHexOrDecimal(aArg, &nvindex, 0, UINT_MAX, "NVRAM index") != 0) return -1; nvindex_set = TRUE; break; case 'p': if (!strcmp(aArg, "?")) { displayStringsAndValues(permvalues, ""); end = 1; return 0; } if (parseStringWithValues(aArg, permvalues, &nvperm, UINT_MAX, "NVRAM permission") != 0) return -1; break; case 's': if (parseHexOrDecimal(aArg, &nvsize, 0, UINT_MAX, "NVRAM index size") != 0) return -1; break; case 'o': ownerpass = aArg; if (!ownerpass) askOwnerPass = TRUE; else askOwnerPass = FALSE; ownerWellKnown = FALSE; break; case 'y': ownerWellKnown = TRUE; ownerpass = NULL; askOwnerPass = FALSE; break; case 'a': datapass = aArg; if (!datapass) askDataPass = TRUE; else askDataPass = FALSE; dataWellKnown = FALSE; break; case 'z': dataWellKnown = TRUE; datapass = NULL; askDataPass = FALSE; break; case 'u': useUnicode = TRUE; break; case 'r': if (aArg && atoi(aArg) >= 0 && atoi(aArg) < 24) { selectedPcrsRead[selectedPcrsReadLen++] = atoi(aArg); } else return -1; break; case 'w': if (aArg && atoi(aArg) >= 0 && atoi(aArg) < 24) { selectedPcrsWrite[selectedPcrsWriteLen++] = atoi(aArg); } else return -1; break; case 'f': filename = aArg; break; default: return -1; } return 0; } static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-y, --owner-well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the " "TPM owner secret")); logCmdOption("-z, --data-well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the " "NVRAM area's secret")); logOwnerPassCmdOption(); logCmdOption("-a, --pwda", _("NVRAM area password")); logNVIndexCmdOption(); logCmdOption("-s, --size", _("Size of the NVRAM area")); logCmdOption("-r, --rpcrs", _("PCRs to seal the NVRAM area to for reading (use multiple times)")); logCmdOption("-w, --wpcrs", _("PCRs to seal the NVRAM area to for writing (use multiple times)")); logCmdOption("-f, --filename", _("File containing PCR info for the NVRAM area")); logCmdOption("-p, --permissions", _("Permissions of the NVRAM area")); displayStringsAndValues(permvalues, " "); } void logInvalidPcrInfoFile() { logError(_("Invalid PCR info file. Format is:\n" "[r/w] [PCR IDX] [SHA-1 ascii]\n\nExample:\n" "r 9 00112233445566778899AABBCCDDEEFF00112233")); } int parseNVPermsFile(FILE *f, TSS_HCONTEXT *hContext, TSS_HNVSTORE *nvObject, TSS_HPCRS *hPcrsRead, TSS_HPCRS *hPcrsWrite) { UINT32 pcrSize; char rw; unsigned int pcr, n; char hash_ascii[65], hash_bin[32], save; int rc = -1; while (!feof(f)) { errno = 0; n = fscanf(f, "%c %u %s\n", &rw, &pcr, hash_ascii); if (n != 3) { logInvalidPcrInfoFile(); goto out; } else if (errno != 0) { perror("fscanf"); goto out; } if (rw != 'r' && rw != 'w') { logInvalidPcrInfoFile(); goto out; } if (pcr > 23) { logError(_("Cannot seal NVRAM area to PCR > 23\n")); goto out; } for (n = 0; n < strlen(hash_ascii); n += 2) { save = hash_ascii[n + 2]; hash_ascii[n + 2] = '\0'; hash_bin[n/2] = strtoul(&hash_ascii[n], NULL, 16); hash_ascii[n + 2] = save; } pcrSize = n/2; if (rw == 'r') { if (*hPcrsRead == NULL_HPCRS) if (contextCreateObject(*hContext, TSS_OBJECT_TYPE_PCRS, TSS_PCRS_STRUCT_INFO_SHORT, hPcrsRead) != TSS_SUCCESS) goto out; if (pcrcompositeSetPcrValue(*hPcrsRead, pcr, pcrSize, (BYTE *)hash_bin) != TSS_SUCCESS) goto out; } else { if (*hPcrsWrite == NULL_HPCRS) if (contextCreateObject(*hContext, TSS_OBJECT_TYPE_PCRS, TSS_PCRS_STRUCT_INFO_SHORT, hPcrsWrite) != TSS_SUCCESS) goto out; if (pcrcompositeSetPcrValue(*hPcrsWrite, pcr, pcrSize, (BYTE *)hash_bin) != TSS_SUCCESS) goto out; } } rc = 0; out: return rc; } int main(int argc, char **argv) { TSS_HTPM hTpm; TSS_HNVSTORE nvObject; TSS_FLAG fNvAttrs; TSS_HPOLICY hTpmPolicy, hDataPolicy; int iRc = -1; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; int opswd_len = -1; int dpswd_len = -1; TSS_HPCRS hPcrsRead = 0, hPcrsWrite = 0; struct option hOpts[] = { {"index" , required_argument, NULL, 'i'}, {"size" , required_argument, NULL, 's'}, {"permissions" , required_argument, NULL, 'p'}, {"rpcrs" , required_argument, NULL, 'r'}, {"wpcrs" , required_argument, NULL, 'w'}, {"filename" , required_argument, NULL, 'f'}, {"pwdo" , optional_argument, NULL, 'o'}, {"pwda" , optional_argument, NULL, 'a'}, {"use-unicode" , no_argument, NULL, 'u'}, {"data-well-known" , no_argument, NULL, 'z'}, {"owner-well-known", no_argument, NULL, 'y'}, {NULL , no_argument, NULL, 0}, }; TSS_FLAG initFlag = TSS_PCRS_STRUCT_INFO_SHORT; UINT32 localityValue = TPM_LOC_ZERO | TPM_LOC_ONE | TPM_LOC_TWO | TPM_LOC_THREE | TPM_LOC_FOUR; initIntlSys(); if (genericOptHandler (argc, argv, "i:s:p:o:a:r:w:f:yzu", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (end) { iRc = 0; goto out; } if (!nvindex_set) { logError(_("You must provide an index for the NVRAM area.\n")); goto out; } if (nvperm == 0 && (UINT32)nvindex != TPM_NV_INDEX_LOCK && (UINT32)nvindex != TPM_NV_INDEX0) { logError(_("You must provide permission bits for the NVRAM area.\n")); goto out; } logDebug("permissions = 0x%08x\n", nvperm); if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; fNvAttrs = 0; if (contextCreateObject(hContext, TSS_OBJECT_TYPE_NV, fNvAttrs, &nvObject) != TSS_SUCCESS) goto out_close; if (askOwnerPass) { ownerpass = _GETPASSWD(_("Enter owner password: "), &opswd_len, FALSE, useUnicode ); if (!ownerpass) { logError(_("Failed to get owner password\n")); goto out_close; } } if (ownerpass || ownerWellKnown) { if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (ownerpass) { if (opswd_len < 0) opswd_len = strlen(ownerpass); if (policySetSecret(hTpmPolicy, opswd_len, (BYTE *)ownerpass) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hTpmPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } } if (askDataPass) { datapass = _GETPASSWD(_("Enter NVRAM data password: "), &dpswd_len, TRUE, useUnicode ); if (!datapass) { logError(_("Failed to get NVRAM data password\n")); goto out_close; } } if (datapass || dataWellKnown) { if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hDataPolicy) != TSS_SUCCESS) goto out_close; if (datapass) { if (dpswd_len < 0) dpswd_len = strlen(datapass); if (policySetSecret(hDataPolicy, dpswd_len, (BYTE *)datapass) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hDataPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } if (Tspi_Policy_AssignToObject(hDataPolicy, nvObject) != TSS_SUCCESS) goto out_close; } if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_INDEX, 0, nvindex) != TSS_SUCCESS) goto out_close_obj; if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_PERMISSIONS, 0, nvperm) != TSS_SUCCESS) goto out_close_obj; if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_DATASIZE, 0, nvsize) != TSS_SUCCESS) goto out_close_obj; if (selectedPcrsReadLen) { UINT32 pcrSize; BYTE *pcrValue; UINT32 i; for (i = 0; i < selectedPcrsReadLen; i++) { if (selectedPcrsRead[i] > 23) { logError(_("Cannot seal NVRAM area to PCR > 23\n")); goto out_close; } } if (contextCreateObject(hContext, TSS_OBJECT_TYPE_PCRS, initFlag, &hPcrsRead) != TSS_SUCCESS) goto out_close; for (i = 0; i < selectedPcrsReadLen; i++) { if (tpmPcrRead(hTpm, selectedPcrsRead[i], &pcrSize, &pcrValue) != TSS_SUCCESS) goto out_close; if (pcrcompositeSetPcrValue(hPcrsRead, selectedPcrsRead[i], pcrSize, pcrValue) != TSS_SUCCESS) goto out_close; } } if (selectedPcrsWriteLen) { UINT32 pcrSize; BYTE *pcrValue; UINT32 i; for (i = 0; i < selectedPcrsWriteLen; i++) { if (selectedPcrsWrite[i] > 23) { logError(_("Cannot seal NVRAM area to PCR > 23\n")); goto out_close; } } if (contextCreateObject(hContext, TSS_OBJECT_TYPE_PCRS, initFlag, &hPcrsWrite) != TSS_SUCCESS) goto out_close; for (i = 0; i < selectedPcrsWriteLen; i++) { if (tpmPcrRead(hTpm, selectedPcrsWrite[i], &pcrSize, &pcrValue) != TSS_SUCCESS) goto out_close; if (pcrcompositeSetPcrValue(hPcrsWrite, selectedPcrsWrite[i], pcrSize, pcrValue) != TSS_SUCCESS) goto out_close; } } if (filename) { FILE *f; f = fopen(filename, "r"); if (!f) { logError(_("Could not access file '%s'\n"), filename); goto out_close_obj; } if (parseNVPermsFile(f, &hContext, &nvObject, &hPcrsRead, &hPcrsWrite) != TSS_SUCCESS) goto out_close_obj; } if (hPcrsRead) if (pcrcompositeSetPcrLocality(hPcrsRead, localityValue) != TSS_SUCCESS) goto out_close; if (hPcrsWrite) if (pcrcompositeSetPcrLocality(hPcrsWrite, localityValue) != TSS_SUCCESS) goto out_close; if (NVDefineSpace(nvObject, hPcrsRead, hPcrsWrite) != TSS_SUCCESS) goto out_close; logMsg(_("Successfully created NVRAM area at index 0x%x (%u).\n"), nvindex, nvindex); iRc = 0; goto out_close; out_close_obj: contextCloseObject(hContext, nvObject); out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_clear.c0000664000175000017510000000662613735320450017640 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" //Controled by input options static BOOL bValue = FALSE; //If true FORCE CLEAR static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static inline TSS_RESULT tpmClearOwner(TSS_HTPM a_hTpm, BOOL a_bValue) { TSS_RESULT result = Tspi_TPM_ClearOwner(a_hTpm, a_bValue); tspiResult("Tspi_TPM_ClearOwner", result); return result; } static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-f, --force", _("Use physical presence authorization.")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'f': logDebug(_("Changing mode to use force authorization\n")); bValue = TRUE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HTPM hTpm; TSS_HPOLICY hTpmPolicy; int iRc = -1; struct option opts[] = { {"force", no_argument, NULL, 'f'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "fz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (!bValue) { if (isWellKnown){ szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); }else{ szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; } //Setup complete attempt command if (tpmClearOwner(hTpm, bValue) != TSS_SUCCESS) goto out_close; //Command successful iRc = 0; logSuccess(argv[0]); logMsg( _("TPM Successfuly Cleared. You need to reboot to complete this operation. After reboot the TPM will be in the default state: unowned, disabled and inactive.\n") ); //Cleanup out_close: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvread.c0000664000175000017510000001625713735320450020032 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include #include #include "tpm_nvcommon.h" #include "tpm_tspi.h" #include "tpm_utils.h" static unsigned int nvindex; static unsigned int offset; static unsigned int length; static BOOL length_set; static const char *filename; static BOOL passWellKnown; static const char *password; static BOOL askPassword; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': if (parseHexOrDecimal(aArg, &nvindex, 0, UINT_MAX, "NVRAM index") != 0) return -1; break; case 'n': if (parseHexOrDecimal(aArg, &offset, 0, UINT_MAX, "read offset") != 0) return -1; break; case 's': if (parseHexOrDecimal(aArg, &length, 0, UINT_MAX, "length of data") != 0) return -1; length_set = TRUE; break; case 'f': filename = aArg; break; case 'p': password = aArg; if (!password) askPassword = TRUE; else askPassword = FALSE; passWellKnown = FALSE; break; case 'z': password = NULL; passWellKnown = TRUE; askPassword = FALSE; break; case 'u': useUnicode = TRUE; break; default: return -1; } return 0; } static void displayData(FILE *stream, UINT32 offset, BYTE *data, UINT32 length) { unsigned int len = (length + 0xf) & ~0xf; unsigned int c; unsigned char buf[17] = { 0, }; for (c = 0; c < len; c++) { if ((c & 0xf) == 0) printf("%08x ", c + offset); if (c < length) { printf("%02x ", data[c]); if (isgraph(data[c])) buf[c & 0xf] = data[c]; else buf[c & 0xf] = ' '; } else { printf(" "); buf[c & 0xf] = 0; } if ((c & 0xf) == 0xf) { printf(" %s\n", buf); } } } static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); logCmdOption("-p, --password", _("Owner or NVRAM area password depending on permissions")); logNVIndexCmdOption(); logCmdOption("-s, --size", _("Number of bytes to read from the NVRAM area")); logCmdOption("-n, --offset", _("Offset at which to start reading from the NVRAM area")); logCmdOption("-f, --filename", _("File to write data to.")); } int main(int argc, char **argv) { TSS_HTPM hTpm; TSS_HNVSTORE nvObject; TSS_FLAG fNvAttrs; TSS_HPOLICY hTpmPolicy, hDataPolicy; int iRc = -1; int pswd_len = -1; BYTE well_known_secret[] = TSS_WELL_KNOWN_SECRET; UINT32 ulDataLength; BYTE *rgbDataRead = NULL; TPM_NV_DATA_PUBLIC *nvpub = NULL; struct option hOpts[] = { {"index" , required_argument, NULL, 'i'}, {"size" , required_argument, NULL, 's'}, {"offset" , required_argument, NULL, 'n'}, {"filename" , required_argument, NULL, 'f'}, {"password" , optional_argument, NULL, 'p'}, {"use-unicode", no_argument, NULL, 'u'}, {"well-known" , no_argument, NULL, 'z'}, {NULL , no_argument, NULL, 0}, }; int fd = -1; ssize_t written; initIntlSys(); if (genericOptHandler (argc, argv, "i:s:n:f:p::zu", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (nvindex == 0) { logError(_("You must provide an index (!= 0) for the " "NVRAM area.\n")); goto out; } ulDataLength = length; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; fNvAttrs = 0; if (contextCreateObject(hContext, TSS_OBJECT_TYPE_NV, fNvAttrs, &nvObject) != TSS_SUCCESS) goto out_close; if (askPassword) { password = _GETPASSWD(_("Enter NVRAM access password: "), &pswd_len, FALSE, useUnicode ); if (!password) { logError(_("Failed to get NVRAM access password\n")); goto out_close; } } if (password || passWellKnown) { if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (password) { if (pswd_len < 0) pswd_len = strlen(password); if (policySetSecret(hTpmPolicy, pswd_len, (BYTE *)password) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hTpmPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } if (contextCreateObject (hContext, TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &hDataPolicy) != TSS_SUCCESS) goto out_close; if (password) { if (policySetSecret(hDataPolicy, pswd_len, (BYTE *)password) != TSS_SUCCESS) goto out_close; } else { if (policySetSecret(hDataPolicy, TCPA_SHA1_160_HASH_LEN, (BYTE *)well_known_secret) != TSS_SUCCESS) goto out_close; } if (Tspi_Policy_AssignToObject(hDataPolicy, nvObject) != TSS_SUCCESS) goto out_close; } if (getNVDataPublic(hTpm, nvindex, &nvpub) != TSS_SUCCESS) { logError(_("Could not get the NVRAM area's public information.\n")); goto out_close_obj; } if (!length_set) ulDataLength = nvpub->dataSize; if ((UINT32)offset > nvpub->dataSize) { logError(_("The offset is outside the NVRAM area's size of " "%u bytes.\n"), nvpub->dataSize); goto out_close_obj; } if ((UINT32)offset + ulDataLength > nvpub->dataSize) { ulDataLength = nvpub->dataSize - (UINT32)offset; } if (Tspi_SetAttribUint32(nvObject, TSS_TSPATTRIB_NV_INDEX, 0, nvindex) != TSS_SUCCESS) goto out_close_obj; if (NVReadValue(nvObject, offset, &ulDataLength, &rgbDataRead) != TSS_SUCCESS) goto out_close_obj; if (filename) { fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR); if (fd < 0) { logError(_("Could not open file %s for writing."), filename); goto out_close_obj; } written = write(fd, rgbDataRead, ulDataLength); if (written < 0 || ulDataLength != (UINT32)written) { logError(_("Error while writing to file.\n")); close(fd); fd = -1; goto out_close_obj; } close(fd); fd = -1; logMsg(_("Successfully wrote data from NVRAM area 0x%x (%u) " "to file.\n"), nvindex, nvindex); } else { displayData(stdout, offset, rgbDataRead, ulDataLength); } iRc = 0; goto out_close; out_close_obj: contextCloseObject(hContext, nvObject); out_close: contextClose(hContext); out: free(rgbDataRead); freeNVDataPublic(nvpub); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_nvinfo.c0000664000175000017510000001073213735320450020042 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include "tpm_tspi.h" #include "tpm_utils.h" #include "tpm_nvcommon.h" static BOOL nvindex_set; static unsigned int nvindex; static BOOL list_only; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'i': if (parseHexOrDecimal(aArg, &nvindex, 0, UINT_MAX, "NVRAM index") != 0) return -1; nvindex_set = TRUE; list_only = FALSE; break; case 'n': list_only = TRUE; nvindex_set = FALSE; break; default: return -1; } return 0; } static void help(const char* aCmd) { logCmdHelp(aCmd); logNVIndexCmdOption(); logCmdOption("-n, --list-only", _("Only list the defined NVRAM areas' indices.")); } static void pcrInfoShortDisplay(TPM_PCR_INFO_SHORT *tpis, const char *type) { UINT16 i, c; c = 0; logMsg("PCR %sselection:\n", type); for (i = 0; i < tpis->pcrSelection.sizeOfSelect * 8; i++) { if (tpis->pcrSelection.pcrSelect[(i / 8)] & (1 << (i & 0x7))) { if (!c) logMsg(" PCRs : "); if (c) logMsg(", "); printf("%d", i); c++; } } if (c) logMsg("\n"); if (tpis->localityAtRelease) { if (tpis->localityAtRelease == 0x1f) { logMsg(" Localities : ALL\n"); } else { logMsg(" Localities : 0x%01x\n", tpis->localityAtRelease); } } if (c) { logMsg(" Hash : "); for (i = 0; i < 20; i++) logMsg("%02x", tpis->digestAtRelease.digest[i]); logMsg("\n"); } } static void nvindexDisplay(TSS_HTPM hTpm, UINT32 nvindex) { TSS_RESULT res; char *buffer; TPM_NV_DATA_PUBLIC *nvpub = NULL; logMsg("NVRAM index : 0x%08x (%u)\n", nvindex, nvindex); res = getNVDataPublic(hTpm, nvindex, &nvpub); if (res != TSS_SUCCESS) goto out; pcrInfoShortDisplay(&nvpub->pcrInfoRead , "read "); pcrInfoShortDisplay(&nvpub->pcrInfoWrite, "write "); buffer = printValueAsStrings((unsigned int)nvpub->permission.attributes, permvalues); logMsg("Permissions : 0x%08x (%s)\n", nvpub->permission.attributes, buffer); free(buffer); buffer = NULL; logMsg("bReadSTClear : %s\n", nvpub->bReadSTClear ? "TRUE" : "FALSE"); logMsg("bWriteSTClear : %s\n", nvpub->bWriteSTClear ? "TRUE" : "FALSE"); logMsg("bWriteDefine : %s\n", nvpub->bWriteDefine ? "TRUE" : "FALSE"); logMsg("Size : %d (0x%x)\n", nvpub->dataSize, nvpub->dataSize); out: freeNVDataPublic(nvpub); return; } int main(int argc, char **argv) { TSS_HTPM hTpm; UINT32 ulResultLen; BYTE *pResult = NULL; int iRc = -1; unsigned int i; struct option hOpts[] = { {"index" , required_argument, NULL, 'i'}, {"list-only", no_argument, NULL, 'n'}, {NULL , no_argument, NULL, 0}, }; initIntlSys(); if (genericOptHandler (argc, argv, "i:o:n", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (getCapability(hTpm, TSS_TPMCAP_NV_LIST, 0, NULL, &ulResultLen, &pResult) != TSS_SUCCESS) { goto out_close; } if (list_only) { logMsg(_("The following NVRAM areas have been defined:\n")); } for (i = 0; i < ulResultLen/sizeof(UINT32); i++) { UINT32 nvi; nvi = Decode_UINT32(pResult + i * sizeof(UINT32)); if (list_only) { logMsg("0x%08x (%d)\n", nvi, nvi); } else { if ((nvindex_set && nvi == (UINT32)nvindex) || !nvindex_set) { nvindexDisplay(hTpm, nvi); logMsg("\n"); } } } iRc = 0; out_close: contextClose(hContext); out: return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_startup.c0000664000175000017510000000523013735320450020242 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include #include #include #include #include #include #include #include int main() { char startup[] = { 0, 193, /* TPM_TAG_RQU_COMMAND */ 0, 0, 0, 12, /* length */ 0, 0, 0, 153, /* TPM_ORD_Startup */ 0, 1 /* ST_CLEAR */ }; char selftest[] = { 0, 193, /* TPM_TAG_RQU_COMMAND */ 0, 0, 0, 10, /* length */ 0, 0, 0, 80 /* TPM_ORD_SelfTestFull */ }; int fd; int err; int rc = 1; fd = open( "/dev/tpm0", O_RDWR ); if ( fd < 0 ) { printf( "Unable to open the device.\n" ); goto out_noclose; } err = write( fd, startup, sizeof(startup) ); if ( err != sizeof( startup ) ){ printf( "Error occured while writing the startup command: %d\n", errno ); goto out; } err = read( fd, startup, sizeof(startup) ); if ( err != 10 ) { printf( "Error occured while reading the startup result: %d %d %s\n", err, errno, strerror(errno)); goto out; } err = ntohl( *((uint32_t *)(startup+6)) ); if ( err == 38 ) { printf( "TPM already started.\n" ); goto out; } if ( err != 0 ) { printf( "TPM Error occured: %d\n", err ); goto out; } rc = 0; printf( "Startup successful\n" ); out: err = write( fd, selftest, sizeof(selftest) ); if ( err != sizeof( selftest ) ){ printf( "Error occured while writing the selftest command: %d\n", errno ); goto out; } err = read( fd, selftest, sizeof(selftest) ); if ( err != 10 ) { printf( "Error occured while reading the selftest result: %d %d %s\n", err, errno, strerror(errno)); goto out; } err = ntohl( *((uint32_t *)(selftest+6)) ); if ( err != 0 ) { printf( "TPM Error occured: %d\n", err ); goto out; } else { rc = 0; printf( "Selftest successful\n" ); } close(fd); out_noclose: return rc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_getpubek.c0000664000175000017510000000604013735320450020346 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } static void help(const char* aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_RESULT tResult; TSS_HTPM hTpm; TSS_HKEY hEk; TSS_HPOLICY hTpmPolicy; int iRc = -1; struct option hOpts[] = { {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "z", hOpts, sizeof(hOpts) / sizeof(struct option), parse, help) != 0) goto out; if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; tResult = tpmGetPubEk(hTpm, FALSE, NULL, &hEk); if (tResult == TCPA_E_DISABLED_CMD) { logInfo (_("Public PubEk access blocked, owner password required\n")); if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; tResult = tpmGetPubEk(hTpm, TRUE, NULL, &hEk); } if (tResult != TSS_SUCCESS) goto out_close; logMsg(_("Public Endorsement Key:\n")); if (displayKey(hEk) != TSS_SUCCESS) goto out_close; iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/src/tpm_mgmt/tpm_restrictsrk.c0000664000175000017510000000753513735320450021131 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #include "tpm_tspi.h" #include "tpm_utils.h" #include //controlled by input options static BOOL bCheck = FALSE; static BOOL bRestrict = FALSE; static BOOL isWellKnown = FALSE; TSS_HCONTEXT hContext = 0; static int parse(const int aOpt, const char *aArg) { switch (aOpt) { case 'a': logDebug(_("Changing mode to allow SRK access using SRK auth\n")); bRestrict = FALSE; break; case 's': logDebug(_("Changing mode to check status.\n")); bCheck = TRUE; break; case 'r': logDebug(_("Changing mode to restrist SRK access\n")); bRestrict = TRUE; break; case 'z': logDebug(_("Using TSS_WELL_KNOWN_SECRET to authorize the TPM command\n")); isWellKnown = TRUE; break; default: return -1; } return 0; } static void help(const char *aCmd) { logCmdHelp(aCmd); logUnicodeCmdOption(); logCmdOption("-a, --allow", _("Allow SRK read access using SRK auth")); logCmdOption("-s, --status", _("Display current status")); logCmdOption("-r, --restrict", _("Restrict SRK read to owner only")); logCmdOption("-z, --well-known", _("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the TPM secret authorization data")); } int main(int argc, char **argv) { char *szTpmPasswd = NULL; int pswd_len; TSS_HPOLICY hTpmPolicy; TSS_HTPM hTpm; int iRc = -1; struct option opts[] = { {"allow", no_argument, NULL, 'a'}, {"status", no_argument, NULL, 's'}, {"restrict", no_argument, NULL, 'r'}, {"well-known", no_argument, NULL, 'z'}, }; BYTE well_known[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET; initIntlSys(); if (genericOptHandler (argc, argv, "asrz", opts, sizeof(opts) / sizeof(struct option), parse, help) != 0) goto out; /* If no args are given, the default should be to give status */ if (argc == 1) bCheck = TRUE; //Connect to TSS and TPM if (contextCreate(&hContext) != TSS_SUCCESS) goto out; if (contextConnect(hContext) != TSS_SUCCESS) goto out_close; if (contextGetTpm(hContext, &hTpm) != TSS_SUCCESS) goto out_close; if (isWellKnown) { szTpmPasswd = (char *)well_known; pswd_len = sizeof(well_known); } else { // Prompt for owner password szTpmPasswd = GETPASSWD(_("Enter owner password: "), &pswd_len, FALSE); if (!szTpmPasswd) { logMsg(_("Failed to get password\n")); goto out_close; } } if (policyGet(hTpm, &hTpmPolicy) != TSS_SUCCESS) goto out_close; if (policySetSecret (hTpmPolicy, pswd_len, (BYTE *)szTpmPasswd) != TSS_SUCCESS) goto out_close; if (bCheck) { TSS_BOOL bValue; if (tpmGetStatus (hTpm, TSS_TPMSTATUS_DISABLEPUBSRKREAD, &bValue) != TSS_SUCCESS) goto out; logMsg(_("Storage Root Key readable with: %s\n"), bValue ? _("owner auth") : _("SRK auth")); } else { if (tpmSetStatus(hTpm, TSS_TPMSTATUS_DISABLEPUBSRKREAD, bRestrict) != TSS_SUCCESS) goto out_close; } iRc = 0; logSuccess(argv[0]); out_close: contextClose(hContext); out: if (szTpmPasswd && !isWellKnown) shredPasswd(szTpmPasswd); return iRc; } tpm-tools-1.3.9.2/po_/0000775000175000017510000000000013735320450013656 5ustar deboradeboratpm-tools-1.3.9.2/po_/Makevars0000664000175000017510000000535313735320450015360 0ustar deboradebora# # Makevars # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = International Business Machines Corporation # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = tpm-tools-1.3.9.2/po_/POTFILES.in0000664000175000017510000000370213735320450015435 0ustar deboradebora# # POTFILES.in # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # Files that can contain translatable strings. # This file must be updated when any new # files that (can) contain translatable # strings are added. # Include files include/tpm_tspi.h include/tpm_pkcs11.h include/tpm_utils.h # Library files lib/tpm_tspi.c lib/tpm_log.c lib/tpm_pkcs11.c lib/tpm_utils.c # Data management files src/data_mgmt/data_common.h src/data_mgmt/data_import.c src/data_mgmt/data_import.h src/data_mgmt/data_init.c src/data_mgmt/data_init.h src/data_mgmt/data_object.c src/data_mgmt/data_object.h src/data_mgmt/data_passwd.c src/data_mgmt/data_passwd.h src/data_mgmt/data_protect.c src/data_mgmt/data_protect.h # Tpm management files src/tpm_mgmt/tpm_activate.c src/tpm_mgmt/tpm_changeauth.c src/tpm_mgmt/tpm_clear.c src/tpm_mgmt/tpm_clearable.c src/tpm_mgmt/tpm_enable.c src/tpm_mgmt/tpm_getpubek.c src/tpm_mgmt/tpm_ownable.c src/tpm_mgmt/tpm_present.c src/tpm_mgmt/tpm_restrictpubek.c src/tpm_mgmt/tpm_selftest.c src/tpm_mgmt/tpm_takeownership.c src/tpm_mgmt/tpm_version.c tpm-tools-1.3.9.2/po_/LINGUAS0000664000175000017510000000174513735320450014712 0ustar deboradebora# # LINGUAS # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # Current tranlations tpm-tools-1.3.9.2/po_/tpm-tools.pot0000664000175000017510000005374413735320450016355 0ustar deboradebora# # tpm-tools.pot # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-05-31 09:40-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: include/tpm_utils.h:59 msgid "none" msgstr "" #: include/tpm_utils.h:61 msgid "error" msgstr "" #: include/tpm_utils.h:63 msgid "info" msgstr "" #: include/tpm_utils.h:65 msgid "debug" msgstr "" #: lib/tpm_tspi.c:186 msgid " Version: " msgstr "" #: lib/tpm_tspi.c:195 #, c-format msgid " Usage: 0x%04x (%s)\n" msgstr "" #: lib/tpm_tspi.c:202 #, c-format msgid " Flags: 0x%08x (%s)\n" msgstr "" #: lib/tpm_tspi.c:209 #, c-format msgid " AuthUsage: 0x%02x (%s)\n" msgstr "" #: lib/tpm_tspi.c:216 #, c-format msgid " Algorithm: 0x%08x (%s)\n" msgstr "" #: lib/tpm_tspi.c:223 #, c-format msgid " Encryption Scheme: 0x%08x (%s)\n" msgstr "" #: lib/tpm_tspi.c:230 #, c-format msgid " Signature Scheme: 0x%08x (%s)\n" msgstr "" #: lib/tpm_tspi.c:239 #, c-format msgid " Key Size: %d bits\n" msgstr "" #: lib/tpm_tspi.c:248 msgid " Public Key:" msgstr "" #: lib/tpm_tspi.c:277 lib/tpm_pkcs11.c:39 #, c-format msgid "%s success\n" msgstr "" #: lib/tpm_tspi.c:283 #, c-format msgid "%s failed: 0x%08x - layer=%s, code=%04x (%d), %s\n" msgstr "" #: lib/tpm_log.c:124 src/data_mgmt/data_common.h:51 #, c-format msgid "%s succeeded\n" msgstr "" #: lib/tpm_log.c:141 msgid "Display command usage info." msgstr "" #: lib/tpm_log.c:142 msgid "Display command version info." msgstr "" #: lib/tpm_log.c:143 msgid "Set logging level." msgstr "" #: lib/tpm_log.c:149 #, c-format msgid "Usage: %s [options]\n" msgstr "" #: lib/tpm_log.c:157 #, c-format msgid "Usage: %s [options]" msgstr "" #: lib/tpm_log.c:168 lib/tpm_pkcs11.c:648 lib/tpm_pkcs11.c:650 #: lib/tpm_pkcs11.c:652 lib/tpm_pkcs11.c:656 lib/tpm_pkcs11.c:781 #: lib/tpm_pkcs11.c:783 lib/tpm_pkcs11.c:785 lib/tpm_pkcs11.c:870 #: lib/tpm_pkcs11.c:872 lib/tpm_pkcs11.c:874 msgid "true" msgstr "" #: lib/tpm_log.c:168 lib/tpm_pkcs11.c:648 lib/tpm_pkcs11.c:650 #: lib/tpm_pkcs11.c:652 lib/tpm_pkcs11.c:656 lib/tpm_pkcs11.c:781 #: lib/tpm_pkcs11.c:783 lib/tpm_pkcs11.c:785 lib/tpm_pkcs11.c:870 #: lib/tpm_pkcs11.c:872 lib/tpm_pkcs11.c:874 msgid "false" msgstr "" #: lib/tpm_pkcs11.c:46 #, c-format msgid "%s failed: 0x%08x (%ld)\n" msgstr "" #: lib/tpm_pkcs11.c:88 #, c-format msgid "Slot description: %s\n" msgstr "" #: lib/tpm_pkcs11.c:89 #, c-format msgid "Slot manufacturer: %s\n" msgstr "" #: lib/tpm_pkcs11.c:91 msgid "Token is present\n" msgstr "" #: lib/tpm_pkcs11.c:93 msgid "Token is not present\n" msgstr "" #: lib/tpm_pkcs11.c:118 #, c-format msgid "Token Label: %s\n" msgstr "" #: lib/tpm_pkcs11.c:119 #, c-format msgid "Token manufacturer: %s\n" msgstr "" #: lib/tpm_pkcs11.c:120 #, c-format msgid "Token model: %s\n" msgstr "" #: lib/tpm_pkcs11.c:123 msgid "Token is initialized\n" msgstr "" #: lib/tpm_pkcs11.c:125 msgid "Token is not initialized\n" msgstr "" #: lib/tpm_pkcs11.c:164 msgid "No PKCS#11 slots present\n" msgstr "" #: lib/tpm_pkcs11.c:170 #, c-format msgid "Slots present: %ld\n" msgstr "" #: lib/tpm_pkcs11.c:173 msgid "Unable to obtain memory for PKCS#11 slot IDs\n" msgstr "" #: lib/tpm_pkcs11.c:187 #, c-format msgid "Retrieving slot information for SlotID %ld\n" msgstr "" #: lib/tpm_pkcs11.c:196 #, c-format msgid "Retrieving token information for SlotID %ld\n" msgstr "" #: lib/tpm_pkcs11.c:214 msgid "PKCS#11 TPM Token is not present\n" msgstr "" #: lib/tpm_pkcs11.c:474 msgid "Unable to obtain memory for object handle list\n" msgstr "" #: lib/tpm_pkcs11.c:634 msgid "Certificate Object\n" msgstr "" #: lib/tpm_pkcs11.c:637 msgid "\tX509 Certificate\n" msgstr "" #: lib/tpm_pkcs11.c:641 msgid "\tX509 Attribute Certificate\n" msgstr "" #: lib/tpm_pkcs11.c:645 #, c-format msgid "\tUnknown Certificate Type (%08x)\n" msgstr "" #: lib/tpm_pkcs11.c:648 lib/tpm_pkcs11.c:781 lib/tpm_pkcs11.c:870 #, c-format msgid "\tToken Object: %s\n" msgstr "" #: lib/tpm_pkcs11.c:650 lib/tpm_pkcs11.c:783 lib/tpm_pkcs11.c:872 #, c-format msgid "\tPrivate Object: %s\n" msgstr "" #: lib/tpm_pkcs11.c:652 lib/tpm_pkcs11.c:785 lib/tpm_pkcs11.c:874 #, c-format msgid "\tModifiable Object: %s\n" msgstr "" #: lib/tpm_pkcs11.c:654 lib/tpm_pkcs11.c:787 lib/tpm_pkcs11.c:876 #, c-format msgid "\tLabel: '%s'\n" msgstr "" #: lib/tpm_pkcs11.c:656 #, c-format msgid "\tTrusted: %s\n" msgstr "" #: lib/tpm_pkcs11.c:662 lib/tpm_pkcs11.c:791 msgid "Subject: " msgstr "" #: lib/tpm_pkcs11.c:664 lib/tpm_pkcs11.c:793 #, c-format msgid "\tId: '%s' (" msgstr "" #: lib/tpm_pkcs11.c:669 lib/tpm_pkcs11.c:680 msgid "Issuer: " msgstr "" #: lib/tpm_pkcs11.c:671 lib/tpm_pkcs11.c:682 msgid "Serial Number: " msgstr "" #: lib/tpm_pkcs11.c:673 lib/tpm_pkcs11.c:686 msgid "Value: " msgstr "" #: lib/tpm_pkcs11.c:678 msgid "Owner: " msgstr "" #: lib/tpm_pkcs11.c:684 msgid "Attribute Types: " msgstr "" #: lib/tpm_pkcs11.c:692 msgid "Certificate: " msgstr "" #: lib/tpm_pkcs11.c:695 msgid "Type: X509 Public Key" msgstr "" #: lib/tpm_pkcs11.c:699 msgid "Type: X509 Attribute" msgstr "" #: lib/tpm_pkcs11.c:703 #, c-format msgid "Unknown Type (%08x)" msgstr "" #: lib/tpm_pkcs11.c:707 lib/tpm_pkcs11.c:812 lib/tpm_pkcs11.c:890 #, c-format msgid ", Label: '%s'" msgstr "" #: lib/tpm_pkcs11.c:770 lib/tpm_pkcs11.c:863 msgid "Key Object\n" msgstr "" #: lib/tpm_pkcs11.c:773 msgid "\tPublic Key\n" msgstr "" #: lib/tpm_pkcs11.c:777 msgid "\tPrivate Key\n" msgstr "" #: lib/tpm_pkcs11.c:789 lib/tpm_pkcs11.c:878 #, c-format msgid "\tType: %ld\n" msgstr "" #: lib/tpm_pkcs11.c:801 msgid "Public Key: " msgstr "" #: lib/tpm_pkcs11.c:805 msgid "Private Key: " msgstr "" #: lib/tpm_pkcs11.c:810 lib/tpm_pkcs11.c:888 #, c-format msgid "Type: %ld" msgstr "" #: lib/tpm_pkcs11.c:866 msgid "\tSecret Key\n" msgstr "" #: lib/tpm_pkcs11.c:883 msgid "Secret Key: " msgstr "" #: lib/tpm_pkcs11.c:922 msgid "Data object\n" msgstr "" #: lib/tpm_pkcs11.c:941 #, c-format msgid "Object class=%ld\n" msgstr "" #: lib/tpm_pkcs11.c:1036 lib/tpm_pkcs11.c:1125 msgid "Unable to obtain memory for the encrypted data buffer\n" msgstr "" #: lib/tpm_utils.c:82 #, c-format msgid "%s version: %s\n" msgstr "" #: lib/tpm_utils.c:100 #, c-format msgid "Valid log levels are: %s, %s, %s, %s\n" msgstr "" #: lib/tpm_utils.c:167 msgid "Passwords didn't match\n" msgstr "" #: lib/tpm_utils.c:180 msgid "Confirm password: " msgstr "" #: src/data_mgmt/data_common.h:29 msgid "Enter the TPM security officer password: " msgstr "" #: src/data_mgmt/data_common.h:30 #, c-format msgid "" "A new TPM security officer password is needed. The password must be between %" "d and %d characters in length.\n" "Enter new password: " msgstr "" #: src/data_mgmt/data_common.h:36 msgid "Enter your TPM user password: " msgstr "" #: src/data_mgmt/data_common.h:37 #, c-format msgid "" "A new TPM user password is needed. The password must be between %d and %d " "characters in length.\n" "Enter new password: " msgstr "" #: src/data_mgmt/data_common.h:42 msgid "The password entered is not valid, please try again.\n" msgstr "" #: src/data_mgmt/data_common.h:46 msgid "Error, the TPM token has not been initialized\n" msgstr "" #: src/data_mgmt/data_common.h:47 msgid "Error, unable to allocate needed memory\n" msgstr "" #: src/data_mgmt/data_common.h:48 #, c-format msgid "Error, OpenSSL error: %s\n" msgstr "" #: src/data_mgmt/data_common.h:49 #, c-format msgid "Error, unable to open file %s: %s\n" msgstr "" #: src/data_mgmt/data_common.h:52 #, c-format msgid "%s failed\n" msgstr "" #: src/data_mgmt/data_import.c:123 msgid "" "Import the PEM formatted RSA key and/or X.509 certificate object contained " "in FILE" msgstr "" #: src/data_mgmt/data_import.c:129 msgid "" "Use FILE as the PEM formatted X.509 certificate input used to obtain the " "subject and id attributes" msgstr "" #: src/data_mgmt/data_import.c:131 msgid "Use STRING as the label for the imported object(s)" msgstr "" #: src/data_mgmt/data_import.c:133 msgid "Import the object(s) as a public object" msgstr "" #: src/data_mgmt/data_import.c:135 msgid "Import only the specified object type" msgstr "" #: src/data_mgmt/data_import.c:137 msgid "Assume yes as the answer to any confirmation prompt" msgstr "" #: src/data_mgmt/data_import.h:25 msgid "X509 Public Key Certificate" msgstr "" #: src/data_mgmt/data_import.h:26 msgid "RSA Public Key" msgstr "" #: src/data_mgmt/data_import.h:27 msgid "RSA Public/Private Key" msgstr "" #: src/data_mgmt/data_import.h:29 msgid "" "The subject name and key identifier can not be obtained.\n" "Certificate to key association may not be possible after the import is " "complete. If the key does not correspond to a certficate or the key can be " "associated with the certificate in another way this may not be an issue.\n" "Import the object? [y/N]: " msgstr "" #: src/data_mgmt/data_import.h:35 #, c-format msgid "" "One or more %s objects matching the subject name and key identifier already " "exist. Importing this object will replace all of these matching objects.\n" "Import the object? [y/N]: " msgstr "" #. TRANSLATORS: this should be the affirmative letter that was prompted for in the message corresponding to: "Are you sure you want to continue?[y/N]" #: src/data_mgmt/data_import.h:39 src/data_mgmt/data_init.h:29 #: src/tpm_mgmt/tpm_present.c:210 msgid "y" msgstr "" #: src/data_mgmt/data_import.h:40 src/data_mgmt/data_init.h:30 msgid "n" msgstr "" #: src/data_mgmt/data_import.h:42 msgid "Error, an import file must be specified\n" msgstr "" #: src/data_mgmt/data_import.h:43 msgid "Error, the X509 certificate does not contain an RSA key\n" msgstr "" #: src/data_mgmt/data_import.h:44 msgid "Error, no objects were found that could be imported\n" msgstr "" #: src/data_mgmt/data_import.h:45 msgid "Error, unable to obtain the required subject and id attributes\n" msgstr "" #: src/data_mgmt/data_init.c:62 msgid "Reply 'yes' to the clear TPM token prompt" msgstr "" #: src/data_mgmt/data_init.h:25 msgid "" "Warning: The TPM token has already been initialized. Reinitializing the TPM " "token will cause all TPM token data to be lost.\n" "Clear the TPM token data? [y/N]: " msgstr "" #: src/data_mgmt/data_object.c:70 msgid "Display only public objects" msgstr "" #: src/data_mgmt/data_object.c:72 msgid "Display additional information about the objects" msgstr "" #: src/data_mgmt/data_passwd.c:68 msgid "Change the security officer password" msgstr "" #: src/data_mgmt/data_protect.c:94 msgid "Decrypt the input data" msgstr "" #: src/data_mgmt/data_protect.c:96 msgid "Encrypt the input data" msgstr "" #: src/data_mgmt/data_protect.c:98 msgid "Use FILE as the input to the specified operation" msgstr "" #: src/data_mgmt/data_protect.c:100 msgid "Use FILE as the output of the specified operation" msgstr "" #: src/data_mgmt/data_protect.h:28 msgid "Error, an input file must be specified\n" msgstr "" #: src/data_mgmt/data_protect.h:29 msgid "Error, an output file must be specified\n" msgstr "" #: src/data_mgmt/data_protect.h:30 msgid "Error, protection key is not available\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:37 msgid "Report current state" msgstr "" #: src/tpm_mgmt/tpm_activate.c:38 msgid "Activate TPM, requires reboot" msgstr "" #: src/tpm_mgmt/tpm_activate.c:39 msgid "Deactivate TPM, requires reboot" msgstr "" #: src/tpm_mgmt/tpm_activate.c:41 msgid "" "Change state immediately but only for this boot.\n" "\t\tOnly valid in conjunction with the inactive parameter." msgstr "" #: src/tpm_mgmt/tpm_activate.c:49 src/tpm_mgmt/tpm_enable.c:54 #: src/tpm_mgmt/tpm_ownable.c:41 src/tpm_mgmt/tpm_present.c:91 #: src/tpm_mgmt/tpm_restrictpubek.c:34 msgid "Changing mode to check status.\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:53 msgid "Changing mode to activate the TPM.\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:57 msgid "Changing mode to deactivate the TPM.\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:61 msgid "Changing mode to temporarily deactivate the TPM\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:109 msgid "Checking status:\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:110 src/tpm_mgmt/tpm_changeauth.c:121 #: src/tpm_mgmt/tpm_clear.c:88 src/tpm_mgmt/tpm_clearable.c:118 #: src/tpm_mgmt/tpm_clearable.c:149 src/tpm_mgmt/tpm_enable.c:109 #: src/tpm_mgmt/tpm_enable.c:129 src/tpm_mgmt/tpm_getpubek.c:68 #: src/tpm_mgmt/tpm_ownable.c:99 src/tpm_mgmt/tpm_present.c:170 #: src/tpm_mgmt/tpm_present.c:278 src/tpm_mgmt/tpm_restrictpubek.c:86 #: src/tpm_mgmt/tpm_takeownership.c:53 msgid "Enter owner password: " msgstr "" #: src/tpm_mgmt/tpm_activate.c:112 src/tpm_mgmt/tpm_clearable.c:120 #: src/tpm_mgmt/tpm_clearable.c:152 src/tpm_mgmt/tpm_ownable.c:101 msgid "Failed to get password\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:126 #, c-format msgid "Persistent Deactivated Status: %s\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:132 #, c-format msgid "Volatile Deactivated Status: %s\n" msgstr "" #: src/tpm_mgmt/tpm_activate.c:138 src/tpm_mgmt/tpm_activate.c:143 msgid "Action requires a reboot to take affect\n" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:38 msgid "SRK" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:38 msgid "Enter new SRK password: " msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:39 src/tpm_mgmt/tpm_restrictpubek.c:104 msgid "owner" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:39 msgid "Enter new owner password: " msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:47 msgid "Change the owner password." msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:48 msgid "Change the SRK password." msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:123 src/tpm_mgmt/tpm_clear.c:90 #: src/tpm_mgmt/tpm_enable.c:111 src/tpm_mgmt/tpm_enable.c:131 #: src/tpm_mgmt/tpm_present.c:280 src/tpm_mgmt/tpm_restrictpubek.c:88 msgid "Failed to get owner password\n" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:137 #, c-format msgid "Changing password for: %s.\n" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:140 msgid "Failed to get new password.\n" msgstr "" #: src/tpm_mgmt/tpm_changeauth.c:169 #, c-format msgid "Change of %s password successful.\n" msgstr "" #: src/tpm_mgmt/tpm_clear.c:41 src/tpm_mgmt/tpm_enable.c:45 msgid "Use physical presence authorization." msgstr "" #: src/tpm_mgmt/tpm_clear.c:49 src/tpm_mgmt/tpm_enable.c:66 msgid "Changing mode to use force authorization\n" msgstr "" #: src/tpm_mgmt/tpm_clear.c:109 msgid "" "TPM Successfuly Cleared. You need to reboot to complete this operation. " "After reboot the TPM will be in the default state: unowned, disabled and " "inactive.\n" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:29 msgid "Report current status." msgstr "" #: src/tpm_mgmt/tpm_clearable.c:31 msgid "Remove ability of the owner to clear TPM." msgstr "" #: src/tpm_mgmt/tpm_clearable.c:33 msgid "" "Remove ability to clear TPM with physical presence.\n" "\t\tThis action is not persistent" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:48 msgid "Owner Clear" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:50 msgid "Force Clear" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:117 src/tpm_mgmt/tpm_present.c:277 msgid "Checking current status: \n" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:145 #, c-format msgid "Requested to disable: %s ability.\n" msgstr "" #: src/tpm_mgmt/tpm_clearable.c:169 #, c-format msgid "Disabling %s successful.\n" msgstr "" #: src/tpm_mgmt/tpm_enable.c:41 msgid "Display current state" msgstr "" #: src/tpm_mgmt/tpm_enable.c:42 msgid "Enable TPM" msgstr "" #: src/tpm_mgmt/tpm_enable.c:43 msgid "Disable TPM" msgstr "" #: src/tpm_mgmt/tpm_enable.c:58 msgid "Changing mode to enable the TPM\n" msgstr "" #: src/tpm_mgmt/tpm_enable.c:62 msgid "Changing mode to disable the TPM\n" msgstr "" #: src/tpm_mgmt/tpm_enable.c:108 msgid "Checking current status:\n" msgstr "" #: src/tpm_mgmt/tpm_enable.c:125 #, c-format msgid "Disabled status: %s\n" msgstr "" #: src/tpm_mgmt/tpm_getpubek.c:66 msgid "Public PubEk access blocked, owner password required\n" msgstr "" #: src/tpm_mgmt/tpm_getpubek.c:85 msgid "Public Endorsement Key:\n" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:45 msgid "Changing to prevent ownership mode\n" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:50 msgid "Changing to allow ownership mode\n" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:64 src/tpm_mgmt/tpm_restrictpubek.c:51 msgid "Display current status" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:65 msgid "Allow TPM takeownership command" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:66 msgid "Prevent TPM takeownership command" msgstr "" #: src/tpm_mgmt/tpm_ownable.c:116 #, c-format msgid "Ownable status: %s\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:51 msgid "Command Enable" msgstr "" #: src/tpm_mgmt/tpm_present.c:52 msgid "Hardware Enable" msgstr "" #: src/tpm_mgmt/tpm_present.c:53 msgid "Lifetime Lock" msgstr "" #: src/tpm_mgmt/tpm_present.c:54 msgid "Physical Presence" msgstr "" #: src/tpm_mgmt/tpm_present.c:55 msgid "Lock" msgstr "" #: src/tpm_mgmt/tpm_present.c:68 msgid "Report current physical presence states." msgstr "" #: src/tpm_mgmt/tpm_present.c:69 msgid "Assert that admin is present." msgstr "" #: src/tpm_mgmt/tpm_present.c:70 msgid "Clear assertion of admin presence." msgstr "" #: src/tpm_mgmt/tpm_present.c:72 msgid "Lock TPM presence assertion into specified state." msgstr "" #: src/tpm_mgmt/tpm_present.c:74 msgid "Allow TPM to accept Physical Presence Command." msgstr "" #: src/tpm_mgmt/tpm_present.c:76 msgid "Disallow TPM to accept Physical Presence Command." msgstr "" #: src/tpm_mgmt/tpm_present.c:78 msgid "Allow TPM to accept Hardware Physical Presence." msgstr "" #: src/tpm_mgmt/tpm_present.c:80 msgid "Disallow TPM to accept Hardware Physical Presence." msgstr "" #: src/tpm_mgmt/tpm_present.c:82 msgid "" "Prevent further modification of TPM Physical Presence\n" "\t\tCommand and Hardware Enablement states.\n" "\t\tTHIS ACTION IS PERMANENT AND CAN NEVER BE UNDONE." msgstr "" #: src/tpm_mgmt/tpm_present.c:84 msgid "" "Automatically respond yes to all prompts. Only use\n" "\t\tthis if you are sure of the current state and don't want\n" "\t\tany textra checking done before setting the lifetime lock" msgstr "" #: src/tpm_mgmt/tpm_present.c:95 msgid "Changing mode to assert presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:101 msgid "Changing mode to clear presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:107 msgid "Changing mode to lock presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:113 msgid "Changing mode to enable command presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:119 msgid "Changing mode to disable command presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:125 msgid "Changing mode to enable hardware presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:131 msgid "Changing mode to disable hardware presence.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:137 msgid "Changing mode to set lifetime presence lock.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:143 msgid "Changing mode to automatically answer yes.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:167 msgid "Unable to determine current state without authorization\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:169 msgid "TPM is owned\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:188 msgid "Unable to determine current state with the entered password.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:195 msgid "" "Unable to programatically determine the current setting of TPM Physcial " "Presence Command Enable and Hardware Enable states. Make sure you are aware " "of and comfortable with the current states.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:199 msgid "Current State:\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:203 msgid "These will be the permanent values if you choose to proceed.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:206 msgid "" "This command cannot be undone. Are you sure you want to continue?[y/N]\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:212 msgid "" "Setting the lifetime lock was confirmed.\n" "Continuing.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:217 msgid "" "Continuing to set the lifetime lock was declined.\n" "Action canceled.\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:291 msgid "Physical Presence Status:\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:306 #, c-format msgid "Requested to Change %s to %s\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:315 #, c-format msgid "Change to %s Failed\n" msgstr "" #: src/tpm_mgmt/tpm_present.c:319 #, c-format msgid "Change to %s Successful\n" msgstr "" #: src/tpm_mgmt/tpm_restrictpubek.c:38 msgid "Changing mode to restrist PubEK access\n" msgstr "" #: src/tpm_mgmt/tpm_restrictpubek.c:53 msgid "Restrict PubEK read to owner only" msgstr "" #: src/tpm_mgmt/tpm_restrictpubek.c:103 #, c-format msgid "Public Endorsement Key readable by: %s\n" msgstr "" #: src/tpm_mgmt/tpm_restrictpubek.c:104 msgid "everyone" msgstr "" #: src/tpm_mgmt/tpm_selftest.c:70 msgid " TPM Test Results: " msgstr "" #: src/tpm_mgmt/tpm_selftest.c:87 msgid "Report results of last test without retesting." msgstr "" #: src/tpm_mgmt/tpm_selftest.c:95 msgid "Results only\n" msgstr "" #: src/tpm_mgmt/tpm_takeownership.c:58 msgid "Enter SRK password: " msgstr "" #: src/tpm_mgmt/tpm_version.c:48 msgid " TPM Version: " msgstr "" #: src/tpm_mgmt/tpm_version.c:57 msgid " Manufacturer Info: " msgstr "" tpm-tools-1.3.9.2/man/0000775000175000017510000000000013735320450013654 5ustar deboradeboratpm-tools-1.3.9.2/man/Makefile.am0000664000175000017510000000175413735320450015717 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # SUBDIRS = man1 man3 man8 tpm-tools-1.3.9.2/man/man3/0000775000175000017510000000000013735320450014512 5ustar deboradeboratpm-tools-1.3.9.2/man/man3/tpmUnsealStrerror.30000664000175000017510000000003113735320450020303 0ustar deboradebora.so man3/tpmUnsealFile.3 tpm-tools-1.3.9.2/man/man3/Makefile.am0000664000175000017510000000207213735320450016547 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # man3_MANS = tpmUnsealFile.3 \ tpmUnsealShred.3 \ tpmUnsealStrerror.3 EXTRA_DIST = $(man3_MANS) tpm-tools-1.3.9.2/man/man3/tpmUnsealFile.30000664000175000017510000000322513735320450017350 0ustar deboradebora.\" Copyright (C) 2005, 2006 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_sealdata" 3 "2005-08-10" "TPM Management" .ce 1 TPM Management - tpmUnsealFile, tpmUnsealShred, tpmUnsealStrerror .SH NAME tpmUnsealFile, tpmUnsealShred, tpmUnsealStrerror - unseal routines .SH "SYNOPSIS" .ad l .hy 0 .B #include .sp .B int tpmUnsealFile(char* file, char** data, int* size); .br .B void tpmUnsealShred(char* data, int size); .br .B char* tpmUnsealStrerror(int rc); .br .SH "DESCRIPTION" .PP The functions in the tpmUnseal family allow access to a piece of sensitive data that has been sealed to the TPM configuration of a given system if the conditions are right, that is the SRK has not changed and the PCRS (if any) specified at seal time are of the appropriate value. The tpmUnsealFile function returns the contents of the file unsealed in the data buffer. The memory at *data must be freed by the caller. The tpmUnsealShred function will zero and free the memory. The tpmUnsealStrerror function will convert the return code from tpmUnsealFile into a human comprehensible string using and internal errno variable. .SH "Return Value" The tpmUnsealFile function returns 0 on success and a negative number on error. The tpmUnsealStrerror function returns the error string on success and the empty string on an error. .SH "SEE ALSO" .PP \fBtpm_sealdata\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man3/tpmUnsealShred.30000664000175000017510000000003113735320450017526 0ustar deboradebora.so man3/tpmUnsealFile.3 tpm-tools-1.3.9.2/man/man8/0000775000175000017510000000000013737506450014527 5ustar deboradeboratpm-tools-1.3.9.2/man/man8/Makefile.am0000664000175000017510000000321613737506450016565 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # man8_PODS = if TSS_LIB_IS_12 man8_PODS += tpm_nvdefine.pod \ tpm_nvinfo.pod \ tpm_nvread.pod \ tpm_nvrelease.pod \ tpm_nvwrite.pod endif man8_MANS = tpm_changeownerauth.8 \ tpm_clear.8 \ tpm_createek.8 \ tpm_getpubek.8 \ tpm_restrictpubek.8 \ tpm_restrictsrk.8 \ tpm_selftest.8 \ tpm_setactive.8 \ tpm_setclearable.8 \ tpm_setenable.8 \ tpm_setownable.8 \ tpm_setpresence.8 \ tpm_takeownership.8 \ $(addsuffix .8,$(basename $(man8_PODS))) if TSS_LIB_IS_12 man8_MANS+=tpm_revokeek.8 tpm_setoperatorauth.8 tpm_resetdalock.8 endif EXTRA_DIST = $(man8_MANS) %.8 : %.pod @pod2man -r "TPM Management" \ -c "" \ -n $(basename $@) \ --section=8 $< > $@ tpm-tools-1.3.9.2/man/man8/tpm_nvwrite.pod0000664000175000017510000000472113735320450017605 0ustar deboradebora=head1 NAME tpm_nvwrite =head1 SYNOPSIS B =head1 DESCRIPTION B writes data to an NVRAM area. The user must provide the index of the NVRAM area as well as the data to write into the NVRAM area. Optionally an offset into the NVRAM area can be given where the writing of the data is to start. Similarly the use may provide the number of bytes to write into the NVRAM area. Some NVRAM areas only allow write sizes of zero, i.e., NVRAM area index 0. If the NVRAM area has permission bits set that require owner or NVRAM area authentication, then the password must be provided via the password option. The following options are supported: =over 4 =item B<-h, --help> Display command usage info. =item B<-v, --version> Display command version info. =item B<-l, --log [none|error|info|debug]> Set logging level. =item B<-u, --unicode> Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes =item B<-z, --well-known> Use a secret of all zeros (20 bytes of zeros) as either the NVRAM area or owner secret. =item B<-p, --password> Depending on what type of authentication is required for the NVRAM area, this must either be the NVRAM area or owner password. A password may be directly provided for example by using '--password=password' or -ppassword. If no password is provided then the program will prompt the user for the password. =item B<-i, --index> (optional parameter) The index of the NVRAM area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-s, --size> The number of bytes to write to the NVRAM area. This parameter may be used to truncating the data that are for example read from a file. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-n, --offset> (optional parameter) The offset into the NVRAM area where to start writing. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-f, --filename> (optional parameter) The name of a file from which to read data and copy them into the NVRAM area. =item B<-d, --data> (optional parameter) The data to write into the NVRAM area passed in the command line. =item B<-m, --fill-value> (optional parameter) The byte to fill the NVRAM area with. =back =head1 SEE ALSO B(8), B(8), B(8), B(8) =head1 REPORTING BUGS Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvrelease.80000664000175000017510000001267713735320450017471 0ustar deboradebora.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "tpm_nvrelease 8" .TH tpm_nvrelease 8 "2011-07-01" "TPM Management" "" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" tpm_nvrelease .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBtpm_nvrelease [\s-1OPTIONS\s0]\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBtpm_nvrelease\fR releases an \s-1NVRAM\s0 area. The user must provide the index of the \s-1NVRAM\s0 area. If owner authentication is required then the user must provide the owner password. .PP Note that some areas cannot be released since they are permanent. Others can be release only after a reboot of the system. .PP The following options are supported: .IP "\fB\-h, \-\-help\fR" 4 .IX Item "-h, --help" Display command usage info. .IP "\fB\-v, \-\-version\fR" 4 .IX Item "-v, --version" Display command version info. .IP "\fB\-l, \-\-log [none|error|info|debug]\fR" 4 .IX Item "-l, --log [none|error|info|debug]" Set logging level. .IP "\fB\-u, \-\-unicode\fR" 4 .IX Item "-u, --unicode" Use \s-1TSS\s0 \s-1UNICODE\s0 encoding for passwords to comply with applications using \s-1TSS\s0 popup boxes .IP "\fB\-y, \-\-owner\-well\-known\fR" 4 .IX Item "-y, --owner-well-known" Use a secret of all zeros (20 bytes of zeros) as the owner's secret. .IP "\fB\-o, \-\-pwdo\fR" 4 .IX Item "-o, --pwdo" The owner password. .Sp A password may be directly provided for example by using '\-\-pwdo=password' or \&'\-opassword'. If no password is provided with this option then the program will prompt the user for the password. .IP "\fB\-i, \-\-index\fR" 4 .IX Item "-i, --index" The index of the \s-1NVRAM\s0 area that is to be released. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBtpm_nvdefine\fR(8), \fBtpm_nvinfo\fR(8), \fBtpm_nvread\fR(8), \fBtpm_nvwrite\fR(8) .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvinfo.pod0000664000175000017510000000174713735320450017413 0ustar deboradebora=head1 NAME tpm_nvinfo =head1 SYNOPSIS B =head1 DESCRIPTION B displays information about defined NVRAM areas. The user may restrict it to display only a single NVRAM area by providing an index or may choose ton only list available NVRAM areas indices without displaying the NVRAM areas' detailed information. The following options are supported: =over 4 =item B<-h, --help> Display command usage info. =item B<-v, --version> Display command version info. =item B<-l, --log [none|error|info|debug]> Set logging level. =item B<-i, --index> (optional parameter) Only display the NVRAM area with the given index. If this option is not provided all NVRAM areas will be displayed. =item B<-n, --list-only> (optional parameter) Only display the defined NVRAM areas' indices. =back =head1 SEE ALSO B(8), B(8), B(8), B(8) =head1 REPORTING BUGS Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setactive.80000664000175000017510000000532513735320450017464 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setactive" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_setactive .SH NAME tpm_setactive \- change TPM active states .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setactive .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setactive\fR reports the status of the TPM's flags regarding the active state of the TPM. This is the default behavior and also accessible via the \fB\-\-status\fR option. Requesting a report of this status prompts for the owner password. The \fB\-\-active\fR option changes the TPM to the active state (via the TPM_PhysicalSetDeactivated API). This operation requires evidence of physical presence, is persistent and requires a reboot to take effect. The \fB\-\-inactive\fR option (via the TPM_PhysicalSetDeactivated API) changes the TPM to the inactive state. This operation requires evidence of physical presence, is persistent and requires a reboot to take effect. An inactive TPM is essentially off but still allows for a tpm_takeownership to occur. The \fB\-\-temp\fR option causes deactivation (via the TPM_SetTempDeactivated API) to happen immediately but only endure for the current boot cycle. The \fB\-\-status\fR, \fB\-\-active\fR, \fB\-\-inactive\fR, and \fB\-\-temp\fR options are mutually exclusive and the last one on the command line will be carried out. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Report the status of flags regarding the TPM active states. .TP \fB-a\fR, \fB\-\-active\fR Make the TPM active. Operation is persistent, requires phyiscal presence to authorize, and a reboot to take effect. .TP \fB-i\fR, \fB\-\-inactive\fR Make the TPM inactive. Operation is persistent, requires phyiscal presence to authorize, and a reboot to take effect. .TP \fB-t\fR, \fB\-\-temp\fR Makes the TPM inactive for the current boot cycle only. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_setpresence\fR(8), \fBtpm_takeownership\fR(8), \fBtpm_setenable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_resetdalock.80000664000175000017510000000233713735320450017775 0ustar deboradebora.\" Copyright (C) 2005 - 2007 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_resetdalock" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_resetdalock .SH NAME tpm_resetdalock \- reset the dictionary attack lock for the user (require owner authentication) .SH "SYNOPSIS" .ad l .hy 0 .B tpm_resetdalock .RB .SH "DESCRIPTION" .PP \fBtpm_resetdalock\fR resets the dictionary attack lock. It prompts for owner authentication and, if password is correct, calls 'tpmSetStatus' which does necessary action to reset dictionary attack lock. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_reset\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvdefine.pod0000664000175000017510000000632413735320450017706 0ustar deboradebora=head1 NAME tpm_nvdefine =head1 SYNOPSIS B =head1 DESCRIPTION B defines a new NVRAM area at the given index and of given size. The user has to provide the permissions that control access to the NVRAM area. Owner authentication is necessary once the NVRAM area 0xFFFFFFFF has been defined. The owner password may be provided on the command line using the owner password option. The following options are supported: =over 4 =item B<-h, --help> Display command usage info. =item B<-v, --version> Display command version info. =item B<-l, --log [none|error|info|debug]> Set logging level. =item B<-u, --unicode> Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes =item B<-y, --owner-well-known> Use a secret of all zeros (20 bytes of zeros) as the owner's secret. =item B<-z, --area-well-known> Use a secret of all zeros (20 bytes of zeros) as the NVRAM area's secret. =item B<-o, --pwdo> (optional parameter) The owner password. A password may be directly provided for example by using '--pwdo=password' or '-opassword'. If no password is provided with this option then the program will prompt the user for the password. =item B<-a, --pwda> (optional parameter) The NVRAM area password. A password may be directly provided for example by using '--pwda=password' or '-apassword'. If no password is provided with this option then the program will prompt the user for the password. =item B<-i, --index> The index of the NVRAM area. The parameter must either be a decimal number or a hexadecimal number starting with '0x'. To select the NVRAM area with index 0x100, the command line parameter should be '-i 0x100' or '--index 0x100'. =item B<-s, --size> The size of the NVRAM area. The parameter must either be a decimal number or a hexadecimal number starting with '0x'. =item B<-p, --permissions> The access permissions associated with the NVRAM area. The parameter must either be a decimal number or a hexadecimal number staring with '0x'. It is possible to logically 'or' numbers or strings. The following strings are supported: =over 4 =item B Reading requires NVRAM area authorization. =item B Writing requires NVRAM area authorization. =item B Reading requires physical presence. =item B Writing requires physical presence. =item B Reading requires owner authorization. =item B Writing requires owner authorization. =item B A write to index 0 locks the NVRAM area until the next TPM_Startup(ST_CLEAR) =item B A read with size 0 on the same index prevents further reading until the next TPM_Startup(ST_CLEAR) =item B A write with size 0 to the same index prevents further writing until the next TPM_Startup(ST_CLEAR) =item B A write with size 0 to the same index locks the NVRAM area permanently =item B The value must be written in a single operation =back An example of a permission parameter is: --permissions="OWNERREAD|OWNERWRITE" =item B<> =back =head1 SEE ALSO B(8), B(8), B(8), B(8) =head1 REPORTING BUGS Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_restrictpubek.80000664000175000017510000000411013735320450020352 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_restrictpubek" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_restrictpubek .SH NAME tpm_restrictpubek \- restrict the ability to display the public portion of the Endorsement Key to the owner .SH "SYNOPSIS" .ad l .hy 0 .B tpm_restrictpubek .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_restrictpubek\fR reports the status of who can display the public portion of the Endorsement Key. This is the default behavior and also available with the \fB\-\-status\fR option. This operation will be in effect until the owner is cleared and prompts for the owner passord. With the \fB\-\-restrict\fR option, the ability to display the public portion of the Endorsement Key is resticted to the owner (via the TPM_DisablePubekRead API). The command prompts for the owner password to complete the operation. The \fB\-\-status\fR and \fB\-\-restrict\fR options are mutually exclusive and the last one on the command line will be carried out. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Display the status of who can see the public portion of the Endorsement Key .TP \fB-r\fR, \fB\-\-restrict\fR Restrict seeing the public portion of the Endorsement Key to the owner .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_getpubek\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_revokeek.80000664000175000017510000000270513735320450017307 0ustar deboradebora.\" Copyright (C) 2007 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_revokeek" 8 "2007-10-22" "TPM Management" .ce 1 TPM Management - tpm_revokeek .SH NAME tpm_revokeek \- revokes the Endorsement Key Pair of the TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_revokeek .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_revokeek\fR clears the TPM revocable Endorsement Key Pair (via the TPM_RevokeEndorsementKey API). This command erases all counters (except the base one), erases the Ek, the SRK, the owner auth and any NVRAM locked to the owner auth. It does not touch the delegation tables or other NVRAM. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. \.TP \fB-i\fR, \fB\-\-infile\fR [input file] Specifies the file that contains the authorization information required to revoke the Ek (secret data generated during the revocable Ek creation process). Only the first 20 bytes of this file are used and the remaining ones are ignored. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_createek\fR(8), \fBtpm_getpubek\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_restrictsrk.80000664000175000017510000000367213737506450020067 0ustar deboradebora.\" Copyright (C) 2019 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_restrictsrk" 8 "2019-01-27" "TPM Management" .ce 1 TPM Management - tpm_restrictsrk .SH NAME tpm_restrictsrk \- restrict the ability to access the Storage Root Key .SH "SYNOPSIS" .ad l .hy 0 .B tpm_restrictsrk .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_restrictsrk\fR reports the status of who can access the Storage Root Key. This is the default behavior and also available with the \fB\-\-status\fR option. This operation will be in effect until the owner is cleared and prompts for the owner passord. With the \fB\-\-restrict\fR option, the ability to access the Storage Root Key is resticted to the owner. The command prompts for the owner password to complete the operation. The \fB\-\-allow\fR and \fB\-\-restrict\fR options are mutually exclusive and the last one on the command line will be carried out. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-a\fR, \fB\-\-allow\fR Allow SRK read access using SRK auth .TP \fB-s\fR, \fB\-\-status\fR Display the status of who can access the Storage Root Key .TP \fB-r\fR, \fB\-\-restrict\fR Restrict SRK read to owner only .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvread.80000664000175000017510000001511113735320450016746 0ustar deboradebora.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "tpm_nvread 8" .TH tpm_nvread 8 "2011-07-11" "TPM Management" "" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" tpm_nvread .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBtpm_nvread [\s-1OPTIONS\s0]\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBtpm_nvread\fR reads data from an \s-1NVRAM\s0 area and either displays them or writes them into a file. The user must provide the index of the \s-1NVRAM\s0 area. If the user provided the number of bytes to read then this will be the maximum number of bytes that will be read from the \s-1NVRAM\s0 area, otherwise the whole \&\s-1NVRAM\s0 area will be read. Some \s-1NVRAM\s0 areas only allow read sizes of zero, i.e., \s-1NVRAM\s0 area with index 0. Optionally an offset into the \s-1NVRAM\s0 area can be given where the reading of the data is to start. If the \s-1NVRAM\s0 area has permission bits set that require owner or \s-1NVRAM\s0 area authentication, then the password must be provided via the password option. .PP The following options are supported: .IP "\fB\-h, \-\-help\fR" 4 .IX Item "-h, --help" Display command usage info. .IP "\fB\-v, \-\-version\fR" 4 .IX Item "-v, --version" Display command version info. .IP "\fB\-l, \-\-log [none|error|info|debug]\fR" 4 .IX Item "-l, --log [none|error|info|debug]" Set logging level. .IP "\fB\-u, \-\-unicode\fR" 4 .IX Item "-u, --unicode" Use \s-1TSS\s0 \s-1UNICODE\s0 encoding for passwords to comply with applications using \s-1TSS\s0 popup boxes .IP "\fB\-z, \-\-well\-known\fR" 4 .IX Item "-z, --well-known" Use a secret of all zeros (20 bytes of zeros) as either the \s-1NVRAM\s0 area or owner secret. .IP "\fB\-p, \-\-password\fR" 4 .IX Item "-p, --password" Depending on what type of authentication is required for the \s-1NVRAM\s0 area, this must either be the \s-1NVRAM\s0 area or owner password. .Sp A password may be directly provided for example by using '\-\-password=password' or \&'\-ppassword'. If no password is provided then the program will prompt the user for the password. .IP "\fB\-i, \-\-index\fR" 4 .IX Item "-i, --index" The index of the \s-1NVRAM\s0 area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-s, \-\-size\fR" 4 .IX Item "-s, --size" The number of bytes to read from the \s-1NVRAM\s0 area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-n, \-\-offset\fR (optional parameter)" 4 .IX Item "-n, --offset (optional parameter)" The offset into the \s-1NVRAM\s0 area from where to start reading. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-f, \-\-filename\fR (optional parameter)" 4 .IX Item "-f, --filename (optional parameter)" The name of a file the read data will be written into. If no filename is given the data will be printed to stdout. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBtpm_nvdefine\fR(8), \fBtpm_nvinfo\fR(8), \fBtpm_nvrelease\fR(8), \fBtpm_nvwrite\fR(8) .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvdefine.80000664000175000017510000002037713737506450017307 0ustar deboradebora.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "tpm_nvdefine 8" .TH tpm_nvdefine 8 "2011-07-07" "TPM Management" "" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" tpm_nvdefine .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBtpm_nvdefine [\s-1OPTIONS\s0]\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBtpm_nvdefine\fR defines a new \s-1NVRAM\s0 area at the given index and of given size. The user has to provide the permissions that control access to the \s-1NVRAM\s0 area. .PP Owner authentication is necessary once the \s-1NVRAM\s0 area 0xFFFFFFFF has been defined. The owner password may be provided on the command line using the owner password option. .PP The following options are supported: .IP "\fB\-h, \-\-help\fR" 4 .IX Item "-h, --help" Display command usage info. .IP "\fB\-v, \-\-version\fR" 4 .IX Item "-v, --version" Display command version info. .IP "\fB\-l, \-\-log [none|error|info|debug]\fR" 4 .IX Item "-l, --log [none|error|info|debug]" Set logging level. .IP "\fB\-u, \-\-unicode\fR" 4 .IX Item "-u, --unicode" Use \s-1TSS\s0 \s-1UNICODE\s0 encoding for passwords to comply with applications using \s-1TSS\s0 popup boxes .IP "\fB\-y, \-\-owner\-well\-known\fR" 4 .IX Item "-y, --owner-well-known" Use a secret of all zeros (20 bytes of zeros) as the owner's secret. .IP "\fB\-z, \-\-data\-well\-known\fR" 4 .IX Item "-z, --data-well-known" Use a secret of all zeros (20 bytes of zeros) as the \s-1NVRAM\s0 area's secret. .IP "\fB\-o, \-\-pwdo\fR (optional parameter)" 4 .IX Item "-o, --pwdo (optional parameter)" The owner password. .Sp A password may be directly provided for example by using '\-\-pwdo=password' or \&'\-opassword'. If no password is provided with this option then the program will prompt the user for the password. .IP "\fB\-a, \-\-pwda\fR (optional parameter)" 4 .IX Item "-a, --pwda (optional parameter)" The \s-1NVRAM\s0 area password. .Sp A password may be directly provided for example by using '\-\-pwda=password' or \&'\-apassword'. If no password is provided with this option then the program will prompt the user for the password. .IP "\fB\-i, \-\-index\fR" 4 .IX Item "-i, --index" The index of the \s-1NVRAM\s0 area. The parameter must either be a decimal number or a hexadecimal number starting with '0x'. .Sp To select the \s-1NVRAM\s0 area with index 0x100, the command line parameter should be '\-i 0x100' or \&'\-\-index 0x100'. .IP "\fB\-s, \-\-size\fR" 4 .IX Item "-s, --size" The size of the \s-1NVRAM\s0 area. The parameter must either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-r, \-\-rpcsr\fR" 4 .IX Item "-r, --rpcrs" PCRs to seal the NVRAM area to for reading (use multiple times) .IP "\fB\-w, \-\-wpcrs\fR" 4 .IX Item "-w, --wpcrs" PCRs to seal the NVRAM area to for writing (use multiple times) .IP "\fB\-f, \-\-filename\fR" 4 .IX Item "-f, --filename" File containing PCR info for the NVRAM area. .IP "\fB\-p, \-\-permissions\fR" 4 .IX Item "-p, --permissions" The access permissions associated with the \s-1NVRAM\s0 area. The parameter must either be a decimal number or a hexadecimal number staring with '0x'. It is possible to logically 'or' numbers or strings. The following strings are supported: .RS 4 .IP "\fB\s-1AUTHREAD\s0\fR" 4 .IX Item "AUTHREAD" Reading requires \s-1NVRAM\s0 area authorization. .IP "\fB\s-1AUTHWRITE\s0\fR" 4 .IX Item "AUTHWRITE" Writing requires \s-1NVRAM\s0 area authorization. .IP "\fB\s-1PPREAD\s0\fR" 4 .IX Item "PPREAD" Reading requires physical presence. .IP "\fB\s-1PPWRITE\s0\fR" 4 .IX Item "PPWRITE" Writing requires physical presence. .IP "\fB\s-1OWNERREAD\s0\fR" 4 .IX Item "OWNERREAD" Reading requires owner authorization. .IP "\fB\s-1OWNERWRITE\s0\fR" 4 .IX Item "OWNERWRITE" Writing requires owner authorization. .IP "\fB\s-1GLOBALLOCK\s0\fR" 4 .IX Item "GLOBALLOCK" A write to index 0 locks the \s-1NVRAM\s0 area until the next TPM_Startup(\s-1ST_CLEAR\s0) .IP "\fB\s-1READ_STCLEAR\s0\fR" 4 .IX Item "READ_STCLEAR" A read with size 0 on the same index prevents further reading until the next TPM_Startup(\s-1ST_CLEAR\s0) .IP "\fB\s-1WRITE_STCLEAR\s0\fR" 4 .IX Item "WRITE_STCLEAR" A write with size 0 to the same index prevents further writing until the next TPM_Startup(\s-1ST_CLEAR\s0) .IP "\fB\s-1WRITEDEFINE\s0\fR" 4 .IX Item "WRITEDEFINE" A write with size 0 to the same index locks the \s-1NVRAM\s0 area permanently .IP "\fB\s-1WRITEALL\s0\fR" 4 .IX Item "WRITEALL" The value must be written in a single operation .RE .RS 4 .Sp An example of a permission parameter is: .Sp \&\-\-permissions=\*(L"OWNERREAD|OWNERWRITE\*(R" .RE .IP "\fB\fR" 4 .IX Item "" .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBtpm_nvread\fR(8), \fBtpm_nvwrite\fR(8), \fBtpm_nvrelease\fR(8), \fBtpm_nvinfo\fR(8) .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_changeownerauth.80000664000175000017510000000511613735320450020655 0ustar deboradebora.\" Copyright (C) 2005 - 2007 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_changeownerauth" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_changeownerauth .SH NAME tpm_changeownerauth \- change the authorization data associated with the owner or SRK .SH "SYNOPSIS" .ad l .hy 0 .B tpm_changeownerauth .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_changeownerauth\fR allows for changing the authorization data for the TPM owner or the TPM's Storage Root Key (via the TPM_ChangeAuthOwner API). This operation prompts for current password, followed by the new password and a confirmation of the new password. The \fB\-\-owner\fR option changes the TPM owner password and \fB\-\-srk\fR option changes the TPM's SRK password. The \fB\-\-well-known\fR option is used when SRK or owner passwords need to be changed and current owner password is a secret of zeros, \fB\-\-set-well-known\fR option changes current password to a secret of zeros, both options do not work by themselves, they must be used with \fB\-\-owner\fR and \fB\-\-srk\fR options to indicate which of these passwords will be changed. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-o\fR, \fB\-\-owner\fR Change the authorization data for the TPM owner. .TP \fB-s\fR, \fB\-\-srk\fR Change the authorization data for the TPM's Storage Root Key. .TP \fB-g\fR, \fB\-\-original_password_unicode\fR Use TSS UNICODE encoding for original password to comply with applications using TSS popup boxes .TP \fB-n\fR, \fB\-\-new_password_unicode\fR Use TSS UNICODE encoding for new password to comply with applications using TSS popup boxes .TP \fB-z\fR, \fB\-\-well-known\fR Change password to a new one when current owner password is a secret of all zeros (20 bytes of zeros). It must be specified which password (owner, SRK or both) to change .TP \fB-r\fR, \fB\-\-set-well-known\fR Change password to a secret of all zeros (20 bytes of zeros). It must be specified which password (owner, SRK or both) to change .TP .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvrelease.pod0000664000175000017510000000257213735320450020075 0ustar deboradebora=head1 NAME tpm_nvrelease =head1 SYNOPSIS B =head1 DESCRIPTION B releases an NVRAM area. The user must provide the index of the NVRAM area. If owner authentication is required then the user must provide the owner password. Note that some areas cannot be released since they are permanent. Others can be release only after a reboot of the system. The following options are supported: =over 4 =item B<-h, --help> Display command usage info. =item B<-v, --version> Display command version info. =item B<-l, --log [none|error|info|debug]> Set logging level. =item B<-u, --unicode> Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes =item B<-y, --owner-well-known> Use a secret of all zeros (20 bytes of zeros) as the owner's secret. =item B<-o, --pwdo> The owner password. A password may be directly provided for example by using '--pwdo=password' or '-opassword'. If no password is provided with this option then the program will prompt the user for the password. =item B<-i, --index> The index of the NVRAM area that is to be released. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =back =head1 SEE ALSO B(8), B(8), B(8), B(8) =head1 REPORTING BUGS Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvinfo.80000664000175000017510000001201413735320450016765 0ustar deboradebora.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "tpm_nvinfo 8" .TH tpm_nvinfo 8 "2011-07-07" "TPM Management" "" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" tpm_nvinfo .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBtpm_nvinfo [\s-1OPTIONS\s0]\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBtpm_nvinfo\fR displays information about defined \s-1NVRAM\s0 areas. The user may restrict it to display only a single \s-1NVRAM\s0 area by providing an index or may choose ton only list available \s-1NVRAM\s0 areas indices without displaying the \&\s-1NVRAM\s0 areas' detailed information. .PP The following options are supported: .IP "\fB\-h, \-\-help\fR" 4 .IX Item "-h, --help" Display command usage info. .IP "\fB\-v, \-\-version\fR" 4 .IX Item "-v, --version" Display command version info. .IP "\fB\-l, \-\-log [none|error|info|debug]\fR" 4 .IX Item "-l, --log [none|error|info|debug]" Set logging level. .IP "\fB\-i, \-\-index\fR (optional parameter)" 4 .IX Item "-i, --index (optional parameter)" Only display the \s-1NVRAM\s0 area with the given index. If this option is not provided all \s-1NVRAM\s0 areas will be displayed. .IP "\fB\-n, \-\-list\-only\fR (optional parameter)" 4 .IX Item "-n, --list-only (optional parameter)" Only display the defined \s-1NVRAM\s0 areas' indices. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBtpm_nvdefine\fR(8), \fBtpm_nvread\fR(8), \fBtpm_nvwrite\fR(8), \fBtpm_nvrelease\fR(8) .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setenable.80000664000175000017510000000517313735320450017440 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setenable" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_setenable .SH NAME tpm_setenable \- change TPM enable states .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setenable .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setenable\fR reports the status of the TPM's flags regarding the enable state of the TPM. This is the default behavior and also accessible via the \fB\-\-status\fR option. Requesting a report of this status prompts for the owner password. The \fB\-\-enable\fR option changes the system's TPM to the enabled state (via the TPM_OwnerSetDisable API). This operation prompts for the owner password and is persistent. The \fB\-\-disable\fR option (via the TPM_OwnerSetDisable API) changes the system's TPM to the disabled state. This operation prompts for the owner password and is persistent. A disabled TPM is essentially off and does not allow a tpm_takeownership to occur. The \fB\-\-force\fR option overrides the owner password prompt and relies on physical presence for the operation authorization (via the TPM_PhysicalEnable and TPM_PhysicalDisable APIs). The \fB\-\-enable\fR, \fB\-\-disable\fR, and \fB\-\-status\fR options are mutually exclusive and the last one on the command line will be carried out. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Report the status of flags regarding the TPM enable states. .TP \fB-e\fR, \fB\-\-enable\fR Make the TPM enabled. Operation is persistent and prompts for owner authorization. .TP \fB-d\fR, \fB\-\-disable\fR Make the TPM disabled. Operation is persistent and prompts for owner authorization. .TP \fB-f\fR, \fB\-\-force\fR Overrides the prompt for owner authorization and uses physical presence to authorize the action. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_setpresence\fR(8), \fBtpm_takeownership\fR(8), \fBtpm_setactive\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setoperatorauth.80000664000175000017510000000321313735320450020720 0ustar deboradebora.\" Copyright (C) 2007 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setoperatorauth" 8 "2007-10-22" "TPM Management" .ce 1 TPM Management - tpm_setoperatorauth .SH NAME tpm_setoperatorauth \- sets the operator authorization value in the TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setoperatorauth .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setoperatorauth\fR allows setting the operator authorization value in the TPM (via the TPM_SetOperatorAuth API). This operation prompts for the new password and a confirmation of it. The \fB\-\-well-known\fR option tells the API to use the default TSS_WELL_KNOWN_SECRET (a 20-bytes array of zeros) as operator authorization information, instead of prompting for one. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-z\fR, \fB\-\-well-known\fR Use the default TSS_WELL_KNOWN_SECRET 20-bytes array of zeros as the operator password. .TP \fB-p\fR, \fB\-\-op_password_unicode\fR Use TSS UNICODE encoding for new operator password to comply with applications using TSS popup boxes .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_createek.80000664000175000017510000000364113735320450017257 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_createek" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_createek .SH NAME tpm_createek \- create an Endorsement Key Pair on the TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_createek .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_createek\fR creates and Endorsement Key Pair on the TPM (via the TPM_CreateEndorsementKeyPair API). This should rarely be required as the Endorsement Key is normally installed as part of manufacturing. However, you might need to run this command once if commands such as tpm_getpubek are returning error code 35 from the TPM layer. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .SH "OPTIONS VALID ONLY FOR TPM VERSION 1.2" .PP .TP \fB-r\fR, \fB\-\-revocable\fR Creates a \fBrevocable\fR key pair instead of non-revocable one. Requires secret data (either \fB-g\fR \fB-o\fR or \fB-i\fR - see below). \.TP \fB-i\fR, \fB\-\-infile\fR [input file] Specifies the file that contains the secret data used as revoke data do the new revocable EK pair. Only the first 20 bytes of this file are used and the remaining ones are ignored. \.TP \fB-g\fR, \fB\-\-generate-secret\fR Generates a random 20 bytes value that is used as the EK pair revocable secret data. Requires \fB-o\fR (see below). \.TP \fB-o\fR, \fB\-\-outfile\fR [output file] Specifies the file to write the generated revocable secret data to, for further use. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_getpubek\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setclearable.80000664000175000017510000000446113735320450020123 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setclearable" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_setclearable .SH NAME tpm_setclearable \- disable TPM clear operations .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setclearable .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setclearable\fR reports the status of the TPM's flags regarding how the TPM can be cleared. This is the default behavior and also accessible via the \fB\-\-status\fR option. Requesting a report of this status prompts for the owner password. The \fB\-\-owner\fR option requests that the TPM disable clear operations (via the TPM_DisableOwnerClear API) disabling the owner from clearing out the ownership information. This operation prompts for the owner password. This operation is in effect until the current owner is cleared. The \fB\-\-force\fR option (via the TPM_DisableForceClear API) disables using Phyiscal Presence to authorize a clear operation. This operation does not require authorization and will skip the owner password prompt. This operation is only in effect until a reboot. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Report the status of flags regarding how the TPM can be cleared. .TP \fB-o\fR, \fB\-\-owner\fR Disable use of owner authorization for authorizating a clear operation until a new owner exists. .TP \fB-f\fR, \fB\-\-force\fR Disable use of Physical Presence for authorizating a clear operation until a reboot has occurred. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_clear\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvread.pod0000664000175000017510000000446113735320450017367 0ustar deboradebora=head1 NAME tpm_nvread =head1 SYNOPSIS B =head1 DESCRIPTION B reads data from an NVRAM area and either displays them or writes them into a file. The user must provide the index of the NVRAM area. If the user provided the number of bytes to read then this will be the maximum number of bytes that will be read from the NVRAM area, otherwise the whole NVRAM area will be read. Some NVRAM areas only allow read sizes of zero, i.e., NVRAM area index 0. Optionally an offset into the NVRAM area can be given where the reading of the data is to start. If the NVRAM area has permission bits set that require owner or NVRAM area authentication, then the password must be provided via the password option. The following options are supported: =over 4 =item B<-h, --help> Display command usage info. =item B<-v, --version> Display command version info. =item B<-l, --log [none|error|info|debug]> Set logging level. =item B<-u, --unicode> Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes =item B<-z, --well-known> Use a secret of all zeros (20 bytes of zeros) as either the NVRAM area or owner secret. =item B<-p, --password> Depending on what type of authentication is required for the NVRAM area, this must either be the NVRAM area or owner password. A password may be directly provided for example by using '--password=password' or '-ppassword'. If no password is provided then the program will prompt the user for the password. =item B<-i, --index> The index of the NVRAM area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-s, --size> The number of bytes to read from the NVRAM area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-n, --offset> (optional parameter) The offset into the NVRAM area from where to start reading. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. =item B<-f, --filename> (optional parameter) The name of a file the read data will be written into. If no filename is given the data will be printed to stdout. =back =head1 SEE ALSO B(8), B(8), B(8), B(8) =head1 REPORTING BUGS Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setownable.80000664000175000017510000000413513735320450017636 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setownable" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_setownable .SH NAME tpm_setownable \- change whether the TPM allows tpm_takeownership operations .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setownable .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setownable\fR reports the status of the TPM's flags regarding if the TPM can be owned. This is the default behavior and also accessible via the \fB\-\-status\fR option. Requesting a report of this status prompts for the owner password. The \fB\-\-allow\fR option sets the system's TPM to allow tpm_takeownership operations (via the TPM_SetOwnerInstall API). This operation requires physical presence. The \fB\-\-prevent\fR option (via the TPM_SetOwnerInstall API) prevents the TPM from accepting tpm_takeownership operations. This operation requires physical presence. These operations are persistent. tpm_takeownership requires the tpm be enabled. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Report the status of flags regarding if the TPM can be owned. .TP \fB-a\fR, \fB\-\-allow\fR Allow tpm_takeownership operations. .TP \fB-p\fR, \fB\-\-prevent\fR Prevent tpm_takeownership operations. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_setpresence\fR(8), \fBtpm_setenable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_getpubek.80000664000175000017510000000300313735320450017272 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_getpubek" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_getpubek .SH NAME tpm_getpubek \- display the public portion of the TPM's Endorsement Key .SH "SYNOPSIS" .ad l .hy 0 .B tpm_getpubek .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_getpubek\fR requests the TPM's public portion of the Endorsement Key (via the TPM_ReadPubek API). This operation can be restricted to require owner authorization, in that case the command will prompt for the owner password and request the data. The key information is output on a successful call. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_restrictpubek\fR(8), \fBtpm_createek\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_takeownership.80000664000175000017510000000325413735320450020357 0ustar deboradebora.\" Copyright (C) 2005 - 2007 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_takeownership" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_takeownership .SH NAME tpm_takeownership \- setup an owner on the TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_takeownership .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_takeownership\fR setup an owner on the system's TPM (via the TPM_TakeOwnership API). This operation requires the TPM to be enabled and can be restricted by tpm_setownable. The command will prompt for owner and SRK passwords and confirmations of these if executed without either of the \fB\-well-known\fR options, otherwise, a secret of all zeros is set for the requested password. After the second confirmation, be patient as the command may take awhile. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-y\fR, \fB\-\-owner-well-known\fR Set a secret of all zeros (20 bytes of zeros) as the owner's secret. .TP \fB-z\fR, \fB\-\-srk-well-known\fR Set a secret of all zeros (20 bytes of zeros) as the SRK secret. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_setownable\fR(8), \fBtpm_setenable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_clear.80000664000175000017510000000410313735320450016554 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_clear" 8 "2005-05-05" "TPM Management" .ce 1 TPM Management - tpm_clear .SH NAME tpm_clear \- return the TPM to the default state (unowned, disabled, inactive) .SH "SYNOPSIS" .ad l .hy 0 .B tpm_clear .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_clear\fR requests that the system's TPM perform a clear (via the TPM_OwnerClear API) wiping out all ownership information, in effect invalidaing all keys and data tied to the TPM, as well as disabling and deactivating the TPM. This operation will prompt for the owner password. The \fB\-\-force\fR option relies on Phyiscal Presence to authorize the command (via the TPM_ForceClear API) skipping the owner password prompt. The TPM OwnerClear API can be disabled until the current owner is cleared, requiring use of the \fB\-\-force\fR with tpm_setclearable command. The TPM_ForceClear API can be disabled for the current boot cycle with the tpm_setclearable command. This command requires a reboot to complete the operation. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-f\fR, \fB\-\-force\fR Rely on Physical Presence for authorization; therefore, do not prompt for owner password. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_setclearable\fR(8), \fBtpm_setactive\fR(8), \fBtpm_setenable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_nvwrite.80000664000175000017510000001557213735320450017200 0ustar deboradebora.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "tpm_nvwrite 8" .TH tpm_nvwrite 8 "2011-07-11" "TPM Management" "" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" tpm_nvwrite .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBtpm_nvwrite [\s-1OPTIONS\s0]\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBtpm_nvwrite\fR writes data to an \s-1NVRAM\s0 area. The user must provide the index of the \s-1NVRAM\s0 area as well as the data to write into the \s-1NVRAM\s0 area. Optionally an offset into the \s-1NVRAM\s0 area can be given where the writing of the data is to start. Similarly the use may provide the number of bytes to write into the \&\s-1NVRAM\s0 area. Some \s-1NVRAM\s0 areas only allow write sizes of zero, i.e., \s-1NVRAM\s0 area index 0. If the \s-1NVRAM\s0 area has permission bits set that require owner or \s-1NVRAM\s0 area authentication, then the password must be provided via the password option. .PP The following options are supported: .IP "\fB\-h, \-\-help\fR" 4 .IX Item "-h, --help" Display command usage info. .IP "\fB\-v, \-\-version\fR" 4 .IX Item "-v, --version" Display command version info. .IP "\fB\-l, \-\-log [none|error|info|debug]\fR" 4 .IX Item "-l, --log [none|error|info|debug]" Set logging level. .IP "\fB\-u, \-\-unicode\fR" 4 .IX Item "-u, --unicode" Use \s-1TSS\s0 \s-1UNICODE\s0 encoding for passwords to comply with applications using \s-1TSS\s0 popup boxes .IP "\fB\-z, \-\-well\-known\fR" 4 .IX Item "-z, --well-known" Use a secret of all zeros (20 bytes of zeros) as either the \s-1NVRAM\s0 area or owner secret. .IP "\fB\-p, \-\-password\fR" 4 .IX Item "-p, --password" Depending on what type of authentication is required for the \s-1NVRAM\s0 area, this must either be the \s-1NVRAM\s0 area or owner password. .Sp A password may be directly provided for example by using '\-\-password=password' or \&\-ppassword. If no password is provided then the program will prompt the user for the password. .IP "\fB\-i, \-\-index\fR (optional parameter)" 4 .IX Item "-i, --index (optional parameter)" The index of the \s-1NVRAM\s0 area. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-s, \-\-size\fR" 4 .IX Item "-s, --size" The number of bytes to write to the \s-1NVRAM\s0 area. This parameter may be used to truncating the data that are for example read from a file. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-n, \-\-offset\fR (optional parameter)" 4 .IX Item "-n, --offset (optional parameter)" The offset into the \s-1NVRAM\s0 area where to start writing. The parameter may either be a decimal number or a hexadecimal number starting with '0x'. .IP "\fB\-f, \-\-filename\fR (optional parameter)" 4 .IX Item "-f, --filename (optional parameter)" The name of a file from which to read data and copy them into the \s-1NVRAM\s0 area. .IP "\fB\-d, \-\-data\fR (optional parameter)" 4 .IX Item "-d, --data (optional parameter)" The data to write into the \s-1NVRAM\s0 area passed in the command line. .IP "\fB\-m, \-\-fill\-value\fR (optional parameter)" 4 .IX Item "-m, --fill-value (optional parameter)" The byte to fill the \s-1NVRAM\s0 area with. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBtpm_nvdefine\fR(8), \fBtpm_nvinfo\fR(8), \fBtpm_nvread\fR(8), \fBtpm_nvrelease\fR(8) .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_selftest.80000664000175000017510000000262313735320450017324 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_selftest" 8 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpm_selftest .SH NAME tpm_selftest \- request TPM perform selftest and report .SH "SYNOPSIS" .ad l .hy 0 .B tpm_selftest .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_selftest\fR requests that the system's TPM perform a self test (via the TPM_SelfTestFull API) and report the results. The \fB\-\-results\fR option reports the outcome of the last self test operation without requesting that another test be executed. If the TPM fails the self test, it enters failure mode where no commands are accepted. The results are reported in a manufacturer specific format. The TPM's self test is always executed automatically at every boot. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-r\fR, \fB\-\-results\fR Report results only. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_takeownership\fR(8), \fBtpm_setownable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man8/tpm_setpresence.80000664000175000017510000000674413737506450020033 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_setpresence" 8 "2005-05-06" "TPM Management" .ce 1 TPM Management - tpm_setpresence .SH NAME tpm_setpresence\- change TPM physical presence states or settings .SH "SYNOPSIS" .ad l .hy 0 .B tpm_setpresence .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_setpresence\fR reports the status of the TPM's flags regarding physical presence. This is the default behavior and also accessible via the \fB\-\-status\fR option. Requesting a report of this status prompts for the owner password. The \fB\-\-assert\fR option changes the TPM to the physically present state. The \fB\-\-clear\fR option changes the TPM to the not present state. The \fB\-\-lock\fR option locks the TPM to the current physical presence state for the current boot cycle. The \fB\-\-enable-cmd\fR option allows the TPM to accept local commands to toggle physical presence states. The \fB\-\-disable-cmd\fR option prevents the TPM from accepting local commands to toggle physical presence states. The \fB\-\-enable-hw\fR option allows the TPM to accept hardware signals to toggle physical presence states. The \fB\-\-disable-hw\fR option prevents the TPM from accepting hardware signals to toggle physical presence states. The \fB\-\-set-lifetime-lock\fR option locks the Command and Hardware enablement flags in their current state permenantly. This option can never be undone. The system will attempt to use the owner password to display the current states before preceding unless the \fB\-\-yes\fR option is given to answer yes to all questions. All changes are made with the TSC_Physical Presence API. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for passwords to comply with applications using TSS popup boxes .TP \fB-s\fR, \fB\-\-status\fR Report current physical presence states. .TP \fB-a\fR, \fB\-\-assert\fR Assert that an admin is physically present at the machine. .TP \fB-c\fR, \fB\-\-clear\fR Remove the assertion that an admin is physically present at the machine. .TP \fB\-\-lock\fR Lock the assertions of physical presence in there current states until a reboot. .TP \fB\-\-enable-cmd\fR Allow use of commands to signal an admin is physically present. .TP \fB\-\-disable-cmd\fR Disallow use of commands to signal an admin is physically present. .TP \fB\-\-enable-hw\fR Allow use of hardware signals to signal an admin is physically present. .TP \fB\-\-disable-hw\fR Disallow use of hardware signals to signal an admin is physically present. .TP \fB\-\-set-lifetime-lock\fR Allow no further changes to the flags controling how physical presence can be signaled. This is PERMANENT. .TP \fB\-y\fR, \fB\-\-yes\fR Answer yes to all questions. Only applicable with \fB\-\-set\-lifetime\-lock\fR. .TP \fB-z\fR, \fB\-\-well-known\fR Authenticate using 20 bytes of zeros as owner password (the default TSS Well Known Secret), instead of prompting for an owner password. .SH "SEE ALSO" .PP \fBtpm_version\fR(1), \fBtpm_setenable\fR(8), \fBtpm_setactive\fR(8), \fBtpm_setownable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/0000775000175000017510000000000013737506450014520 5ustar deboradeboratpm-tools-1.3.9.2/man/man1/tpmtoken_protect.10000664000175000017510000000361013735320450020173 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpmtoken_protect" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpmtoken_protect .SH NAME tpmtoken_protect \- encrypt or decrypt data using a symmetric key stored in the user's TPM PKCS#11 data store .SH "SYNOPSIS" .ad l .hy 0 .B tpmtoken_protect [ OPTION ] .SH "DESCRIPTION" .PP \fBtpmtoken_protect\fR will encrypt or decrypt data using a symmetric key that is stored in the user's data store. The key used to protect the data is a 256-bit AES key stored as a private Secret Key PKCS#11 object. The object has the PKCS#11 label attribute of \'User Data Protection Key\'. The key is generated by the TPM PKCS#11 implementation when it is needed the first time. Since it is generated as a private object, it is protected by the TPM on the platform. .PP This command requires the \'-i\' and \'-o\' command options to be specified. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-d\fR, \fB\-\-decrypt\fR Perform a decryption operation .TP \fB-e\fR, \fB\-\-encrypt\fR Perform an encryption operation .TP \fB-i\fR, \fB\-\-infile\fR FILE Use FILE as the input to the specified operation .TP \fB-k\fR, \fB\-\-token\fR STRING Use STRING to identify the label of the PKCS#11 token to be used .TP \fB-o\fR, \fB\-\-outfile\fR FILE Use FILE as the output of the specified operation .SH "SEE ALSO" .PP \fBtpmtoken_init\fR(1), \fBtpmtoken_import\fR(1), \fBtpmtoken_setpasswd\fR(1), \fBtpmtoken_objects\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/Makefile.am0000664000175000017510000000230713737506450016556 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # man1_MANS = tpm_sealdata.1 \ tpm_unsealdata.1 \ tpm_version.1 if P11_SUPPORT man1_MANS += tpmtoken_init.1 \ tpmtoken_import.1 \ tpmtoken_objects.1 \ tpmtoken_protect.1 \ tpmtoken_setpasswd.1 endif EXTRA_DIST = $(man1_MANS) tpm-tools-1.3.9.2/man/man1/tpm_version.10000664000175000017510000000201413735320450017134 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_version" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpm_version .SH NAME tpm_version \- report TPM version and manufacturer information .SH "SYNOPSIS" .ad l .hy 0 .B tpm_version .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_version\fR reports the system's TPM version and manufacturer information. The information reported is manufacturer specific. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .SH "SEE ALSO" .PP \fBtpm_selftest\fR(8), \fBtpm_takeownership\fR(8), \fBtpm_setownable\fR(8), \fBtcsd\fR(8) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpm_sealdata.10000664000175000017510000000347713735320450017243 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_sealdata" 1 "2005-08-10" "TPM Management" .ce 1 TPM Management - tpm_sealdata .SH NAME tpm_sealdata \- seal input data to the system's TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_sealdata .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_sealdata\fR seals sensitive input data to the SRK of the system's TPM and optionally a PCR configuration. Backup your data, it is unrecoverable from this format if the SRK changes or the specified PCR configuration is unreproducable. The result can be unsealed by functions in libtpm_unseal, such as \fBtpmUnsealFile\fR(3). .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-i\fR, \fB\-\-infile FILE\fR File containing input data to seal. .TP \fB-o\fR, \fB\-\-outfile FILE\fR Output file. Default is STDOUT. .TP \fB-p\fR, \fB\-\-pcr NUMBER\fR Seal data to the current value of the specified pcr. This option can be given NUM_PCRS times. The specified pcr is in the range of 0 to NUM_PCRS-1. NUM_PCRS is at least 16 but may vary by platform. .TP \fB-z\fR, \fB\-\-well-known\fR Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the SRK password. You will not be prompted for the SRK password with this option. .TP \fB-u\fR, \fB\-\-unicode\fR Use TSS UNICODE encoding for the SRK password to comply with applications using TSS popup boxes. .SH "SEE ALSO" .PP \fBtpm_takeownership\fR(8), \fBtpmUnsealFile\fR(3) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpmtoken_setpasswd.10000664000175000017510000000271513735320450020535 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpmtoken_setpasswd" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpmtoken_setpasswd .SH NAME tpmtoken_setpasswd \- change the password(s) associated with the user's TPM PKCS#11 data store .SH "SYNOPSIS" .ad l .hy 0 .B tpmtoken_setpasswd [ OPTION ] .SH "DESCRIPTION" .PP \fBtpmtoken_setpasswd\fR is used to change the password(s) associated with the user's data store. .PP PKCS#11 requires a password (or PIN) for the Security Officer (SO) and the User. The SO and User password are set when the data store is initialized. This command will allow the user change either password. .PP .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-k\fR, \fB\-\-token\fR STRING Use STRING to identify the label of the PKCS#11 token to be used .TP \fB-s\fR, \fB\-\-security-officer\fR Set the Security Officer password instead of the User password .SH "SEE ALSO" .PP \fBtpmtoken_init\fR(1), \fBtpmtoken_import\fR(1), \fBtpmtoken_objects\fR(1), \fBtpmtoken_protect\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpmtoken_import.10000664000175000017510000000512613735320450020031 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpmtoken_import" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpmtoken_import .SH NAME tpmtoken_import \- import an X.509 certficate and/or an RSA key pair into the user's TPM PKCS#11 data store .SH "SYNOPSIS" .ad l .hy 0 .B tpmtoken_import [ OPTION ] FILE .SH "DESCRIPTION" .PP \fBtpmtoken_import\fR imports a PEM formatted representation of an X.509 certificate and/or an RSA key contained in FILE. .PP Importing an X.509 certificate creates an X.509 Public Key Certificate PKCS#11 object and also an RSA Public Key PKCS#11 object using the RSA public key contained in the certificate. The certificate's key must be an RSA key in order for the certificate to be successfully processed by this command. .PP Importing an RSA key creates an RSA Public Key and an RSA Private Key PKCS#11 object. In order to associate the RSA PKCS#11 objects with an X.509 Public Key Certificate PKCS#11 object, the RSA PKCS#11 objects must have a subject name and key identifier associated with them. This can be accomplished by supplying the corresponding X.509 certificate as an optional command parameter. .PP The input can contain PEM formatted representations of both an X.509 certificate and an RSA key. If both representations are present then an X.509 Public Key Certificate PKCS#11 object, an RSA Public Key PKCS#11 object and an RSA Private Key PKCS#11 object are created. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-i\fR, \fB\-\-idfile\fR FILE Use FILE as the PEM formatted X.509 certificate input used to obtain the subject and id attributes .TP \fB-k\fR, \fB\-\-token\fR STRING Use STRING to identify the label of the PKCS#11 token to be used .TP \fB-n\fR, \fB\-\-name\fR STRING Use STRING as the label for the imported object(s) .TP \fB-p\fR, \fB\-\-public\fR Import the object(s) as a public object .TP \fB-t\fR, \fB\-\-type\fR key|cert Import only the specified object type .TP \fB-y\fR, \fB\-\-yes\fR Assume an answer of yes for any confirmation prompts that would normally be asked .SH "SEE ALSO" .PP \fBtpmtoken_init\fR(1), \fBtpmtoken_setpasswd\fR(1), \fBtpmtoken_objects\fR(1), \fBtpmtoken_protect\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpmtoken_objects.10000664000175000017510000000244113735320450020145 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpmtoken_objects" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpmtoken_objects .SH NAME tpmtoken_objects \- display the objects in the user's TPM PKCS#11 data store .SH "SYNOPSIS" .ad l .hy 0 .B tpmtoken_objects [ OPTION ] .SH "DESCRIPTION" .PP \fBtpmtoken_objects\fR displays information about the PKCS#11 objects that are in the user's data store. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-k\fR, \fB\-\-token\fR STRING Use STRING to identify the label of the PKCS#11 token to be used .TP \fB-p\fR, \fB\-\-public\fR Display only public objects .TP \fB-x\fR, \fB\-\-extended\fR Display additional information about an object not displayed by default .SH "SEE ALSO" .PP \fBtpmtoken_init\fR(1), \fBtpmtoken_setpasswd\fR(1), \fBtpmtoken_import\fR(1), \fBtpmtoken_protect\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpm_unsealdata.10000664000175000017510000000240513737506450017604 0ustar deboradebora.\" Copyright (C) 2019 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpm_unsealdata" 1 "2019-01-27" "TPM Management" .ce 1 TPM Management - tpm_unsealdata .SH NAME tpm_unsealdata \- unseal input data with the SRK of the system's TPM .SH "SYNOPSIS" .ad l .hy 0 .B tpm_unsealdata .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpm_unsealdata\fR unseals sensitive data that was sealed the SRK of the system's TPM. .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-i\fR, \fB\-\-infile FILE\fR File containing data to unseal. .TP \fB-o\fR, \fB\-\-outfile FILE\fR Filename to write unsealed data to. Default is STDOUT. .TP \fB-z\fR, \fB\-\-well-known\fR Use TSS_WELL_KNOWN_SECRET (20 zero bytes) as the SRK password. You will not be prompted for the SRK password with this option. .SH "SEE ALSO" .PP \fBtpm_sealdata\fR(1), \fBtpmUnsealFile\fR(3) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/man/man1/tpmtoken_init.10000664000175000017510000000266713735320450017471 0ustar deboradebora.\" Copyright (C) 2005 International Business Machines Corporation .\" .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "tpmtoken_init" 1 "2005-04-25" "TPM Management" .ce 1 TPM Management - tpmtoken_init .SH NAME tpmtoken_init \- initialize the user's TPM PKCS#11 data store .SH "SYNOPSIS" .ad l .hy 0 .B tpmtoken_init .RB [ OPTION ] .SH "DESCRIPTION" .PP \fBtpmtoken_init\fR initializes the user's TPM PKCS#11 data store so that applications can exploit the TPM capabilities through the PKCS#11 interface. .PP PKCS#11 requires a password (or PIN) for the Security Officer (SO) and the User. The SO is responsible for initializing the token and setting the User password (or PIN). .TP \fB\-h\fR, \fB\-\-help\fR Display command usage info. .TP \fB-v\fR, \fB\-\-version\fR Display command version info. .TP \fB-l\fR, \fB\-\-log\fR [none|error|info|debug] Set logging level. .TP \fB-k\fR, \fB\-\-token\fR STRING Use STRING to identify the label of the PKCS#11 token to be used .TP \fB-y\fR, \fB\-\-yes\fR Assume an answer of yes for any confirmation prompts that would normally be asked .SH "SEE ALSO" .PP \fBtpmtoken_setpasswd\fR(1), \fBtpmtoken_import\fR(1), \fBtpmtoken_objects\fR(1), \fBtpmtoken_protect\fR(1) .SH "REPORTING BUGS" Report bugs to tpm-tools-1.3.9.2/bootstrap.sh0000664000175000017510000000202213735320450015446 0ustar deboradebora#! /bin/sh # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # # bootstrap.sh # set -x # # gettextize support mkdir -p po mkdir -p m4 cp -R po_/* po/ touch po/Makefile.in.in touch m4/Makefile.am autoreconf -fv --install tpm-tools-1.3.9.2/.gitignore0000664000175000017510000000242013735320450015067 0ustar deboradebora*~ *.o *.lo Makefile Makefile.in *.3 *.8 ABOUT-NLS aclocal.m4 autom4te.cache config.guess config.h.in config.rpath config.sub configure cscope.out depcomp install-sh ltmain.sh m4 missing po config.h config.log config.status dist/tpm-tools.spec lib/.deps/ lib/.libs/ lib/libtpm_pkcs11.la lib/libtpm_tspi.la lib/libtpm_unseal.la lib/libtpm_utils.la libtool src/cmds/.deps/ src/cmds/.libs/ src/cmds/tpm_sealdata src/cmds/tpm_unsealdata src/data_mgmt/.deps/ src/data_mgmt/tpmtoken_import src/data_mgmt/tpmtoken_init src/data_mgmt/tpmtoken_objects src/data_mgmt/tpmtoken_protect src/data_mgmt/tpmtoken_setpasswd src/tpm_mgmt/.deps/ src/tpm_mgmt/tpm_changeownerauth src/tpm_mgmt/tpm_clear src/tpm_mgmt/tpm_createek src/tpm_mgmt/tpm_getpubek src/tpm_mgmt/tpm_nvdefine src/tpm_mgmt/tpm_nvinfo src/tpm_mgmt/tpm_nvread src/tpm_mgmt/tpm_nvrelease src/tpm_mgmt/tpm_nvwrite src/tpm_mgmt/tpm_reset src/tpm_mgmt/tpm_resetdalock src/tpm_mgmt/tpm_restrictpubek src/tpm_mgmt/tpm_restrictsrk src/tpm_mgmt/tpm_revokeek src/tpm_mgmt/tpm_selftest src/tpm_mgmt/tpm_setactive src/tpm_mgmt/tpm_setclearable src/tpm_mgmt/tpm_setenable src/tpm_mgmt/tpm_setoperatorauth src/tpm_mgmt/tpm_setownable src/tpm_mgmt/tpm_setpresence src/tpm_mgmt/tpm_startup src/tpm_mgmt/tpm_takeownership src/tpm_mgmt/tpm_version stamp-h1 added tpm-tools-1.3.9.2/dist/0000775000175000017510000000000013735320450014044 5ustar deboradeboratpm-tools-1.3.9.2/dist/tpm-tools-nopkcs11.spec0000664000175000017510000000330713735320450020316 0ustar deboradeboraName: tpm-tools Version: 1.2.4 Release: 1 Summary: Management tools for the TPM hardware Group: Applications/System License: CPL URL: http://www.sf.net/projects/trousers Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf automake libtool trousers-devel openssl-devel perl Requires: trousers %description tpm-tools is a group of tools to manage and utilize the Trusted Computing Group's TPM hardware. TPM hardware can create, store and use RSA keys securely (without ever being exposed in memory), verify a platform's software state using cryptographic hashes and more. %package devel Summary: Files to use the library routines supplied with tpm-tools Group: Development/Libraries Requires: tpm-tools = %{version}-%{release} %description devel tpm-tools-devel is a package that contains the libraries and headers necessary for developing tpm-tools applications. %prep %setup -q %build autoreconf --force --install %configure --disable-static --disable-pkcs11-support make %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT rm -f $RPM_BUILD_ROOT/%{_libdir}/libtpm_unseal.la %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc LICENSE README %attr(755, root, root) %{_bindir}/tpm_* %attr(755, root, root) %{_sbindir}/tpm_* %attr(755, root, root) %{_libdir}/libtpm_unseal.so.0.0.1 %{_libdir}/libtpm_unseal.so.0 %{_mandir}/man1/tpm_* %{_mandir}/man8/tpm_* %files devel %defattr(-,root,root,-) %{_libdir}/libtpm_unseal.so %{_includedir}/tpm_tools/*.h %{_mandir}/man3/tpmUnseal* %post -p /sbin/ldconfig %postun -p /sbin/ldconfig tpm-tools-1.3.9.2/dist/tpm-tools.spec.in0000664000175000017510000000543113735320450017266 0ustar deboradebora %define name @PACKAGE@ %define version @VERSION@ %define release 1 Name: %{name} Version: %{version} Release: %{release} Summary: Management tools for the TPM hardware Group: Applications/System License: CPL URL: http://www.sf.net/projects/trousers Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf automake libtool trousers-devel opencryptoki-devel openssl-devel perl opencryptoki-devel Requires: trousers %description tpm-tools is a group of tools to manage and utilize the Trusted Computing Group's TPM hardware. TPM hardware can create, store and use RSA keys securely (without ever being exposed in memory), verify a platform's software state using cryptographic hashes and more. %package pkcs11 Summary: Data management tools that use a PKCS#11 interface to the TPM Group: Applications/Productivity Requires: %{name} = %{version}-%{release}, opencryptoki >= 2.2.4 %description pkcs11 %{name}-pkcs11 is a group of tools that uses the TPM PKCS#11 token developed in the opencryptoki project. All data contained in the PKCS#11 data store is protected by the TPM (keys, certificates, etc.). You can import keys and certificates, list out the objects in the data store, and protect data. %package devel Summary: Files to use the library routines supplied with tpm-tools Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel %{name}-devel is a package that contains the libraries and headers necessary for developing tpm-tools applications. %prep %setup -q %build %configure --disable-static --prefix=/usr --libdir=%{_libdir} make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT rm -f $RPM_BUILD_ROOT/%{_libdir}/libtpm_unseal.la %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc LICENSE README %attr(755, root, root) %{_bindir}/tpm_* %attr(755, root, root) %{_sbindir}/tpm_* #%attr(755, root, root) %{_libdir}/libtpm_unseal.a %attr(755, root, root) %{_libdir}/libtpm_unseal.so.?.?.? %{_libdir}/libtpm_unseal.so.0 %{_mandir}/man1/tpm_* %{_mandir}/man8/tpm_* %files pkcs11 %defattr(-,root,root,-) %attr(755, root, root) %{_bindir}/tpmtoken_* %{_mandir}/man1/tpmtoken_* %files devel %defattr(-,root,root,-) %{_libdir}/libtpm_unseal.so %{_includedir}/tpm_tools/*.h %{_mandir}/man3/tpmUnseal* %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog * Tue Jul 12 2010 Stefan Berger - 1.3.7 - added perl build dependency * Fri Nov 16 2007 Kent Yoder - 1.3.1 - Updates to configure * Fri Oct 05 2007 Kent Yoder - 1.2.5.1 - Updated %build section to use smp_mflags tpm-tools-1.3.9.2/include/0000775000175000017510000000000013736475721014541 5ustar deboradeboratpm-tools-1.3.9.2/include/Makefile.am0000664000175000017510000000214413735320450016561 0ustar deboradebora# # Makefile.am # # The Initial Developer of the Original Code is International # Business Machines Corporation. Portions created by IBM # Corporation are Copyright (C) 2005 International Business # Machines Corporation. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the Common Public License as published by # IBM Corporation; either version 1 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # Common Public License for more details. # # You should have received a copy of the Common Public License # along with this program; if not, a copy can be viewed at # http://www.opensource.org/licenses/cpl1.0.php. # unsealincludedir = $(includedir)/tpm_tools unsealinclude_HEADERS = tpm_unseal.h noinst_HEADERS = tpm_pkcs11.h tpm_seal.h tpm_tspi.h tpm_utils.h tpm-tools-1.3.9.2/include/tpm_tspi.h0000664000175000017510000001174713735320450016546 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __TPM_TSPI_H #define __TPM_TSPI_H #include #include #include #include extern TSS_UUID SRK_UUID; #define NULL_HOBJECT 0 #define NULL_HKEY NULL_HOBJECT #define NULL_HPCRS NULL_HOBJECT //Display functions const char *displayKeyUsageMap(UINT32 a_uiData); const char *displayKeyFlagsMap(UINT32 a_uiFlags); const char *displayAuthUsageMap(UINT32 a_uiData); const char *displayAlgorithmMap(UINT32 a_uiData); const char *displayEncSchemeMap(UINT32 a_uiData); const char *displaySigSchemeMap(UINT32 a_uiData); TSS_RESULT displayKey(TSS_HKEY a_hKey); //Generic query functions BOOL isTpmOwned(TSS_HCONTEXT hContext); //TSPI logging functions void tspiDebug(const char *a_szName, TSS_RESULT a_iResult); void tspiError(const char *a_szName, TSS_RESULT a_iResult); void tspiResult(const char *a_szName, TSS_RESULT a_tResult); // Map a TSS_BOOL into a BOOL BOOL mapTssBool(TSS_BOOL a_bValue); //TSPI generic setup/teardown functions TSS_RESULT contextCreate(TSS_HCONTEXT * a_hContext); TSS_RESULT contextClose(TSS_HCONTEXT a_hContext); TSS_RESULT contextConnect(TSS_HCONTEXT a_hContext); TSS_RESULT contextCreateObject(TSS_HCONTEXT a_hContext, TSS_FLAG a_fType, TSS_FLAG a_fAttrs, TSS_HOBJECT * a_hObject); TSS_RESULT contextCloseObject(TSS_HCONTEXT a_hContext, TSS_HOBJECT a_hObject); TSS_RESULT contextGetTpm(TSS_HCONTEXT a_hContext, TSS_HTPM * a_hTpm); TSS_RESULT policyGet(TSS_HOBJECT a_hObject, TSS_HPOLICY * a_hPolicy); TSS_RESULT policyAssign(TSS_HPOLICY a_hPolicy, TSS_HOBJECT a_hObject); TSS_RESULT policySetSecret(TSS_HPOLICY a_hPolicy, UINT32 a_uiSecretLen, BYTE * a_chSecret); TSS_RESULT policyFlushSecret(TSS_HPOLICY a_hPolicy); //Common TSPI functions TSS_RESULT tpmGetPubEk(TSS_HTPM a_hTpm, TSS_BOOL a_fOwner, TSS_VALIDATION * a_pValData, TSS_HKEY * a_phEPubKey); TSS_RESULT tpmGetRandom(TSS_HTPM a_hTpm, UINT32 a_length, BYTE ** a_data); TSS_RESULT tpmSetStatus(TSS_HTPM a_hTpm, TSS_FLAG a_fStatus, TSS_BOOL a_bValue); TSS_RESULT tpmGetStatus(TSS_HTPM a_hTpm, TSS_FLAG a_fStatus, TSS_BOOL * a_bValue); TSS_RESULT getCapability(TSS_HTPM a_hTpm, TSS_FLAG a_fCapArea, UINT32 a_uiSubCapLen, BYTE * a_pSubCap, UINT32 * a_uiResultLen, BYTE ** a_pResult); TSS_RESULT getAttribData(TSS_HOBJECT a_hObject, TSS_FLAG a_fAttr, TSS_FLAG a_fSubAttr, UINT32 * a_uiSize, BYTE ** a_pData); TSS_RESULT getAttribUint32(TSS_HOBJECT a_hObject, TSS_FLAG a_fAttr, TSS_FLAG a_fSubAttr, UINT32 * a_uiData); //TSPI key functions TSS_RESULT keyLoadKey(TSS_HKEY a_hKey, TSS_HKEY a_hWrapKey); TSS_RESULT keyLoadKeyByUUID(TSS_HCONTEXT a_hContext, TSS_FLAG a_fStoreType, TSS_UUID a_uKeyId, TSS_HKEY * a_hKey); TSS_RESULT keyGetPubKey(TSS_HKEY a_hKey, UINT32 * a_uiKeyLen, BYTE ** a_pKey); TSS_RESULT keyGetKeyByUUID(TSS_HCONTEXT a_hContext, TSS_FLAG a_fStoreType, TSS_UUID a_uKeyId, TSS_HKEY * a_hKey); TSS_RESULT keyCreateKey(TSS_HKEY a_hKey, TSS_HKEY a_hWrapKey, TSS_HPCRS a_hPcrs); TSS_RESULT dataSeal(TSS_HENCDATA a_hEncdata, TSS_HKEY a_hKey, UINT32 a_len, BYTE * a_data, TSS_HPCRS a_hPcrs); TSS_RESULT tpmPcrRead(TSS_HTPM a_hTpm, UINT32 a_Idx, UINT32 *a_PcrSize, BYTE **a_PcrValue); TSS_RESULT pcrcompositeSetPcrValue(TSS_HPCRS a_hPcrs, UINT32 a_Idx, UINT32 a_PcrSize, BYTE *a_PcrValue); #ifdef TSS_LIB_IS_12 TSS_RESULT unloadVersionInfo(UINT64 *offset, BYTE *blob, TPM_CAP_VERSION_INFO *v); TSS_RESULT pcrcompositeSetPcrLocality(TSS_HPCRS a_hPcrs, UINT32 localityValue); TSS_RESULT NVDefineSpace(TSS_HNVSTORE hNVStore, TSS_HPCRS hReadPcrComposite, TSS_HPCRS hWritePcrComposite); TSS_RESULT NVReleaseSpace(TSS_HNVSTORE hNVStore); TSS_RESULT NVWriteValue(TSS_HNVSTORE hNVStore, UINT32 offset, UINT32 ulDataLength, BYTE *rgbDataToWrite); TSS_RESULT NVReadValue(TSS_HNVSTORE hNVStore, UINT32 offset, UINT32 *ulDataLength, BYTE **rgbDataRead); TSS_RESULT unloadNVDataPublic(UINT64 *offset, BYTE *blob, UINT32 bloblen, TPM_NV_DATA_PUBLIC *v); #endif #endif tpm-tools-1.3.9.2/include/tpm_pkcs11.h0000664000175000017510000001044713735320450016665 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __TPM_PKCS11_H #define __TPM_PKCS11_H #include #include #define TPM_OPENCRYPTOKI_SO "libopencryptoki.so" #define TPM_TOKEN_LABEL "IBM PKCS#11 TPM Token" #define TPM_FIND_MAX 10 typedef int (*TokenCryptGet)( CK_BYTE **a_pbData, CK_ULONG *a_pulDataLen, CK_BBOOL *a_pbMoreData, CK_BBOOL a_bEncrypt ); typedef int (*TokenCryptPut)( CK_BYTE *a_pbData, CK_ULONG a_ulDataLen, CK_BBOOL a_bMoreData, CK_BBOOL a_bEncrypt ); void pkcsDebug(const char *a_pszName, CK_RV a_tResult); void pkcsError(const char *a_pszName, CK_RV a_tResult); void pkcsResult(const char *a_pszName, CK_RV a_tResult); void pkcsResultException(const char *a_pszName, CK_RV a_tResult, CK_RV a_tExcept); void pkcsSlotInfo(CK_SLOT_INFO *a_ptSlotInfo); void pkcsTokenInfo(CK_TOKEN_INFO *a_ptTokenInfo); CK_RV openToken( char *a_pszTokenLabel ); CK_RV closeToken( ); CK_RV initToken( char *a_pszPin ); CK_RV openTokenSession( CK_FLAGS a_tType, CK_SESSION_HANDLE *a_phSession ); CK_RV closeTokenSession( CK_SESSION_HANDLE a_hSession ); CK_RV closeAllTokenSessions( ); CK_RV loginToken( CK_SESSION_HANDLE a_hSession, CK_USER_TYPE a_tType, char *a_pszPin ); CK_RV initPin( CK_SESSION_HANDLE a_hSession, char *a_pszPin ); CK_RV setPin( CK_SESSION_HANDLE a_hSession, char *a_pszOldPin, char *a_pszNewPin ); CK_RV generateKey( CK_SESSION_HANDLE a_hSession, CK_MECHANISM *a_ptMechanism, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE *a_phObject ); CK_RV createObject( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE *a_phObject ); CK_RV destroyObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject ); CK_RV getObjectAttributes( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount ); CK_RV findObjects( CK_SESSION_HANDLE a_hSession, CK_ATTRIBUTE *a_ptAttrList, CK_ULONG a_ulAttrCount, CK_OBJECT_HANDLE **a_phObjList, CK_ULONG *a_pulObjCount ); CK_RV displayObject( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, int a_bExtended ); CK_RV encryptData( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_MECHANISM *a_ptMechanism, TokenCryptGet a_fGet, TokenCryptPut a_fPut ); CK_RV decryptData( CK_SESSION_HANDLE a_hSession, CK_OBJECT_HANDLE a_hObject, CK_MECHANISM *a_ptMechanism, TokenCryptGet a_fGet, TokenCryptPut a_fPut ); BOOL isTokenInitialized( ); int getMinPinLen( ); int getMaxPinLen( ); #endif tpm-tools-1.3.9.2/include/tpm_utils.h0000664000175000017510000000732613736475721016742 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __TPM_UTILS_H #define __TPM_UTILS_H #ifdef ENABLE_NLS #include #include #define _(String) gettext(String) #define N_(String) String #else #define setlocale(category, local) #define bindtextdomain(package, localedir) #define textdomain(package); #define _(String) String #define N_(String) String #endif #include #include #include #include //#define GNU_SOURCE #include #ifndef BOOL #define BOOL int #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE (!FALSE) #endif #define CMD_VERSION PACKAGE_VERSION #define LOG_NONE _("none") #define LOG_LEVEL_NONE 0 #define LOG_ERROR _("error") #define LOG_LEVEL_ERROR 1 #define LOG_INFO _("info") #define LOG_LEVEL_INFO 2 #define LOG_DEBUG _("debug") #define LOG_LEVEL_DEBUG 3 #ifdef __GNUC__ #define __no_optimize __attribute__((optimize("O0"))) #else #define __no_optimize #endif void * __memset(void *s, int c, size_t n); typedef int (*CmdOptParser)( const int aOpt, const char *aOptArg ); typedef void (*CmdHelpFunction)( const char *aCmd ); void initIntlSys( ); int genericOptHandler( int a_iNumArgs, char **a_pszArgs, const char *a_pszShortOpts, struct option *a_psLongOpts, int a_iNumOpts, CmdOptParser, CmdHelpFunction ); char *getPlainPasswd( const char* a_pszPrompt, BOOL a_bConfirm ); #ifdef TSS_LIB_IS_12 char *_getPasswd12( const char *a_pszPrompt, int *a_iLen, BOOL a_bConfirm, BOOL a_uUseUnicode); char *getPasswd12( const char *a_pszPrompt, int *a_iLen, BOOL a_bConfirm ); #define _GETPASSWD _getPasswd12 #define GETPASSWD getPasswd12 #else char *getPasswd( const char *a_pszPrompt, int *a_iLen, BOOL a_bConfirm ); #define _GETPASSWD _getPasswd #define GETPASSWD getPasswd #endif char *_getPasswd( const char *a_pszPrompt, int *a_iLen, BOOL a_bConfirm, BOOL a_bUseUnicode); void shredPasswd( char *a_pszPasswd ); char *getReply( const char *a_pszPrompt, int a_iMaxLen ); extern int iLogLevel; extern BOOL useUnicode; int logHex( int a_iLen, void *a_pData ); int logMsg( const char *a_pszFormat, ... ); int logDebug( const char *a_pszFormat, ... ); int logInfo( const char *a_pszFormat, ... ); int logError( const char *a_pszFormat, ... ); int logProcess( FILE *a_pStream, const char *a_pszFormat, va_list a_vaArgs ); int logIt( FILE *a_pStream, const char *a_pszFormat, va_list a_vaArgs ); void logSuccess( const char *a_pszCmd ); void logCmdOption( const char *a_pszOption, const char *a_pszDescr ); void logUnicodeCmdOption( ); void logGenericOptions( ); void logCmdHelp( const char *a_pszCmd ); void logCmdHelpEx( const char *a_pszCmd, char *a_pszArgs[], char *a_pszArgDescs[] ); char *logBool( BOOL aValue ); void logOwnerPassCmdOption( ); void logNVIndexCmdOption( ); #endif tpm-tools-1.3.9.2/include/tpm_unseal.h0000664000175000017510000000240213735320450017042 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __TPM_UNSEAL_H #define __TPM_UNSEAL_H #define TPMSEAL_FILE_ERROR -2 #define TPMSEAL_STD_ERROR -1 enum tpm_errors { ENOTSSHDR = 0, ENOTSSFTR, EWRONGTSSTAG, EWRONGEVPTAG, EWRONGDATTAG, EWRONGKEYTYPE, EBADSEEK, }; extern int tpm_errno; int tpmUnsealFile(char*, unsigned char**, int*, BOOL); void tpmUnsealShred(unsigned char*, int); char* tpmUnsealStrerror(int); #endif tpm-tools-1.3.9.2/include/tpm_seal.h0000664000175000017510000000252613735320450016506 0ustar deboradebora/* * The Initial Developer of the Original Code is International * Business Machines Corporation. Portions created by IBM * Corporation are Copyright (C) 2005, 2006 International Business * Machines Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Common Public License as published by * IBM Corporation; either version 1 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Common Public License for more details. * * You should have received a copy of the Common Public License * along with this program; if not, a copy can be viewed at * http://www.opensource.org/licenses/cpl1.0.php. */ #ifndef __TPM_SEAL_H #define __TPM_SEAL_H #define TPMSEAL_HDR_STRING "-----BEGIN TSS-----\n" #define TPMSEAL_FTR_STRING "-----END TSS-----\n" #define TPMSEAL_TSS_STRING "-----TSS KEY-----\n" #define TPMSEAL_EVP_STRING "-----ENC KEY-----\n" #define TPMSEAL_ENC_STRING "-----ENC DAT-----\n" #define TPMSEAL_KEYTYPE_SYM "Symmetric Key: " #define TPMSEAL_CIPHER_AES256CBC "AES-256-CBC\n" #define TPMSEAL_SECRET "password" #define TPMSEAL_IV "IBM SEALIBM SEAL" #endif