commit 5885e489b0a115773df9e9b23dd862d2744cabc8
Author: Jan Pašek <janpasek97@gmail.com>
Date:   Fri Apr 16 19:32:52 2021 +0200

    Re #8583 - Loading screen and error reaction in certificate.html

diff --git a/static/certificate.html b/static/certificate.html
index e423554..b6d71c8 100644
--- a/static/certificate.html
+++ b/static/certificate.html
@@ -4,186 +4,202 @@
     <meta charset="UTF-8">
     <title>X.509 Certificate Management</title>
     <link rel="stylesheet" href="/static/css/bootstrap.min.css">
+    <link href="https://cdn.jsdelivr.net/npm/vue-loading-overlay@3/dist/vue-loading.css" rel="stylesheet">
     <link rel="stylesheet" href="/static/css/app.css">
 </head>
 <body class="p-4">
     <div id="certificate-detailed-view-content" class="p-4">
-        <div class="row">
-            <a href="/static/index.html"><div class="caret-left font-weight-bold ml-2 mb-2">Home</div></a>
+        <div v-if="loading">
+            <loading :active.sync="loading"
+                     :can-cancel="false"
+                      loader="dots"
+                     :is-full-page="true"></loading>
         </div>
-        <h1 class="mb-5 text-center">Certificate Detailed View</h1>
-        <div class="alert alert-success" v-if="successMessage !== ''" role="alert" v-cloak>
-            {{ successMessage }}
-        </div>
-        <div v-if="errorMessage !== ''" class="alert alert-danger" v-cloak role="alert">
-            {{ errorMessage }}
+        <div id="404_page" v-if="!loading && error" align="center" v-cloak>
+            <div class="fof">
+                    <h1>Error 404</h1>
+            </div>
+            <a href="/" class="caret-left">Home</a>
         </div>
-        <div class="row">
-            <div class="col-xl-6">
-                <table class="ml-auto mr-auto mb-4">
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="validity_start">Validity start:</label></td>
-                            <td class="pl-3">
-                                <input :value="startDate" type="text" id="validity_start" name="validity_start" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="validity_end">Validity end:</label></td>
-                            <td class="pl-3">
-                                <input :value="endDate" type="text" id="validity_end" name="validity_end" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <td colspan="2"><h5>Subject</h5></td>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_C">Country Code:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.C" type="text" id="subject_C" name="subject_C" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_ST">Province/State:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.ST" type="text" id="subject_ST" name="subject_ST" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_L">Locality:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.L" type="text" id="subject_L" name="subject_L" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_CN">Common Name:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.CN" type="text" id="subject_CN" name="subject_CN" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_O">Organization:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.O" type="text" id="subject_O" name="subject_O" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_OU">Organization Unit:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.OU" type="text" id="subject_OU" name="subject_OU" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <div class="form-group">
-                            <td><label for="subject_emailAddress">Email Address:</label></td>
-                            <td class="pl-3">
-                                <input :value="certificate.subject.emailAddress" type="text" id="subject_emailAddress" name="subject_emailAddress" class="form-control" disabled>
-                            </td>
-                        </div>
-                    </tr>
-                    <tr>
-                        <td>Usage:</td>
-                        <td class="form-check">
-                            <input class="form-check-input" v-model="certificate.usage.CA" type="checkbox" id="isCA" name="isCA" value="CA" disabled>
-                            <label class="form-check-label" for="isCA">CA</label><br>
+        <div v-if="!loading && !error" v-cloak>
+            <div class="row">
+                <a href="/static/index.html"><div class="caret-left font-weight-bold ml-2 mb-2">Home</div></a>
+            </div>
+            <h1 class="mb-5 text-center">Certificate Detailed View</h1>
+            <div class="alert alert-success" v-if="successMessage !== ''" role="alert" v-cloak>
+                {{ successMessage }}
+            </div>
+            <div v-if="errorMessage !== ''" class="alert alert-danger" v-cloak role="alert">
+                {{ errorMessage }}
+            </div>
+            <div class="row">
+                <div class="col-xl-6">
+                    <table class="ml-auto mr-auto mb-4">
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="validity_start">Validity start:</label></td>
+                                <td class="pl-3">
+                                    <input :value="startDate" type="text" id="validity_start" name="validity_start" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="validity_end">Validity end:</label></td>
+                                <td class="pl-3">
+                                    <input :value="endDate" type="text" id="validity_end" name="validity_end" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <td colspan="2"><h5>Subject</h5></td>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_C">Country Code:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.C" type="text" id="subject_C" name="subject_C" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_ST">Province/State:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.ST" type="text" id="subject_ST" name="subject_ST" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_L">Locality:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.L" type="text" id="subject_L" name="subject_L" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_CN">Common Name:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.CN" type="text" id="subject_CN" name="subject_CN" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_O">Organization:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.O" type="text" id="subject_O" name="subject_O" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_OU">Organization Unit:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.OU" type="text" id="subject_OU" name="subject_OU" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <div class="form-group">
+                                <td><label for="subject_emailAddress">Email Address:</label></td>
+                                <td class="pl-3">
+                                    <input :value="certificate.subject.emailAddress" type="text" id="subject_emailAddress" name="subject_emailAddress" class="form-control" disabled>
+                                </td>
+                            </div>
+                        </tr>
+                        <tr>
+                            <td>Usage:</td>
+                            <td class="form-check">
+                                <input class="form-check-input" v-model="certificate.usage.CA" type="checkbox" id="isCA" name="isCA" value="CA" disabled>
+                                <label class="form-check-label" for="isCA">CA</label><br>
 
-                            <input class="form-check-input" v-model="certificate.usage.digitalSignature" type="checkbox" id="isDigitalSignature" name="isDigitalSignature" value="DigitalSignature" disabled>
-                            <label class="form-check-label" for="isDigitalSignature">Digital Signature</label><br>
+                                <input class="form-check-input" v-model="certificate.usage.digitalSignature" type="checkbox" id="isDigitalSignature" name="isDigitalSignature" value="DigitalSignature" disabled>
+                                <label class="form-check-label" for="isDigitalSignature">Digital Signature</label><br>
 
-                            <input class="form-check-input" v-model="certificate.usage.authentication" type="checkbox" id="isAuthentication" name="isAuthentication" value="Authentication" disabled>
-                            <label class="form-check-label" for="isAuthentication">Authentication</label><br>
+                                <input class="form-check-input" v-model="certificate.usage.authentication" type="checkbox" id="isAuthentication" name="isAuthentication" value="Authentication" disabled>
+                                <label class="form-check-label" for="isAuthentication">Authentication</label><br>
 
-                            <input class="form-check-input" v-model="certificate.usage.SSL" type="checkbox" id="isSSL_TLS" name="isSSL_TLS" value="SSL_TLS" disabled>
-                            <label class="form-check-label" for="isSSL_TLS">SSL/TLS</label><br>
-                        </td>
-                    </tr>
-                </table>
-            </div>
-            <div class="col-xl-5">
-                <div class="row table-responsive">
-                    <table class="table table-striped">
-                        <thead class="thead-dark">
-                            <tr>
-                                <th colspan="4" class="text-center">Manage certificate</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr class="d-flex">
-                                <td style="width: 30%" class="font-weight-bold">Certificate download:</td>
-                                <td><a v-on:click="onCertificateDownload()" class="btn btn-primary btn-sm certificate-control" href="">Certificate</a></td>
-                                <td><a v-on:click="onChainDownload()" class="btn btn-primary btn-sm certificate-control" href="">Chain of trust</a></td>
-                                <td><a v-on:click="onRootDownload()" class="btn btn-primary btn-sm certificate-control" href="">Root</a></td>
-                            </tr>
-                            <tr class="d-flex">
-                                <td style="width: 30%" class="font-weight-bold">Key download:</td>
-                                <td><a v-on:click="onPublicKeyDownload()" class="btn btn-success btn-sm certificate-control" href="">Public key</a></td>
-                                <td><a v-on:click="onPrivateKeyDownload()" class="btn btn-success btn-sm certificate-control" href="">Private key</a></td>
-                                <td> </td>
-                            </tr>
-                            <tr class="d-flex">
-                                <td style="width: 30%" class="font-weight-bold">Actions:</td>
-                                <td><a v-on:click="onDelete()" class="btn btn-danger btn-sm certificate-control" href="">Delete</a></td>
-                                <td><a v-on:click="onRevoke()" class="btn btn-warning btn-sm certificate-control" href="">Revoke</a></td>
-                                <td> </td>
-                            </tr>
-                            <tr class="d-flex">
-                                <td style="width: 30%" class="font-weight-bold">Endpoints:</td>
-                                <td><a class="certificate-control font-weight-bold" :href="crlEndpoint">CRL</a></td>
-                                <td><a class="certificate-control font-weight-bold" :href="ocspEndpoint">OCSP</a></td>
-                                <td> </td>
-                            </tr>
-                            <tr class="d-flex" v-if="id != certificate.CA">
-                                <td style="width: 30%" class="font-weight-bold">Issuer:</td>
-                                <td><a class="certificate-control font-weight-bold" :href="issuerURL">show details</a></td>
-                                <td> </td>
-                                <td> </td>
-                            </tr>
-                        </tbody>
+                                <input class="form-check-input" v-model="certificate.usage.SSL" type="checkbox" id="isSSL_TLS" name="isSSL_TLS" value="SSL_TLS" disabled>
+                                <label class="form-check-label" for="isSSL_TLS">SSL/TLS</label><br>
+                            </td>
+                        </tr>
                     </table>
                 </div>
-                <div class="row table-responsive">
-                    <table class="table table-striped table-hover">
-                        <thead class="thead-dark text-center">
-                            <tr>
-                                <th scope="col" colspan="2">Issued Certificates</th>
-                            </tr>
-                            <tr>
-                                <th class="w-65" scope="col">Common Name</th>
-                                <th class="w-35" scope="col">Type</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr>
-                                <td>&ltsome_certificate_name&gt</td>
-                                <td>&lttype&gt</td>
-                            </tr>
-                            <tr>
-                                <td>&ltsome_certificate_long_name&gt</td>
-                                <td>&ltCA&gt</td>
-                            </tr>
-                        </tbody>
-                    </table>
+                <div class="col-xl-5">
+                    <div class="row table-responsive">
+                        <table class="table table-striped">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th colspan="4" class="text-center">Manage certificate</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr class="d-flex">
+                                    <td style="width: 30%" class="font-weight-bold">Certificate download:</td>
+                                    <td><a v-on:click="onCertificateDownload()" class="btn btn-primary btn-sm certificate-control" href="">Certificate</a></td>
+                                    <td><a v-on:click="onChainDownload()" class="btn btn-primary btn-sm certificate-control" href="">Chain of trust</a></td>
+                                    <td><a v-on:click="onRootDownload()" class="btn btn-primary btn-sm certificate-control" href="">Root</a></td>
+                                </tr>
+                                <tr class="d-flex">
+                                    <td style="width: 30%" class="font-weight-bold">Key download:</td>
+                                    <td><a v-on:click="onPublicKeyDownload()" class="btn btn-success btn-sm certificate-control" href="">Public key</a></td>
+                                    <td><a v-on:click="onPrivateKeyDownload()" class="btn btn-success btn-sm certificate-control" href="">Private key</a></td>
+                                    <td> </td>
+                                </tr>
+                                <tr class="d-flex">
+                                    <td style="width: 30%" class="font-weight-bold">Actions:</td>
+                                    <td><a v-on:click="onDelete()" class="btn btn-danger btn-sm certificate-control" href="">Delete</a></td>
+                                    <td><a v-on:click="onRevoke()" class="btn btn-warning btn-sm certificate-control" href="">Revoke</a></td>
+                                    <td> </td>
+                                </tr>
+                                <tr class="d-flex">
+                                    <td style="width: 30%" class="font-weight-bold">Endpoints:</td>
+                                    <td><a class="certificate-control font-weight-bold" :href="crlEndpoint">CRL</a></td>
+                                    <td><a class="certificate-control font-weight-bold" :href="ocspEndpoint">OCSP</a></td>
+                                    <td> </td>
+                                </tr>
+                                <tr class="d-flex" v-if="id != certificate.CA">
+                                    <td style="width: 30%" class="font-weight-bold">Issuer:</td>
+                                    <td><a class="certificate-control font-weight-bold" :href="issuerURL">show details</a></td>
+                                    <td> </td>
+                                    <td> </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="row table-responsive">
+                        <table class="table table-striped table-hover">
+                            <thead class="thead-dark text-center">
+                                <tr>
+                                    <th scope="col" colspan="2">Issued Certificates</th>
+                                </tr>
+                                <tr>
+                                    <th class="w-65" scope="col">Common Name</th>
+                                    <th class="w-35" scope="col">Type</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>&ltsome_certificate_name&gt</td>
+                                    <td>&lttype&gt</td>
+                                </tr>
+                                <tr>
+                                    <td>&ltsome_certificate_long_name&gt</td>
+                                    <td>&ltCA&gt</td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
                 </div>
             </div>
         </div>
     </div>
 
     <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/vue-loading-overlay@3"></script>
     <script src="/static/js/jquery-3.6.0.min.js"></script>
     <script src="/static/js/bootstrap.bundle.min.js"></script>
     <script src="/static/js/axios.min.js"></script>
diff --git a/static/css/app.css b/static/css/app.css
index cebcd37..eca8d06 100644
--- a/static/css/app.css
+++ b/static/css/app.css
@@ -44,4 +44,29 @@
     -ms-transform: rotate(180deg); /* IE 9 */
     -webkit-transform: rotate(180deg); /* Safari */'
     transform: rotate(180deg);
+}
+
+/*404 page*/
+#404_page{
+    display: table;
+    width: 100%;
+    height: 100vh;
+    text-align: center;
+}
+
+.fof{
+	  display: table-cell;
+	  vertical-align: middle;
+}
+
+.fof h1{
+	  font-size: 50px;
+	  display: inline-block;
+	  padding-right: 12px;
+	  animation: type .5s alternate infinite;
+}
+
+@keyframes type{
+	  from{box-shadow: inset -3px 0px 0px #888;}
+	  to{box-shadow: inset -3px 0px 0px transparent;}
 }
\ No newline at end of file
diff --git a/static/index.html b/static/index.html
index 704cbf1..c2d5c7a 100644
--- a/static/index.html
+++ b/static/index.html
@@ -5,40 +5,49 @@
     <title>X.509 Certificate Management</title>
     <link rel="stylesheet" href="/static/css/app.css">
     <link rel="stylesheet" href="/static/css/bootstrap.min.css">
+    <link href="https://cdn.jsdelivr.net/npm/vue-loading-overlay@3/dist/vue-loading.css" rel="stylesheet">
 </head>
 <body>
     <div id="certificateListingPage" class="p-4">
-        <div>
-            <h1 class="ml-2 d-inline-block">Certificate Listing</h1>
-            <a class="btn btn-success ml-4 mb-3" href="/static/create_certificate.html">Create certificate</a>
+        <div v-if="loading">
+            <loading :active.sync="loading"
+                     :can-cancel="false"
+                      loader="dots"
+                     :is-full-page="true"></loading>
         </div>
-        <div class="alert alert-success" v-if="successMessage !== ''" role="alert" v-cloak>
-            {{ successMessage }}
+        <div v-if="!loading" v-cloak>
+            <div>
+                <h1 class="ml-2 d-inline-block">Certificate Listing</h1>
+                <a class="btn btn-success ml-4 mb-3" href="/static/create_certificate.html">Create certificate</a>
+            </div>
+            <div class="alert alert-success" v-if="successMessage !== ''" role="alert" v-cloak>
+                {{ successMessage }}
+            </div>
+            <table class="table table-striped table-hover text-center">
+                <thead class="thead-dark">
+                    <tr>
+                        <th class="align-middle" scope="col" rowspan="2">Common name</th>
+                        <th class="align-middle" scope="col" colspan="2">Validity</th>
+                        <th class="align-middle" scope="col" rowspan="2">Usage</th>
+                        <th class="align-middle" scope="col" rowspan="2">Certificate</th>
+                        <th class="align-middle" scope="col" rowspan="2">Issuer</th>
+                    </tr>
+                    <tr>
+                        <th scope="col">Start</th>
+                        <th scope="col">End</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr is="certificate-item"
+                        v-for="certificate in certificates"
+                        v-bind:certificate="certificate"
+                        v-bind:key="certificate.id">
+                    </tr>
+                </tbody>
+            </table>
         </div>
-        <table class="table table-striped table-hover text-center">
-            <thead class="thead-dark">
-                <tr>
-                    <th class="align-middle" scope="col" rowspan="2">Common name</th>
-                    <th class="align-middle" scope="col" colspan="2">Validity</th>
-                    <th class="align-middle" scope="col" rowspan="2">Usage</th>
-                    <th class="align-middle" scope="col" rowspan="2">Certificate</th>
-                    <th class="align-middle" scope="col" rowspan="2">Issuer</th>
-                </tr>
-                <tr>
-                    <th scope="col">Start</th>
-                    <th scope="col">End</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr is="certificate-item"
-                    v-for="certificate in certificates"
-                    v-bind:certificate="certificate"
-                    v-bind:key="certificate.id">
-                </tr>
-            </tbody>
-        </table>
     </div>
-
+    <script src="https://cdn.jsdelivr.net/npm/vue-loading-overlay@3"></script>
     <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
     <script src="/static/js/jquery-3.6.0.min.js"></script>
     <script src="/static/js/bootstrap.bundle.min.js"></script>
diff --git a/static/js/certificate.js b/static/js/certificate.js
index 9ea4ef5..5b2d548 100644
--- a/static/js/certificate.js
+++ b/static/js/certificate.js
@@ -1,7 +1,12 @@
+    Vue.use(VueLoading);
+    Vue.component('loading', VueLoading)
+
 
     var certificateDetailsApp = new Vue({
         el: "#certificate-detailed-view-content",
         data: {
+            loading: true,
+            error: false,
             id: null,
             certificate: {
                 subject: {
@@ -74,24 +79,41 @@
     // get details of the selected certificate
     const params = window.location.search;
     if (params !== "") {
+        // get requested ID
         const urlParams = new URLSearchParams(params);
         if (urlParams.get("id") != null) {
             const id = urlParams.get("id");
             certificateDetailsApp.id = id;
+            // query certificate detailes
             axios.get(API_URL + "certificates/"+id+"/details")
                 .then(function (response) {
-                    if (response.data["success"])
+                    if (response.data["success"]) {
+                        // display certificate
                         certificateDetailsApp.certificate = response.data["data"];
+                        certificateDetailsApp.loading = false;
+                        certificateDetailsApp.error = false;
+                    }
+                    else {
+                        // certificate does not exists
+                        console.error("Required certificate does not exists");
+                        certificateDetailsApp.loading = false;
+                        certificateDetailsApp.error = true;
+                    }
                 })
                 .catch(function (error) {
-                    alert("There should be some error reaction");
-                    // TODO error reaction -> display fault window
+                    // server error
+                    console.error(error);
+                    certificateDetailsApp.loading = false;
+                    certificateDetailsApp.error = true;
                 });
         } else {
-            alert("There should be some error reaction");
-            // TODO error reaction -> display fault window
+            // id was not provided as a URL parameter
+            console.error("URL does not contain 'id' parameter")
+            certificateDetailsApp.loading = false;
+            certificateDetailsApp.error = true;
         }
     } else {
-        alert("There should be some error reaction");
-        // TODO error reaction -> display fault window
-    }
\ No newline at end of file
+        console.error("URL does not contain 'id' parameter")
+        certificateDetailsApp.loading = false;
+        certificateDetailsApp.error = true;
+    }
diff --git a/static/js/index.js b/static/js/index.js
index b0f1533..1139a00 100644
--- a/static/js/index.js
+++ b/static/js/index.js
@@ -1,8 +1,11 @@
+    Vue.use(VueLoading);
+    Vue.component('loading', VueLoading)
 
     // certificate listing app VUE instance
     var certificateListingApp = new Vue({
         el: "#certificateListingPage",
         data: {
+            loading: true,
             // list of all certificates to be displayed in the list
             certificates: [],
             successMessage: ''
@@ -30,9 +33,12 @@
     // download a list of all available certificates and display them in the table
     axios.get(API_URL + "certificates")
         .then(function (response) {
-            if (response.data["success"])
+            if (response.data["success"]) {
                 response.data["data"].forEach(item => certificateListingApp.certificates.push(item))
+            }
+            certificateListingApp.loading = false;
         })
         .catch(function (error) {
             console.log(error);
+            certificateListingApp.loading = false;
         });
\ No newline at end of file
