]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfig.vfr
1. Remove “Force clear PK” feature in AuthVarialbe driver.
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / SecureBootConfigDxe / SecureBootConfig.vfr
index fbf5e2eae1a743d85c7f9ad433afb1dbf0de220f..22c03c1288b72a04ad31619495d76fc65e6d674c 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   VFR file used by the SecureBoot configuration component.\r
 \r
-Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials \r
 are licensed and made available under the terms and conditions of the BSD License \r
 which accompanies this distribution.  The full text of the license may be found at \r
@@ -24,26 +24,471 @@ formset
     varid = SECUREBOOT_CONFIGURATION_VARSTORE_ID,\r
     name  = SECUREBOOT_CONFIGURATION,\r
     guid  = SECUREBOOT_CONFIG_FORM_SET_GUID;\r
-\r
+  \r
+  //\r
+  // ##1 Form "Secure Boot Configuration"\r
+  //\r
   form formid = SECUREBOOT_CONFIGURATION_FORM_ID,\r
     title = STRING_TOKEN(STR_SECUREBOOT_TITLE);\r
 \r
     subtitle text = STRING_TOKEN(STR_NULL);\r
-\r
+    \r
+    //\r
+    // Define of Check Box: Attempt Secure Boot\r
+    //\r
     suppressif TRUE;\r
       checkbox varid   = SECUREBOOT_CONFIGURATION.HideSecureBoot,\r
               prompt   = STRING_TOKEN(STR_NULL),\r
               help     = STRING_TOKEN(STR_NULL),\r
       endcheckbox;\r
-    endif;\r
+    endif;  \r
     \r
+    //\r
+    // Display of Check Box: Attempt Secure Boot\r
+    //\r
     grayoutif ideqval SECUREBOOT_CONFIGURATION.HideSecureBoot == 1;\r
     checkbox varid = SECUREBOOT_CONFIGURATION.SecureBootState,\r
           questionid = KEY_SECURE_BOOT_ENABLE,\r
           prompt = STRING_TOKEN(STR_SECURE_BOOT_PROMPT),\r
           help   = STRING_TOKEN(STR_SECURE_BOOT_HELP),\r
+          flags  = INTERACTIVE,\r
+    endcheckbox;\r
+    endif;\r
+    \r
+    //\r
+    // Display of Oneof: 'Secure Boot Mode'\r
+    //\r
+    oneof varid  = SECUREBOOT_CONFIGURATION.SecureBootMode,\r
+          questionid = KEY_SECURE_BOOT_MODE,      \r
+          prompt = STRING_TOKEN(STR_SECURE_BOOT_MODE_PROMPT),\r
+          help   = STRING_TOKEN(STR_SECURE_BOOT_MODE_HELP),\r
+          flags  = INTERACTIVE,\r
+          option text = STRING_TOKEN(STR_STANDARD_MODE),    value = SECURE_BOOT_MODE_STANDARD, flags = DEFAULT;\r
+          option text = STRING_TOKEN(STR_CUSTOM_MODE),      value = SECURE_BOOT_MODE_CUSTOM,   flags = 0;\r
+    endoneof;\r
+    \r
+    //\r
+    //\r
+    // Display of 'Current Secure Boot Mode'\r
+    //\r
+    suppressif ideqval SECUREBOOT_CONFIGURATION.SecureBootMode == SECURE_BOOT_MODE_STANDARD;\r
+      grayoutif NOT ideqval SECUREBOOT_CONFIGURATION.PhysicalPresent == 1;\r
+      goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+           prompt = STRING_TOKEN(STR_SECURE_BOOT_OPTION),\r
+           help   = STRING_TOKEN(STR_SECURE_BOOT_OPTION_HELP),\r
+           flags  = INTERACTIVE,\r
+           key    = KEY_SECURE_BOOT_OPTION;\r
+      endif;\r
+    endif;\r
+  endform;\r
+  \r
+  //\r
+  // ##2 Form: 'Custom Secure Boot Options'\r
+  //\r
+  form formid = FORMID_SECURE_BOOT_OPTION_FORM,\r
+    title  = STRING_TOKEN(STR_SECURE_BOOT_OPTION_TITLE);\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+    goto FORMID_SECURE_BOOT_PK_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_PK_OPTION),\r
+         help   = STRING_TOKEN(STR_SECURE_BOOT_PK_OPTION_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_SECURE_BOOT_PK_OPTION;\r
+        \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+    goto FORMID_SECURE_BOOT_KEK_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_KEK_OPTION),\r
+         help   = STRING_TOKEN(STR_SECURE_BOOT_KEK_OPTION_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_SECURE_BOOT_KEK_OPTION;\r
+        \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+    goto FORMID_SECURE_BOOT_DB_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_DB_OPTION),\r
+         help   = STRING_TOKEN(STR_SECURE_BOOT_DB_OPTION_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_SECURE_BOOT_DB_OPTION;\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+    goto FORMID_SECURE_BOOT_DBX_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_DBX_OPTION),\r
+         help   = STRING_TOKEN(STR_SECURE_BOOT_DBX_OPTION_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_SECURE_BOOT_DBX_OPTION;\r
+\r
+  endform;\r
+  \r
+  //\r
+  // ##3 Form: 'PK Options'\r
+  //\r
+  form formid = FORMID_SECURE_BOOT_PK_OPTION_FORM,\r
+    title  = STRING_TOKEN(STR_SECURE_BOOT_PK_OPTION);\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+    //\r
+    // Define of Check Box: 'Delete PK'\r
+    //\r
+    suppressif TRUE;\r
+      checkbox varid   = SECUREBOOT_CONFIGURATION.DeletePk,\r
+               prompt   = STRING_TOKEN(STR_NULL),\r
+               help     = STRING_TOKEN(STR_NULL),\r
+      endcheckbox;\r
+    endif;\r
+    \r
+    grayoutif ideqval SECUREBOOT_CONFIGURATION.HasPk == 1;\r
+    goto FORMID_ENROLL_PK_FORM,\r
+         prompt = STRING_TOKEN(STR_ENROLL_PK),\r
+         help   = STRING_TOKEN(STR_ENROLL_PK_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_ENROLL_PK;\r
+    endif;\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+   \r
+    //\r
+    // Display of Check Box: 'Delete Pk' \r
+    //\r
+    grayoutif ideqval SECUREBOOT_CONFIGURATION.HideSecureBoot == 1;\r
+    checkbox varid = SECUREBOOT_CONFIGURATION.DeletePk,\r
+          questionid = KEY_SECURE_BOOT_DELETE_PK,\r
+          prompt = STRING_TOKEN(STR_DELETE_PK),          \r
+          help   = STRING_TOKEN(STR_DELETE_PK_HELP),\r
+          flags  = INTERACTIVE,\r
     endcheckbox;\r
     endif;\r
+  endform;\r
+  \r
+  //\r
+  // ##4 Form: 'Enroll PK'\r
+  //\r
+  form formid = FORMID_ENROLL_PK_FORM,\r
+    title  = STRING_TOKEN(STR_ENROLL_PK);\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORM_FILE_EXPLORER_ID_PK,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_ENROLL_PK_FILE),\r
+         help = STRING_TOKEN(STR_SECURE_BOOT_ENROLL_PK_FILE),\r
+         flags = INTERACTIVE,\r
+         key = SECUREBOOT_ADD_PK_FILE_FORM_ID;\r
+  endform;\r
+  \r
+  //\r
+  // ##5 Form: 'KEK Options'\r
+  //\r
+  form formid = FORMID_SECURE_BOOT_KEK_OPTION_FORM,\r
+    title  = STRING_TOKEN(STR_SECURE_BOOT_KEK_OPTION);\r
+\r
+    //\r
+    // Display of 'Enroll KEK' \r
+    //\r
+    goto FORMID_ENROLL_KEK_FORM,\r
+         prompt = STRING_TOKEN(STR_ENROLL_KEK),\r
+         help   = STRING_TOKEN(STR_ENROLL_KEK_HELP),\r
+         flags  = INTERACTIVE;\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);     \r
+   \r
+    //\r
+    // Display of 'Delete KEK' \r
+    //\r
+    goto FORMID_DELETE_KEK_FORM,\r
+         prompt = STRING_TOKEN(STR_DELETE_KEK),\r
+         help   = STRING_TOKEN(STR_DELETE_KEK_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_DELETE_KEK;\r
+  \r
+    subtitle text = STRING_TOKEN(STR_NULL);    \r
+  endform;\r
+\r
+  //\r
+  // ##6 Form: 'Enroll KEK' \r
+  //\r
+  form formid = FORMID_ENROLL_KEK_FORM,\r
+    title = STRING_TOKEN(STR_ENROLL_KEK_TITLE);\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORM_FILE_EXPLORER_ID_KEK,\r
+         prompt = STRING_TOKEN(STR_FORM_ENROLL_KEK_FROM_FILE_TITLE),\r
+         help   = STRING_TOKEN(STR_FORM_ENROLL_KEK_FROM_FILE_TITLE_HELP),\r
+         flags  = INTERACTIVE,\r
+         key    = FORMID_ENROLL_KEK_FORM;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    label FORMID_ENROLL_KEK_FORM;\r
+    label LABEL_END;\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    string  varid   = SECUREBOOT_CONFIGURATION.SignatureGuid,\r
+            prompt  = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID),\r
+            help    = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID_HELP),\r
+            flags   = INTERACTIVE,\r
+            key     = KEY_SECURE_BOOT_KEK_GUID,\r
+            minsize = SECURE_BOOT_GUID_SIZE,\r
+            maxsize = SECURE_BOOT_GUID_SIZE,\r
+    endstring;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+      prompt = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+      help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+      flags  = INTERACTIVE,\r
+      key    = KEY_VALUE_SAVE_AND_EXIT_KEK;\r
\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+      prompt = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+      help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+      flags  = INTERACTIVE,\r
+      key    = KEY_VALUE_NO_SAVE_AND_EXIT_KEK;\r
+\r
+  endform;\r
+\r
+  //\r
+  // ##7 Form: 'Delete KEK'\r
+  //  \r
+  form formid = FORMID_DELETE_KEK_FORM,\r
+    title  = STRING_TOKEN(STR_DELETE_KEK_TITLE);\r
+\r
+    label LABEL_KEK_DELETE;\r
+    label LABEL_END;\r
+         \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+  endform;\r
+\r
+  //\r
+  // ##8 Form: 'DB Options'\r
+  //\r
+  form formid = FORMID_SECURE_BOOT_DB_OPTION_FORM,\r
+    title = STRING_TOKEN(STR_SECURE_BOOT_DB_OPTION);\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto SECUREBOOT_ENROLL_SIGNATURE_TO_DB,\r
+    prompt = STRING_TOKEN (STR_SECURE_BOOT_ENROLL_SIGNATURE),\r
+    help   = STRING_TOKEN (STR_SECURE_BOOT_ENROLL_SIGNATURE),\r
+    flags  = 0;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto SECUREBOOT_DELETE_SIGNATURE_FROM_DB,\r
+    prompt = STRING_TOKEN (STR_SECURE_BOOT_DELETE_SIGNATURE),\r
+    help   = STRING_TOKEN (STR_SECURE_BOOT_DELETE_SIGNATURE),\r
+    flags  = INTERACTIVE,\r
+    key    = SECUREBOOT_DELETE_SIGNATURE_FROM_DB;\r
+    \r
+  endform;\r
+\r
+  //\r
+  // ##9 Form: 'DBX Options'\r
+  //\r
+  form formid = FORMID_SECURE_BOOT_DBX_OPTION_FORM,\r
+    title = STRING_TOKEN(STR_SECURE_BOOT_DBX_OPTION);\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto SECUREBOOT_ENROLL_SIGNATURE_TO_DBX,\r
+    prompt = STRING_TOKEN (STR_SECURE_BOOT_ENROLL_SIGNATURE),\r
+    help   = STRING_TOKEN (STR_SECURE_BOOT_ENROLL_SIGNATURE),\r
+    flags  = 0;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto SECUREBOOT_DELETE_SIGNATURE_FROM_DBX,\r
+    prompt = STRING_TOKEN (STR_SECURE_BOOT_DELETE_SIGNATURE),\r
+    help   = STRING_TOKEN (STR_SECURE_BOOT_DELETE_SIGNATURE),\r
+    flags  = INTERACTIVE,\r
+    key    = SECUREBOOT_DELETE_SIGNATURE_FROM_DBX;\r
+\r
+  endform;\r
+\r
+  //\r
+  // Form: 'Delete Signature' for DB Options.\r
+  //\r
+  form formid = SECUREBOOT_DELETE_SIGNATURE_FROM_DB,\r
+    title  = STRING_TOKEN(STR_SECURE_BOOT_DELETE_SIGNATURE);\r
+\r
+    label LABEL_DB_DELETE;\r
+    label LABEL_END;\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+  endform;\r
+\r
+  //\r
+  // Form: 'Delete Signature' for DBX Options.\r
+  //\r
+  form formid = SECUREBOOT_DELETE_SIGNATURE_FROM_DBX,\r
+    title  = STRING_TOKEN(STR_SECURE_BOOT_DELETE_SIGNATURE);\r
+\r
+    label LABEL_DBX_DELETE;\r
+    label LABEL_END;\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    \r
+  endform;\r
+\r
+  //\r
+  // Form: 'Enroll Signature' for DB options.\r
+  //\r
+  form formid = SECUREBOOT_ENROLL_SIGNATURE_TO_DB,\r
+    title = STRING_TOKEN(STR_SECURE_BOOT_ENROLL_SIGNATURE);\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORM_FILE_EXPLORER_ID_DB,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_ADD_SIGNATURE_FILE),\r
+         help = STRING_TOKEN(STR_SECURE_BOOT_ADD_SIGNATURE_FILE),\r
+         flags = INTERACTIVE,\r
+         key = SECUREBOOT_ENROLL_SIGNATURE_TO_DB;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    label SECUREBOOT_ENROLL_SIGNATURE_TO_DB;\r
+    label LABEL_END;\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    string  varid   = SECUREBOOT_CONFIGURATION.SignatureGuid,\r
+            prompt  = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID),\r
+            help    = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID_HELP),\r
+            flags   = INTERACTIVE,\r
+            key     = KEY_SECURE_BOOT_SIGNATURE_GUID_DB,\r
+            minsize = SECURE_BOOT_GUID_SIZE,\r
+            maxsize = SECURE_BOOT_GUID_SIZE,\r
+    endstring;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_SAVE_AND_EXIT_DB;\r
\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_NO_SAVE_AND_EXIT_DB;\r
+\r
+  endform;\r
+\r
+  //\r
+  // Form: 'Enroll Signature' for DBX options.\r
+  //\r
+  form formid = SECUREBOOT_ENROLL_SIGNATURE_TO_DBX,\r
+    title = STRING_TOKEN(STR_SECURE_BOOT_ENROLL_SIGNATURE);\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORM_FILE_EXPLORER_ID_DBX,\r
+         prompt = STRING_TOKEN(STR_SECURE_BOOT_ADD_SIGNATURE_FILE),\r
+         help = STRING_TOKEN(STR_SECURE_BOOT_ADD_SIGNATURE_FILE),\r
+         flags = INTERACTIVE,\r
+         key = SECUREBOOT_ENROLL_SIGNATURE_TO_DBX;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    label SECUREBOOT_ENROLL_SIGNATURE_TO_DBX;\r
+    label LABEL_END;\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    string  varid   = SECUREBOOT_CONFIGURATION.SignatureGuid,\r
+            prompt  = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID),\r
+            help    = STRING_TOKEN(STR_SECURE_BOOT_SIGNATURE_GUID_HELP),\r
+            flags   = INTERACTIVE,\r
+            key     = KEY_SECURE_BOOT_SIGNATURE_GUID_DBX,\r
+            minsize = SECURE_BOOT_GUID_SIZE,\r
+            maxsize = SECURE_BOOT_GUID_SIZE,\r
+    endstring;\r
+\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_SAVE_AND_EXIT_DBX;\r
\r
+    goto FORMID_SECURE_BOOT_OPTION_FORM,\r
+         prompt = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_NO_SAVE_AND_EXIT_DBX;\r
+\r
+  endform;\r
+\r
+  //\r
+  // File Explorer for PK\r
+  //\r
+  form formid = FORM_FILE_EXPLORER_ID_PK,\r
+       title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);\r
+\r
+       label FORM_FILE_EXPLORER_ID;\r
+       label LABEL_END;\r
+  endform;\r
+  \r
+  //\r
+  // File Explorer for KEK\r
+  //\r
+  form formid = FORM_FILE_EXPLORER_ID_KEK,\r
+       title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);\r
+\r
+       label FORM_FILE_EXPLORER_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  //\r
+  // File Explorer for DB\r
+  //\r
+  form formid = FORM_FILE_EXPLORER_ID_DB,\r
+       title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);\r
+\r
+       label FORM_FILE_EXPLORER_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+  //\r
+  // File Explorer for DBX\r
+  //\r
+  form formid = FORM_FILE_EXPLORER_ID_DBX,\r
+       title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);\r
+\r
+       label FORM_FILE_EXPLORER_ID;\r
+       label LABEL_END;\r
+  endform;\r
+\r
+\r
+  //\r
+  // Enroll Pk from File Commit Form\r
+  //\r
+  form formid = SECUREBOOT_ADD_PK_FILE_FORM_ID,\r
+    title = STRING_TOKEN(STR_SAVE_PK_FILE);\r
+\r
+    label SECUREBOOT_ADD_PK_FILE_FORM_ID;\r
+    label LABEL_END;\r
+    \r
+    subtitle text = STRING_TOKEN(STR_NULL);\r
+\r
+     text\r
+       help   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+       text   = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+       text   = STRING_TOKEN(STR_NULL),\r
+       flags  = INTERACTIVE,\r
+       key    = KEY_VALUE_SAVE_AND_EXIT_PK;\r
+\r
+     text\r
+       help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+       text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+       text   = STRING_TOKEN(STR_NULL),\r
+       flags  = INTERACTIVE,\r
+       key    = KEY_VALUE_NO_SAVE_AND_EXIT_PK;\r
 \r
   endform;\r
 \r