Scezui commited on
Commit
6df3c38
1 Parent(s): e43e91a

Added batch processing

Browse files
Files changed (35) hide show
  1. Layoutlmv3_inference/__init__.py +0 -0
  2. Layoutlmv3_inference/__pycache__/__init__.cpython-310.pyc +0 -0
  3. Layoutlmv3_inference/__pycache__/__init__.cpython-311.pyc +0 -0
  4. Layoutlmv3_inference/__pycache__/__init__.cpython-312.pyc +0 -0
  5. Layoutlmv3_inference/__pycache__/annotate_image.cpython-310.pyc +0 -0
  6. Layoutlmv3_inference/__pycache__/annotate_image.cpython-311.pyc +0 -0
  7. Layoutlmv3_inference/__pycache__/inference_handler.cpython-310.pyc +0 -0
  8. Layoutlmv3_inference/__pycache__/inference_handler.cpython-311.pyc +0 -0
  9. Layoutlmv3_inference/__pycache__/ocr.cpython-310.pyc +0 -0
  10. Layoutlmv3_inference/__pycache__/ocr.cpython-311.pyc +0 -0
  11. Layoutlmv3_inference/__pycache__/ocr.cpython-312.pyc +0 -0
  12. Layoutlmv3_inference/__pycache__/utils.cpython-310.pyc +0 -0
  13. Layoutlmv3_inference/__pycache__/utils.cpython-311.pyc +0 -0
  14. Layoutlmv3_inference/annotate_image.py +56 -0
  15. Layoutlmv3_inference/inference_handler.py +224 -0
  16. Layoutlmv3_inference/ocr.py +199 -0
  17. Layoutlmv3_inference/utils.py +50 -0
  18. app.py +250 -134
  19. inferenced/csv_files/Output_0.csv +4 -0
  20. inferenced/csv_files/Output_1.csv +2 -0
  21. inferenced/csv_files/Output_2.csv +3 -0
  22. inferenced/csv_files/Output_3.csv +2 -0
  23. inferenced/csv_files/Output_4.csv +2 -0
  24. inferenced/output.csv +9 -0
  25. inferenced/sample1_711_inference.jpg +0 -0
  26. inferenced/sample1_grace_inference.jpg +0 -0
  27. inferenced/sample_711_inference.jpg +0 -0
  28. inferenced/sample_coop_inference.jpg +0 -0
  29. inferenced/sample_grace_inference.jpg +0 -0
  30. log/error_output.log +255 -0
  31. static/css/style.css +1714 -1772
  32. static/js/site.js +71 -151
  33. static/js/slideshow.js +64 -0
  34. templates/extractor.html +180 -62
  35. templates/index.html +7 -7
Layoutlmv3_inference/__init__.py ADDED
File without changes
Layoutlmv3_inference/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (172 Bytes). View file
 
Layoutlmv3_inference/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (178 Bytes). View file
 
Layoutlmv3_inference/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (180 Bytes). View file
 
Layoutlmv3_inference/__pycache__/annotate_image.cpython-310.pyc ADDED
Binary file (2.03 kB). View file
 
Layoutlmv3_inference/__pycache__/annotate_image.cpython-311.pyc ADDED
Binary file (3.85 kB). View file
 
Layoutlmv3_inference/__pycache__/inference_handler.cpython-310.pyc ADDED
Binary file (6.88 kB). View file
 
Layoutlmv3_inference/__pycache__/inference_handler.cpython-311.pyc ADDED
Binary file (14 kB). View file
 
Layoutlmv3_inference/__pycache__/ocr.cpython-310.pyc ADDED
Binary file (5.05 kB). View file
 
Layoutlmv3_inference/__pycache__/ocr.cpython-311.pyc ADDED
Binary file (10.5 kB). View file
 
Layoutlmv3_inference/__pycache__/ocr.cpython-312.pyc ADDED
Binary file (5.24 kB). View file
 
Layoutlmv3_inference/__pycache__/utils.cpython-310.pyc ADDED
Binary file (2.4 kB). View file
 
Layoutlmv3_inference/__pycache__/utils.cpython-311.pyc ADDED
Binary file (3.83 kB). View file
 
Layoutlmv3_inference/annotate_image.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from PIL import Image, ImageDraw, ImageFont
3
+ from .utils import image_label_2_color
4
+
5
+
6
+ def get_flattened_output(docs):
7
+ print("Running Flattened Output")
8
+ flattened_output = []
9
+ annotation_key = 'output'
10
+ for doc in docs:
11
+ flattened_output_item = {annotation_key: []}
12
+ doc_annotation = doc[annotation_key]
13
+ for i, span in enumerate(doc_annotation):
14
+ if len(span['words']) > 1:
15
+ for span_chunk in span['words']:
16
+ flattened_output_item[annotation_key].append(
17
+ {
18
+ 'label': span['label'],
19
+ 'text': span_chunk['text'],
20
+ 'words': [span_chunk]
21
+ }
22
+ )
23
+
24
+ else:
25
+ flattened_output_item[annotation_key].append(span)
26
+ flattened_output.append(flattened_output_item)
27
+ return flattened_output
28
+
29
+
30
+ def annotate_image(image_path, annotation_object):
31
+ print("Annotating Images")
32
+ img = None
33
+ image = Image.open(image_path).convert('RGBA')
34
+ tmp = image.copy()
35
+ label2color = image_label_2_color(annotation_object)
36
+ overlay = Image.new('RGBA', tmp.size, (0, 0, 0)+(0,))
37
+ draw = ImageDraw.Draw(overlay)
38
+ font = ImageFont.load_default()
39
+
40
+ predictions = [span['label'] for span in annotation_object['output']]
41
+ boxes = [span['words'][0]['box'] for span in annotation_object['output']]
42
+ for prediction, box in zip(predictions, boxes):
43
+ draw.rectangle(box, outline=label2color[prediction],
44
+ width=3, fill=label2color[prediction]+(int(255*0.33),))
45
+ draw.text((box[0] + 10, box[1] - 10), text=prediction,
46
+ fill=label2color[prediction], font=font)
47
+
48
+ img = Image.alpha_composite(tmp, overlay)
49
+ img = img.convert("RGB")
50
+
51
+ image_name = os.path.basename(image_path)
52
+ image_name = image_name[:image_name.find('.')]
53
+ output_folder = 'inferenced/'
54
+ os.makedirs(output_folder, exist_ok=True)
55
+
56
+ img.save(os.path.join(output_folder, f'{image_name}_inference.jpg'))
Layoutlmv3_inference/inference_handler.py ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .utils import load_model,load_processor,normalize_box,compare_boxes,adjacent
2
+ from .annotate_image import get_flattened_output,annotate_image
3
+ from PIL import Image,ImageDraw, ImageFont
4
+ import logging
5
+ import torch
6
+ import json
7
+ import os
8
+
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class ModelHandler(object):
13
+ def __init__(self):
14
+ self.model = None
15
+ self.model_dir = None
16
+ self.device = 'cpu'
17
+ self.error = None
18
+ self.initialized = False
19
+ self._raw_input_data = None
20
+ self._processed_data = None
21
+ self._images_size = None
22
+ self.counter = 0
23
+
24
+
25
+ def initialize(self, context):
26
+ try:
27
+ logger.info("Loading transformer model")
28
+ self._context = context
29
+ properties = self._context
30
+ self.model_dir = properties.get("model_dir")
31
+ self.model = self.load(self.model_dir)
32
+ self.initialized = True
33
+ except Exception as e:
34
+ logger.error(f"Error initializing model: {str(e)}")
35
+ self.error = str(e)
36
+
37
+ def preprocess(self, batch):
38
+ try:
39
+ inference_dict = batch
40
+ self._raw_input_data = inference_dict
41
+ processor = load_processor()
42
+ images = [Image.open(path).convert("RGB")
43
+ for path in inference_dict['image_path']]
44
+ self._images_size = [img.size for img in images]
45
+ words = inference_dict['words']
46
+ boxes = [[normalize_box(box, images[i].size[0], images[i].size[1])
47
+ for box in doc] for i, doc in enumerate(inference_dict['bboxes'])]
48
+ encoded_inputs = processor(
49
+ images, words, boxes=boxes, return_tensors="pt", padding="max_length", truncation=True)
50
+ self._processed_data = encoded_inputs
51
+ return encoded_inputs
52
+ except Exception as e:
53
+ logger.error(f"Error in preprocessing: {str(e)}")
54
+ self.error = str(e)
55
+ return None
56
+
57
+ def load(self, model_dir):
58
+ try:
59
+ model = load_model(model_dir)
60
+ return model
61
+ except Exception as e:
62
+ logger.error(f"Error loading LayoutLMv3 model: {str(e)}")
63
+ self.error = str(e)
64
+ return None
65
+
66
+ def inference(self, model_input):
67
+ try:
68
+ with torch.no_grad():
69
+ inference_outputs = self.model(**model_input)
70
+ predictions = inference_outputs.logits.argmax(-1).tolist()
71
+ results = []
72
+ for i in range(len(predictions)):
73
+ tmp = dict()
74
+ tmp[f'output_{i}'] = predictions[i]
75
+ results.append(tmp)
76
+ return [results]
77
+ except Exception as e:
78
+ logger.error(f"Error in inference: {str(e)}")
79
+ self.error = str(e)
80
+ return None
81
+
82
+ def postprocess(self, inference_output):
83
+ try:
84
+ docs = []
85
+ k = 0
86
+ for page, doc_words in enumerate(self._raw_input_data['words']):
87
+ doc_list = []
88
+ width, height = self._images_size[page]
89
+ for i, doc_word in enumerate(doc_words, start=0):
90
+ word_tagging = None
91
+ word_labels = []
92
+ word = dict()
93
+ word['id'] = k
94
+ k += 1
95
+ word['text'] = doc_word
96
+ word['pageNum'] = page + 1
97
+ word['box'] = self._raw_input_data['bboxes'][page][i]
98
+ _normalized_box = normalize_box(
99
+ self._raw_input_data['bboxes'][page][i], width, height)
100
+ for j, box in enumerate(self._processed_data['bbox'].tolist()[page]):
101
+ if compare_boxes(box, _normalized_box):
102
+ if self.model.config.id2label[inference_output[0][page][f'output_{page}'][j]] != 'O':
103
+ word_labels.append(
104
+ self.model.config.id2label[inference_output[0][page][f'output_{page}'][j]][2:])
105
+ else:
106
+ word_labels.append('other')
107
+ if word_labels != []:
108
+ word_tagging = word_labels[0] if word_labels[0] != 'other' else word_labels[-1]
109
+ else:
110
+ word_tagging = 'other'
111
+ word['label'] = word_tagging
112
+ word['pageSize'] = {'width': width, 'height': height}
113
+ if word['label'] != 'other':
114
+ doc_list.append(word)
115
+ spans = []
116
+ def adjacents(entity): return [
117
+ adj for adj in doc_list if adjacent(entity, adj)]
118
+ output_test_tmp = doc_list[:]
119
+ for entity in doc_list:
120
+ if adjacents(entity) == []:
121
+ spans.append([entity])
122
+ output_test_tmp.remove(entity)
123
+
124
+ while output_test_tmp != []:
125
+ span = [output_test_tmp[0]]
126
+ output_test_tmp = output_test_tmp[1:]
127
+ while output_test_tmp != [] and adjacent(span[-1], output_test_tmp[0]):
128
+ span.append(output_test_tmp[0])
129
+ output_test_tmp.remove(output_test_tmp[0])
130
+ spans.append(span)
131
+
132
+ output_spans = []
133
+ for span in spans:
134
+ if len(span) == 1:
135
+ output_span = {"text": span[0]['text'],
136
+ "label": span[0]['label'],
137
+ "words": [{
138
+ 'id': span[0]['id'],
139
+ 'box': span[0]['box'],
140
+ 'text': span[0]['text']
141
+ }],
142
+ }
143
+ else:
144
+ output_span = {"text": ' '.join([entity['text'] for entity in span]),
145
+ "label": span[0]['label'],
146
+ "words": [{
147
+ 'id': entity['id'],
148
+ 'box': entity['box'],
149
+ 'text': entity['text']
150
+ } for entity in span]
151
+
152
+ }
153
+ output_spans.append(output_span)
154
+ docs.append({f'output': output_spans})
155
+ return [json.dumps(docs, ensure_ascii=False)]
156
+
157
+ except Exception as e:
158
+ logger.error(f"Error in postprocessing: {str(e)}")
159
+ self.error = str(e)
160
+ return None
161
+
162
+
163
+ def handle(self, data, context):
164
+ """
165
+ Call preprocess, inference, and post-process functions
166
+ :param data: input data
167
+ :param context: mms context
168
+ """
169
+ try:
170
+ if not self.initialized:
171
+ self.initialize(context)
172
+
173
+ if data is None:
174
+ return None
175
+
176
+ model_input = self.preprocess(data)
177
+ if model_input is None:
178
+ return None
179
+
180
+ model_out = self.inference(model_input)
181
+ if model_out is None:
182
+ return None
183
+
184
+ inference_out = self.postprocess(model_out)[0]
185
+
186
+ # # Write the original inference output to a JSON file
187
+ # with open('temp/LayoutlMV3InferenceOutput.json', 'w') as inf_out:
188
+ # inf_out.write(inference_out)
189
+
190
+ # Load the original inference output from the JSON file
191
+ inference_out_list = json.loads(inference_out)
192
+ flattened_output_list = get_flattened_output(inference_out_list)
193
+ print('Ready for Annotation')
194
+ for i, flattened_output in enumerate(flattened_output_list):
195
+ annotate_image(data['image_path'][i], flattened_output)
196
+
197
+ # Create the labeled directory if it doesn't exist
198
+ labeled_dir = 'static/temp/labeled'
199
+ os.makedirs(labeled_dir, exist_ok=True)
200
+
201
+ # Loop through the list and create a new file for each JSON object
202
+ for index, output_json in enumerate(inference_out_list):
203
+ # Generate a filename based on the index
204
+ output_filename = os.path.join(labeled_dir, f'Output_{index}.json')
205
+ # Write the JSON object to the file
206
+ with open(output_filename, 'w') as output_file:
207
+ json.dump(output_json, output_file)
208
+
209
+ except Exception as e:
210
+ logger.error(f"Error handling request: {str(e)}")
211
+ self.error = str(e)
212
+
213
+
214
+ _service = ModelHandler()
215
+
216
+
217
+ def handle(data, context):
218
+ if not _service.initialized:
219
+ _service.initialize(context)
220
+
221
+ if data is None:
222
+ return None
223
+
224
+ return _service.handle(data, context)
Layoutlmv3_inference/ocr.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ import cv2
4
+ import numpy as np
5
+ import json
6
+ import requests
7
+ import traceback
8
+ import tempfile
9
+
10
+ from PIL import Image
11
+
12
+ def preprocess_image(image_path, max_file_size_mb=1, target_file_size_mb=0.5):
13
+ try:
14
+ # Read the image
15
+ image = cv2.imread(image_path)
16
+ # Enhance text
17
+ enhanced = enhance_txt(image)
18
+
19
+ # Save the enhanced image to a temporary file
20
+ temp_file_path = tempfile.NamedTemporaryFile(suffix='.jpg').name
21
+ cv2.imwrite(temp_file_path, enhanced)
22
+
23
+ # Check file size of the temporary file
24
+ file_size_mb = os.path.getsize(temp_file_path) / (1024 * 1024) # Convert to megabytes
25
+
26
+ while file_size_mb > max_file_size_mb:
27
+ print(f"File size ({file_size_mb} MB) exceeds the maximum allowed size ({max_file_size_mb} MB). Resizing the image.")
28
+ ratio = np.sqrt(target_file_size_mb / file_size_mb)
29
+ new_width = int(image.shape[1] * ratio)
30
+ new_height = int(image.shape[0] * ratio)
31
+
32
+ # Resize the image
33
+ enhanced = cv2.resize(enhanced, (new_width, new_height))
34
+
35
+ # Save the resized image to a temporary file
36
+ temp_file_path = tempfile.NamedTemporaryFile(suffix='.jpg').name
37
+ cv2.imwrite(temp_file_path, enhanced)
38
+
39
+ # Update file size
40
+ file_size_mb = os.path.getsize(temp_file_path) / (1024 * 1024)
41
+ print(f"New file size: ({file_size_mb} MB)")
42
+
43
+ # Return the final resized image
44
+ image_resized = cv2.imread(temp_file_path)
45
+ return image_resized
46
+
47
+ except Exception as e:
48
+ print(f"An error occurred in preprocess_image: {str(e)}")
49
+ return None
50
+
51
+
52
+ def enhance_txt(img, intensity_increase=20, bilateral_filter_diameter=9, bilateral_filter_sigma_color=75, bilateral_filter_sigma_space=75):
53
+ # Get the width and height of the image
54
+ w = img.shape[1]
55
+ h = img.shape[0]
56
+ w1 = int(w * 0.05)
57
+ w2 = int(w * 0.95)
58
+ h1 = int(h * 0.05)
59
+ h2 = int(h * 0.95)
60
+ ROI = img[h1:h2, w1:w2] # 95% of the center of the image
61
+ threshold = np.mean(ROI) * 0.88 # % of average brightness
62
+
63
+ # Convert image to grayscale
64
+ grayscale_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
65
+
66
+ # Apply Gaussian blur
67
+ blurred = cv2.GaussianBlur(grayscale_img, (1, 1), 0)
68
+
69
+ edged = 255 - cv2.Canny(blurred, 100, 150, apertureSize=7)
70
+
71
+ # Increase intensity by adding a constant value
72
+ img = np.clip(img + intensity_increase, 0, 255).astype(np.uint8)
73
+
74
+ # Apply bilateral filter to reduce noise
75
+ img = cv2.bilateralFilter(img, bilateral_filter_diameter, bilateral_filter_sigma_color, bilateral_filter_sigma_space)
76
+
77
+ _, binary = cv2.threshold(blurred, threshold, 255, cv2.THRESH_BINARY)
78
+ return binary
79
+
80
+
81
+ def run_tesseract_on_preprocessed_image(preprocessed_image, image_path):
82
+ try:
83
+ image_name = os.path.basename(image_path)
84
+ image_name = image_name[:image_name.find('.')]
85
+
86
+ # Create the "temp" folder if it doesn't exist
87
+ temp_folder = "static/temp"
88
+ if not os.path.exists(temp_folder):
89
+ os.makedirs(temp_folder)
90
+
91
+ # Define the OCR API endpoint
92
+ url = "https://api.ocr.space/parse/image"
93
+
94
+ # Define the API key and the language
95
+ api_key = "K88232854988957" # Replace with your actual OCR Space API key
96
+ language = "eng"
97
+
98
+ # Save the preprocessed image
99
+ cv2.imwrite(os.path.join(temp_folder, f"{image_name}_preprocessed.jpg"), preprocessed_image)
100
+
101
+ # Open the preprocessed image file as binary
102
+ with open(os.path.join(temp_folder, f"{image_name}_preprocessed.jpg"), "rb") as f:
103
+ # Define the payload for the API request
104
+ payload = {
105
+ "apikey": api_key,
106
+ "language": language,
107
+ "isOverlayRequired": True,
108
+ "OCREngine": 2
109
+ }
110
+ # Define the file parameter for the API request
111
+ file = {
112
+ "file": f
113
+ }
114
+ # Send the POST request to the OCR API
115
+ response = requests.post(url, data=payload, files=file)
116
+
117
+ # Check the status code of the response
118
+ if response.status_code == 200:
119
+ # Parse the JSON response
120
+ result = response.json()
121
+ print("---JSON file saved")
122
+ # Save the OCR result as JSON
123
+ with open(os.path.join(temp_folder, f"{image_name}_ocr.json"), 'w') as f:
124
+ json.dump(result, f)
125
+
126
+ return os.path.join(temp_folder, f"{image_name}_ocr.json")
127
+ else:
128
+ # Print the error message
129
+ print("Error: " + response.text)
130
+ return None
131
+
132
+ except Exception as e:
133
+ print(f"An error occurred during OCR request: {str(e)}")
134
+ return None
135
+
136
+ def clean_tesseract_output(json_output_path):
137
+ try:
138
+ with open(json_output_path, 'r') as json_file:
139
+ data = json.load(json_file)
140
+
141
+ lines = data['ParsedResults'][0]['TextOverlay']['Lines']
142
+
143
+ words = []
144
+ for line in lines:
145
+ for word_info in line['Words']:
146
+ word = {}
147
+ origin_box = [
148
+ word_info['Left'],
149
+ word_info['Top'],
150
+ word_info['Left'] + word_info['Width'],
151
+ word_info['Top'] + word_info['Height']
152
+ ]
153
+
154
+ word['word_text'] = word_info['WordText']
155
+ word['word_box'] = origin_box
156
+ words.append(word)
157
+
158
+ return words
159
+ except (KeyError, IndexError, FileNotFoundError, json.JSONDecodeError) as e:
160
+ print(f"Error cleaning Tesseract output: {str(e)}")
161
+ return None
162
+
163
+ def prepare_batch_for_inference(image_paths):
164
+ # print("my_function was called")
165
+ # traceback.print_stack() # This will print the stack trace
166
+ print(f"Number of images to process: {len(image_paths)}") # Print the total number of images to be processed
167
+ print("1. Preparing for Inference")
168
+ tsv_output_paths = []
169
+
170
+ inference_batch = dict()
171
+ print("2. Starting Preprocessing")
172
+ # Ensure that the image is only 1
173
+ for image_path in image_paths:
174
+ print(f"Processing the image: {image_path}") # Print the image being processed
175
+ print("3. Preprocessing the Receipt")
176
+ preprocessed_image = preprocess_image(image_path)
177
+ if preprocessed_image is not None:
178
+ print("4. Preprocessing done. Running OCR")
179
+ json_output_path = run_tesseract_on_preprocessed_image(preprocessed_image, image_path)
180
+ print("5. OCR Complete")
181
+ if json_output_path:
182
+ tsv_output_paths.append(json_output_path)
183
+
184
+ print("6. Preprocessing and OCR Done")
185
+ # clean_outputs is a list of lists
186
+ clean_outputs = [clean_tesseract_output(tsv_path) for tsv_path in tsv_output_paths]
187
+ print("7. Cleaned OCR output")
188
+ word_lists = [[word['word_text'] for word in clean_output] for clean_output in clean_outputs]
189
+ print("8. Word List Created")
190
+ boxes_lists = [[word['word_box'] for word in clean_output] for clean_output in clean_outputs]
191
+ print("9. Box List Created")
192
+ inference_batch = {
193
+ "image_path": image_paths,
194
+ "bboxes": boxes_lists,
195
+ "words": word_lists
196
+ }
197
+
198
+ print("10. Prepared for Inference Batch")
199
+ return inference_batch
Layoutlmv3_inference/utils.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from transformers import AutoModelForTokenClassification, AutoProcessor
3
+
4
+ def normalize_box(bbox, width, height):
5
+ return [
6
+ int(bbox[0]*(1000/width)),
7
+ int(bbox[1]*(1000/height)),
8
+ int(bbox[2]*(1000/width)),
9
+ int(bbox[3]*(1000/height)),
10
+ ]
11
+
12
+ def compare_boxes(b1, b2):
13
+ b1 = np.array([c for c in b1])
14
+ b2 = np.array([c for c in b2])
15
+ equal = np.array_equal(b1, b2)
16
+ return equal
17
+
18
+ def unnormalize_box(bbox, width, height):
19
+ return [
20
+ width * (bbox[0] / 1000),
21
+ height * (bbox[1] / 1000),
22
+ width * (bbox[2] / 1000),
23
+ height * (bbox[3] / 1000),
24
+ ]
25
+
26
+ def adjacent(w1, w2):
27
+ if w1['label'] == w2['label'] and abs(w1['id'] - w2['id']) == 1:
28
+ return True
29
+ return False
30
+
31
+ def random_color():
32
+ return np.random.randint(0, 255, 3)
33
+
34
+ def image_label_2_color(annotation):
35
+ if 'output' in annotation.keys():
36
+ image_labels = set([span['label'] for span in annotation['output']])
37
+ label2color = {f'{label}': (random_color()[0], random_color()[
38
+ 1], random_color()[2]) for label in image_labels}
39
+ return label2color
40
+ else:
41
+ raise ValueError('please use "output" as annotation key')
42
+
43
+ def load_model(model_path):
44
+ model = AutoModelForTokenClassification.from_pretrained(model_path)
45
+ return model
46
+
47
+ def load_processor():
48
+ processor = AutoProcessor.from_pretrained(
49
+ "microsoft/layoutlmv3-base", apply_ocr=False)
50
+ return processor
app.py CHANGED
@@ -1,5 +1,4 @@
1
- import pytesseract
2
- from flask import Flask, request, render_template, jsonify, send_file, redirect, url_for, flash, send_from_directory
3
  from PIL import Image, ImageDraw
4
  import torch
5
  from transformers import LayoutLMv2ForTokenClassification, LayoutLMv3Tokenizer
@@ -19,7 +18,17 @@ import pandas as pd
19
  from itertools import zip_longest
20
  import inspect
21
  from threading import Lock
 
 
 
22
  import zipfile
 
 
 
 
 
 
 
23
  import warnings
24
 
25
  # Ignore SourceChangeWarning
@@ -27,7 +36,7 @@ warnings.filterwarnings("ignore", category=DeprecationWarning)
27
  # warnings.filterwarnings("ignore", category=SourceChangeWarning)
28
 
29
 
30
- UPLOAD_FOLDER = 'static/uploads'
31
  if not os.path.exists(UPLOAD_FOLDER):
32
  os.makedirs(UPLOAD_FOLDER)
33
 
@@ -38,10 +47,32 @@ app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
38
  app.config['SECRET_KEY'] = 'supersecretkey'
39
 
40
 
 
 
 
 
41
  @app.route('/', methods=['GET', 'POST'])
42
  def index():
43
- return render_template('index.html')
 
 
 
 
 
 
 
 
 
 
44
 
 
 
 
 
 
 
 
 
45
 
46
  def allowed_file(filename):
47
  return '.' in filename and \
@@ -49,64 +80,102 @@ def allowed_file(filename):
49
 
50
 
51
  @app.route('/upload', methods=['GET', 'POST'])
52
- def upload_file():
 
 
 
53
  if request.method == 'POST':
54
- if 'file' not in request.files:
55
  resp = jsonify({'message' : 'No file part in the request'})
56
  resp.status_code = 400
57
  return resp
58
- file = request.files['file']
59
- if file.filename == '':
60
- flash('No selected file')
61
- return redirect(request.url)
62
- if file and allowed_file(file.filename):
63
- filename = secure_filename(file.filename)
64
- file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
65
- return redirect(url_for('rename_file', old_name=filename))
66
  return render_template('index.html')
67
 
68
 
69
- def make_prediction(image_path):
 
70
  try:
71
- # temp = pathlib.PosixPath # Save the original state
72
- # pathlib.PosixPath = pathlib.WindowsPath # Change to WindowsPath temporarily
73
-
 
74
  model_path = Path(r'model/export')
75
-
76
  learner = load_learner(model_path)
 
 
77
 
78
- # Open the image using fastai's open_image function
79
- image = open_image(image_path)
 
80
 
81
- # Make a prediction
82
- prediction_class, prediction_idx, probabilities = learner.predict(image)
83
 
84
- # If you want the predicted class as a string
85
- predicted_class_str = str(prediction_class)
 
 
86
 
87
- return predicted_class_str
88
 
89
  except Exception as e:
90
- return {"error": str(e)}
91
- # finally:
92
- # pathlib.PosixPath = temp
93
-
94
-
95
- @app.route('/rename/<old_name>', methods=['GET', 'POST'])
96
- def rename_file(old_name):
97
- new_name = 'temp.jpg'
98
- file_path = os.path.join(app.config['UPLOAD_FOLDER'], old_name)
99
- new_file_path = os.path.join(app.config['UPLOAD_FOLDER'], new_name)
100
-
101
- if os.path.exists(file_path):
102
- shutil.move(file_path, new_file_path)
103
-
104
- # Call make_prediction automatically
105
- prediction_results = make_prediction(new_file_path)
106
- prediction_result = str(prediction_results)
107
- return render_template('extractor.html', uploaded_file=new_name, old_name=old_name, prediction_result=prediction_result)
108
- else:
109
- return 'File not found'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
 
112
  @app.route('/get_inference_image')
@@ -115,119 +184,166 @@ def get_inference_image():
115
  inferenced_image = 'inferenced/temp_inference.jpg'
116
  return jsonify(updatedImagePath=inferenced_image), 200 # Return the image path with a 200 status code
117
 
118
- # Define a lock object
119
- inference_lock = Lock()
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
  @app.route('/run_inference', methods=['GET'])
122
  def run_inference():
123
- # print(f"run_inference was called from {inspect.stack()[1].filename} at line {inspect.stack()[1].lineno}")
124
- if inference_lock.locked():
125
- return '', 204 # Return an empty response with a 204 status code
126
-
127
- # Acquire the lock before starting the inference process
128
- with inference_lock:
129
- try:
130
- model_path = r"model" # path to Layoutlmv3 model
131
- images_path = r"static/uploads" # images folder
132
- # Your inference process code here
133
- subprocess.check_call([sys.executable, "static/inference/run_inference.py", "--model_path", model_path, "--images_path", images_path])
134
- return redirect(url_for('create_csv'))
135
- except Exception as e:
136
- return jsonify({"error": str(e)})
137
-
 
 
 
 
 
 
 
 
138
 
139
  # Define a function to replace all symbols with periods
140
  def replace_symbols_with_period(value):
141
- return re.sub(r'\W+', '.', str(value))
 
 
 
 
 
142
  @app.route('/create_csv', methods=['GET'])
143
  def create_csv():
144
  try:
145
- # Load JSON data from file
146
- json_file_path = r"temp/LayoutlMV3InferenceOutput.json" # path to JSON file
147
- output_file_path = r"inferenced/output.csv" # path to output CSV file
148
-
149
- with open(json_file_path, 'r') as file:
150
- data = json.load(file)
151
-
152
- # Creating a dictionary to store labels and corresponding texts
153
- label_texts = {}
154
- for item in data:
155
- for output_item in item['output']:
156
- label = output_item['label']
157
- text = output_item['text']
158
-
159
- if label not in label_texts:
160
- label_texts[label] = []
161
- label_texts[label].append(text)
162
-
163
- # Order of columns as requested
164
- column_order = [
165
- 'RECEIPTNUMBER', 'MERCHANTNAME', 'MERCHANTADDRESS',
166
- 'TRANSACTIONDATE', 'TRANSACTIONTIME', 'ITEMS',
167
- 'PRICE', 'TOTAL', 'VATTAX'
168
- ]
169
-
170
- # Writing data to CSV file with ordered columns
171
- with open(output_file_path, 'w', newline='') as csvfile:
172
- csv_writer = csv.DictWriter(csvfile, fieldnames=column_order, delimiter=",")
173
- csv_writer.writeheader()
174
-
175
- # Iterating over each item and price, creating a new row for each pair
176
- items = label_texts.get('ITEMS', [])
177
- prices = label_texts.get('PRICE', [])
178
-
179
- for i in range(max(len(items), len(prices))):
180
- item_words = items[i].split() if i < len(items) else ['']
181
- price_words = prices[i].split() if i < len(prices) else ['']
182
-
183
- for j, (item, price) in enumerate(zip_longest(item_words, price_words, fillvalue='')):
184
- row_data = {
185
- 'ITEMS': item,
186
- 'PRICE': replace_symbols_with_period(price) if 'PRICE' in label_texts else price # Replace symbols with period
187
- }
188
- if j == 0:
189
- row_data.update({
190
- label: replace_symbols_with_period(label_texts[label][0]) if label in ['TOTAL', 'VATTAX'] and label in label_texts and 0 < len(label_texts[label]) else label_texts[label][0] if label in label_texts and 0 < len(label_texts[label]) else ''
191
- for label in column_order if label not in ['ITEMS', 'PRICE']
192
- })
193
-
194
- csv_writer.writerow(row_data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
 
196
  return '', 204 # Return an empty response with a 204 status code
197
- except Exception as e:
198
- return jsonify({"error": str(e)})
199
 
 
 
 
200
 
201
  @app.route('/get_data')
202
  def get_data():
203
  return send_from_directory('inferenced','output.csv', as_attachment=False)
204
 
 
205
 
206
  @app.route('/download_csv', methods=['GET'])
207
  def download_csv():
208
  try:
209
- folder_path = r"inferenced" # path to the folder
210
-
211
- # Get a list of all files in the folder
212
- files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
213
-
214
- # Check if there are any files in the folder
215
- if files:
216
- # Create a ZIP file containing all files
217
- zip_filename = 'inferenced_files.zip'
218
- zip_file_path = os.path.join(folder_path, zip_filename)
219
- with zipfile.ZipFile(zip_file_path, 'w') as zipf:
220
- for file in files:
221
- file_path = os.path.join(folder_path, file)
222
- zipf.write(file_path, os.path.basename(file_path))
223
-
224
- # Send the ZIP file as an attachment
225
- return send_file(zip_file_path, as_attachment=True, download_name=zip_filename)
226
  else:
227
- return jsonify({"error": "No files found in the folder"})
228
  except Exception as e:
229
  return jsonify({"error": f"Download failed: {str(e)}"})
230
 
231
 
 
232
  if __name__ == '__main__':
233
  app.run(debug=True)
 
1
+ from flask import Flask, request, render_template, jsonify, send_file, redirect, url_for, flash, send_from_directory, session
 
2
  from PIL import Image, ImageDraw
3
  import torch
4
  from transformers import LayoutLMv2ForTokenClassification, LayoutLMv3Tokenizer
 
18
  from itertools import zip_longest
19
  import inspect
20
  from threading import Lock
21
+ import signal
22
+ import shutil
23
+ from datetime import datetime
24
  import zipfile
25
+ # LLM
26
+ import argparse
27
+ from asyncio.log import logger
28
+ from Layoutlmv3_inference.ocr import prepare_batch_for_inference
29
+ from Layoutlmv3_inference.inference_handler import handle
30
+ import logging
31
+ import os
32
  import warnings
33
 
34
  # Ignore SourceChangeWarning
 
36
  # warnings.filterwarnings("ignore", category=SourceChangeWarning)
37
 
38
 
39
+ UPLOAD_FOLDER = 'static/temp/uploads'
40
  if not os.path.exists(UPLOAD_FOLDER):
41
  os.makedirs(UPLOAD_FOLDER)
42
 
 
47
  app.config['SECRET_KEY'] = 'supersecretkey'
48
 
49
 
50
+
51
+ # Added "temp" files cleaning for privacy and file managements.
52
+ # All temporary files were moved to "output_folders" for review and recovery.
53
+ # Moving of temp files were called at home page to ensure that new data were being supplied for extractor.
54
  @app.route('/', methods=['GET', 'POST'])
55
  def index():
56
+ try:
57
+ # Current date and time
58
+ now = datetime.now()
59
+ dt_string = now.strftime("%Y%m%d_%H%M%S")
60
+
61
+ # Source folders
62
+ temp_folder = r'static/temp'
63
+ inferenced_folder = r'inferenced'
64
+
65
+ # Destination folder path
66
+ destination_folder = os.path.join('output_folders', dt_string) # Create a new folder with timestamp
67
 
68
+ # Move the temp and inferenced folders to the destination folder
69
+ shutil.move(temp_folder, destination_folder)
70
+ shutil.move(inferenced_folder, destination_folder)
71
+
72
+ return render_template('index.html', destination_folder=destination_folder)
73
+ except:
74
+ return render_template('index.html')
75
+
76
 
77
  def allowed_file(filename):
78
  return '.' in filename and \
 
80
 
81
 
82
  @app.route('/upload', methods=['GET', 'POST'])
83
+ def upload_files():
84
+ UPLOAD_FOLDER = 'static/temp/uploads'
85
+ if not os.path.exists(UPLOAD_FOLDER):
86
+ os.makedirs(UPLOAD_FOLDER)
87
  if request.method == 'POST':
88
+ if 'files[]' not in request.files:
89
  resp = jsonify({'message' : 'No file part in the request'})
90
  resp.status_code = 400
91
  return resp
92
+ files = request.files.getlist('files[]')
93
+ filenames = []
94
+ for file in files:
95
+ if file and allowed_file(file.filename):
96
+ filename = secure_filename(file.filename)
97
+ file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
98
+ filenames.append(filename)
99
+ return redirect(url_for('predict_files', filenames=filenames))
100
  return render_template('index.html')
101
 
102
 
103
+ def make_predictions(image_paths):
104
+ temp = None
105
  try:
106
+ # For Windows OS
107
+ temp = pathlib.PosixPath # Save the original state
108
+ pathlib.PosixPath = pathlib.WindowsPath # Change to WindowsPath temporarily
109
+
110
  model_path = Path(r'model/export')
 
111
  learner = load_learner(model_path)
112
+
113
+ predictions = []
114
 
115
+ for image_path in image_paths:
116
+ # Open the image using fastai's open_image function
117
+ image = open_image(image_path)
118
 
119
+ # Make a prediction
120
+ prediction_class, prediction_idx, probabilities = learner.predict(image)
121
 
122
+ # If you want the predicted class as a string
123
+ predicted_class_str = str(prediction_class)
124
+
125
+ predictions.append(predicted_class_str)
126
 
127
+ return predictions
128
 
129
  except Exception as e:
130
+ return {"error in make_predictions": str(e)}
131
+
132
+ finally:
133
+ pathlib.PosixPath = temp
134
+
135
+ import copy
136
+ @app.route('/predict/<filenames>', methods=['GET', 'POST'])
137
+ def predict_files(filenames):
138
+ prediction_results = []
139
+ image_paths = eval(filenames) # Convert the filenames string back to a list
140
+
141
+ for filename in image_paths:
142
+ file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
143
+ folder_path = UPLOAD_FOLDER
144
+ destination_folder = r'static/temp/img_display'
145
+ if not os.path.exists(destination_folder):
146
+ os.makedirs(destination_folder)
147
+
148
+ # Get a list of all files in the source folder
149
+ files = os.listdir(folder_path)
150
+
151
+ # Loop through each file and copy it to the destination folder
152
+ for file in files:
153
+ # Construct the full path of the source file
154
+ source_file_path = os.path.join(folder_path, file)
155
+
156
+ # Construct the full path of the destination file
157
+ destination_file_path = os.path.join(destination_folder, file)
158
+
159
+ # Copy the file to the destination folder
160
+ shutil.copy(source_file_path, destination_file_path)
161
+
162
+ if os.path.exists(file_path):
163
+ # Call make_predictions automatically
164
+ prediction_result = make_predictions([file_path]) # Pass file_path as a list
165
+ prediction_results.extend(prediction_result)
166
+
167
+ # Create a copy of prediction_results before deletion
168
+ prediction_results_copy = copy.deepcopy(prediction_results)
169
+
170
+ if prediction_result[0] != 'non-receipt': # Check if prediction is not 'non-receipt'
171
+ prediction_results.extend(prediction_result) # Use extend to add elements of list to another list
172
+ else:
173
+ # Delete the image if it's predicted as non-receipt
174
+ os.remove(file_path)
175
+ print(image_paths)
176
+
177
+ return render_template('extractor.html', image_paths=image_paths, prediction_results = prediction_results, predictions=dict(zip(image_paths, prediction_results_copy)))
178
+
179
 
180
 
181
  @app.route('/get_inference_image')
 
184
  inferenced_image = 'inferenced/temp_inference.jpg'
185
  return jsonify(updatedImagePath=inferenced_image), 200 # Return the image path with a 200 status code
186
 
187
+
188
+ def process_images(model_path: str, images_path: str) -> None:
189
+ try:
190
+ image_files = os.listdir(images_path)
191
+ images_path = [os.path.join(images_path, image_file) for image_file in image_files]
192
+ inference_batch = prepare_batch_for_inference(images_path)
193
+ context = {"model_dir": model_path}
194
+ handle(inference_batch, context)
195
+ except Exception as err:
196
+ os.makedirs('log', exist_ok=True)
197
+ logging.basicConfig(filename='log/error_output.log', level=logging.ERROR,
198
+ format='%(asctime)s %(levelname)s %(name)s %(message)s')
199
+ logger = logging.getLogger(__name__)
200
+ logger.error(err)
201
 
202
  @app.route('/run_inference', methods=['GET'])
203
  def run_inference():
204
+ try:
205
+ model_path = r"model"
206
+ images_path = r"static/temp/uploads/"
207
+ process_images(model_path, images_path)
208
+ return redirect(url_for('create_csv'))
209
+ except Exception as err:
210
+ return f"Error processing images: {str(err)}", 500
211
+
212
+
213
+ @app.route('/stop_inference', methods=['GET'])
214
+ def stop_inference():
215
+ try:
216
+ # Get the process ID of the run_inference process
217
+ run_inference_pid = os.getpid() # Assuming it's running in the same process
218
+
219
+ # Send the SIGTERM signal to gracefully terminate the process
220
+ os.kill(run_inference_pid, signal.SIGTERM)
221
+
222
+ return render_template('index.html')
223
+ except ProcessLookupError:
224
+ logging.warning("run_inference process not found.")
225
+ except Exception as err:
226
+ logging.error(f"Error terminating run_inference process: {err}")
227
 
228
  # Define a function to replace all symbols with periods
229
  def replace_symbols_with_period(value):
230
+ # return re.sub(r'\W+', '.', str(value))
231
+ return value.replace(',', '.')
232
+
233
+
234
+ from itertools import zip_longest
235
+
236
  @app.route('/create_csv', methods=['GET'])
237
  def create_csv():
238
  try:
239
+ # Path to the folder containing JSON files
240
+ json_folder_path = r"static/temp/labeled" # Change this to your folder path
241
+
242
+ # Path to the output CSV folder
243
+ output_folder_path = r"inferenced/csv_files"
244
+ os.makedirs(output_folder_path, exist_ok=True)
245
+
246
+ # Initialize an empty list to store all JSON data
247
+ all_data = []
248
+
249
+ # Iterate through JSON files in the folder
250
+ for filename in os.listdir(json_folder_path):
251
+ if filename.endswith(".json"):
252
+ json_file_path = os.path.join(json_folder_path, filename)
253
+
254
+ with open(json_file_path, 'r') as file:
255
+ data = json.load(file)
256
+ all_data.extend(data['output'])
257
+
258
+ # Creating a dictionary to store labels and corresponding texts for this JSON file
259
+ label_texts = {}
260
+ for item in data['output']:
261
+ label = item['label']
262
+ text = item['text']
263
+
264
+ # Ensure label exists before adding to dictionary
265
+ if label not in label_texts:
266
+ label_texts[label] = []
267
+ label_texts[label].append(text)
268
+
269
+ # Order of columns as requested
270
+ column_order = [
271
+ 'RECEIPTNUMBER', 'MERCHANTNAME', 'MERCHANTADDRESS',
272
+ 'TRANSACTIONDATE', 'TRANSACTIONTIME', 'ITEMS',
273
+ 'PRICE', 'TOTAL', 'VATTAX'
274
+ ]
275
+
276
+ # Writing data to CSV file with ordered columns
277
+ csv_file_path = os.path.join(output_folder_path, os.path.splitext(filename)[0] + '.csv')
278
+ with open(csv_file_path, 'w', newline='') as csvfile:
279
+ csv_writer = csv.DictWriter(csvfile, fieldnames=column_order, delimiter=",")
280
+ csv_writer.writeheader()
281
+
282
+ # Iterate through items and prices
283
+ max_length = max(len(label_texts.get('ITEMS', [])), len(label_texts.get('PRICE', [])))
284
+ for i in range(max_length):
285
+ # Use get() with default '' to avoid KeyError
286
+ items = label_texts.get('ITEMS', [])[i] if i < len(label_texts.get('ITEMS', [])) else ''
287
+ prices = label_texts.get('PRICE', [])[i] if i < len(label_texts.get('PRICE', [])) else ''
288
+
289
+ # Check if items and prices are separated by space
290
+ if ' ' in items or ' ' in prices:
291
+ item_list = items.split() if items else []
292
+ price_list = prices.split() if prices else []
293
+
294
+ # Create new rows for each combination of items and prices
295
+ for item, price in zip(item_list, price_list):
296
+ row_data = {label: replace_symbols_with_period(label_texts[label][i]) if label == 'ITEMS' else replace_symbols_with_period(label_texts[label][i]) for label in column_order}
297
+ row_data['ITEMS'] = item
298
+ row_data['PRICE'] = price
299
+ csv_writer.writerow(row_data)
300
+ else:
301
+ # Use get() with default '' to avoid KeyError
302
+ row_data = {label: replace_symbols_with_period(label_texts.get(label, [])[i]) if i < len(label_texts.get(label, [])) else '' for label in column_order}
303
+ csv_writer.writerow(row_data)
304
+
305
+ # Combining contents of CSV files into a single CSV file
306
+ output_file_path = r"inferenced/output.csv"
307
+ with open(output_file_path, 'w', newline='') as combined_csvfile:
308
+ combined_csv_writer = csv.DictWriter(combined_csvfile, fieldnames=column_order, delimiter=",")
309
+ combined_csv_writer.writeheader()
310
+
311
+ # Iterate through CSV files in the folder
312
+ for csv_filename in os.listdir(output_folder_path):
313
+ if csv_filename.endswith(".csv"):
314
+ csv_file_path = os.path.join(output_folder_path, csv_filename)
315
+
316
+ # Read data from CSV file and write to the combined CSV file
317
+ with open(csv_file_path, 'r') as csv_file:
318
+ csv_reader = csv.DictReader(csv_file)
319
+ for row in csv_reader:
320
+ combined_csv_writer.writerow(row)
321
 
322
  return '', 204 # Return an empty response with a 204 status code
 
 
323
 
324
+ except Exception as e:
325
+ print(f"An error occurred in create_csv: {str(e)}")
326
+ return None
327
 
328
  @app.route('/get_data')
329
  def get_data():
330
  return send_from_directory('inferenced','output.csv', as_attachment=False)
331
 
332
+ from flask import jsonify
333
 
334
  @app.route('/download_csv', methods=['GET'])
335
  def download_csv():
336
  try:
337
+ output_file_path = r"inferenced/output.csv" # path to output CSV file
338
+ # Check if the file exists
339
+ if os.path.exists(output_file_path):
340
+ return send_file(output_file_path, as_attachment=True, download_name='output.csv')
 
 
 
 
 
 
 
 
 
 
 
 
 
341
  else:
342
+ return jsonify({"error": "CSV file not found"})
343
  except Exception as e:
344
  return jsonify({"error": f"Download failed: {str(e)}"})
345
 
346
 
347
+
348
  if __name__ == '__main__':
349
  app.run(debug=True)
inferenced/csv_files/Output_0.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,C26rnTeaLemon500ml,39.000,88.00,9.43
3
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,COBRENRGYORNK350ML,28.000,88.00,9.43
4
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,OTSHIBMPFRSPLNS50G,21.000,88.00,9.43
inferenced/csv_files/Output_1.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ 01053710,Iloilo Grace Pharmacy,C & J Building Jalandoni Extension Bolilao,08 / 12 / 2023,10 : 07,PharmtonEsentialCao,23.75,23 - 75,
inferenced/csv_files/Output_2.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ # 1457229,7 - ELEVEN �,Poblacion . Leon . Iloilo .,05 / 01 / 2023 ( Mon ),16 : 54 : 23,NESTEALEMICET500ML,35.000,76.00,8.14
3
+ # 1457229,7 - ELEVEN �,Poblacion . Leon . Iloilo .,05 / 01 / 2023 ( Mon ),16 : 54 : 23,ArlaGStrwbryT200ml,41.000,76.00,8.14
inferenced/csv_files/Output_3.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ 000036410,WVSU Multi Purpose Cooperative,Luna Street Lapaz Iloilo City,10 - 25 - 2023,01 : 29 : 49 PM,COKE,13.00,13.00,1.39
inferenced/csv_files/Output_4.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ 01053735,Iloilo Grace Pharmacy,C & J Building Jalandoni Extension Bolilao,09 / 12 / 2023,11 : 07,EQDryTravelM18,3.31.00,331 - 00,35.46
inferenced/output.csv ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ RECEIPTNUMBER,MERCHANTNAME,MERCHANTADDRESS,TRANSACTIONDATE,TRANSACTIONTIME,ITEMS,PRICE,TOTAL,VATTAX
2
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,C26rnTeaLemon500ml,39.000,88.00,9.43
3
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,COBRENRGYORNK350ML,28.000,88.00,9.43
4
+ # 2480507,7 - ELEVEN �,Poblacion . Leon . Iloilo . Philippines,04 / 30 / 2023 ( Surt ),17 : 13 : 00,OTSHIBMPFRSPLNS50G,21.000,88.00,9.43
5
+ 01053710,Iloilo Grace Pharmacy,C & J Building Jalandoni Extension Bolilao,08 / 12 / 2023,10 : 07,PharmtonEsentialCao,23.75,23 - 75,
6
+ # 1457229,7 - ELEVEN �,Poblacion . Leon . Iloilo .,05 / 01 / 2023 ( Mon ),16 : 54 : 23,NESTEALEMICET500ML,35.000,76.00,8.14
7
+ # 1457229,7 - ELEVEN �,Poblacion . Leon . Iloilo .,05 / 01 / 2023 ( Mon ),16 : 54 : 23,ArlaGStrwbryT200ml,41.000,76.00,8.14
8
+ 000036410,WVSU Multi Purpose Cooperative,Luna Street Lapaz Iloilo City,10 - 25 - 2023,01 : 29 : 49 PM,COKE,13.00,13.00,1.39
9
+ 01053735,Iloilo Grace Pharmacy,C & J Building Jalandoni Extension Bolilao,09 / 12 / 2023,11 : 07,EQDryTravelM18,3.31.00,331 - 00,35.46
inferenced/sample1_711_inference.jpg ADDED
inferenced/sample1_grace_inference.jpg ADDED
inferenced/sample_711_inference.jpg ADDED
inferenced/sample_coop_inference.jpg ADDED
inferenced/sample_grace_inference.jpg ADDED
log/error_output.log CHANGED
@@ -53,3 +53,258 @@
53
  2024-01-05 14:05:21,728 ERROR __main__ 'NoneType' object is not iterable
54
  2024-01-05 20:38:28,390 ERROR __main__ 'NoneType' object is not iterable
55
  2024-01-05 20:38:46,926 ERROR __main__ 'NoneType' object is not iterable
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  2024-01-05 14:05:21,728 ERROR __main__ 'NoneType' object is not iterable
54
  2024-01-05 20:38:28,390 ERROR __main__ 'NoneType' object is not iterable
55
  2024-01-05 20:38:46,926 ERROR __main__ 'NoneType' object is not iterable
56
+ 2024-02-05 22:07:24,636 ERROR __main__ 'ModelHandler' object has no attribute 'handle'
57
+ 2024-02-05 22:07:35,496 ERROR __main__ 'ModelHandler' object has no attribute 'handle'
58
+ 2024-02-05 22:20:43,227 ERROR __main__ 'ModelHandler' object has no attribute 'handle'
59
+ 2024-02-05 22:20:43,336 ERROR __main__ 'ModelHandler' object has no attribute 'handle'
60
+ 2024-02-11 22:09:51,699 ERROR __main__ string indices must be integers, not 'str'
61
+ 2024-02-11 22:09:52,871 ERROR __main__ string indices must be integers, not 'str'
62
+ 2024-02-11 22:18:29,791 ERROR __main__ 0
63
+ 2024-02-11 22:18:30,237 ERROR __main__ 0
64
+ 2024-02-11 22:57:32,246 ERROR __main__ string indices must be integers, not 'str'
65
+ 2024-02-11 22:57:34,137 ERROR __main__ string indices must be integers, not 'str'
66
+ 2024-02-11 23:07:26,326 ERROR __main__ 'NoneType' object is not iterable
67
+ 2024-02-11 23:07:26,685 ERROR __main__ 'NoneType' object is not iterable
68
+ 2024-02-11 23:19:56,814 ERROR __main__ [Errno 2] No such file or directory: 'outputs/LayoutlMV3InferenceOutput_0.json'
69
+ 2024-02-11 23:19:57,705 ERROR __main__ [Errno 2] No such file or directory: 'outputs/LayoutlMV3InferenceOutput_0.json'
70
+ 2024-02-11 23:27:11,537 ERROR __main__ [Errno 2] No such file or directory: 'outputs/LayoutlMV3InferenceOutput_0.json'
71
+ 2024-02-11 23:27:11,756 ERROR __main__ [Errno 2] No such file or directory: 'outputs/LayoutlMV3InferenceOutput_0.json'
72
+ 2024-02-12 00:21:48,656 ERROR __main__ name 'image_path' is not defined
73
+ 2024-02-12 08:26:33,701 ERROR app unsupported operand type(s) for +: 'NoneType' and 'str'
74
+ 2024-02-12 08:26:33,704 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:26:33] "GET /run_inference HTTP/1.1" 302 -
75
+ 2024-02-12 08:26:33,762 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:26:33] "GET /create_csv HTTP/1.1" 200 -
76
+ 2024-02-12 08:26:34,307 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:26:34] "GET /get_data HTTP/1.1" 404 -
77
+ 2024-02-12 08:39:52,998 ERROR app unsupported operand type(s) for +: 'NoneType' and 'str'
78
+ 2024-02-12 08:39:53,001 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:39:53] "GET /run_inference HTTP/1.1" 302 -
79
+ 2024-02-12 08:39:53,035 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:39:53] "GET /create_csv HTTP/1.1" 200 -
80
+ 2024-02-12 08:39:53,589 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 08:39:53] "GET /get_data HTTP/1.1" 404 -
81
+ 2024-02-12 11:00:14,343 ERROR app [Errno 2] No such file or directory: 'temp/labeled/LayoutlMV3InferenceOutput_0.json'
82
+ 2024-02-12 11:00:14,359 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:00:14] "GET /run_inference HTTP/1.1" 200 -
83
+ 2024-02-12 11:00:14,900 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:00:14] "GET /get_data HTTP/1.1" 404 -
84
+ 2024-02-12 11:06:54,109 ERROR app [Errno 2] No such file or directory: 'temp/labeled/LayoutlMV3InferenceOutput_0.json'
85
+ 2024-02-12 11:06:54,109 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:06:54] "GET /run_inference HTTP/1.1" 200 -
86
+ 2024-02-12 11:06:54,664 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:06:54] "GET /get_data HTTP/1.1" 404 -
87
+ 2024-02-12 11:21:29,642 ERROR app [Errno 2] No such file or directory: 'labeled/LayoutlMV3InferenceOutput_0.json'
88
+ 2024-02-12 11:21:29,657 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:21:29] "GET /run_inference HTTP/1.1" 200 -
89
+ 2024-02-12 11:21:30,234 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 11:21:30] "GET /get_data HTTP/1.1" 404 -
90
+ 2024-02-12 15:22:39,701 ERROR app 'NoneType' object is not subscriptable
91
+ 2024-02-12 15:22:39,779 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:22:39] "GET /run_inference HTTP/1.1" 302 -
92
+ 2024-02-12 15:22:40,029 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:22:40] "GET /create_csv HTTP/1.1" 500 -
93
+ 2024-02-12 15:22:41,814 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:22:41] "GET /get_data HTTP/1.1" 404 -
94
+ 2024-02-12 15:33:48,045 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:48] "GET / HTTP/1.1" 200 -
95
+ 2024-02-12 15:33:49,469 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:49] "GET /styles.css HTTP/1.1" 404 -
96
+ 2024-02-12 15:33:49,547 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:49] "GET /static/css/animate.css HTTP/1.1" 304 -
97
+ 2024-02-12 15:33:49,632 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:49] "GET /static/css/color.css HTTP/1.1" 304 -
98
+ 2024-02-12 15:33:49,766 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:49] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
99
+ 2024-02-12 15:33:49,959 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:49] "GET /static/css/style.css HTTP/1.1" 304 -
100
+ 2024-02-12 15:33:50,049 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/images/logo.png HTTP/1.1" 304 -
101
+ 2024-02-12 15:33:50,109 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/images/uplogo.gif HTTP/1.1" 304 -
102
+ 2024-02-12 15:33:50,134 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/wow.min.js HTTP/1.1" 304 -
103
+ 2024-02-12 15:33:50,184 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
104
+ 2024-02-12 15:33:50,243 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
105
+ 2024-02-12 15:33:50,360 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
106
+ 2024-02-12 15:33:50,585 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
107
+ 2024-02-12 15:33:50,709 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
108
+ 2024-02-12 15:33:50,752 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/static/js/jquery.stickyNavbar.min.js HTTP/1.1" 404 -
109
+ 2024-02-12 15:33:50,769 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
110
+ 2024-02-12 15:33:50,816 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
111
+ 2024-02-12 15:33:50,868 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
112
+ 2024-02-12 15:33:50,898 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
113
+ 2024-02-12 15:33:50,912 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:33:50] "GET /static/js/site.js HTTP/1.1" 304 -
114
+ 2024-02-12 15:34:20,927 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:20] "GET /static/fonts/fontawesome-webfont.woff2?v=4.7.0 HTTP/1.1" 404 -
115
+ 2024-02-12 15:34:20,969 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:20] "GET /static/fonts/fontawesome-webfont.woff?v=4.7.0 HTTP/1.1" 404 -
116
+ 2024-02-12 15:34:21,014 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:21] "GET /static/fonts/fontawesome-webfont.ttf?v=4.7.0 HTTP/1.1" 404 -
117
+ 2024-02-12 15:34:43,540 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:43] "GET /static/images/favicon.ico HTTP/1.1" 304 -
118
+ 2024-02-12 15:34:57,852 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:57] "POST /upload HTTP/1.1" 302 -
119
+ 2024-02-12 15:34:58,580 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:58] "GET /predict/%5B'receipt_4.jpg'%5D HTTP/1.1" 200 -
120
+ 2024-02-12 15:34:59,230 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:59] "GET /predict/css/animate.css HTTP/1.1" 404 -
121
+ 2024-02-12 15:34:59,297 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:59] "GET /static/css/style.css HTTP/1.1" 304 -
122
+ 2024-02-12 15:34:59,413 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:59] "GET /static/css/color.css HTTP/1.1" 304 -
123
+ 2024-02-12 15:34:59,563 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:34:59] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
124
+ 2024-02-12 15:35:00,080 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
125
+ 2024-02-12 15:35:00,225 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/images/logo.png HTTP/1.1" 304 -
126
+ 2024-02-12 15:35:00,270 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/wow.min.js HTTP/1.1" 304 -
127
+ 2024-02-12 15:35:00,374 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
128
+ 2024-02-12 15:35:00,455 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
129
+ 2024-02-12 15:35:00,518 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
130
+ 2024-02-12 15:35:00,681 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
131
+ 2024-02-12 15:35:00,747 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
132
+ 2024-02-12 15:35:00,780 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.stickyNavbar.min.js HTTP/1.1" 304 -
133
+ 2024-02-12 15:35:00,864 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
134
+ 2024-02-12 15:35:00,898 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
135
+ 2024-02-12 15:35:00,914 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
136
+ 2024-02-12 15:35:00,935 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:00] "GET /static/js/site.js HTTP/1.1" 304 -
137
+ 2024-02-12 15:35:01,331 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:35:01] "GET /static/images/favicon.ico HTTP/1.1" 304 -
138
+ 2024-02-12 15:38:18,229 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:38:18] "GET /run_inference HTTP/1.1" 302 -
139
+ 2024-02-12 15:38:18,825 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:38:18] "GET /create_csv HTTP/1.1" 204 -
140
+ 2024-02-12 15:38:19,453 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 15:38:19] "GET /get_data HTTP/1.1" 200 -
141
+ 2024-02-12 16:17:35,300 ERROR app 'NoneType' object is not iterable
142
+ 2024-02-12 16:17:35,300 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:17:35] "GET /run_inference HTTP/1.1" 302 -
143
+ 2024-02-12 16:17:35,383 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:17:35] "GET /create_csv HTTP/1.1" 204 -
144
+ 2024-02-12 16:17:35,949 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:17:35] "GET /get_data HTTP/1.1" 200 -
145
+ 2024-02-12 16:18:09,159 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET / HTTP/1.1" 200 -
146
+ 2024-02-12 16:18:09,415 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/css/style.css HTTP/1.1" 304 -
147
+ 2024-02-12 16:18:09,546 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
148
+ 2024-02-12 16:18:09,656 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/css/color.css HTTP/1.1" 304 -
149
+ 2024-02-12 16:18:09,686 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/images/logo.png HTTP/1.1" 304 -
150
+ 2024-02-12 16:18:09,703 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/css/animate.css HTTP/1.1" 200 -
151
+ 2024-02-12 16:18:09,728 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /styles.css HTTP/1.1" 404 -
152
+ 2024-02-12 16:18:09,871 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/images/uplogo.gif HTTP/1.1" 200 -
153
+ 2024-02-12 16:18:09,925 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
154
+ 2024-02-12 16:18:09,974 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:09] "GET /static/js/wow.min.js HTTP/1.1" 304 -
155
+ 2024-02-12 16:18:10,056 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
156
+ 2024-02-12 16:18:10,075 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
157
+ 2024-02-12 16:18:10,192 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
158
+ 2024-02-12 16:18:10,444 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
159
+ 2024-02-12 16:18:10,499 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
160
+ 2024-02-12 16:18:10,534 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/static/js/jquery.stickyNavbar.min.js HTTP/1.1" 404 -
161
+ 2024-02-12 16:18:10,596 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
162
+ 2024-02-12 16:18:10,768 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
163
+ 2024-02-12 16:18:10,790 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
164
+ 2024-02-12 16:18:10,940 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:10] "GET /static/js/site.js HTTP/1.1" 304 -
165
+ 2024-02-12 16:18:15,475 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:15] "GET /static/images/favicon.ico HTTP/1.1" 304 -
166
+ 2024-02-12 16:18:35,183 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:35] "POST /upload HTTP/1.1" 302 -
167
+ 2024-02-12 16:18:35,889 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:35] "GET /predict/%5B'sample_grace.jpg',%20'sample1_711.jpg'%5D HTTP/1.1" 200 -
168
+ 2024-02-12 16:18:36,090 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/css/style.css HTTP/1.1" 304 -
169
+ 2024-02-12 16:18:36,115 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/css/color.css HTTP/1.1" 304 -
170
+ 2024-02-12 16:18:36,145 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
171
+ 2024-02-12 16:18:36,241 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/images/logo.png HTTP/1.1" 304 -
172
+ 2024-02-12 16:18:36,251 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /predict/css/animate.css HTTP/1.1" 404 -
173
+ 2024-02-12 16:18:36,296 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
174
+ 2024-02-12 16:18:36,347 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/wow.min.js HTTP/1.1" 304 -
175
+ 2024-02-12 16:18:36,436 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
176
+ 2024-02-12 16:18:36,488 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.stickyNavbar.min.js HTTP/1.1" 304 -
177
+ 2024-02-12 16:18:36,512 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
178
+ 2024-02-12 16:18:36,529 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
179
+ 2024-02-12 16:18:36,579 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
180
+ 2024-02-12 16:18:36,635 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
181
+ 2024-02-12 16:18:36,676 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
182
+ 2024-02-12 16:18:36,719 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/site.js HTTP/1.1" 304 -
183
+ 2024-02-12 16:18:36,743 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
184
+ 2024-02-12 16:18:36,785 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:36] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
185
+ 2024-02-12 16:18:37,120 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:18:37] "GET /static/images/favicon.ico HTTP/1.1" 304 -
186
+ 2024-02-12 16:21:17,090 ERROR app 'NoneType' object is not iterable
187
+ 2024-02-12 16:21:17,100 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:21:17] "GET /run_inference HTTP/1.1" 302 -
188
+ 2024-02-12 16:21:17,131 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:21:17] "GET /create_csv HTTP/1.1" 500 -
189
+ 2024-02-12 16:21:17,662 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 16:21:17] "GET /get_data HTTP/1.1" 404 -
190
+ 2024-02-12 17:02:28,396 ERROR app 'NoneType' object is not iterable
191
+ 2024-02-12 17:02:28,396 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:02:28] "GET /run_inference HTTP/1.1" 302 -
192
+ 2024-02-12 17:02:28,447 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:02:28] "GET /create_csv HTTP/1.1" 500 -
193
+ 2024-02-12 17:02:29,128 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:02:29] "GET /get_data HTTP/1.1" 404 -
194
+ 2024-02-12 17:33:50,964 ERROR app 'NoneType' object is not iterable
195
+ 2024-02-12 17:33:50,964 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:33:50] "GET /run_inference HTTP/1.1" 302 -
196
+ 2024-02-12 17:33:50,980 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:33:50] "GET /create_csv HTTP/1.1" 500 -
197
+ 2024-02-12 17:33:51,501 INFO werkzeug 127.0.0.1 - - [12/Feb/2024 17:33:51] "GET /get_data HTTP/1.1" 404 -2024-02-22 08:35:19,397 ERROR app 'NoneType' object is not iterable
198
+ 2024-02-22 08:35:19,409 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:35:19] "GET /run_inference HTTP/1.1" 302 -
199
+ 2024-02-22 08:35:19,459 ERROR app Exception on /create_csv [GET]
200
+ Traceback (most recent call last):
201
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
202
+ response = self.full_dispatch_request()
203
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
204
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1487, in full_dispatch_request
205
+ return self.finalize_request(rv)
206
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
207
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1506, in finalize_request
208
+ response = self.make_response(rv)
209
+ ^^^^^^^^^^^^^^^^^^^^^^
210
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1801, in make_response
211
+ raise TypeError(
212
+ TypeError: The view function for 'create_csv' did not return a valid response. The function either returned None or ended without a return statement.
213
+ 2024-02-22 08:35:19,467 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:35:19] "GET /create_csv HTTP/1.1" 500 -
214
+ 2024-02-22 08:35:20,086 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:35:20] "GET /get_data HTTP/1.1" 404 -
215
+ 2024-02-22 08:56:07,674 ERROR app 'NoneType' object is not iterable
216
+ 2024-02-22 08:56:07,680 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:56:07] "GET /run_inference HTTP/1.1" 302 -
217
+ 2024-02-22 08:56:07,738 ERROR app Exception on /create_csv [GET]
218
+ Traceback (most recent call last):
219
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
220
+ response = self.full_dispatch_request()
221
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
222
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1487, in full_dispatch_request
223
+ return self.finalize_request(rv)
224
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
225
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1506, in finalize_request
226
+ response = self.make_response(rv)
227
+ ^^^^^^^^^^^^^^^^^^^^^^
228
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1801, in make_response
229
+ raise TypeError(
230
+ TypeError: The view function for 'create_csv' did not return a valid response. The function either returned None or ended without a return statement.
231
+ 2024-02-22 08:56:07,746 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:56:07] "GET /create_csv HTTP/1.1" 500 -
232
+ 2024-02-22 08:56:08,300 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 08:56:08] "GET /get_data HTTP/1.1" 404 -
233
+ 2024-02-22 10:10:19,427 ERROR app 'NoneType' object is not iterable
234
+ 2024-02-22 10:10:19,434 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:10:19] "GET /run_inference HTTP/1.1" 302 -
235
+ 2024-02-22 10:10:19,502 ERROR app Exception on /create_csv [GET]
236
+ Traceback (most recent call last):
237
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
238
+ response = self.full_dispatch_request()
239
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
240
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1487, in full_dispatch_request
241
+ return self.finalize_request(rv)
242
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
243
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1506, in finalize_request
244
+ response = self.make_response(rv)
245
+ ^^^^^^^^^^^^^^^^^^^^^^
246
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1801, in make_response
247
+ raise TypeError(
248
+ TypeError: The view function for 'create_csv' did not return a valid response. The function either returned None or ended without a return statement.
249
+ 2024-02-22 10:10:19,518 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:10:19] "GET /create_csv HTTP/1.1" 500 -
250
+ 2024-02-22 10:10:21,030 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:10:21] "GET /get_data HTTP/1.1" 404 -
251
+ 2024-02-22 10:15:13,513 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET / HTTP/1.1" 200 -
252
+ 2024-02-22 10:15:13,667 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/css/style.css HTTP/1.1" 304 -
253
+ 2024-02-22 10:15:13,683 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/css/color.css HTTP/1.1" 304 -
254
+ 2024-02-22 10:15:13,700 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
255
+ 2024-02-22 10:15:13,739 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/css/animate.css HTTP/1.1" 304 -
256
+ 2024-02-22 10:15:13,751 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /styles.css HTTP/1.1" 404 -
257
+ 2024-02-22 10:15:13,803 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/images/logo.png HTTP/1.1" 304 -
258
+ 2024-02-22 10:15:13,818 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/images/uplogo.gif HTTP/1.1" 304 -
259
+ 2024-02-22 10:15:13,976 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
260
+ 2024-02-22 10:15:13,976 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/js/wow.min.js HTTP/1.1" 304 -
261
+ 2024-02-22 10:15:13,987 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:13] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
262
+ 2024-02-22 10:15:14,007 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
263
+ 2024-02-22 10:15:14,446 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
264
+ 2024-02-22 10:15:14,566 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
265
+ 2024-02-22 10:15:14,701 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
266
+ 2024-02-22 10:15:14,734 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/static/js/jquery.stickyNavbar.min.js HTTP/1.1" 404 -
267
+ 2024-02-22 10:15:14,776 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
268
+ 2024-02-22 10:15:14,816 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:14] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
269
+ 2024-02-22 10:15:16,790 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:16] "GET /static/js/site.js HTTP/1.1" 304 -
270
+ 2024-02-22 10:15:16,797 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:16] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
271
+ 2024-02-22 10:15:16,992 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:15:16] "GET /static/images/favicon.ico HTTP/1.1" 304 -
272
+ 2024-02-22 10:16:06,240 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:06] "POST /upload HTTP/1.1" 302 -
273
+ 2024-02-22 10:16:12,283 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /predict/['receipt_384.jpg'] HTTP/1.1" 200 -
274
+ 2024-02-22 10:16:12,541 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/css/style.css HTTP/1.1" 304 -
275
+ 2024-02-22 10:16:12,553 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/css/color.css HTTP/1.1" 304 -
276
+ 2024-02-22 10:16:12,643 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /predict/css/animate.css HTTP/1.1" 404 -
277
+ 2024-02-22 10:16:12,648 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/css/font-awesome.min.css HTTP/1.1" 304 -
278
+ 2024-02-22 10:16:12,744 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/images/logo.png HTTP/1.1" 304 -
279
+ 2024-02-22 10:16:12,821 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/temp/img_display/receipt_384.jpg HTTP/1.1" 200 -
280
+ 2024-02-22 10:16:12,850 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/images/avatar.gif HTTP/1.1" 304 -
281
+ 2024-02-22 10:16:12,877 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/js/jquery.1.8.3.min.js HTTP/1.1" 304 -
282
+ 2024-02-22 10:16:12,903 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/js/wow.min.js HTTP/1.1" 304 -
283
+ 2024-02-22 10:16:12,972 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/js/featherlight.min.js HTTP/1.1" 304 -
284
+ 2024-02-22 10:16:12,977 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/js/featherlight.gallery.min.js HTTP/1.1" 304 -
285
+ 2024-02-22 10:16:12,985 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:12] "GET /static/js/jquery.enllax.min.js HTTP/1.1" 304 -
286
+ 2024-02-22 10:16:13,042 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/jquery.scrollUp.min.js HTTP/1.1" 304 -
287
+ 2024-02-22 10:16:13,084 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/jquery.easing.min.js HTTP/1.1" 304 -
288
+ 2024-02-22 10:16:13,108 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/jquery.stickyNavbar.min.js HTTP/1.1" 304 -
289
+ 2024-02-22 10:16:13,125 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/jquery.waypoints.min.js HTTP/1.1" 304 -
290
+ 2024-02-22 10:16:13,159 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/images-loaded.min.js HTTP/1.1" 304 -
291
+ 2024-02-22 10:16:13,196 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/lightbox.min.js HTTP/1.1" 304 -
292
+ 2024-02-22 10:16:13,200 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:13] "GET /static/js/site.js HTTP/1.1" 304 -
293
+ 2024-02-22 10:16:14,036 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:16:14] "GET /static/images/favicon.ico HTTP/1.1" 304 -
294
+ 2024-02-22 10:18:01,407 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:18:01] "GET /run_inference HTTP/1.1" 302 -
295
+ 2024-02-22 10:18:01,531 ERROR app Exception on /create_csv [GET]
296
+ Traceback (most recent call last):
297
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
298
+ response = self.full_dispatch_request()
299
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
300
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1487, in full_dispatch_request
301
+ return self.finalize_request(rv)
302
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
303
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1506, in finalize_request
304
+ response = self.make_response(rv)
305
+ ^^^^^^^^^^^^^^^^^^^^^^
306
+ File "C:\Users\Ayoo\anaconda3\envs\mlenv\Lib\site-packages\flask\app.py", line 1801, in make_response
307
+ raise TypeError(
308
+ TypeError: The view function for 'create_csv' did not return a valid response. The function either returned None or ended without a return statement.
309
+ 2024-02-22 10:18:01,539 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:18:01] "GET /create_csv HTTP/1.1" 500 -
310
+ 2024-02-22 10:18:02,099 INFO werkzeug 127.0.0.1 - - [22/Feb/2024 10:18:02] "GET /get_data HTTP/1.1" 404 -
static/css/style.css CHANGED
@@ -1,17 +1,15 @@
1
  /*------------------------------------------------------------------------------------------*/
2
 
3
-
4
  /* 1. Defaults & Reset of specific styles across browsers */
5
 
6
-
7
  /*------------------------------------------------------------------------------------------*/
8
 
9
  *,
10
  *:before,
11
  *:after {
12
- -webkit-box-sizing: border-box;
13
- -moz-box-sizing: border-box;
14
- box-sizing: border-box;
15
  }
16
 
17
  body,
@@ -33,1333 +31,1287 @@ form,
33
  blockquote,
34
  th,
35
  td {
36
- margin: 0;
37
- padding: 0;
38
- direction: ltr;
39
  }
40
 
41
  body {
42
- margin: 0;
43
- padding: 0;
44
- -webkit-font-smoothing: antialiased;
45
- overflow-x: hidden;
46
  }
47
 
48
  p {
49
- line-height: 25px;
50
  }
51
 
52
  .row img {
53
- height: auto;
54
- max-width: 100%;
55
  }
56
 
57
  a {
58
- text-decoration: none;
59
- line-height: inherit;
60
- -webkit-transition: opacity 0.3s ease-out;
61
- -moz-transition: opacity 0.3s ease-out;
62
- -o-transition: opacity 0.3s ease-out;
63
- transition: opacity 0.3s ease-out;
64
  }
65
 
66
  iframe {
67
- border: 0 !important;
68
  }
69
 
70
  .parallax-window {
71
- min-height: 400px;
72
- background: transparent;
73
  }
74
 
75
  figure {
76
- margin: 0;
77
  }
78
 
79
-
80
  /* Page Border */
81
 
82
  .page-border {
83
- position: fixed;
84
- z-index: 999999;
85
- pointer-events: none;
86
  }
87
 
88
  .page-border .bottom-border,
89
  .page-border .left-border,
90
  .page-border .right-border,
91
  .page-border .top-border {
92
- background: #f3f3efcd;
93
- position: fixed;
94
- z-index: 9999;
95
  }
96
 
97
- .page-border>.top-border,
98
- .page-border>.right-border,
99
- .page-border>.bottom-border,
100
- .page-border>.left-border {
101
- padding: 11px;
102
- background: #ccc;
103
  }
104
 
105
  .page-border .bottom-border,
106
  .page-border .top-border {
107
- width: 100%;
108
- padding: 10px;
109
- left: 0;
110
  }
111
 
112
  .page-border .left-border,
113
  .page-border .right-border {
114
- padding: 10px;
115
- height: 100%;
116
- top: 0;
117
  }
118
 
119
  .page-border .top-border {
120
- top: 0;
121
  }
122
 
123
  .page-border .right-border {
124
- right: 0;
125
  }
126
 
127
  .page-border .bottom-border {
128
- bottom: 0;
129
  }
130
 
131
  .page-border .left-border {
132
- left: 0;
133
  }
134
 
135
  #wrapper {
136
- margin: 0 15px;
137
- padding: 15px 0;
138
- position: relative;
139
  }
140
 
141
-
142
  /* --------- 1.1 Input Elements ---------- */
143
 
144
  input,
145
  textarea {
146
- border: 1px solid #e1e1e1;
147
- padding: 10px;
148
- -webkit-transition: all .3s linear;
149
- -moz-transition: all .3s linear;
150
- transition: all .3s linear;
151
- border-radius: 3px;
152
  }
153
 
154
  input {
155
- height: 40px;
156
- margin: 3px 0;
157
- outline: none;
158
- line-height: normal;
159
- font-size: 14px;
160
  }
161
 
162
  input[type="submit"] {
163
- cursor: pointer;
164
- border-style: solid;
165
- border-width: 2px;
166
- padding-top: 0;
167
- padding-bottom: 0;
168
  }
169
 
170
  select {
171
- border: 1px solid #e1e1e1;
172
- height: 40px;
173
- padding: 5px;
174
  }
175
 
176
  input:focus,
177
  textarea:focus {
178
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
179
  }
180
 
181
  *:focus {
182
- outline: none;
183
  }
184
 
185
-
186
  /*------------------------------------------------------------------------------------------*/
187
 
188
-
189
  /* 2. Layout Elements */
190
 
191
-
192
  /*------------------------------------------------------------------------------------------*/
193
 
194
  section {
195
- clear: both;
196
- overflow: hidden;
197
  }
198
 
199
-
200
  /* Rows and Columns */
201
 
202
  .row {
203
- max-width: 1245px;
204
- margin: 0 auto;
205
- padding: 75px 0;
206
- position: relative;
207
  }
208
 
209
  .no-padding-bottom .row,
210
  .no-padding-bottom div,
211
  .no-padding-bottom.row {
212
- padding-bottom: 0;
213
  }
214
 
215
  .no-padding-top.row,
216
  .no-padding-top div {
217
- padding-top: 0;
218
  }
219
 
220
  .big-padding-top {
221
- padding-top: 75px !important;
222
  }
223
 
224
  .big-padding-bottom {
225
- padding-bottom: 85px !important;
226
  }
227
 
228
-
229
  /* Targets all elements */
230
 
231
- [class*='col-'] {
232
- float: left;
233
- padding: 20px;
234
  }
235
 
236
- #clients .col-2-3 [class*='col-'] {
237
- padding: 0;
238
  }
239
 
240
-
241
  /* Clearfix */
242
 
243
  .clearfix:after {
244
- content: "";
245
- display: table;
246
- clear: both;
247
  }
248
 
249
-
250
  /* Main Widths */
251
 
252
  .col-1 {
253
- width: 100%;
254
  }
255
 
256
  .col-2 {
257
- width: 50%;
258
  }
259
 
260
  .col-3 {
261
- width: 33.33%;
262
  }
263
 
264
  .col-4 {
265
- width: 25%;
266
  }
267
 
268
  .col-5 {
269
- width: 20%;
270
  }
271
 
272
  .col-6 {
273
- width: 16.6666666667%;
274
  }
275
 
276
  .col-7 {
277
- width: 14.2857142857%;
278
  }
279
 
280
  .col-8 {
281
- width: 12.5%;
282
  }
283
 
284
  .col-9 {
285
- width: 11.1111111111%;
286
  }
287
 
288
  .col-10 {
289
- width: 10%;
290
  }
291
 
292
  .col-11 {
293
- width: 9.09090909091%;
294
  }
295
 
296
  .col-12 {
297
- width: 8.33%;
298
  }
299
 
300
  .col-2-3 {
301
- width: 66.66%;
302
  }
303
 
304
  .col-3-4 {
305
- width: 75%;
306
  }
307
 
308
  .col-9-10 {
309
- width: 90%;
310
  }
311
 
312
-
313
  /* Golden Ratio */
314
 
315
  .col-lg-6 {
316
- width: 50%;
317
- height: auto;
318
  }
319
 
320
  .col-lg-3 {
321
- width: 50%;
322
  }
323
 
324
-
325
  /* --------- 2.1 Header --------- */
326
 
327
  #header {
328
- height: 71px !important;
329
- overflow: visible;
330
- z-index: 9999;
331
- width: 100%;
332
- position: absolute !important;
333
  }
334
 
335
  #header .row {
336
- padding: 0;
337
  }
338
 
339
  #header aside {
340
- text-align: right;
341
  }
342
 
343
  #header ul {
344
- text-align: right;
345
  }
346
 
347
  #header li {
348
- display: inline-block;
349
- list-style: none;
350
- margin: 0;
351
  }
352
 
353
-
354
  /* --------- 2.2 Logo ---------- */
355
 
356
  #logo {
357
- float: left;
358
- height: 90px;
359
- line-height: 66px;
360
- margin: 10px 15px 0 0;
361
  }
362
 
363
  #logo h1,
364
  #logo h2 {
365
- display: inline-block;
366
  }
367
 
368
  #banner #logo h1 {
369
- font-size: 28px;
370
- margin-right: 10px;
371
- font-weight: 900;
372
- padding: 0;
373
  }
374
 
375
  #logo h2 {
376
- font-size: 18px;
377
- padding: 0;
378
  }
379
 
380
  #logo img {
381
- max-height: 40px;
382
- vertical-align: middle;
383
- margin-right: 15px;
384
  }
385
 
386
  #navigation-logo {
387
- display: none;
388
  }
389
 
390
  .nav-solid #logo #banner-logo {
391
- display: none;
392
  }
393
 
394
  .nav-solid #logo #navigation-logo {
395
- display: inline-block;
396
- margin-bottom: 10px;
397
  }
398
 
399
-
400
  /* --------- 2.3 Buttons ---------- */
401
 
402
  .call-to-action {
403
- padding: 35px 0 35px 0;
404
  }
405
 
406
-
407
  /*Style*/
408
 
409
  .button {
410
- font-size: 16px;
411
- margin: 35px 0;
412
- padding: 11px 16px;
413
- -webkit-transition: all .3s linear;
414
- -moz-transition: all .3s linear;
415
- transition: all .3s linear;
416
- display: inline-block;
417
- border-width: 3px;
418
- border-style: solid;
419
  }
420
 
421
-
422
  /* --------- 2.4 Navigation ---------- */
423
 
424
  #header {
425
- font-size: 13px;
426
  }
427
 
428
  #header aside {
429
- float: right;
430
  }
431
 
432
  #header nav ul {
433
- text-transform: uppercase;
434
  }
435
 
436
  #header nav a {
437
- height: 71px;
438
- line-height: 90px;
439
- display: block;
440
- padding: 0 10px;
441
  }
442
 
443
  #header nav a:hover {
444
- color: #FF8B4A;
445
  }
446
 
447
-
448
  /*Navigation Solid*/
449
 
450
- #header.nav-solid [class*='col-'] {
451
- padding: 0 20px;
452
  }
453
 
454
  #header.nav-solid {
455
- background: #fff;
456
- box-shadow: 2px 0px 3px rgba(0, 0, 0, 0.2);
457
- position: fixed !important;
458
- left: 0;
459
  }
460
 
461
  #header.nav-solid nav a {
462
- border-bottom: 3px solid;
463
- border-color: #fff;
464
- -webkit-transition: all 0.3s ease-out;
465
- -moz-transition: all 0.3s ease-out;
466
- -o-transition: all 0.3s ease-out;
467
- transition: all 0.3s ease-out;
468
  }
469
 
470
  #header.nav-solid nav a:hover {
471
- opacity: 1;
472
  }
473
 
474
-
475
  /* Social Elements when Solid*/
476
 
477
  #header.nav-solid .social-icons a {
478
- -webkit-transition: all 0.3s ease-out;
479
- -moz-transition: all 0.3s ease-out;
480
- -o-transition: all 0.3s ease-out;
481
- transition: all 0.3s ease-out;
482
- opacity: 0.5;
483
  }
484
 
485
  #header.nav-solid .social-icons a:hover {
486
- opacity: 1;
487
- color: #e4473c;
488
  }
489
 
490
-
491
  /* Responsive Nav Styling */
492
 
493
  #nav-trigger {
494
- display: none;
495
- text-align: right;
496
  }
497
 
498
  #nav-trigger span {
499
- display: inline-block;
500
- width: 38px;
501
- height: 71px;
502
- color: #111;
503
- cursor: pointer;
504
- text-transform: uppercase;
505
- font-size: 22px;
506
- text-align: center;
507
- border-top-right-radius: 5px;
508
- border-top-left-radius: 5px;
509
- -webkit-transition: all 0.3s ease-out;
510
- -moz-transition: all 0.3s ease-out;
511
- -o-transition: all 0.3s ease-out;
512
- transition: all 0.3s ease-out;
513
  }
514
 
515
  #nav-trigger span:after {
516
- font-family: "fontAwesome";
517
- display: inline-block;
518
- width: 38px;
519
- height: 71px;
520
- line-height: 75px;
521
- text-align: center;
522
- content: '\2630';
523
- border-top-right-radius: 5px;
524
- border-top-left-radius: 5px;
525
- transition: all .4s ease-in-out;
526
  }
527
 
528
  #nav-trigger span.open:after {
529
- content: '\269E';
530
- transition: all .4s ease-in-out;
531
  }
532
 
533
  #nav-trigger span:hover,
534
  .nav-solid #nav-trigger span.open:hover,
535
  .nav-solid #nav-trigger span:hover {
536
- opacity: 0.6;
537
  }
538
 
539
  #nav-trigger span.open,
540
  #nav-trigger span.open:hover {
541
- color: #111;
542
  }
543
 
544
  .nav-solid #nav-trigger span.open:hover {
545
- color: #999;
546
  }
547
 
548
  .nav-solid #nav-trigger span {
549
- color: #999;
550
- opacity: 1;
551
  }
552
 
553
  nav#nav-mobile {
554
- position: relative;
555
- display: none;
556
  }
557
 
558
  nav#nav-mobile ul {
559
- display: none;
560
- list-style-type: none;
561
- position: absolute;
562
- left: 0;
563
- right: 0;
564
- margin-left: -20px;
565
- margin-right: -20px;
566
- padding-top: 10px;
567
- padding-bottom: 10px;
568
- text-align: center;
569
- background-color: #fff;
570
- box-shadow: 0 5px 3px rgba(0, 0, 0, 0.2);
571
  }
572
 
573
  nav#nav-mobile ul:after {
574
- display: none;
575
  }
576
 
577
  nav#nav-mobile li {
578
- margin: 0 20px;
579
- float: none;
580
- text-align: left;
581
- border-bottom: 1px solid #e1e1e1;
582
  }
583
 
584
  nav#nav-mobile li:last-child {
585
- border-bottom: none;
586
  }
587
 
588
  .nav-solid nav#nav-mobile li {
589
- border-top: 1px solid #e1e1e1;
590
- border-bottom: none;
591
  }
592
 
593
  nav#nav-mobile a {
594
- display: block;
595
- padding: 12px 0;
596
- color: #333;
597
- text-align: center;
598
- width: 100%;
599
- height: auto;
600
- line-height: normal;
601
- display: block;
602
- border-bottom: none !important;
603
- -webkit-transition: all 0.3s ease-out;
604
- -moz-transition: all 0.3s ease-out;
605
- -o-transition: all 0.3s ease-out;
606
- transition: all 0.3s ease-out;
607
  }
608
 
609
  nav#nav-mobile a:hover {
610
- background: #fafafa;
611
- opacity: 1;
612
  }
613
 
614
-
615
  /* --------- 2.5 Social Elements ---------- */
616
 
617
  #header .col-4 {
618
- text-align: right;
619
  }
620
 
621
  .social-icons {
622
- display: inline-block;
623
- list-style: none;
624
  }
625
 
626
  .social-icons a {
627
- display: inline-block;
628
- width: 32px;
629
- text-align: center;
630
  }
631
 
632
  .social-icons a:hover {
633
- opacity: 0.7;
634
  }
635
 
636
  .social-icons span {
637
- display: none;
638
  }
639
 
640
  #header .social-icons {
641
- margin-top: 27px;
642
  }
643
 
644
-
645
  /* --------- 2.6 Images ---------- */
646
 
647
-
648
  /*Alignment*/
649
 
650
  img {
651
- vertical-align: top;
652
  }
653
 
654
  .image-center {
655
- display: block;
656
- margin: 0 auto;
657
  }
658
 
659
  a img {
660
- border: none;
661
- -webkit-transition: all 0.3s ease-out;
662
- -moz-transition: all 0.3s ease-out;
663
- -o-transition: all 0.3s ease-out;
664
- transition: all 0.3s ease-out;
665
- -webkit-backface-visibility: hidden;
666
  }
667
 
668
  a img:hover {
669
- opacity: 0.7;
670
  }
671
 
672
-
673
  /*------------------------------------------------------------------------------------------*/
674
 
675
-
676
  /* 3. Fonts */
677
 
678
-
679
  /*------------------------------------------------------------------------------------------*/
680
 
681
  h1 {
682
- padding: 20px 0;
683
  }
684
 
685
  h2 {
686
- padding: 14px 0;
687
  }
688
 
689
  h3 {
690
- padding: 10px 0;
691
  }
692
 
693
  h4 {
694
- padding: 7px 0;
695
  }
696
 
697
  h5 {
698
- padding: 7px 0;
699
  }
700
 
701
  h6 {
702
- padding: 7px 0;
703
  }
704
 
705
-
706
  /* Text Alignment */
707
 
708
  .text-left {
709
- text-align: left;
710
  }
711
 
712
  .text-center {
713
- text-align: center;
714
  }
715
 
716
  .text-right {
717
- text-align: right;
718
  }
719
 
720
-
721
  /* Section Headings */
722
 
723
  .section-heading {
724
- padding: 0 0 15px 0;
725
- display: flex;
726
- justify-content: center;
727
  }
728
 
729
  .section-subtitle {
730
- font-size: 18px;
731
- padding-top: 0;
732
  }
733
 
734
  .section-heading h3 {
735
- font-size: 14px;
736
- font-weight: bold;
737
- color: #ccc;
738
- letter-spacing: 2px;
739
- padding-bottom: 0;
740
  }
741
 
742
-
743
  /*------------------------------------------------------------------------------------------*/
744
 
745
-
746
  /* 4. Banner */
747
 
748
-
749
  /*------------------------------------------------------------------------------------------*/
750
 
751
  #banner {
752
- background-size: cover;
753
  }
754
 
755
  #banner-content.row {
756
- padding-top: 50px;
757
- padding-bottom: 170px;
758
  }
759
 
760
  #banner h1 {
761
- padding-top: 5%;
762
  }
763
 
764
-
765
  /*------------------------------------------------------------------------------------------*/
766
 
767
-
768
  /* 5. Content Elements */
769
 
770
-
771
  /*------------------------------------------------------------------------------------------*/
772
 
773
-
774
  /* --------- 5.1 Icons ---------- */
775
 
776
-
777
  /*Font Icon sizes*/
778
 
779
  .fa-1x {
780
- font-size: 15px !important;
781
  }
782
 
783
-
784
  /*Icon Block*/
785
 
786
  .icon-block {
787
- position: relative;
788
  }
789
 
790
  .icon-block h4 {
791
- font-weight: bold;
792
- padding-top: 0;
793
  }
794
 
795
  .icon-block .icon {
796
- position: absolute;
797
  }
798
 
799
  .icon-block p {
800
- margin-top: 0;
801
  }
802
 
803
-
804
  /* Icon Left*/
805
 
806
  .icon-left .icon {
807
- left: 15;
808
  }
809
 
810
  .icon-left .icon-block-description {
811
- padding-left: 53px;
812
  }
813
 
814
-
815
  /* Icon Right */
816
 
817
  .icon-right .icon {
818
- right: 15;
819
  }
820
 
821
  .icon-right .icon-block-description {
822
- padding-right: 53px;
823
  }
824
 
825
-
826
  /* Icon Above */
827
 
828
  .icon-top {
829
- display: block;
830
  }
831
 
832
  .icon-top .icon {
833
- position: relative;
834
- display: block;
835
  }
836
 
837
  .icon-top .icon-block-description {
838
- padding-top: 25px;
839
  }
840
 
841
-
842
  /* --------- 5.2 Parallax Elements ---------- */
843
 
844
  .banner-parallax-1,
845
  .banner-parallax-2,
846
  .banner-parallax-3 {
847
- min-height: 350px;
848
  }
849
 
850
-
851
  /* --------- 5.3 Divider ---------- */
852
 
853
  .divider {
854
- position: relative;
855
- width: 40%;
856
- height: 20px;
857
- line-height: 20px;
858
- margin: 10px auto 5px auto;
859
- clear: both;
860
- text-align: center;
861
  }
862
 
863
  .divider-inner {
864
- position: absolute;
865
- height: 1px;
866
- width: 100%;
867
- top: 50%;
868
- margin-top: -1px;
869
- border-top: 1px solid;
870
- border-color: #e1e1e1;
871
  }
872
 
873
  .divider i {
874
- background: #fff;
875
- position: relative;
876
- top: -11px;
877
- padding: 0 5px 0 5px;
878
- color: #e1e1e1;
879
  }
880
 
881
  @media all {
882
- .featherlight {
883
- display: none;
884
- /* dimensions: spanning the background from edge to edge */
885
- position: fixed;
886
- top: 0;
887
- right: 0;
888
- bottom: 0;
889
- left: 0;
890
- z-index: 2147483647;
891
- /* z-index needs to be >= elements on the site. */
892
- /* position: centering content */
893
- text-align: center;
894
- /* insures that the ::before pseudo element doesn't force wrap with fixed width content; */
895
- white-space: nowrap;
896
- /* styling */
897
- cursor: pointer;
898
- background: #333;
899
- /* IE8 "hack" for nested featherlights */
900
- background: rgba(0, 0, 0, 0);
901
- }
902
- /* support for nested featherlights. Does not work in IE8 (use JS to fix) */
903
- .featherlight:last-of-type {
904
- background: rgba(0, 0, 0, 0.8);
905
- }
906
- .featherlight:before {
907
- /* position: trick to center content vertically */
908
- content: '';
909
- display: inline-block;
910
- height: 100%;
911
- vertical-align: middle;
912
- margin-right: -0.25em;
913
- }
914
- .featherlight .featherlight-content {
915
- /* position: centering vertical and horizontal */
916
- text-align: left;
917
- vertical-align: middle;
918
- display: inline-block;
919
- /* dimensions: cut off images */
920
- overflow: auto;
921
- padding: 25px 0;
922
- border-bottom: 25px solid transparent;
923
- /* dimensions: handling small or empty content */
924
- min-width: 30%;
925
- /* dimensions: handling large content */
926
- margin-left: 5%;
927
- margin-right: 5%;
928
- max-height: 95%;
929
- /* styling */
930
- cursor: auto;
931
- /* reset white-space wrapping */
932
- white-space: normal;
933
- }
934
- /* contains the content */
935
- .featherlight .featherlight-inner {
936
- /* make sure its visible */
937
- display: block;
938
- }
939
- .featherlight .featherlight-close-icon {
940
- /* position: centering vertical and horizontal */
941
- position: absolute;
942
- z-index: 9999;
943
- top: 25px;
944
- right: 25px;
945
- /* dimensions: 25px x 25px */
946
- line-height: 25px;
947
- width: 25px;
948
- /* styling */
949
- cursor: pointer;
950
- text-align: center;
951
- color: #fff;
952
- font-family: "fontawesome";
953
- font-size: 22px;
954
- opacity: 0.5;
955
- -webkit-transition: all 0.3s ease-out;
956
- -moz-transition: all 0.3s ease-out;
957
- -o-transition: all 0.3s ease-out;
958
- transition: all 0.3s ease-out;
959
- }
960
- .featherlight .featherlight-close-icon:hover {
961
- opacity: 1;
962
- }
963
- .featherlight .featherlight-image {
964
- /* styling */
965
- max-height: 100%;
966
- max-width: 100%;
967
- }
968
- .featherlight-iframe .featherlight-content {
969
- /* removed the border for image croping since iframe is edge to edge */
970
- border-bottom: 0;
971
- padding: 0;
972
- }
973
- .featherlight iframe {
974
- /* styling */
975
- border: none;
976
- }
977
  }
978
 
979
-
980
  /* handling phones and small screens */
981
 
982
  @media only screen and (max-width: 1024px) {
983
- .featherlight .featherlight-content {
984
- /* dimensions: maximize lightbox with for small screens */
985
- margin-left: 10px;
986
- margin-right: 10px;
987
- max-height: 98%;
988
- padding: 10px 10px 0;
989
- border-bottom: 10px solid transparent;
990
- }
991
  }
992
 
993
-
994
  /* Gallery Styling */
995
 
996
  @media all {
997
- .featherlight-next,
998
- .featherlight-previous {
999
- font-family: "fontawesome";
1000
- font-size: 22px;
1001
- display: block;
1002
- position: absolute;
1003
- top: 25px;
1004
- right: 0;
1005
- bottom: 0;
1006
- left: 80%;
1007
- cursor: pointer;
1008
- /* preventing text selection */
1009
- -webkit-touch-callout: none;
1010
- -webkit-user-select: none;
1011
- -khtml-user-select: none;
1012
- -moz-user-select: none;
1013
- -ms-user-select: none;
1014
- user-select: none;
1015
- /* IE9 hack, otherwise navigation doesn't appear */
1016
- background: rgba(0, 0, 0, 0);
1017
- -webkit-transition: all 0.3s ease-out;
1018
- -moz-transition: all 0.3s ease-out;
1019
- -o-transition: all 0.3s ease-out;
1020
- transition: all 0.3s ease-out;
1021
- }
1022
- .featherlight-previous {
1023
- left: 0;
1024
- right: 80%;
1025
- }
1026
- .featherlight-next span,
1027
- .featherlight-previous span {
1028
- display: inline-block;
1029
- opacity: 0.3;
1030
- position: absolute;
1031
- top: 50%;
1032
- width: 100%;
1033
- font-size: 80px;
1034
- line-height: 80px;
1035
- /* center vertically */
1036
- margin-top: -40px;
1037
- color: #fff;
1038
- font-style: normal;
1039
- font-weight: normal;
1040
- -webkit-transition: all 0.3s ease-out;
1041
- -moz-transition: all 0.3s ease-out;
1042
- -o-transition: all 0.3s ease-out;
1043
- transition: all 0.3s ease-out;
1044
- }
1045
- .featherlight-next span {
1046
- text-align: right;
1047
- left: auto;
1048
- right: 7%;
1049
- }
1050
- .featherlight-previous span {
1051
- text-align: left;
1052
- left: 7%;
1053
- }
1054
- .featherlight-next:hover span,
1055
- .featherlight-previous:hover span {
1056
- display: inline-block;
1057
- opacity: 1;
1058
- }
1059
- /* Hide navigation while loading */
1060
- .featherlight-loading .featherlight-previous,
1061
- .featherlight-loading .featherlight-next {
1062
- display: none;
1063
- }
1064
  }
1065
 
1066
-
1067
  /* Always display arrows on touch devices */
1068
 
1069
  @media only screen and (max-device-width: 1024px) {
1070
- .featherlight-next:hover,
1071
- .featherlight-previous:hover {
1072
- background: none;
1073
- }
1074
- .featherlight-next span,
1075
- .featherlight-previous span {
1076
- display: block;
1077
- }
1078
  }
1079
 
1080
-
1081
  /* handling phones and small screens */
1082
 
1083
  @media only screen and (max-width: 1024px) {
1084
- .featherlight-next,
1085
- .featherlight-previous {
1086
- top: 10px;
1087
- right: 10px;
1088
- left: 85%;
1089
- }
1090
- .featherlight-previous {
1091
- left: 10px;
1092
- right: 85%;
1093
- }
1094
- .featherlight-next span,
1095
- .featherlight-previous span {
1096
- margin-top: -30px;
1097
- font-size: 40px;
1098
- }
1099
  }
1100
 
1101
  .loader {
1102
- z-index: 999999;
1103
- width: 94px;
1104
- height: 77px;
1105
- position: relative;
1106
- top: 20%;
1107
- left: 50%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1108
  transform: translate(-50%, -50%);
 
1109
  backface-visibility: hidden;
1110
- display: none;
1111
- span {
1112
- position: absolute;
1113
- left: 0;
1114
- top: 0;
1115
- width: 100%;
1116
- height: 20px;
1117
- background-color: #ff8c4a6f;
1118
- z-index: 1;
1119
- transform: translateY(135%);
1120
- animation: move 2s cubic-bezier(0.15, 0.44, 0.76, 0.64);
1121
- /* Adjust the animation duration here */
1122
- animation-iteration-count: infinite;
1123
  }
1124
- >div {
1125
- z-index: 1;
1126
- position: absolute;
1127
- left: 50%;
1128
- top: 50%;
1129
- transform: translate(-50%, -50%);
1130
- width: 48%;
1131
- backface-visibility: hidden;
1132
  }
1133
- i {
1134
- display: block;
1135
- height: 1px;
1136
- background: #000;
1137
- margin: 0 auto 2px;
1138
- margin: 0 auto 2.2px;
1139
- backface-visibility: hidden;
1140
- &:nth-child(2) {
1141
- width: 75%;
1142
- }
1143
- &:nth-child(3) {
1144
- width: 81%;
1145
- }
1146
- &:nth-child(4) {
1147
- width: 87%;
1148
- }
1149
- &:nth-child(6) {
1150
- width: 71%;
1151
- }
1152
- &:nth-child(7) {
1153
- width: 81%;
1154
- }
1155
- &:nth-child(8) {
1156
- width: 65%;
1157
- }
1158
- &:nth-child(9) {
1159
- width: 83%;
1160
- }
1161
- &:nth-child(10) {
1162
- width: 75%;
1163
- }
1164
- &:nth-child(12) {
1165
- width: 86%;
1166
- }
1167
- &:nth-child(14) {
1168
- width: 65%;
1169
- }
1170
- &:nth-child(16) {
1171
- width: 75%;
1172
- }
1173
- &:nth-child(18) {
1174
- width: 83%;
1175
- }
1176
  }
1177
- &:before,
1178
- &:after,
1179
- em:after,
1180
- em:before {
1181
- border-color: #000;
1182
- content: "";
1183
- position: absolute;
1184
- width: 19px;
1185
- height: 16px;
1186
- border-style: solid;
1187
- border-width: 0px;
1188
  }
1189
- &:before {
1190
- left: 0;
1191
- top: 0;
1192
- border-left-width: 1px;
1193
- border-top-width: 1px;
1194
  }
1195
- &:after {
1196
- right: 0;
1197
- top: 0;
1198
- border-right-width: 1px;
1199
- border-top-width: 1px;
1200
  }
1201
- em:before {
1202
- left: 0;
1203
- bottom: 0;
1204
- border-left-width: 1px;
1205
- border-bottom-width: 1px;
1206
  }
1207
- em:after {
1208
- right: 0;
1209
- bottom: 0;
1210
- border-right-width: 1px;
1211
- border-bottom-width: 1px;
1212
  }
1213
- }
1214
-
1215
- @keyframes move {
1216
- 0%,
1217
- 100% {
1218
- transform: translateY(0%);
1219
  }
1220
- 25% {
1221
- transform: translateY(135%);
1222
  }
1223
- 50% {
1224
- transform: translateY(272%);
1225
  }
1226
- 75% {
1227
- transform: translateY(135%);
1228
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1229
  }
1230
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1231
 
1232
  /*Preloader*/
1233
 
1234
  .ocrloader {
1235
- z-index: 999999;
1236
- width: 94px;
1237
- height: 77px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1238
  position: absolute;
1239
  left: 50%;
1240
  top: 50%;
1241
  transform: translate(-50%, -50%);
 
1242
  backface-visibility: hidden;
1243
- span {
1244
- position: absolute;
1245
- left: 0;
1246
- top: 0;
1247
- width: 100%;
1248
- height: 20px;
1249
- background-color: #ff8c4a6f;
1250
- z-index: 1;
1251
- transform: translateY(135%);
1252
- animation: move 2s cubic-bezier(0.15, 0.44, 0.76, 0.64);
1253
- /* Adjust the animation duration here */
1254
- animation-iteration-count: infinite;
1255
  }
1256
- >div {
1257
- z-index: 1;
1258
- position: absolute;
1259
- left: 50%;
1260
- top: 50%;
1261
- transform: translate(-50%, -50%);
1262
- width: 48%;
1263
- backface-visibility: hidden;
1264
  }
1265
- i {
1266
- display: block;
1267
- height: 1px;
1268
- background: #000;
1269
- margin: 0 auto 2px;
1270
- margin: 0 auto 2.2px;
1271
- backface-visibility: hidden;
1272
- &:nth-child(2) {
1273
- width: 75%;
1274
- }
1275
- &:nth-child(3) {
1276
- width: 81%;
1277
- }
1278
- &:nth-child(4) {
1279
- width: 87%;
1280
- }
1281
- &:nth-child(6) {
1282
- width: 71%;
1283
- }
1284
- &:nth-child(7) {
1285
- width: 81%;
1286
- }
1287
- &:nth-child(8) {
1288
- width: 65%;
1289
- }
1290
- &:nth-child(9) {
1291
- width: 83%;
1292
- }
1293
- &:nth-child(10) {
1294
- width: 75%;
1295
- }
1296
- &:nth-child(12) {
1297
- width: 86%;
1298
- }
1299
- &:nth-child(14) {
1300
- width: 65%;
1301
- }
1302
- &:nth-child(16) {
1303
- width: 75%;
1304
- }
1305
- &:nth-child(18) {
1306
- width: 83%;
1307
- }
1308
  }
1309
- &:before,
1310
- &:after,
1311
- em:after,
1312
- em:before {
1313
- border-color: #000;
1314
- content: "";
1315
- position: absolute;
1316
- width: 19px;
1317
- height: 16px;
1318
- border-style: solid;
1319
- border-width: 0px;
1320
  }
1321
- &:before {
1322
- left: 0;
1323
- top: 0;
1324
- border-left-width: 1px;
1325
- border-top-width: 1px;
1326
  }
1327
- &:after {
1328
- right: 0;
1329
- top: 0;
1330
- border-right-width: 1px;
1331
- border-top-width: 1px;
1332
  }
1333
- em:before {
1334
- left: 0;
1335
- bottom: 0;
1336
- border-left-width: 1px;
1337
- border-bottom-width: 1px;
1338
  }
1339
- em:after {
1340
- right: 0;
1341
- bottom: 0;
1342
- border-right-width: 1px;
1343
- border-bottom-width: 1px;
1344
  }
1345
- }
1346
-
1347
- @keyframes move {
1348
- 0%,
1349
- 100% {
1350
- transform: translateY(0%);
1351
  }
1352
- 25% {
1353
- transform: translateY(135%);
1354
  }
1355
- 50% {
1356
- transform: translateY(272%);
1357
  }
1358
- 75% {
1359
- transform: translateY(135%);
1360
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1361
  }
1362
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1363
 
1364
  /*!
1365
  * Load Awesome v1.1.0 (http://github.danielcardoso.net/load-awesome/)
@@ -1368,1246 +1320,1236 @@ h6 {
1368
  */
1369
 
1370
  .la-ball-triangle-path,
1371
- .la-ball-triangle-path>div {
1372
- position: relative;
1373
- -webkit-box-sizing: border-box;
1374
- -moz-box-sizing: border-box;
1375
- box-sizing: border-box;
1376
  }
1377
 
1378
  .la-ball-triangle-path {
1379
- display: block;
1380
- font-size: 0;
1381
- color: #fff;
1382
  }
1383
 
1384
  .la-ball-triangle-path.la-dark {
1385
- color: #333;
1386
  }
1387
 
1388
- .la-ball-triangle-path>div {
1389
- display: inline-block;
1390
- float: none;
1391
- background-color: currentColor;
1392
- border: 0 solid currentColor;
1393
  }
1394
 
1395
  .la-ball-triangle-path {
1396
- width: 32px;
1397
- height: 32px;
1398
  }
1399
 
1400
- .la-ball-triangle-path>div {
1401
- position: absolute;
1402
- top: 0;
1403
- left: 0;
1404
- width: 10px;
1405
- height: 10px;
1406
- border-radius: 100%;
1407
  }
1408
 
1409
- .la-ball-triangle-path>div:nth-child(1) {
1410
- -webkit-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1411
- -moz-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1412
- -o-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1413
- animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1414
  }
1415
 
1416
- .la-ball-triangle-path>div:nth-child(2) {
1417
- -webkit-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1418
- -moz-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1419
- -o-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1420
- animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1421
  }
1422
 
1423
- .la-ball-triangle-path>div:nth-child(3) {
1424
- -webkit-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1425
- -moz-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1426
- -o-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1427
- animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1428
  }
1429
 
1430
  .la-ball-triangle-path.la-sm {
1431
- width: 16px;
1432
- height: 16px;
1433
  }
1434
 
1435
- .la-ball-triangle-path.la-sm>div {
1436
- width: 4px;
1437
- height: 4px;
1438
  }
1439
 
1440
  .la-ball-triangle-path.la-2x {
1441
- width: 64px;
1442
- height: 64px;
1443
  }
1444
 
1445
- .la-ball-triangle-path.la-2x>div {
1446
- width: 20px;
1447
- height: 20px;
1448
  }
1449
 
1450
  .la-ball-triangle-path.la-3x {
1451
- width: 96px;
1452
- height: 96px;
1453
  }
1454
 
1455
- .la-ball-triangle-path.la-3x>div {
1456
- width: 30px;
1457
- height: 30px;
1458
  }
1459
 
1460
-
1461
  /*
1462
  * Animations
1463
  */
1464
 
1465
  @-webkit-keyframes ball-triangle-path-ball-one {
1466
- 0% {
1467
- -webkit-transform: translate(0, 220%);
1468
- transform: translate(0, 220%);
1469
- }
1470
- 17% {
1471
- opacity: .25;
1472
- }
1473
- 33% {
1474
- opacity: 1;
1475
- -webkit-transform: translate(110%, 0);
1476
- transform: translate(110%, 0);
1477
- }
1478
- 50% {
1479
- opacity: .25;
1480
- }
1481
- 66% {
1482
- opacity: 1;
1483
- -webkit-transform: translate(220%, 220%);
1484
- transform: translate(220%, 220%);
1485
- }
1486
- 83% {
1487
- opacity: .25;
1488
- }
1489
- 100% {
1490
- opacity: 1;
1491
- -webkit-transform: translate(0, 220%);
1492
- transform: translate(0, 220%);
1493
- }
1494
  }
1495
 
1496
  @-moz-keyframes ball-triangle-path-ball-one {
1497
- 0% {
1498
- -moz-transform: translate(0, 220%);
1499
- transform: translate(0, 220%);
1500
- }
1501
- 17% {
1502
- opacity: .25;
1503
- }
1504
- 33% {
1505
- opacity: 1;
1506
- -moz-transform: translate(110%, 0);
1507
- transform: translate(110%, 0);
1508
- }
1509
- 50% {
1510
- opacity: .25;
1511
- }
1512
- 66% {
1513
- opacity: 1;
1514
- -moz-transform: translate(220%, 220%);
1515
- transform: translate(220%, 220%);
1516
- }
1517
- 83% {
1518
- opacity: .25;
1519
- }
1520
- 100% {
1521
- opacity: 1;
1522
- -moz-transform: translate(0, 220%);
1523
- transform: translate(0, 220%);
1524
- }
1525
  }
1526
 
1527
  @-o-keyframes ball-triangle-path-ball-one {
1528
- 0% {
1529
- -o-transform: translate(0, 220%);
1530
- transform: translate(0, 220%);
1531
- }
1532
- 17% {
1533
- opacity: .25;
1534
- }
1535
- 33% {
1536
- opacity: 1;
1537
- -o-transform: translate(110%, 0);
1538
- transform: translate(110%, 0);
1539
- }
1540
- 50% {
1541
- opacity: .25;
1542
- }
1543
- 66% {
1544
- opacity: 1;
1545
- -o-transform: translate(220%, 220%);
1546
- transform: translate(220%, 220%);
1547
- }
1548
- 83% {
1549
- opacity: .25;
1550
- }
1551
- 100% {
1552
- opacity: 1;
1553
- -o-transform: translate(0, 220%);
1554
- transform: translate(0, 220%);
1555
- }
1556
  }
1557
 
1558
  @keyframes ball-triangle-path-ball-one {
1559
- 0% {
1560
- -webkit-transform: translate(0, 220%);
1561
- -moz-transform: translate(0, 220%);
1562
- -o-transform: translate(0, 220%);
1563
- transform: translate(0, 220%);
1564
- }
1565
- 17% {
1566
- opacity: .25;
1567
- }
1568
- 33% {
1569
- opacity: 1;
1570
- -webkit-transform: translate(110%, 0);
1571
- -moz-transform: translate(110%, 0);
1572
- -o-transform: translate(110%, 0);
1573
- transform: translate(110%, 0);
1574
- }
1575
- 50% {
1576
- opacity: .25;
1577
- }
1578
- 66% {
1579
- opacity: 1;
1580
- -webkit-transform: translate(220%, 220%);
1581
- -moz-transform: translate(220%, 220%);
1582
- -o-transform: translate(220%, 220%);
1583
- transform: translate(220%, 220%);
1584
- }
1585
- 83% {
1586
- opacity: .25;
1587
- }
1588
- 100% {
1589
- opacity: 1;
1590
- -webkit-transform: translate(0, 220%);
1591
- -moz-transform: translate(0, 220%);
1592
- -o-transform: translate(0, 220%);
1593
- transform: translate(0, 220%);
1594
- }
1595
  }
1596
 
1597
  @-webkit-keyframes ball-triangle-path-ball-two {
1598
- 0% {
1599
- -webkit-transform: translate(110%, 0);
1600
- transform: translate(110%, 0);
1601
- }
1602
- 17% {
1603
- opacity: .25;
1604
- }
1605
- 33% {
1606
- opacity: 1;
1607
- -webkit-transform: translate(220%, 220%);
1608
- transform: translate(220%, 220%);
1609
- }
1610
- 50% {
1611
- opacity: .25;
1612
- }
1613
- 66% {
1614
- opacity: 1;
1615
- -webkit-transform: translate(0, 220%);
1616
- transform: translate(0, 220%);
1617
- }
1618
- 83% {
1619
- opacity: .25;
1620
- }
1621
- 100% {
1622
- opacity: 1;
1623
- -webkit-transform: translate(110%, 0);
1624
- transform: translate(110%, 0);
1625
- }
1626
  }
1627
 
1628
  @-moz-keyframes ball-triangle-path-ball-two {
1629
- 0% {
1630
- -moz-transform: translate(110%, 0);
1631
- transform: translate(110%, 0);
1632
- }
1633
- 17% {
1634
- opacity: .25;
1635
- }
1636
- 33% {
1637
- opacity: 1;
1638
- -moz-transform: translate(220%, 220%);
1639
- transform: translate(220%, 220%);
1640
- }
1641
- 50% {
1642
- opacity: .25;
1643
- }
1644
- 66% {
1645
- opacity: 1;
1646
- -moz-transform: translate(0, 220%);
1647
- transform: translate(0, 220%);
1648
- }
1649
- 83% {
1650
- opacity: .25;
1651
- }
1652
- 100% {
1653
- opacity: 1;
1654
- -moz-transform: translate(110%, 0);
1655
- transform: translate(110%, 0);
1656
- }
1657
  }
1658
 
1659
  @-o-keyframes ball-triangle-path-ball-two {
1660
- 0% {
1661
- -o-transform: translate(110%, 0);
1662
- transform: translate(110%, 0);
1663
- }
1664
- 17% {
1665
- opacity: .25;
1666
- }
1667
- 33% {
1668
- opacity: 1;
1669
- -o-transform: translate(220%, 220%);
1670
- transform: translate(220%, 220%);
1671
- }
1672
- 50% {
1673
- opacity: .25;
1674
- }
1675
- 66% {
1676
- opacity: 1;
1677
- -o-transform: translate(0, 220%);
1678
- transform: translate(0, 220%);
1679
- }
1680
- 83% {
1681
- opacity: .25;
1682
- }
1683
- 100% {
1684
- opacity: 1;
1685
- -o-transform: translate(110%, 0);
1686
- transform: translate(110%, 0);
1687
- }
1688
  }
1689
 
1690
  @keyframes ball-triangle-path-ball-two {
1691
- 0% {
1692
- -webkit-transform: translate(110%, 0);
1693
- -moz-transform: translate(110%, 0);
1694
- -o-transform: translate(110%, 0);
1695
- transform: translate(110%, 0);
1696
- }
1697
- 17% {
1698
- opacity: .25;
1699
- }
1700
- 33% {
1701
- opacity: 1;
1702
- -webkit-transform: translate(220%, 220%);
1703
- -moz-transform: translate(220%, 220%);
1704
- -o-transform: translate(220%, 220%);
1705
- transform: translate(220%, 220%);
1706
- }
1707
- 50% {
1708
- opacity: .25;
1709
- }
1710
- 66% {
1711
- opacity: 1;
1712
- -webkit-transform: translate(0, 220%);
1713
- -moz-transform: translate(0, 220%);
1714
- -o-transform: translate(0, 220%);
1715
- transform: translate(0, 220%);
1716
- }
1717
- 83% {
1718
- opacity: .25;
1719
- }
1720
- 100% {
1721
- opacity: 1;
1722
- -webkit-transform: translate(110%, 0);
1723
- -moz-transform: translate(110%, 0);
1724
- -o-transform: translate(110%, 0);
1725
- transform: translate(110%, 0);
1726
- }
1727
  }
1728
 
1729
  @-webkit-keyframes ball-triangle-path-ball-tree {
1730
- 0% {
1731
- -webkit-transform: translate(220%, 220%);
1732
- transform: translate(220%, 220%);
1733
- }
1734
- 17% {
1735
- opacity: .25;
1736
- }
1737
- 33% {
1738
- opacity: 1;
1739
- -webkit-transform: translate(0, 220%);
1740
- transform: translate(0, 220%);
1741
- }
1742
- 50% {
1743
- opacity: .25;
1744
- }
1745
- 66% {
1746
- opacity: 1;
1747
- -webkit-transform: translate(110%, 0);
1748
- transform: translate(110%, 0);
1749
- }
1750
- 83% {
1751
- opacity: .25;
1752
- }
1753
- 100% {
1754
- opacity: 1;
1755
- -webkit-transform: translate(220%, 220%);
1756
- transform: translate(220%, 220%);
1757
- }
1758
  }
1759
 
1760
  @-moz-keyframes ball-triangle-path-ball-tree {
1761
- 0% {
1762
- -moz-transform: translate(220%, 220%);
1763
- transform: translate(220%, 220%);
1764
- }
1765
- 17% {
1766
- opacity: .25;
1767
- }
1768
- 33% {
1769
- opacity: 1;
1770
- -moz-transform: translate(0, 220%);
1771
- transform: translate(0, 220%);
1772
- }
1773
- 50% {
1774
- opacity: .25;
1775
- }
1776
- 66% {
1777
- opacity: 1;
1778
- -moz-transform: translate(110%, 0);
1779
- transform: translate(110%, 0);
1780
- }
1781
- 83% {
1782
- opacity: .25;
1783
- }
1784
- 100% {
1785
- opacity: 1;
1786
- -moz-transform: translate(220%, 220%);
1787
- transform: translate(220%, 220%);
1788
- }
1789
  }
1790
 
1791
  @-o-keyframes ball-triangle-path-ball-tree {
1792
- 0% {
1793
- -o-transform: translate(220%, 220%);
1794
- transform: translate(220%, 220%);
1795
- }
1796
- 17% {
1797
- opacity: .25;
1798
- }
1799
- 33% {
1800
- opacity: 1;
1801
- -o-transform: translate(0, 220%);
1802
- transform: translate(0, 220%);
1803
- }
1804
- 50% {
1805
- opacity: .25;
1806
- }
1807
- 66% {
1808
- opacity: 1;
1809
- -o-transform: translate(110%, 0);
1810
- transform: translate(110%, 0);
1811
- }
1812
- 83% {
1813
- opacity: .25;
1814
- }
1815
- 100% {
1816
- opacity: 1;
1817
- -o-transform: translate(220%, 220%);
1818
- transform: translate(220%, 220%);
1819
- }
1820
  }
1821
 
1822
  @keyframes ball-triangle-path-ball-tree {
1823
- 0% {
1824
- -webkit-transform: translate(220%, 220%);
1825
- -moz-transform: translate(220%, 220%);
1826
- -o-transform: translate(220%, 220%);
1827
- transform: translate(220%, 220%);
1828
- }
1829
- 17% {
1830
- opacity: .25;
1831
- }
1832
- 33% {
1833
- opacity: 1;
1834
- -webkit-transform: translate(0, 220%);
1835
- -moz-transform: translate(0, 220%);
1836
- -o-transform: translate(0, 220%);
1837
- transform: translate(0, 220%);
1838
- }
1839
- 50% {
1840
- opacity: .25;
1841
- }
1842
- 66% {
1843
- opacity: 1;
1844
- -webkit-transform: translate(110%, 0);
1845
- -moz-transform: translate(110%, 0);
1846
- -o-transform: translate(110%, 0);
1847
- transform: translate(110%, 0);
1848
- }
1849
- 83% {
1850
- opacity: .25;
1851
- }
1852
- 100% {
1853
- opacity: 1;
1854
- -webkit-transform: translate(220%, 220%);
1855
- -moz-transform: translate(220%, 220%);
1856
- -o-transform: translate(220%, 220%);
1857
- transform: translate(220%, 220%);
1858
- }
1859
  }
1860
 
1861
-
1862
  /*------------------------------------------------------------------------------------------*/
1863
 
1864
-
1865
  /* Responsive Elements */
1866
 
1867
-
1868
  /*------------------------------------------------------------------------------------------*/
1869
 
1870
-
1871
  /* =Media Queries for Nav
1872
  ===============================*/
1873
 
1874
  @media all and (max-width: 1024px) {
1875
- #nav-trigger {
1876
- display: block;
1877
- }
1878
- nav#nav-main {
1879
- display: none;
1880
- }
1881
- nav#nav-mobile {
1882
- display: block;
1883
- }
1884
- nav#nav-mobile li {
1885
- display: block;
1886
- }
1887
- #header aside {
1888
- display: none;
1889
- }
1890
  }
1891
 
1892
-
1893
  /* Landscape mobile & down
1894
  ===============================*/
1895
 
1896
  @media (max-width: 480px) {
1897
- #wrapper {
1898
- margin: 0;
1899
- padding: 0;
1900
- }
1901
- .page-border,
1902
- #scrollUp,
1903
- #scrollUp:before {
1904
- display: none;
1905
- }
1906
- .row {
1907
- padding: 15px !important;
1908
- }
1909
- .col-1,
1910
- .col-2,
1911
- .col-3,
1912
- .col-4,
1913
- .col-5,
1914
- .col-6,
1915
- .col-7,
1916
- .col-8,
1917
- .col-9,
1918
- .col-10,
1919
- .col-11,
1920
- .col-12,
1921
- .col-2-3,
1922
- .col-3-4,
1923
- .col-9-10,
1924
- .col-61,
1925
- .col-38,
1926
- .row {
1927
- width: 100%;
1928
- }
1929
- .col-1,
1930
- .col-2,
1931
- .col-3,
1932
- .col-4,
1933
- .col-5,
1934
- .col-6,
1935
- .col-7,
1936
- .col-8,
1937
- .col-9,
1938
- .col-10,
1939
- .col-11,
1940
- .col-12,
1941
- .col-2-3,
1942
- .col-3-4,
1943
- .col-9-10,
1944
- .col-61,
1945
- .col-38 {
1946
- padding-right: 0;
1947
- padding-left: 0;
1948
- }
1949
- /*-----------------Header Elements-----------------*/
1950
- #header .row {
1951
- padding: 0 15px !important;
1952
- }
1953
- #header.nav-solid [class*="col-"] {
1954
- padding: 0;
1955
- }
1956
- /*Logo*/
1957
- #logo h2 {
1958
- padding: 0;
1959
- }
1960
- /* Social */
1961
- #header aside {
1962
- clear: both;
1963
- padding: 0;
1964
- }
1965
- #header ul.social-icons {
1966
- margin-top: 0;
1967
- }
1968
- #banner-content.row {
1969
- padding-top: 85px !important;
1970
- }
1971
- /*-----------------Sections-----------------*/
1972
- /* Call to Action*/
1973
- .call-to-action {
1974
- padding-bottom: 25px;
1975
- }
1976
- /* Video */
1977
- .slvj-lightbox iframe,
1978
- .slvj-lightbox object,
1979
- .slvj-lightbox embed {
1980
- height: 270px !important;
1981
- }
1982
- /* Footer */
1983
- #landing-footer #copyright {
1984
- float: left;
1985
- width: 50%;
1986
- }
1987
- #landing-footer .social-icons {
1988
- float: right;
1989
- width: 50%;
1990
- }
1991
- /*-----------------Typography-----------------*/
1992
- h1 {
1993
- font-size: 38px;
1994
- }
1995
- #banner h1 {
1996
- font-size: 48px;
1997
- }
1998
- /* Hide Elements */
1999
- a#scrollUp {
2000
- display: none !important;
2001
- }
2002
  }
2003
 
2004
-
2005
  /* Mobile to Tablet Portrait
2006
  ===============================*/
2007
 
2008
  @media (min-width: 480px) and (max-width: 767px) {
2009
- #wrapper {
2010
- margin: 0;
2011
- padding: 0;
2012
- }
2013
- .page-border,
2014
- #scrollUp,
2015
- #scrollUp:before {
2016
- display: none;
2017
- }
2018
- .row {
2019
- padding: 15px 0 !important;
2020
- }
2021
- .col-1,
2022
- .col-2,
2023
- .col-5,
2024
- .col-7,
2025
- .col-9,
2026
- .col-11,
2027
- .col-2-3,
2028
- .col-3-4,
2029
- .col-61,
2030
- .col-38,
2031
- .row {
2032
- width: 100%;
2033
- }
2034
- .col-3,
2035
- .col-4,
2036
- .col-6,
2037
- .col-8,
2038
- .col-10,
2039
- .col-12 {
2040
- width: 50%;
2041
- }
2042
- /*-----------------Header Elements-----------------*/
2043
- #header .row {
2044
- padding: 0 !important;
2045
- }
2046
- #header aside {
2047
- display: inline-block;
2048
- position: absolute;
2049
- top: 40px;
2050
- right: 60px;
2051
- padding-top: 3px;
2052
- padding-right: 5px;
2053
- }
2054
- #header.nav-solid aside {
2055
- top: 20px;
2056
- }
2057
- #header aside ul {
2058
- margin-top: 0 !important;
2059
- padding-top: 6px;
2060
- }
2061
- #banner-content.row {
2062
- padding-top: 85px !important;
2063
- }
2064
- /*Navigation*/
2065
- nav#nav-mobile ul {
2066
- margin-left: -40px;
2067
- margin-right: -40px;
2068
- padding-left: 20px;
2069
- padding-right: 20px;
2070
- }
2071
- /*-----------------Sections-----------------*/
2072
- /* Video */
2073
- .slvj-lightbox iframe,
2074
- .slvj-lightbox object,
2075
- .slvj-lightbox embed {
2076
- height: 370px !important;
2077
- }
2078
- /* Footer */
2079
- #landing-footer #copyright {
2080
- float: left;
2081
- width: 50%;
2082
- }
2083
- #landing-footer .social-icons {
2084
- float: right;
2085
- width: 50%;
2086
- }
2087
  }
2088
 
2089
-
2090
  /* Landscape Tablet to Desktop
2091
  ===============================*/
2092
 
2093
  @media (min-width: 768px) and (max-width: 1024px) {
2094
- #wrapper {
2095
- margin: 0;
2096
- padding: 0;
2097
- }
2098
- .page-border {
2099
- display: none;
2100
- }
2101
- .big-padding-top {
2102
- padding-top: 45px !important;
2103
- }
2104
- /*-----------------Header Elements-----------------*/
2105
- #header aside {
2106
- display: inline-block;
2107
- position: absolute;
2108
- top: 40px;
2109
- right: 60px;
2110
- padding-top: 3px;
2111
- padding-right: 5px;
2112
- }
2113
- #header.nav-solid aside {
2114
- top: 20px;
2115
- }
2116
- #header aside ul {
2117
- margin-top: 0 !important;
2118
- padding-top: 6px;
2119
- }
2120
- /*Navigation*/
2121
- nav#nav-mobile ul {
2122
- margin-left: -40px;
2123
- margin-right: -40px;
2124
- padding-left: 20px;
2125
- padding-right: 20px;
2126
- }
2127
- /*-----------------Sections-----------------*/
2128
- /* Video */
2129
- .slvj-lightbox object,
2130
- .slvj-lightbox embed {
2131
- height: 432px !important;
2132
- }
2133
- }
2134
-
2135
- @import 'https://fonts.googleapis.com/css?family=Montserrat:800|Poppins:400';
2136
- .wall {
2137
  position: absolute;
2138
- width: 100vw;
2139
- height: 100vh;
2140
- background-color: #fff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2141
  }
2142
 
2143
  .row1 {
2144
- z-index: -9999999;
2145
- display: flex;
2146
- animation: 200s linear ticker-to-left infinite;
2147
  }
2148
 
2149
  .row1:nth-child(even) {
2150
- animation: 60s linear ticker-to-right infinite;
2151
- justify-content: flex-end;
2152
  }
2153
 
2154
  .row1 span {
2155
- margin-right: 0.2em;
2156
- font-family: sans-serif;
2157
- color: transparent;
2158
- font-size: 20vh;
2159
- font-weight: bold;
2160
- line-height: 1;
2161
- text-transform: uppercase;
2162
- -webkit-text-stroke-width: 4px;
2163
- text-stroke-width: 4px;
2164
- -webkit-text-stroke-color: #f5f5f599;
2165
- text-stroke-color: #f5f5f599;
2166
  }
2167
 
2168
  @keyframes ticker-to-left {
2169
- 0% {
2170
- transform: translate3d(0, 0, 0);
2171
- }
2172
- 100% {
2173
- transform: translate3d(-100%, 0, 0);
2174
- }
2175
  }
2176
 
2177
  @keyframes ticker-to-right {
2178
- 0% {
2179
- transform: translate3d(0, 0, 0);
2180
- }
2181
- 100% {
2182
- transform: translate3d(100%, 0, 0);
2183
- }
2184
  }
2185
 
2186
  .container {
2187
- max-width: 500px;
2188
- max-height: 400px;
2189
- width: 100%;
2190
- padding: 25px;
2191
- background: rgb(255 255 255 / 0%);
2192
- box-shadow: 0 8px 32px 0 rgba(154, 154, 154, 0.37);
2193
- backdrop-filter: blur(2.2px);
2194
- -webkit-backdrop-filter: blur(2.2px);
2195
- border-radius: 12px;
2196
- border: 1px solid rgba(52, 52, 52, 0.195);
2197
  }
2198
 
2199
  .uploadbuttons {
2200
- display: flex;
2201
- justify-content: flex-start;
2202
  }
2203
 
2204
  .container:hover {
2205
- background: rgb(255 93 0 / 11%);
2206
- /* Adjust the alpha value for the desired transparency */
2207
- box-shadow: 0 8px 32px 0 rgba(154, 154, 154, 0.37);
2208
- backdrop-filter: blur(2.2px);
2209
- -webkit-backdrop-filter: blur(2.2px);
2210
- border: 1px solid rgba(103, 101, 101, 0.195);
2211
- transition: all .4s ease-in-out;
2212
  }
2213
 
2214
  .drag-area {
2215
- height: 200px;
2216
- border: 3px dashed rgba(128, 128, 128, 0.263);
2217
- border-radius: 10px;
2218
- display: flex;
2219
- align-items: center;
2220
- justify-content: center;
2221
- flex-direction: column;
2222
- padding: 0px 50px;
2223
  }
2224
 
2225
  .drag-area:hover {
2226
- height: 200px;
2227
- border: 3px dashed #ff8c4a5a;
2228
- display: flex;
2229
- align-items: center;
2230
- justify-content: center;
2231
- flex-direction: column;
2232
  }
2233
 
2234
  h3 {
2235
- margin-bottom: 20px;
2236
- font-weight: 500;
2237
  }
2238
 
2239
  .drag-area .icon {
2240
- font-size: 50px;
2241
- width: 60px;
2242
- height: 60px;
2243
  }
2244
 
2245
  .drag-area .headerx {
2246
- font-size: 17px;
2247
- font-weight: 500;
2248
- color: #34495e;
2249
  }
2250
 
2251
  .drag-area .support {
2252
- font-size: 12px;
2253
- color: gray;
2254
- margin: 10px 0 15px 0;
2255
  }
2256
 
2257
  .drag-area .buttonx {
2258
- font-size: 17px;
2259
- font-weight: 500;
2260
- color: #FF8B4A;
2261
- cursor: pointer;
2262
  }
2263
 
2264
  .drag-area.active {
2265
- border: 2px solid #FF8B4A;
2266
- margin-bottom: 20px;
2267
  }
2268
 
2269
  .drag-area img {
2270
- width: 100%;
2271
- height: 100%;
2272
- object-fit: contain;
2273
- z-index: -1;
2274
- padding-top: 8px;
2275
  }
2276
 
2277
  .image-grid {
2278
- display: flex;
2279
- justify-content: space-between;
2280
- margin-top: 20px;
2281
  }
2282
 
2283
  .image-grid img {
2284
- width: 30%;
2285
- /* Adjust the width as needed */
2286
- cursor: pointer;
2287
  }
2288
 
2289
-
2290
  /* Additional styles for responsiveness */
2291
 
2292
  @media (max-width: 768px) {
2293
- .image-grid {
2294
- flex-direction: column;
2295
- align-items: center;
2296
- }
2297
- .image-grid img {
2298
- width: 80%;
2299
- /* Adjust the width for smaller screens */
2300
- margin-bottom: 10px;
2301
- }
2302
  }
2303
 
2304
  .arrow {
2305
- width: 20px;
2306
- height: 20px;
2307
- transform: rotate(90deg);
2308
  }
2309
 
2310
  .ar {
2311
- margin-bottom: 20px;
2312
- display: flex;
2313
- justify-content: center;
2314
- align-items: center;
2315
- font-size: 12px;
2316
  }
2317
 
2318
  .easytext {
2319
- background: linear-gradient(45deg, #FFA07A, #FF6347);
2320
- -webkit-background-clip: text;
2321
- color: transparent;
2322
  }
2323
 
2324
  .grid-container {
2325
- display: grid;
2326
- grid-template-columns: repeat(3, 1fr);
2327
- max-width: 600px;
2328
- margin: 0 auto;
2329
- gap: 10px;
2330
- /* Adjust the gap as needed */
2331
  }
2332
 
2333
  .grid-item {
2334
- background: rgba(100, 97, 97, 0.2);
2335
- backdrop-filter: blur(3.5px);
2336
- padding: 20px;
2337
- text-align: center;
2338
- width: auto;
2339
- height: max-content;
2340
- border-radius: 5px;
2341
  }
2342
 
2343
  .grid-item:hover {
2344
- background: linear-gradient(45deg, #FFA07A, #FF6347);
2345
- color: #fff;
2346
  }
2347
 
2348
  .uploadbuttons {
2349
- display: flex;
2350
- align-items: center;
2351
- align-content: center;
2352
- flex-wrap: nowrap;
2353
- justify-content: space-around;
2354
  }
2355
 
2356
  .uploadbutton {
2357
- font-family: poppins;
2358
- font-weight: 400;
2359
- position: relative;
2360
- padding: 12px 28px;
2361
- background: linear-gradient(45deg, #FFA07A, #fa7962);
2362
- font-size: 17px;
2363
- font-weight: 500;
2364
- color: #fff;
2365
- border: 2px solid transparent;
2366
- border-radius: 10px;
2367
- box-shadow: 0 0 0 #fec1958c;
2368
- transition: all .3s ease-in-out;
2369
- justify-self: center;
2370
  }
2371
 
2372
  .star-1 {
2373
- position: absolute;
2374
- top: 20%;
2375
- left: 20%;
2376
- width: 25px;
2377
- height: auto;
2378
- filter: drop-shadow(0 0 0 #fffdef);
2379
- z-index: -5;
2380
- transition: all 1s cubic-bezier(0.05, 0.83, 0.43, 0.96);
2381
  }
2382
 
2383
  .star-2 {
2384
- position: absolute;
2385
- top: 45%;
2386
- left: 45%;
2387
- width: 15px;
2388
- height: auto;
2389
- filter: drop-shadow(0 0 0 #fffdef);
2390
- z-index: -5;
2391
- transition: all 1s cubic-bezier(0, 0.4, 0, 1.01);
2392
  }
2393
 
2394
  .star-3 {
2395
- position: absolute;
2396
- top: 40%;
2397
- left: 40%;
2398
- width: 5px;
2399
- height: auto;
2400
- filter: drop-shadow(0 0 0 #fffdef);
2401
- z-index: -5;
2402
- transition: all 1s cubic-bezier(0, 0.4, 0, 1.01);
2403
  }
2404
 
2405
  .star-4 {
2406
- position: absolute;
2407
- top: 20%;
2408
- left: 40%;
2409
- width: 8px;
2410
- height: auto;
2411
- filter: drop-shadow(0 0 0 #fffdef);
2412
- z-index: -5;
2413
- transition: all .8s cubic-bezier(0, 0.4, 0, 1.01);
2414
  }
2415
 
2416
  .star-5 {
2417
- position: absolute;
2418
- top: 25%;
2419
- left: 45%;
2420
- width: 15px;
2421
- height: auto;
2422
- filter: drop-shadow(0 0 0 #fffdef);
2423
- z-index: -5;
2424
- transition: all .6s cubic-bezier(0, 0.4, 0, 1.01);
2425
  }
2426
 
2427
  .star-6 {
2428
- position: absolute;
2429
- top: 5%;
2430
- left: 50%;
2431
- width: 5px;
2432
- height: auto;
2433
- filter: drop-shadow(0 0 0 #fffdef);
2434
- z-index: -5;
2435
- transition: all .8s ease;
2436
  }
2437
 
2438
  .uploadbutton:hover {
2439
- border: 2px solid #FF8B4A;
2440
- background: #f5f5f5;
2441
- color: #000;
2442
- transition: all .3s ease-in-out;
2443
  }
2444
 
2445
  .uploadbutton:hover .star-1 {
2446
- position: absolute;
2447
- top: -80%;
2448
- left: -30%;
2449
- width: 25px;
2450
- height: auto;
2451
- filter: drop-shadow(0 0 10px #fffdef);
2452
- z-index: 2;
2453
  }
2454
 
2455
  .uploadbutton:hover .star-2 {
2456
- position: absolute;
2457
- top: -25%;
2458
- left: 10%;
2459
- width: 15px;
2460
- height: auto;
2461
- filter: drop-shadow(0 0 10px #fffdef);
2462
- z-index: 2;
2463
  }
2464
 
2465
  .uploadbutton:hover .star-3 {
2466
- position: absolute;
2467
- top: 55%;
2468
- left: 25%;
2469
- width: 5px;
2470
- height: auto;
2471
- filter: drop-shadow(0 0 10px #fffdef);
2472
- z-index: 2;
2473
  }
2474
 
2475
  .uploadbutton:hover .star-4 {
2476
- position: absolute;
2477
- top: 30%;
2478
- left: 80%;
2479
- width: 8px;
2480
- height: auto;
2481
- filter: drop-shadow(0 0 10px #fffdef);
2482
- z-index: 2;
2483
  }
2484
 
2485
  .uploadbutton:hover .star-5 {
2486
- position: absolute;
2487
- top: 25%;
2488
- left: 115%;
2489
- width: 15px;
2490
- height: auto;
2491
- filter: drop-shadow(0 0 10px #fffdef);
2492
- z-index: 2;
2493
  }
2494
 
2495
  .uploadbutton:hover .star-6 {
2496
- position: absolute;
2497
- top: 5%;
2498
- left: 60%;
2499
- width: 5px;
2500
- height: auto;
2501
- filter: drop-shadow(0 0 10px #fffdef);
2502
- z-index: 2;
2503
  }
2504
 
2505
  .buttondiv {
2506
- margin-top: 15px;
2507
- display: flex;
2508
- justify-content: center;
2509
  }
2510
 
2511
  input #file-input {
2512
- height: 100%;
2513
  }
2514
 
2515
-
2516
  /* Responsive layout for smaller screens */
2517
 
2518
  @media (max-width: 1024px) {
2519
- .col-lg-6 {
2520
- width: 55%;
2521
- }
2522
- .col-lg-3 {
2523
- width: 45%;
2524
- padding-top: .5em;
2525
- }
2526
- #logo img {
2527
- max-height: 30px;
2528
- vertical-align: middle;
2529
- margin-left: 1.5em;
2530
- }
2531
- .container {
2532
- max-width: 90%;
2533
- }
2534
- p,
2535
- input {
2536
- text-align: center;
2537
- margin: auto;
2538
- line-height: normal;
2539
- }
2540
- input,
2541
- textarea {
2542
- width: 100%;
2543
- box-sizing: border-box;
2544
- margin: 0px 0 10px 0;
2545
- }
2546
  }
2547
 
2548
  @media (max-width: 768px) {
2549
- .col-lg-6,
2550
- .col-lg-3 {
2551
- width: 100%;
2552
- float: none;
2553
- /* Remove float for full-width layout */
2554
- }
2555
- .container {
2556
- max-width: 100%;
2557
- }
2558
  }
2559
 
2560
  @media (max-width: 576px) {
2561
- .drag-area {
2562
- padding: 0px 20px;
2563
- }
2564
- .image-grid img {
2565
- width: 100%;
2566
- }
2567
- .container {
2568
- width: 90%;
2569
- max-width: 100%;
2570
- padding: 1em;
2571
- margin: 0 auto;
2572
- }
2573
- .drag-area {
2574
- padding: 0px 20px;
2575
- /* Adjust padding for smaller screens */
2576
- }
2577
- .image-grid img {
2578
- width: 100%;
2579
- /* Adjust image width for smaller screens */
2580
- }
2581
- p,
2582
- input {
2583
- text-align: center;
2584
- margin: auto;
2585
- line-height: normal;
2586
- }
2587
- input,
2588
- textarea {
2589
- width: 100%;
2590
- box-sizing: border-box;
2591
- margin: 0px 0 10px 0;
2592
- display: block;
2593
- }
2594
- .drag-area img {
2595
- width: 90%;
2596
- height: 90%;
2597
- object-fit: contain;
2598
- z-index: -1;
2599
- padding-top: 8px;
2600
- }
2601
- .wall {
2602
- position: absolute;
2603
- width: 100vw;
2604
- height: 100vh;
2605
- background-color: #fff;
2606
- }
2607
  }
2608
 
2609
  #error-message {
2610
- color: #ff0000;
2611
- font-size: 14px;
2612
- margin-top: 8px;
2613
- }
 
1
  /*------------------------------------------------------------------------------------------*/
2
 
 
3
  /* 1. Defaults & Reset of specific styles across browsers */
4
 
 
5
  /*------------------------------------------------------------------------------------------*/
6
 
7
  *,
8
  *:before,
9
  *:after {
10
+ -webkit-box-sizing: border-box;
11
+ -moz-box-sizing: border-box;
12
+ box-sizing: border-box;
13
  }
14
 
15
  body,
 
31
  blockquote,
32
  th,
33
  td {
34
+ margin: 0;
35
+ padding: 0;
36
+ direction: ltr;
37
  }
38
 
39
  body {
40
+ margin: 0;
41
+ padding: 0;
42
+ -webkit-font-smoothing: antialiased;
43
+ overflow-x: hidden;
44
  }
45
 
46
  p {
47
+ line-height: 25px;
48
  }
49
 
50
  .row img {
51
+ height: auto;
52
+ max-width: 100%;
53
  }
54
 
55
  a {
56
+ text-decoration: none;
57
+ line-height: inherit;
58
+ -webkit-transition: opacity 0.3s ease-out;
59
+ -moz-transition: opacity 0.3s ease-out;
60
+ -o-transition: opacity 0.3s ease-out;
61
+ transition: opacity 0.3s ease-out;
62
  }
63
 
64
  iframe {
65
+ border: 0 !important;
66
  }
67
 
68
  .parallax-window {
69
+ min-height: 400px;
70
+ background: transparent;
71
  }
72
 
73
  figure {
74
+ margin: 0;
75
  }
76
 
 
77
  /* Page Border */
78
 
79
  .page-border {
80
+ position: fixed;
81
+ z-index: 999999;
82
+ pointer-events: none;
83
  }
84
 
85
  .page-border .bottom-border,
86
  .page-border .left-border,
87
  .page-border .right-border,
88
  .page-border .top-border {
89
+ background: #f3f3efcd;
90
+ position: fixed;
91
+ z-index: 9999;
92
  }
93
 
94
+ .page-border > .top-border,
95
+ .page-border > .right-border,
96
+ .page-border > .bottom-border,
97
+ .page-border > .left-border {
98
+ padding: 11px;
99
+ background: #ccc;
100
  }
101
 
102
  .page-border .bottom-border,
103
  .page-border .top-border {
104
+ width: 100%;
105
+ padding: 10px;
106
+ left: 0;
107
  }
108
 
109
  .page-border .left-border,
110
  .page-border .right-border {
111
+ padding: 10px;
112
+ height: 100%;
113
+ top: 0;
114
  }
115
 
116
  .page-border .top-border {
117
+ top: 0;
118
  }
119
 
120
  .page-border .right-border {
121
+ right: 0;
122
  }
123
 
124
  .page-border .bottom-border {
125
+ bottom: 0;
126
  }
127
 
128
  .page-border .left-border {
129
+ left: 0;
130
  }
131
 
132
  #wrapper {
133
+ margin: 0 15px;
134
+ padding: 15px 0;
135
+ position: relative;
136
  }
137
 
 
138
  /* --------- 1.1 Input Elements ---------- */
139
 
140
  input,
141
  textarea {
142
+ border: 1px solid #e1e1e1;
143
+ padding: 10px;
144
+ -webkit-transition: all 0.3s linear;
145
+ -moz-transition: all 0.3s linear;
146
+ transition: all 0.3s linear;
147
+ border-radius: 3px;
148
  }
149
 
150
  input {
151
+ height: 40px;
152
+ margin: 3px 0;
153
+ outline: none;
154
+ line-height: normal;
155
+ font-size: 14px;
156
  }
157
 
158
  input[type="submit"] {
159
+ cursor: pointer;
160
+ border-style: solid;
161
+ border-width: 2px;
162
+ padding-top: 0;
163
+ padding-bottom: 0;
164
  }
165
 
166
  select {
167
+ border: 1px solid #e1e1e1;
168
+ height: 40px;
169
+ padding: 5px;
170
  }
171
 
172
  input:focus,
173
  textarea:focus {
174
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
175
  }
176
 
177
  *:focus {
178
+ outline: none;
179
  }
180
 
 
181
  /*------------------------------------------------------------------------------------------*/
182
 
 
183
  /* 2. Layout Elements */
184
 
 
185
  /*------------------------------------------------------------------------------------------*/
186
 
187
  section {
188
+ clear: both;
189
+ overflow: hidden;
190
  }
191
 
 
192
  /* Rows and Columns */
193
 
194
  .row {
195
+ max-width: 1245px;
196
+ margin: 0 auto;
197
+ padding: 75px 0;
198
+ position: relative;
199
  }
200
 
201
  .no-padding-bottom .row,
202
  .no-padding-bottom div,
203
  .no-padding-bottom.row {
204
+ padding-bottom: 0;
205
  }
206
 
207
  .no-padding-top.row,
208
  .no-padding-top div {
209
+ padding-top: 0;
210
  }
211
 
212
  .big-padding-top {
213
+ padding-top: 75px !important;
214
  }
215
 
216
  .big-padding-bottom {
217
+ padding-bottom: 85px !important;
218
  }
219
 
 
220
  /* Targets all elements */
221
 
222
+ [class*="col-"] {
223
+ float: left;
224
+ padding: 20px;
225
  }
226
 
227
+ #clients .col-2-3 [class*="col-"] {
228
+ padding: 0;
229
  }
230
 
 
231
  /* Clearfix */
232
 
233
  .clearfix:after {
234
+ content: "";
235
+ display: table;
236
+ clear: both;
237
  }
238
 
 
239
  /* Main Widths */
240
 
241
  .col-1 {
242
+ width: 100%;
243
  }
244
 
245
  .col-2 {
246
+ width: 50%;
247
  }
248
 
249
  .col-3 {
250
+ width: 33.33%;
251
  }
252
 
253
  .col-4 {
254
+ width: 25%;
255
  }
256
 
257
  .col-5 {
258
+ width: 20%;
259
  }
260
 
261
  .col-6 {
262
+ width: 16.6666666667%;
263
  }
264
 
265
  .col-7 {
266
+ width: 14.2857142857%;
267
  }
268
 
269
  .col-8 {
270
+ width: 12.5%;
271
  }
272
 
273
  .col-9 {
274
+ width: 11.1111111111%;
275
  }
276
 
277
  .col-10 {
278
+ width: 10%;
279
  }
280
 
281
  .col-11 {
282
+ width: 9.09090909091%;
283
  }
284
 
285
  .col-12 {
286
+ width: 8.33%;
287
  }
288
 
289
  .col-2-3 {
290
+ width: 66.66%;
291
  }
292
 
293
  .col-3-4 {
294
+ width: 75%;
295
  }
296
 
297
  .col-9-10 {
298
+ width: 90%;
299
  }
300
 
 
301
  /* Golden Ratio */
302
 
303
  .col-lg-6 {
304
+ width: 50%;
305
+ height: auto;
306
  }
307
 
308
  .col-lg-3 {
309
+ width: 50%;
310
  }
311
 
 
312
  /* --------- 2.1 Header --------- */
313
 
314
  #header {
315
+ height: 71px !important;
316
+ overflow: visible;
317
+ z-index: 9999;
318
+ width: 100%;
319
+ position: absolute !important;
320
  }
321
 
322
  #header .row {
323
+ padding: 0;
324
  }
325
 
326
  #header aside {
327
+ text-align: right;
328
  }
329
 
330
  #header ul {
331
+ text-align: right;
332
  }
333
 
334
  #header li {
335
+ display: inline-block;
336
+ list-style: none;
337
+ margin: 0;
338
  }
339
 
 
340
  /* --------- 2.2 Logo ---------- */
341
 
342
  #logo {
343
+ float: left;
344
+ height: 90px;
345
+ line-height: 66px;
346
+ margin: 10px 15px 0 0;
347
  }
348
 
349
  #logo h1,
350
  #logo h2 {
351
+ display: inline-block;
352
  }
353
 
354
  #banner #logo h1 {
355
+ font-size: 28px;
356
+ margin-right: 10px;
357
+ font-weight: 900;
358
+ padding: 0;
359
  }
360
 
361
  #logo h2 {
362
+ font-size: 18px;
363
+ padding: 0;
364
  }
365
 
366
  #logo img {
367
+ max-height: 40px;
368
+ vertical-align: middle;
369
+ margin-right: 15px;
370
  }
371
 
372
  #navigation-logo {
373
+ display: none;
374
  }
375
 
376
  .nav-solid #logo #banner-logo {
377
+ display: none;
378
  }
379
 
380
  .nav-solid #logo #navigation-logo {
381
+ display: inline-block;
382
+ margin-bottom: 10px;
383
  }
384
 
 
385
  /* --------- 2.3 Buttons ---------- */
386
 
387
  .call-to-action {
388
+ padding: 35px 0 35px 0;
389
  }
390
 
 
391
  /*Style*/
392
 
393
  .button {
394
+ font-size: 16px;
395
+ margin: 35px 0;
396
+ padding: 11px 16px;
397
+ -webkit-transition: all 0.3s linear;
398
+ -moz-transition: all 0.3s linear;
399
+ transition: all 0.3s linear;
400
+ display: inline-block;
401
+ border-width: 3px;
402
+ border-style: solid;
403
  }
404
 
 
405
  /* --------- 2.4 Navigation ---------- */
406
 
407
  #header {
408
+ font-size: 13px;
409
  }
410
 
411
  #header aside {
412
+ float: right;
413
  }
414
 
415
  #header nav ul {
416
+ text-transform: uppercase;
417
  }
418
 
419
  #header nav a {
420
+ height: 71px;
421
+ line-height: 90px;
422
+ display: block;
423
+ padding: 0 10px;
424
  }
425
 
426
  #header nav a:hover {
427
+ color: #ff8b4a;
428
  }
429
 
 
430
  /*Navigation Solid*/
431
 
432
+ #header.nav-solid [class*="col-"] {
433
+ padding: 0 20px;
434
  }
435
 
436
  #header.nav-solid {
437
+ background: #fff;
438
+ box-shadow: 2px 0px 3px rgba(0, 0, 0, 0.2);
439
+ position: fixed !important;
440
+ left: 0;
441
  }
442
 
443
  #header.nav-solid nav a {
444
+ border-bottom: 3px solid;
445
+ border-color: #fff;
446
+ -webkit-transition: all 0.3s ease-out;
447
+ -moz-transition: all 0.3s ease-out;
448
+ -o-transition: all 0.3s ease-out;
449
+ transition: all 0.3s ease-out;
450
  }
451
 
452
  #header.nav-solid nav a:hover {
453
+ opacity: 1;
454
  }
455
 
 
456
  /* Social Elements when Solid*/
457
 
458
  #header.nav-solid .social-icons a {
459
+ -webkit-transition: all 0.3s ease-out;
460
+ -moz-transition: all 0.3s ease-out;
461
+ -o-transition: all 0.3s ease-out;
462
+ transition: all 0.3s ease-out;
463
+ opacity: 0.5;
464
  }
465
 
466
  #header.nav-solid .social-icons a:hover {
467
+ opacity: 1;
468
+ color: #e4473c;
469
  }
470
 
 
471
  /* Responsive Nav Styling */
472
 
473
  #nav-trigger {
474
+ display: none;
475
+ text-align: right;
476
  }
477
 
478
  #nav-trigger span {
479
+ display: inline-block;
480
+ width: 38px;
481
+ height: 71px;
482
+ color: #111;
483
+ cursor: pointer;
484
+ text-transform: uppercase;
485
+ font-size: 22px;
486
+ text-align: center;
487
+ border-top-right-radius: 5px;
488
+ border-top-left-radius: 5px;
489
+ -webkit-transition: all 0.3s ease-out;
490
+ -moz-transition: all 0.3s ease-out;
491
+ -o-transition: all 0.3s ease-out;
492
+ transition: all 0.3s ease-out;
493
  }
494
 
495
  #nav-trigger span:after {
496
+ font-family: "fontAwesome";
497
+ display: inline-block;
498
+ width: 38px;
499
+ height: 71px;
500
+ line-height: 75px;
501
+ text-align: center;
502
+ content: "\2630";
503
+ border-top-right-radius: 5px;
504
+ border-top-left-radius: 5px;
505
+ transition: all 0.4s ease-in-out;
506
  }
507
 
508
  #nav-trigger span.open:after {
509
+ content: "\269E";
510
+ transition: all 0.4s ease-in-out;
511
  }
512
 
513
  #nav-trigger span:hover,
514
  .nav-solid #nav-trigger span.open:hover,
515
  .nav-solid #nav-trigger span:hover {
516
+ opacity: 0.6;
517
  }
518
 
519
  #nav-trigger span.open,
520
  #nav-trigger span.open:hover {
521
+ color: #111;
522
  }
523
 
524
  .nav-solid #nav-trigger span.open:hover {
525
+ color: #999;
526
  }
527
 
528
  .nav-solid #nav-trigger span {
529
+ color: #999;
530
+ opacity: 1;
531
  }
532
 
533
  nav#nav-mobile {
534
+ position: relative;
535
+ display: none;
536
  }
537
 
538
  nav#nav-mobile ul {
539
+ display: none;
540
+ list-style-type: none;
541
+ position: absolute;
542
+ left: 0;
543
+ right: 0;
544
+ margin-left: -20px;
545
+ margin-right: -20px;
546
+ padding-top: 10px;
547
+ padding-bottom: 10px;
548
+ text-align: center;
549
+ background-color: #fff;
550
+ box-shadow: 0 5px 3px rgba(0, 0, 0, 0.2);
551
  }
552
 
553
  nav#nav-mobile ul:after {
554
+ display: none;
555
  }
556
 
557
  nav#nav-mobile li {
558
+ margin: 0 20px;
559
+ float: none;
560
+ text-align: left;
561
+ border-bottom: 1px solid #e1e1e1;
562
  }
563
 
564
  nav#nav-mobile li:last-child {
565
+ border-bottom: none;
566
  }
567
 
568
  .nav-solid nav#nav-mobile li {
569
+ border-top: 1px solid #e1e1e1;
570
+ border-bottom: none;
571
  }
572
 
573
  nav#nav-mobile a {
574
+ display: block;
575
+ padding: 12px 0;
576
+ color: #333;
577
+ text-align: center;
578
+ width: 100%;
579
+ height: auto;
580
+ line-height: normal;
581
+ display: block;
582
+ border-bottom: none !important;
583
+ -webkit-transition: all 0.3s ease-out;
584
+ -moz-transition: all 0.3s ease-out;
585
+ -o-transition: all 0.3s ease-out;
586
+ transition: all 0.3s ease-out;
587
  }
588
 
589
  nav#nav-mobile a:hover {
590
+ background: #fafafa;
591
+ opacity: 1;
592
  }
593
 
 
594
  /* --------- 2.5 Social Elements ---------- */
595
 
596
  #header .col-4 {
597
+ text-align: right;
598
  }
599
 
600
  .social-icons {
601
+ display: inline-block;
602
+ list-style: none;
603
  }
604
 
605
  .social-icons a {
606
+ display: inline-block;
607
+ width: 32px;
608
+ text-align: center;
609
  }
610
 
611
  .social-icons a:hover {
612
+ opacity: 0.7;
613
  }
614
 
615
  .social-icons span {
616
+ display: none;
617
  }
618
 
619
  #header .social-icons {
620
+ margin-top: 27px;
621
  }
622
 
 
623
  /* --------- 2.6 Images ---------- */
624
 
 
625
  /*Alignment*/
626
 
627
  img {
628
+ vertical-align: top;
629
  }
630
 
631
  .image-center {
632
+ display: block;
633
+ margin: 0 auto;
634
  }
635
 
636
  a img {
637
+ border: none;
638
+ -webkit-transition: all 0.3s ease-out;
639
+ -moz-transition: all 0.3s ease-out;
640
+ -o-transition: all 0.3s ease-out;
641
+ transition: all 0.3s ease-out;
642
+ -webkit-backface-visibility: hidden;
643
  }
644
 
645
  a img:hover {
646
+ opacity: 0.7;
647
  }
648
 
 
649
  /*------------------------------------------------------------------------------------------*/
650
 
 
651
  /* 3. Fonts */
652
 
 
653
  /*------------------------------------------------------------------------------------------*/
654
 
655
  h1 {
656
+ padding: 20px 0;
657
  }
658
 
659
  h2 {
660
+ padding: 14px 0;
661
  }
662
 
663
  h3 {
664
+ padding: 10px 0;
665
  }
666
 
667
  h4 {
668
+ padding: 7px 0;
669
  }
670
 
671
  h5 {
672
+ padding: 7px 0;
673
  }
674
 
675
  h6 {
676
+ padding: 7px 0;
677
  }
678
 
 
679
  /* Text Alignment */
680
 
681
  .text-left {
682
+ text-align: left;
683
  }
684
 
685
  .text-center {
686
+ text-align: center;
687
  }
688
 
689
  .text-right {
690
+ text-align: right;
691
  }
692
 
 
693
  /* Section Headings */
694
 
695
  .section-heading {
696
+ padding: 0 0 15px 0;
697
+ display: flex;
698
+ justify-content: center;
699
  }
700
 
701
  .section-subtitle {
702
+ font-size: 18px;
703
+ padding-top: 0;
704
  }
705
 
706
  .section-heading h3 {
707
+ font-size: 14px;
708
+ font-weight: bold;
709
+ color: #ccc;
710
+ letter-spacing: 2px;
711
+ padding-bottom: 0;
712
  }
713
 
 
714
  /*------------------------------------------------------------------------------------------*/
715
 
 
716
  /* 4. Banner */
717
 
 
718
  /*------------------------------------------------------------------------------------------*/
719
 
720
  #banner {
721
+ background-size: cover;
722
  }
723
 
724
  #banner-content.row {
725
+ padding-top: 50px;
726
+ padding-bottom: 170px;
727
  }
728
 
729
  #banner h1 {
730
+ padding-top: 5%;
731
  }
732
 
 
733
  /*------------------------------------------------------------------------------------------*/
734
 
 
735
  /* 5. Content Elements */
736
 
 
737
  /*------------------------------------------------------------------------------------------*/
738
 
 
739
  /* --------- 5.1 Icons ---------- */
740
 
 
741
  /*Font Icon sizes*/
742
 
743
  .fa-1x {
744
+ font-size: 15px !important;
745
  }
746
 
 
747
  /*Icon Block*/
748
 
749
  .icon-block {
750
+ position: relative;
751
  }
752
 
753
  .icon-block h4 {
754
+ font-weight: bold;
755
+ padding-top: 0;
756
  }
757
 
758
  .icon-block .icon {
759
+ position: absolute;
760
  }
761
 
762
  .icon-block p {
763
+ margin-top: 0;
764
  }
765
 
 
766
  /* Icon Left*/
767
 
768
  .icon-left .icon {
769
+ left: 15;
770
  }
771
 
772
  .icon-left .icon-block-description {
773
+ padding-left: 53px;
774
  }
775
 
 
776
  /* Icon Right */
777
 
778
  .icon-right .icon {
779
+ right: 15;
780
  }
781
 
782
  .icon-right .icon-block-description {
783
+ padding-right: 53px;
784
  }
785
 
 
786
  /* Icon Above */
787
 
788
  .icon-top {
789
+ display: block;
790
  }
791
 
792
  .icon-top .icon {
793
+ position: relative;
794
+ display: block;
795
  }
796
 
797
  .icon-top .icon-block-description {
798
+ padding-top: 25px;
799
  }
800
 
 
801
  /* --------- 5.2 Parallax Elements ---------- */
802
 
803
  .banner-parallax-1,
804
  .banner-parallax-2,
805
  .banner-parallax-3 {
806
+ min-height: 350px;
807
  }
808
 
 
809
  /* --------- 5.3 Divider ---------- */
810
 
811
  .divider {
812
+ position: relative;
813
+ width: 40%;
814
+ height: 20px;
815
+ line-height: 20px;
816
+ margin: 10px auto 5px auto;
817
+ clear: both;
818
+ text-align: center;
819
  }
820
 
821
  .divider-inner {
822
+ position: absolute;
823
+ height: 1px;
824
+ width: 100%;
825
+ top: 50%;
826
+ margin-top: -1px;
827
+ border-top: 1px solid;
828
+ border-color: #e1e1e1;
829
  }
830
 
831
  .divider i {
832
+ background: #fff;
833
+ position: relative;
834
+ top: -11px;
835
+ padding: 0 5px 0 5px;
836
+ color: #e1e1e1;
837
  }
838
 
839
  @media all {
840
+ .featherlight {
841
+ display: none;
842
+ /* dimensions: spanning the background from edge to edge */
843
+ position: fixed;
844
+ top: 0;
845
+ right: 0;
846
+ bottom: 0;
847
+ left: 0;
848
+ z-index: 2147483647;
849
+ /* z-index needs to be >= elements on the site. */
850
+ /* position: centering content */
851
+ text-align: center;
852
+ /* insures that the ::before pseudo element doesn't force wrap with fixed width content; */
853
+ white-space: nowrap;
854
+ /* styling */
855
+ cursor: pointer;
856
+ background: #333;
857
+ /* IE8 "hack" for nested featherlights */
858
+ background: rgba(0, 0, 0, 0);
859
+ }
860
+ /* support for nested featherlights. Does not work in IE8 (use JS to fix) */
861
+ .featherlight:last-of-type {
862
+ background: rgba(0, 0, 0, 0.8);
863
+ }
864
+ .featherlight:before {
865
+ /* position: trick to center content vertically */
866
+ content: "";
867
+ display: inline-block;
868
+ height: 100%;
869
+ vertical-align: middle;
870
+ margin-right: -0.25em;
871
+ }
872
+ .featherlight .featherlight-content {
873
+ /* position: centering vertical and horizontal */
874
+ text-align: left;
875
+ vertical-align: middle;
876
+ display: inline-block;
877
+ /* dimensions: cut off images */
878
+ overflow: auto;
879
+ padding: 25px 0;
880
+ border-bottom: 25px solid transparent;
881
+ /* dimensions: handling small or empty content */
882
+ min-width: 30%;
883
+ /* dimensions: handling large content */
884
+ margin-left: 5%;
885
+ margin-right: 5%;
886
+ max-height: 95%;
887
+ /* styling */
888
+ cursor: auto;
889
+ /* reset white-space wrapping */
890
+ white-space: normal;
891
+ }
892
+ /* contains the content */
893
+ .featherlight .featherlight-inner {
894
+ /* make sure its visible */
895
+ display: block;
896
+ }
897
+ .featherlight .featherlight-close-icon {
898
+ /* position: centering vertical and horizontal */
899
+ position: absolute;
900
+ z-index: 9999;
901
+ top: 25px;
902
+ right: 25px;
903
+ /* dimensions: 25px x 25px */
904
+ line-height: 25px;
905
+ width: 25px;
906
+ /* styling */
907
+ cursor: pointer;
908
+ text-align: center;
909
+ color: #fff;
910
+ font-family: "fontawesome";
911
+ font-size: 22px;
912
+ opacity: 0.5;
913
+ -webkit-transition: all 0.3s ease-out;
914
+ -moz-transition: all 0.3s ease-out;
915
+ -o-transition: all 0.3s ease-out;
916
+ transition: all 0.3s ease-out;
917
+ }
918
+ .featherlight .featherlight-close-icon:hover {
919
+ opacity: 1;
920
+ }
921
+ .featherlight .featherlight-image {
922
+ /* styling */
923
+ max-height: 100%;
924
+ max-width: 100%;
925
+ }
926
+ .featherlight-iframe .featherlight-content {
927
+ /* removed the border for image croping since iframe is edge to edge */
928
+ border-bottom: 0;
929
+ padding: 0;
930
+ }
931
+ .featherlight iframe {
932
+ /* styling */
933
+ border: none;
934
+ }
935
  }
936
 
 
937
  /* handling phones and small screens */
938
 
939
  @media only screen and (max-width: 1024px) {
940
+ .featherlight .featherlight-content {
941
+ /* dimensions: maximize lightbox with for small screens */
942
+ margin-left: 10px;
943
+ margin-right: 10px;
944
+ max-height: 98%;
945
+ padding: 10px 10px 0;
946
+ border-bottom: 10px solid transparent;
947
+ }
948
  }
949
 
 
950
  /* Gallery Styling */
951
 
952
  @media all {
953
+ .featherlight-next,
954
+ .featherlight-previous {
955
+ font-family: "fontawesome";
956
+ font-size: 22px;
957
+ display: block;
958
+ position: absolute;
959
+ top: 25px;
960
+ right: 0;
961
+ bottom: 0;
962
+ left: 80%;
963
+ cursor: pointer;
964
+ /* preventing text selection */
965
+ -webkit-touch-callout: none;
966
+ -webkit-user-select: none;
967
+ -khtml-user-select: none;
968
+ -moz-user-select: none;
969
+ -ms-user-select: none;
970
+ user-select: none;
971
+ /* IE9 hack, otherwise navigation doesn't appear */
972
+ background: rgba(0, 0, 0, 0);
973
+ -webkit-transition: all 0.3s ease-out;
974
+ -moz-transition: all 0.3s ease-out;
975
+ -o-transition: all 0.3s ease-out;
976
+ transition: all 0.3s ease-out;
977
+ }
978
+ .featherlight-previous {
979
+ left: 0;
980
+ right: 80%;
981
+ }
982
+ .featherlight-next span,
983
+ .featherlight-previous span {
984
+ display: inline-block;
985
+ opacity: 0.3;
986
+ position: absolute;
987
+ top: 50%;
988
+ width: 100%;
989
+ font-size: 80px;
990
+ line-height: 80px;
991
+ /* center vertically */
992
+ margin-top: -40px;
993
+ color: #fff;
994
+ font-style: normal;
995
+ font-weight: normal;
996
+ -webkit-transition: all 0.3s ease-out;
997
+ -moz-transition: all 0.3s ease-out;
998
+ -o-transition: all 0.3s ease-out;
999
+ transition: all 0.3s ease-out;
1000
+ }
1001
+ .featherlight-next span {
1002
+ text-align: right;
1003
+ left: auto;
1004
+ right: 7%;
1005
+ }
1006
+ .featherlight-previous span {
1007
+ text-align: left;
1008
+ left: 7%;
1009
+ }
1010
+ .featherlight-next:hover span,
1011
+ .featherlight-previous:hover span {
1012
+ display: inline-block;
1013
+ opacity: 1;
1014
+ }
1015
+ /* Hide navigation while loading */
1016
+ .featherlight-loading .featherlight-previous,
1017
+ .featherlight-loading .featherlight-next {
1018
+ display: none;
1019
+ }
1020
  }
1021
 
 
1022
  /* Always display arrows on touch devices */
1023
 
1024
  @media only screen and (max-device-width: 1024px) {
1025
+ .featherlight-next:hover,
1026
+ .featherlight-previous:hover {
1027
+ background: none;
1028
+ }
1029
+ .featherlight-next span,
1030
+ .featherlight-previous span {
1031
+ display: block;
1032
+ }
1033
  }
1034
 
 
1035
  /* handling phones and small screens */
1036
 
1037
  @media only screen and (max-width: 1024px) {
1038
+ .featherlight-next,
1039
+ .featherlight-previous {
1040
+ top: 10px;
1041
+ right: 10px;
1042
+ left: 85%;
1043
+ }
1044
+ .featherlight-previous {
1045
+ left: 10px;
1046
+ right: 85%;
1047
+ }
1048
+ .featherlight-next span,
1049
+ .featherlight-previous span {
1050
+ margin-top: -30px;
1051
+ font-size: 40px;
1052
+ }
1053
  }
1054
 
1055
  .loader {
1056
+ z-index: 999999;
1057
+ width: 94px;
1058
+ height: 77px;
1059
+ position: relative;
1060
+ top: 20%;
1061
+ left: 50%;
1062
+ transform: translate(-50%, -50%);
1063
+ backface-visibility: hidden;
1064
+ display: none;
1065
+ span {
1066
+ position: absolute;
1067
+ left: 0;
1068
+ top: 0;
1069
+ width: 100%;
1070
+ height: 20px;
1071
+ background-color: #ff8c4a6f;
1072
+ z-index: 1;
1073
+ transform: translateY(135%);
1074
+ animation: move 2s cubic-bezier(0.15, 0.44, 0.76, 0.64);
1075
+ /* Adjust the animation duration here */
1076
+ animation-iteration-count: infinite;
1077
+ }
1078
+ > div {
1079
+ z-index: 1;
1080
+ position: absolute;
1081
+ left: 50%;
1082
+ top: 50%;
1083
  transform: translate(-50%, -50%);
1084
+ width: 48%;
1085
  backface-visibility: hidden;
1086
+ }
1087
+ i {
1088
+ display: block;
1089
+ height: 1px;
1090
+ background: #000;
1091
+ margin: 0 auto 2px;
1092
+ margin: 0 auto 2.2px;
1093
+ backface-visibility: hidden;
1094
+ &:nth-child(2) {
1095
+ width: 75%;
 
 
 
1096
  }
1097
+ &:nth-child(3) {
1098
+ width: 81%;
 
 
 
 
 
 
1099
  }
1100
+ &:nth-child(4) {
1101
+ width: 87%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1102
  }
1103
+ &:nth-child(6) {
1104
+ width: 71%;
 
 
 
 
 
 
 
 
 
1105
  }
1106
+ &:nth-child(7) {
1107
+ width: 81%;
 
 
 
1108
  }
1109
+ &:nth-child(8) {
1110
+ width: 65%;
 
 
 
1111
  }
1112
+ &:nth-child(9) {
1113
+ width: 83%;
 
 
 
1114
  }
1115
+ &:nth-child(10) {
1116
+ width: 75%;
 
 
 
1117
  }
1118
+ &:nth-child(12) {
1119
+ width: 86%;
 
 
 
 
1120
  }
1121
+ &:nth-child(14) {
1122
+ width: 65%;
1123
  }
1124
+ &:nth-child(16) {
1125
+ width: 75%;
1126
  }
1127
+ &:nth-child(18) {
1128
+ width: 83%;
1129
  }
1130
+ }
1131
+ &:before,
1132
+ &:after,
1133
+ em:after,
1134
+ em:before {
1135
+ border-color: #000;
1136
+ content: "";
1137
+ position: absolute;
1138
+ width: 19px;
1139
+ height: 16px;
1140
+ border-style: solid;
1141
+ border-width: 0px;
1142
+ }
1143
+ &:before {
1144
+ left: 0;
1145
+ top: 0;
1146
+ border-left-width: 1px;
1147
+ border-top-width: 1px;
1148
+ }
1149
+ &:after {
1150
+ right: 0;
1151
+ top: 0;
1152
+ border-right-width: 1px;
1153
+ border-top-width: 1px;
1154
+ }
1155
+ em:before {
1156
+ left: 0;
1157
+ bottom: 0;
1158
+ border-left-width: 1px;
1159
+ border-bottom-width: 1px;
1160
+ }
1161
+ em:after {
1162
+ right: 0;
1163
+ bottom: 0;
1164
+ border-right-width: 1px;
1165
+ border-bottom-width: 1px;
1166
+ }
1167
  }
1168
 
1169
+ @keyframes move {
1170
+ 0%,
1171
+ 100% {
1172
+ transform: translateY(0%);
1173
+ }
1174
+ 25% {
1175
+ transform: translateY(135%);
1176
+ }
1177
+ 50% {
1178
+ transform: translateY(272%);
1179
+ }
1180
+ 75% {
1181
+ transform: translateY(135%);
1182
+ }
1183
+ }
1184
 
1185
  /*Preloader*/
1186
 
1187
  .ocrloader {
1188
+ z-index: 999999;
1189
+ width: 94px;
1190
+ height: 77px;
1191
+ position: absolute;
1192
+ left: 50%;
1193
+ top: 50%;
1194
+ transform: translate(-50%, -50%);
1195
+ backface-visibility: hidden;
1196
+ span {
1197
+ position: absolute;
1198
+ left: 0;
1199
+ top: 0;
1200
+ width: 100%;
1201
+ height: 20px;
1202
+ background-color: #ff8c4a6f;
1203
+ z-index: 1;
1204
+ transform: translateY(135%);
1205
+ animation: move 2s cubic-bezier(0.15, 0.44, 0.76, 0.64);
1206
+ /* Adjust the animation duration here */
1207
+ animation-iteration-count: infinite;
1208
+ }
1209
+ > div {
1210
+ z-index: 1;
1211
  position: absolute;
1212
  left: 50%;
1213
  top: 50%;
1214
  transform: translate(-50%, -50%);
1215
+ width: 48%;
1216
  backface-visibility: hidden;
1217
+ }
1218
+ i {
1219
+ display: block;
1220
+ height: 1px;
1221
+ background: #000;
1222
+ margin: 0 auto 2px;
1223
+ margin: 0 auto 2.2px;
1224
+ backface-visibility: hidden;
1225
+ &:nth-child(2) {
1226
+ width: 75%;
 
 
1227
  }
1228
+ &:nth-child(3) {
1229
+ width: 81%;
 
 
 
 
 
 
1230
  }
1231
+ &:nth-child(4) {
1232
+ width: 87%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1233
  }
1234
+ &:nth-child(6) {
1235
+ width: 71%;
 
 
 
 
 
 
 
 
 
1236
  }
1237
+ &:nth-child(7) {
1238
+ width: 81%;
 
 
 
1239
  }
1240
+ &:nth-child(8) {
1241
+ width: 65%;
 
 
 
1242
  }
1243
+ &:nth-child(9) {
1244
+ width: 83%;
 
 
 
1245
  }
1246
+ &:nth-child(10) {
1247
+ width: 75%;
 
 
 
1248
  }
1249
+ &:nth-child(12) {
1250
+ width: 86%;
 
 
 
 
1251
  }
1252
+ &:nth-child(14) {
1253
+ width: 65%;
1254
  }
1255
+ &:nth-child(16) {
1256
+ width: 75%;
1257
  }
1258
+ &:nth-child(18) {
1259
+ width: 83%;
1260
  }
1261
+ }
1262
+ &:before,
1263
+ &:after,
1264
+ em:after,
1265
+ em:before {
1266
+ border-color: #000;
1267
+ content: "";
1268
+ position: absolute;
1269
+ width: 19px;
1270
+ height: 16px;
1271
+ border-style: solid;
1272
+ border-width: 0px;
1273
+ }
1274
+ &:before {
1275
+ left: 0;
1276
+ top: 0;
1277
+ border-left-width: 1px;
1278
+ border-top-width: 1px;
1279
+ }
1280
+ &:after {
1281
+ right: 0;
1282
+ top: 0;
1283
+ border-right-width: 1px;
1284
+ border-top-width: 1px;
1285
+ }
1286
+ em:before {
1287
+ left: 0;
1288
+ bottom: 0;
1289
+ border-left-width: 1px;
1290
+ border-bottom-width: 1px;
1291
+ }
1292
+ em:after {
1293
+ right: 0;
1294
+ bottom: 0;
1295
+ border-right-width: 1px;
1296
+ border-bottom-width: 1px;
1297
+ }
1298
  }
1299
 
1300
+ @keyframes move {
1301
+ 0%,
1302
+ 100% {
1303
+ transform: translateY(0%);
1304
+ }
1305
+ 25% {
1306
+ transform: translateY(135%);
1307
+ }
1308
+ 50% {
1309
+ transform: translateY(272%);
1310
+ }
1311
+ 75% {
1312
+ transform: translateY(135%);
1313
+ }
1314
+ }
1315
 
1316
  /*!
1317
  * Load Awesome v1.1.0 (http://github.danielcardoso.net/load-awesome/)
 
1320
  */
1321
 
1322
  .la-ball-triangle-path,
1323
+ .la-ball-triangle-path > div {
1324
+ position: relative;
1325
+ -webkit-box-sizing: border-box;
1326
+ -moz-box-sizing: border-box;
1327
+ box-sizing: border-box;
1328
  }
1329
 
1330
  .la-ball-triangle-path {
1331
+ display: block;
1332
+ font-size: 0;
1333
+ color: #fff;
1334
  }
1335
 
1336
  .la-ball-triangle-path.la-dark {
1337
+ color: #333;
1338
  }
1339
 
1340
+ .la-ball-triangle-path > div {
1341
+ display: inline-block;
1342
+ float: none;
1343
+ background-color: currentColor;
1344
+ border: 0 solid currentColor;
1345
  }
1346
 
1347
  .la-ball-triangle-path {
1348
+ width: 32px;
1349
+ height: 32px;
1350
  }
1351
 
1352
+ .la-ball-triangle-path > div {
1353
+ position: absolute;
1354
+ top: 0;
1355
+ left: 0;
1356
+ width: 10px;
1357
+ height: 10px;
1358
+ border-radius: 100%;
1359
  }
1360
 
1361
+ .la-ball-triangle-path > div:nth-child(1) {
1362
+ -webkit-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1363
+ -moz-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1364
+ -o-animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1365
+ animation: ball-triangle-path-ball-one 2s 0s ease-in-out infinite;
1366
  }
1367
 
1368
+ .la-ball-triangle-path > div:nth-child(2) {
1369
+ -webkit-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1370
+ -moz-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1371
+ -o-animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1372
+ animation: ball-triangle-path-ball-two 2s 0s ease-in-out infinite;
1373
  }
1374
 
1375
+ .la-ball-triangle-path > div:nth-child(3) {
1376
+ -webkit-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1377
+ -moz-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1378
+ -o-animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1379
+ animation: ball-triangle-path-ball-tree 2s 0s ease-in-out infinite;
1380
  }
1381
 
1382
  .la-ball-triangle-path.la-sm {
1383
+ width: 16px;
1384
+ height: 16px;
1385
  }
1386
 
1387
+ .la-ball-triangle-path.la-sm > div {
1388
+ width: 4px;
1389
+ height: 4px;
1390
  }
1391
 
1392
  .la-ball-triangle-path.la-2x {
1393
+ width: 64px;
1394
+ height: 64px;
1395
  }
1396
 
1397
+ .la-ball-triangle-path.la-2x > div {
1398
+ width: 20px;
1399
+ height: 20px;
1400
  }
1401
 
1402
  .la-ball-triangle-path.la-3x {
1403
+ width: 96px;
1404
+ height: 96px;
1405
  }
1406
 
1407
+ .la-ball-triangle-path.la-3x > div {
1408
+ width: 30px;
1409
+ height: 30px;
1410
  }
1411
 
 
1412
  /*
1413
  * Animations
1414
  */
1415
 
1416
  @-webkit-keyframes ball-triangle-path-ball-one {
1417
+ 0% {
1418
+ -webkit-transform: translate(0, 220%);
1419
+ transform: translate(0, 220%);
1420
+ }
1421
+ 17% {
1422
+ opacity: 0.25;
1423
+ }
1424
+ 33% {
1425
+ opacity: 1;
1426
+ -webkit-transform: translate(110%, 0);
1427
+ transform: translate(110%, 0);
1428
+ }
1429
+ 50% {
1430
+ opacity: 0.25;
1431
+ }
1432
+ 66% {
1433
+ opacity: 1;
1434
+ -webkit-transform: translate(220%, 220%);
1435
+ transform: translate(220%, 220%);
1436
+ }
1437
+ 83% {
1438
+ opacity: 0.25;
1439
+ }
1440
+ 100% {
1441
+ opacity: 1;
1442
+ -webkit-transform: translate(0, 220%);
1443
+ transform: translate(0, 220%);
1444
+ }
1445
  }
1446
 
1447
  @-moz-keyframes ball-triangle-path-ball-one {
1448
+ 0% {
1449
+ -moz-transform: translate(0, 220%);
1450
+ transform: translate(0, 220%);
1451
+ }
1452
+ 17% {
1453
+ opacity: 0.25;
1454
+ }
1455
+ 33% {
1456
+ opacity: 1;
1457
+ -moz-transform: translate(110%, 0);
1458
+ transform: translate(110%, 0);
1459
+ }
1460
+ 50% {
1461
+ opacity: 0.25;
1462
+ }
1463
+ 66% {
1464
+ opacity: 1;
1465
+ -moz-transform: translate(220%, 220%);
1466
+ transform: translate(220%, 220%);
1467
+ }
1468
+ 83% {
1469
+ opacity: 0.25;
1470
+ }
1471
+ 100% {
1472
+ opacity: 1;
1473
+ -moz-transform: translate(0, 220%);
1474
+ transform: translate(0, 220%);
1475
+ }
1476
  }
1477
 
1478
  @-o-keyframes ball-triangle-path-ball-one {
1479
+ 0% {
1480
+ -o-transform: translate(0, 220%);
1481
+ transform: translate(0, 220%);
1482
+ }
1483
+ 17% {
1484
+ opacity: 0.25;
1485
+ }
1486
+ 33% {
1487
+ opacity: 1;
1488
+ -o-transform: translate(110%, 0);
1489
+ transform: translate(110%, 0);
1490
+ }
1491
+ 50% {
1492
+ opacity: 0.25;
1493
+ }
1494
+ 66% {
1495
+ opacity: 1;
1496
+ -o-transform: translate(220%, 220%);
1497
+ transform: translate(220%, 220%);
1498
+ }
1499
+ 83% {
1500
+ opacity: 0.25;
1501
+ }
1502
+ 100% {
1503
+ opacity: 1;
1504
+ -o-transform: translate(0, 220%);
1505
+ transform: translate(0, 220%);
1506
+ }
1507
  }
1508
 
1509
  @keyframes ball-triangle-path-ball-one {
1510
+ 0% {
1511
+ -webkit-transform: translate(0, 220%);
1512
+ -moz-transform: translate(0, 220%);
1513
+ -o-transform: translate(0, 220%);
1514
+ transform: translate(0, 220%);
1515
+ }
1516
+ 17% {
1517
+ opacity: 0.25;
1518
+ }
1519
+ 33% {
1520
+ opacity: 1;
1521
+ -webkit-transform: translate(110%, 0);
1522
+ -moz-transform: translate(110%, 0);
1523
+ -o-transform: translate(110%, 0);
1524
+ transform: translate(110%, 0);
1525
+ }
1526
+ 50% {
1527
+ opacity: 0.25;
1528
+ }
1529
+ 66% {
1530
+ opacity: 1;
1531
+ -webkit-transform: translate(220%, 220%);
1532
+ -moz-transform: translate(220%, 220%);
1533
+ -o-transform: translate(220%, 220%);
1534
+ transform: translate(220%, 220%);
1535
+ }
1536
+ 83% {
1537
+ opacity: 0.25;
1538
+ }
1539
+ 100% {
1540
+ opacity: 1;
1541
+ -webkit-transform: translate(0, 220%);
1542
+ -moz-transform: translate(0, 220%);
1543
+ -o-transform: translate(0, 220%);
1544
+ transform: translate(0, 220%);
1545
+ }
1546
  }
1547
 
1548
  @-webkit-keyframes ball-triangle-path-ball-two {
1549
+ 0% {
1550
+ -webkit-transform: translate(110%, 0);
1551
+ transform: translate(110%, 0);
1552
+ }
1553
+ 17% {
1554
+ opacity: 0.25;
1555
+ }
1556
+ 33% {
1557
+ opacity: 1;
1558
+ -webkit-transform: translate(220%, 220%);
1559
+ transform: translate(220%, 220%);
1560
+ }
1561
+ 50% {
1562
+ opacity: 0.25;
1563
+ }
1564
+ 66% {
1565
+ opacity: 1;
1566
+ -webkit-transform: translate(0, 220%);
1567
+ transform: translate(0, 220%);
1568
+ }
1569
+ 83% {
1570
+ opacity: 0.25;
1571
+ }
1572
+ 100% {
1573
+ opacity: 1;
1574
+ -webkit-transform: translate(110%, 0);
1575
+ transform: translate(110%, 0);
1576
+ }
1577
  }
1578
 
1579
  @-moz-keyframes ball-triangle-path-ball-two {
1580
+ 0% {
1581
+ -moz-transform: translate(110%, 0);
1582
+ transform: translate(110%, 0);
1583
+ }
1584
+ 17% {
1585
+ opacity: 0.25;
1586
+ }
1587
+ 33% {
1588
+ opacity: 1;
1589
+ -moz-transform: translate(220%, 220%);
1590
+ transform: translate(220%, 220%);
1591
+ }
1592
+ 50% {
1593
+ opacity: 0.25;
1594
+ }
1595
+ 66% {
1596
+ opacity: 1;
1597
+ -moz-transform: translate(0, 220%);
1598
+ transform: translate(0, 220%);
1599
+ }
1600
+ 83% {
1601
+ opacity: 0.25;
1602
+ }
1603
+ 100% {
1604
+ opacity: 1;
1605
+ -moz-transform: translate(110%, 0);
1606
+ transform: translate(110%, 0);
1607
+ }
1608
  }
1609
 
1610
  @-o-keyframes ball-triangle-path-ball-two {
1611
+ 0% {
1612
+ -o-transform: translate(110%, 0);
1613
+ transform: translate(110%, 0);
1614
+ }
1615
+ 17% {
1616
+ opacity: 0.25;
1617
+ }
1618
+ 33% {
1619
+ opacity: 1;
1620
+ -o-transform: translate(220%, 220%);
1621
+ transform: translate(220%, 220%);
1622
+ }
1623
+ 50% {
1624
+ opacity: 0.25;
1625
+ }
1626
+ 66% {
1627
+ opacity: 1;
1628
+ -o-transform: translate(0, 220%);
1629
+ transform: translate(0, 220%);
1630
+ }
1631
+ 83% {
1632
+ opacity: 0.25;
1633
+ }
1634
+ 100% {
1635
+ opacity: 1;
1636
+ -o-transform: translate(110%, 0);
1637
+ transform: translate(110%, 0);
1638
+ }
1639
  }
1640
 
1641
  @keyframes ball-triangle-path-ball-two {
1642
+ 0% {
1643
+ -webkit-transform: translate(110%, 0);
1644
+ -moz-transform: translate(110%, 0);
1645
+ -o-transform: translate(110%, 0);
1646
+ transform: translate(110%, 0);
1647
+ }
1648
+ 17% {
1649
+ opacity: 0.25;
1650
+ }
1651
+ 33% {
1652
+ opacity: 1;
1653
+ -webkit-transform: translate(220%, 220%);
1654
+ -moz-transform: translate(220%, 220%);
1655
+ -o-transform: translate(220%, 220%);
1656
+ transform: translate(220%, 220%);
1657
+ }
1658
+ 50% {
1659
+ opacity: 0.25;
1660
+ }
1661
+ 66% {
1662
+ opacity: 1;
1663
+ -webkit-transform: translate(0, 220%);
1664
+ -moz-transform: translate(0, 220%);
1665
+ -o-transform: translate(0, 220%);
1666
+ transform: translate(0, 220%);
1667
+ }
1668
+ 83% {
1669
+ opacity: 0.25;
1670
+ }
1671
+ 100% {
1672
+ opacity: 1;
1673
+ -webkit-transform: translate(110%, 0);
1674
+ -moz-transform: translate(110%, 0);
1675
+ -o-transform: translate(110%, 0);
1676
+ transform: translate(110%, 0);
1677
+ }
1678
  }
1679
 
1680
  @-webkit-keyframes ball-triangle-path-ball-tree {
1681
+ 0% {
1682
+ -webkit-transform: translate(220%, 220%);
1683
+ transform: translate(220%, 220%);
1684
+ }
1685
+ 17% {
1686
+ opacity: 0.25;
1687
+ }
1688
+ 33% {
1689
+ opacity: 1;
1690
+ -webkit-transform: translate(0, 220%);
1691
+ transform: translate(0, 220%);
1692
+ }
1693
+ 50% {
1694
+ opacity: 0.25;
1695
+ }
1696
+ 66% {
1697
+ opacity: 1;
1698
+ -webkit-transform: translate(110%, 0);
1699
+ transform: translate(110%, 0);
1700
+ }
1701
+ 83% {
1702
+ opacity: 0.25;
1703
+ }
1704
+ 100% {
1705
+ opacity: 1;
1706
+ -webkit-transform: translate(220%, 220%);
1707
+ transform: translate(220%, 220%);
1708
+ }
1709
  }
1710
 
1711
  @-moz-keyframes ball-triangle-path-ball-tree {
1712
+ 0% {
1713
+ -moz-transform: translate(220%, 220%);
1714
+ transform: translate(220%, 220%);
1715
+ }
1716
+ 17% {
1717
+ opacity: 0.25;
1718
+ }
1719
+ 33% {
1720
+ opacity: 1;
1721
+ -moz-transform: translate(0, 220%);
1722
+ transform: translate(0, 220%);
1723
+ }
1724
+ 50% {
1725
+ opacity: 0.25;
1726
+ }
1727
+ 66% {
1728
+ opacity: 1;
1729
+ -moz-transform: translate(110%, 0);
1730
+ transform: translate(110%, 0);
1731
+ }
1732
+ 83% {
1733
+ opacity: 0.25;
1734
+ }
1735
+ 100% {
1736
+ opacity: 1;
1737
+ -moz-transform: translate(220%, 220%);
1738
+ transform: translate(220%, 220%);
1739
+ }
1740
  }
1741
 
1742
  @-o-keyframes ball-triangle-path-ball-tree {
1743
+ 0% {
1744
+ -o-transform: translate(220%, 220%);
1745
+ transform: translate(220%, 220%);
1746
+ }
1747
+ 17% {
1748
+ opacity: 0.25;
1749
+ }
1750
+ 33% {
1751
+ opacity: 1;
1752
+ -o-transform: translate(0, 220%);
1753
+ transform: translate(0, 220%);
1754
+ }
1755
+ 50% {
1756
+ opacity: 0.25;
1757
+ }
1758
+ 66% {
1759
+ opacity: 1;
1760
+ -o-transform: translate(110%, 0);
1761
+ transform: translate(110%, 0);
1762
+ }
1763
+ 83% {
1764
+ opacity: 0.25;
1765
+ }
1766
+ 100% {
1767
+ opacity: 1;
1768
+ -o-transform: translate(220%, 220%);
1769
+ transform: translate(220%, 220%);
1770
+ }
1771
  }
1772
 
1773
  @keyframes ball-triangle-path-ball-tree {
1774
+ 0% {
1775
+ -webkit-transform: translate(220%, 220%);
1776
+ -moz-transform: translate(220%, 220%);
1777
+ -o-transform: translate(220%, 220%);
1778
+ transform: translate(220%, 220%);
1779
+ }
1780
+ 17% {
1781
+ opacity: 0.25;
1782
+ }
1783
+ 33% {
1784
+ opacity: 1;
1785
+ -webkit-transform: translate(0, 220%);
1786
+ -moz-transform: translate(0, 220%);
1787
+ -o-transform: translate(0, 220%);
1788
+ transform: translate(0, 220%);
1789
+ }
1790
+ 50% {
1791
+ opacity: 0.25;
1792
+ }
1793
+ 66% {
1794
+ opacity: 1;
1795
+ -webkit-transform: translate(110%, 0);
1796
+ -moz-transform: translate(110%, 0);
1797
+ -o-transform: translate(110%, 0);
1798
+ transform: translate(110%, 0);
1799
+ }
1800
+ 83% {
1801
+ opacity: 0.25;
1802
+ }
1803
+ 100% {
1804
+ opacity: 1;
1805
+ -webkit-transform: translate(220%, 220%);
1806
+ -moz-transform: translate(220%, 220%);
1807
+ -o-transform: translate(220%, 220%);
1808
+ transform: translate(220%, 220%);
1809
+ }
1810
  }
1811
 
 
1812
  /*------------------------------------------------------------------------------------------*/
1813
 
 
1814
  /* Responsive Elements */
1815
 
 
1816
  /*------------------------------------------------------------------------------------------*/
1817
 
 
1818
  /* =Media Queries for Nav
1819
  ===============================*/
1820
 
1821
  @media all and (max-width: 1024px) {
1822
+ #nav-trigger {
1823
+ display: block;
1824
+ }
1825
+ nav#nav-main {
1826
+ display: none;
1827
+ }
1828
+ nav#nav-mobile {
1829
+ display: block;
1830
+ }
1831
+ nav#nav-mobile li {
1832
+ display: block;
1833
+ }
1834
+ #header aside {
1835
+ display: none;
1836
+ }
1837
  }
1838
 
 
1839
  /* Landscape mobile & down
1840
  ===============================*/
1841
 
1842
  @media (max-width: 480px) {
1843
+ #wrapper {
1844
+ margin: 0;
1845
+ padding: 0;
1846
+ }
1847
+ .page-border,
1848
+ #scrollUp,
1849
+ #scrollUp:before {
1850
+ display: none;
1851
+ }
1852
+ .row {
1853
+ padding: 15px !important;
1854
+ }
1855
+ .col-1,
1856
+ .col-2,
1857
+ .col-3,
1858
+ .col-4,
1859
+ .col-5,
1860
+ .col-6,
1861
+ .col-7,
1862
+ .col-8,
1863
+ .col-9,
1864
+ .col-10,
1865
+ .col-11,
1866
+ .col-12,
1867
+ .col-2-3,
1868
+ .col-3-4,
1869
+ .col-9-10,
1870
+ .col-61,
1871
+ .col-38,
1872
+ .row {
1873
+ width: 100%;
1874
+ }
1875
+ .col-1,
1876
+ .col-2,
1877
+ .col-3,
1878
+ .col-4,
1879
+ .col-5,
1880
+ .col-6,
1881
+ .col-7,
1882
+ .col-8,
1883
+ .col-9,
1884
+ .col-10,
1885
+ .col-11,
1886
+ .col-12,
1887
+ .col-2-3,
1888
+ .col-3-4,
1889
+ .col-9-10,
1890
+ .col-61,
1891
+ .col-38 {
1892
+ padding-right: 0;
1893
+ padding-left: 0;
1894
+ }
1895
+ /*-----------------Header Elements-----------------*/
1896
+ #header .row {
1897
+ padding: 0 15px !important;
1898
+ }
1899
+ #header.nav-solid [class*="col-"] {
1900
+ padding: 0;
1901
+ }
1902
+ /*Logo*/
1903
+ #logo h2 {
1904
+ padding: 0;
1905
+ }
1906
+ /* Social */
1907
+ #header aside {
1908
+ clear: both;
1909
+ padding: 0;
1910
+ }
1911
+ #header ul.social-icons {
1912
+ margin-top: 0;
1913
+ }
1914
+ #banner-content.row {
1915
+ padding-top: 85px !important;
1916
+ }
1917
+ /*-----------------Sections-----------------*/
1918
+ /* Call to Action*/
1919
+ .call-to-action {
1920
+ padding-bottom: 25px;
1921
+ }
1922
+ /* Video */
1923
+ .slvj-lightbox iframe,
1924
+ .slvj-lightbox object,
1925
+ .slvj-lightbox embed {
1926
+ height: 270px !important;
1927
+ }
1928
+ /* Footer */
1929
+ #landing-footer #copyright {
1930
+ float: left;
1931
+ width: 50%;
1932
+ }
1933
+ #landing-footer .social-icons {
1934
+ float: right;
1935
+ width: 50%;
1936
+ }
1937
+ /*-----------------Typography-----------------*/
1938
+ h1 {
1939
+ font-size: 38px;
1940
+ }
1941
+ #banner h1 {
1942
+ font-size: 48px;
1943
+ }
1944
+ /* Hide Elements */
1945
+ a#scrollUp {
1946
+ display: none !important;
1947
+ }
1948
  }
1949
 
 
1950
  /* Mobile to Tablet Portrait
1951
  ===============================*/
1952
 
1953
  @media (min-width: 480px) and (max-width: 767px) {
1954
+ #wrapper {
1955
+ margin: 0;
1956
+ padding: 0;
1957
+ }
1958
+ .page-border,
1959
+ #scrollUp,
1960
+ #scrollUp:before {
1961
+ display: none;
1962
+ }
1963
+ .row {
1964
+ padding: 15px 0 !important;
1965
+ }
1966
+ .col-1,
1967
+ .col-2,
1968
+ .col-5,
1969
+ .col-7,
1970
+ .col-9,
1971
+ .col-11,
1972
+ .col-2-3,
1973
+ .col-3-4,
1974
+ .col-61,
1975
+ .col-38,
1976
+ .row {
1977
+ width: 100%;
1978
+ }
1979
+ .col-3,
1980
+ .col-4,
1981
+ .col-6,
1982
+ .col-8,
1983
+ .col-10,
1984
+ .col-12 {
1985
+ width: 50%;
1986
+ }
1987
+ /*-----------------Header Elements-----------------*/
1988
+ #header .row {
1989
+ padding: 0 !important;
1990
+ }
1991
+ #header aside {
1992
+ display: inline-block;
1993
+ position: absolute;
1994
+ top: 40px;
1995
+ right: 60px;
1996
+ padding-top: 3px;
1997
+ padding-right: 5px;
1998
+ }
1999
+ #header.nav-solid aside {
2000
+ top: 20px;
2001
+ }
2002
+ #header aside ul {
2003
+ margin-top: 0 !important;
2004
+ padding-top: 6px;
2005
+ }
2006
+ #banner-content.row {
2007
+ padding-top: 85px !important;
2008
+ }
2009
+ /*Navigation*/
2010
+ nav#nav-mobile ul {
2011
+ margin-left: -40px;
2012
+ margin-right: -40px;
2013
+ padding-left: 20px;
2014
+ padding-right: 20px;
2015
+ }
2016
+ /*-----------------Sections-----------------*/
2017
+ /* Video */
2018
+ .slvj-lightbox iframe,
2019
+ .slvj-lightbox object,
2020
+ .slvj-lightbox embed {
2021
+ height: 370px !important;
2022
+ }
2023
+ /* Footer */
2024
+ #landing-footer #copyright {
2025
+ float: left;
2026
+ width: 50%;
2027
+ }
2028
+ #landing-footer .social-icons {
2029
+ float: right;
2030
+ width: 50%;
2031
+ }
2032
  }
2033
 
 
2034
  /* Landscape Tablet to Desktop
2035
  ===============================*/
2036
 
2037
  @media (min-width: 768px) and (max-width: 1024px) {
2038
+ #wrapper {
2039
+ margin: 0;
2040
+ padding: 0;
2041
+ }
2042
+ .page-border {
2043
+ display: none;
2044
+ }
2045
+ .big-padding-top {
2046
+ padding-top: 45px !important;
2047
+ }
2048
+ /*-----------------Header Elements-----------------*/
2049
+ #header aside {
2050
+ display: inline-block;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2051
  position: absolute;
2052
+ top: 40px;
2053
+ right: 60px;
2054
+ padding-top: 3px;
2055
+ padding-right: 5px;
2056
+ }
2057
+ #header.nav-solid aside {
2058
+ top: 20px;
2059
+ }
2060
+ #header aside ul {
2061
+ margin-top: 0 !important;
2062
+ padding-top: 6px;
2063
+ }
2064
+ /*Navigation*/
2065
+ nav#nav-mobile ul {
2066
+ margin-left: -40px;
2067
+ margin-right: -40px;
2068
+ padding-left: 20px;
2069
+ padding-right: 20px;
2070
+ }
2071
+ /*-----------------Sections-----------------*/
2072
+ /* Video */
2073
+ .slvj-lightbox object,
2074
+ .slvj-lightbox embed {
2075
+ height: 432px !important;
2076
+ }
2077
+ }
2078
+
2079
+ @import "https://fonts.googleapis.com/css?family=Montserrat:800|Poppins:400";
2080
+ .wall {
2081
+ position: absolute;
2082
+ width: 100vw;
2083
+ height: 100vh;
2084
+ background-color: #fff;
2085
  }
2086
 
2087
  .row1 {
2088
+ z-index: -9999999;
2089
+ display: flex;
2090
+ animation: 200s linear ticker-to-left infinite;
2091
  }
2092
 
2093
  .row1:nth-child(even) {
2094
+ animation: 60s linear ticker-to-right infinite;
2095
+ justify-content: flex-end;
2096
  }
2097
 
2098
  .row1 span {
2099
+ margin-right: 0.2em;
2100
+ font-family: sans-serif;
2101
+ color: transparent;
2102
+ font-size: 20vh;
2103
+ font-weight: bold;
2104
+ line-height: 1;
2105
+ text-transform: uppercase;
2106
+ -webkit-text-stroke-width: 4px;
2107
+ text-stroke-width: 4px;
2108
+ -webkit-text-stroke-color: #f5f5f599;
2109
+ text-stroke-color: #f5f5f599;
2110
  }
2111
 
2112
  @keyframes ticker-to-left {
2113
+ 0% {
2114
+ transform: translate3d(0, 0, 0);
2115
+ }
2116
+ 100% {
2117
+ transform: translate3d(-100%, 0, 0);
2118
+ }
2119
  }
2120
 
2121
  @keyframes ticker-to-right {
2122
+ 0% {
2123
+ transform: translate3d(0, 0, 0);
2124
+ }
2125
+ 100% {
2126
+ transform: translate3d(100%, 0, 0);
2127
+ }
2128
  }
2129
 
2130
  .container {
2131
+ max-width: 500px;
2132
+ max-height: 400px;
2133
+ width: 100%;
2134
+ padding: 25px;
2135
+ background: rgb(255 255 255 / 0%);
2136
+ box-shadow: 0 8px 32px 0 rgba(154, 154, 154, 0.37);
2137
+ backdrop-filter: blur(2.2px);
2138
+ -webkit-backdrop-filter: blur(2.2px);
2139
+ border-radius: 12px;
2140
+ border: 1px solid rgba(52, 52, 52, 0.195);
2141
  }
2142
 
2143
  .uploadbuttons {
2144
+ display: flex;
2145
+ justify-content: flex-start;
2146
  }
2147
 
2148
  .container:hover {
2149
+ background: rgb(255 93 0 / 11%);
2150
+ /* Adjust the alpha value for the desired transparency */
2151
+ box-shadow: 0 8px 32px 0 rgba(154, 154, 154, 0.37);
2152
+ backdrop-filter: blur(2.2px);
2153
+ -webkit-backdrop-filter: blur(2.2px);
2154
+ border: 1px solid rgba(103, 101, 101, 0.195);
2155
+ transition: all 0.4s ease-in-out;
2156
  }
2157
 
2158
  .drag-area {
2159
+ height: 200px;
2160
+ border: 3px dashed rgba(128, 128, 128, 0.263);
2161
+ border-radius: 10px;
2162
+ display: flex;
2163
+ align-items: center;
2164
+ justify-content: center;
2165
+ flex-direction: column;
2166
+ padding: 0px 50px;
2167
  }
2168
 
2169
  .drag-area:hover {
2170
+ height: 200px;
2171
+ border: 3px dashed #ff8c4a5a;
2172
+ display: flex;
2173
+ align-items: center;
2174
+ justify-content: center;
2175
+ flex-direction: column;
2176
  }
2177
 
2178
  h3 {
2179
+ margin-bottom: 20px;
2180
+ font-weight: 500;
2181
  }
2182
 
2183
  .drag-area .icon {
2184
+ font-size: 50px;
2185
+ width: 60px;
2186
+ height: 60px;
2187
  }
2188
 
2189
  .drag-area .headerx {
2190
+ font-size: 17px;
2191
+ font-weight: 500;
2192
+ color: #34495e;
2193
  }
2194
 
2195
  .drag-area .support {
2196
+ font-size: 12px;
2197
+ color: gray;
2198
+ margin: 10px 0 15px 0;
2199
  }
2200
 
2201
  .drag-area .buttonx {
2202
+ font-size: 17px;
2203
+ font-weight: 500;
2204
+ color: #ff8b4a;
2205
+ cursor: pointer;
2206
  }
2207
 
2208
  .drag-area.active {
2209
+ border: 2px solid #ff8b4a;
2210
+ margin-bottom: 20px;
2211
  }
2212
 
2213
  .drag-area img {
2214
+ width: 100%;
2215
+ height: 100%;
2216
+ object-fit: contain;
2217
+ z-index: -1;
2218
+ padding-top: 8px;
2219
  }
2220
 
2221
  .image-grid {
2222
+ display: flex;
2223
+ justify-content: space-between;
2224
+ margin-top: 20px;
2225
  }
2226
 
2227
  .image-grid img {
2228
+ width: 30%;
2229
+ /* Adjust the width as needed */
2230
+ cursor: pointer;
2231
  }
2232
 
 
2233
  /* Additional styles for responsiveness */
2234
 
2235
  @media (max-width: 768px) {
2236
+ .image-grid {
2237
+ flex-direction: column;
2238
+ align-items: center;
2239
+ }
2240
+ .image-grid img {
2241
+ width: 80%;
2242
+ /* Adjust the width for smaller screens */
2243
+ margin-bottom: 10px;
2244
+ }
2245
  }
2246
 
2247
  .arrow {
2248
+ width: 20px;
2249
+ height: 20px;
2250
+ transform: rotate(90deg);
2251
  }
2252
 
2253
  .ar {
2254
+ margin-bottom: 20px;
2255
+ display: flex;
2256
+ justify-content: center;
2257
+ align-items: center;
2258
+ font-size: 12px;
2259
  }
2260
 
2261
  .easytext {
2262
+ background: linear-gradient(45deg, #ffa07a, #ff6347);
2263
+ -webkit-background-clip: text;
2264
+ color: transparent;
2265
  }
2266
 
2267
  .grid-container {
2268
+ display: grid;
2269
+ grid-template-columns: repeat(3, 1fr);
2270
+ max-width: 600px;
2271
+ margin: 0 auto;
2272
+ gap: 10px;
2273
+ /* Adjust the gap as needed */
2274
  }
2275
 
2276
  .grid-item {
2277
+ background: rgba(100, 97, 97, 0.2);
2278
+ backdrop-filter: blur(3.5px);
2279
+ padding: 20px;
2280
+ text-align: center;
2281
+ width: auto;
2282
+ height: max-content;
2283
+ border-radius: 5px;
2284
  }
2285
 
2286
  .grid-item:hover {
2287
+ background: linear-gradient(45deg, #ffa07a, #ff6347);
2288
+ color: #fff;
2289
  }
2290
 
2291
  .uploadbuttons {
2292
+ display: flex;
2293
+ align-items: center;
2294
+ align-content: center;
2295
+ flex-wrap: nowrap;
2296
+ justify-content: space-around;
2297
  }
2298
 
2299
  .uploadbutton {
2300
+ font-family: poppins;
2301
+ font-weight: 400;
2302
+ position: relative;
2303
+ padding: 12px 28px;
2304
+ background: linear-gradient(45deg, #ffa07a, #fa7962);
2305
+ font-size: 17px;
2306
+ font-weight: 500;
2307
+ color: #fff;
2308
+ border: 2px solid transparent;
2309
+ border-radius: 10px;
2310
+ box-shadow: 0 0 0 #fec1958c;
2311
+ transition: all 0.3s ease-in-out;
2312
+ justify-self: center;
2313
  }
2314
 
2315
  .star-1 {
2316
+ position: absolute;
2317
+ top: 20%;
2318
+ left: 20%;
2319
+ width: 25px;
2320
+ height: auto;
2321
+ filter: drop-shadow(0 0 0 #fffdef);
2322
+ z-index: -5;
2323
+ transition: all 1s cubic-bezier(0.05, 0.83, 0.43, 0.96);
2324
  }
2325
 
2326
  .star-2 {
2327
+ position: absolute;
2328
+ top: 45%;
2329
+ left: 45%;
2330
+ width: 15px;
2331
+ height: auto;
2332
+ filter: drop-shadow(0 0 0 #fffdef);
2333
+ z-index: -5;
2334
+ transition: all 1s cubic-bezier(0, 0.4, 0, 1.01);
2335
  }
2336
 
2337
  .star-3 {
2338
+ position: absolute;
2339
+ top: 40%;
2340
+ left: 40%;
2341
+ width: 5px;
2342
+ height: auto;
2343
+ filter: drop-shadow(0 0 0 #fffdef);
2344
+ z-index: -5;
2345
+ transition: all 1s cubic-bezier(0, 0.4, 0, 1.01);
2346
  }
2347
 
2348
  .star-4 {
2349
+ position: absolute;
2350
+ top: 20%;
2351
+ left: 40%;
2352
+ width: 8px;
2353
+ height: auto;
2354
+ filter: drop-shadow(0 0 0 #fffdef);
2355
+ z-index: -5;
2356
+ transition: all 0.8s cubic-bezier(0, 0.4, 0, 1.01);
2357
  }
2358
 
2359
  .star-5 {
2360
+ position: absolute;
2361
+ top: 25%;
2362
+ left: 45%;
2363
+ width: 15px;
2364
+ height: auto;
2365
+ filter: drop-shadow(0 0 0 #fffdef);
2366
+ z-index: -5;
2367
+ transition: all 0.6s cubic-bezier(0, 0.4, 0, 1.01);
2368
  }
2369
 
2370
  .star-6 {
2371
+ position: absolute;
2372
+ top: 5%;
2373
+ left: 50%;
2374
+ width: 5px;
2375
+ height: auto;
2376
+ filter: drop-shadow(0 0 0 #fffdef);
2377
+ z-index: -5;
2378
+ transition: all 0.8s ease;
2379
  }
2380
 
2381
  .uploadbutton:hover {
2382
+ border: 2px solid #ff8b4a;
2383
+ background: #f5f5f5;
2384
+ color: #000;
2385
+ transition: all 0.3s ease-in-out;
2386
  }
2387
 
2388
  .uploadbutton:hover .star-1 {
2389
+ position: absolute;
2390
+ top: -80%;
2391
+ left: -30%;
2392
+ width: 25px;
2393
+ height: auto;
2394
+ filter: drop-shadow(0 0 10px #fffdef);
2395
+ z-index: 2;
2396
  }
2397
 
2398
  .uploadbutton:hover .star-2 {
2399
+ position: absolute;
2400
+ top: -25%;
2401
+ left: 10%;
2402
+ width: 15px;
2403
+ height: auto;
2404
+ filter: drop-shadow(0 0 10px #fffdef);
2405
+ z-index: 2;
2406
  }
2407
 
2408
  .uploadbutton:hover .star-3 {
2409
+ position: absolute;
2410
+ top: 55%;
2411
+ left: 25%;
2412
+ width: 5px;
2413
+ height: auto;
2414
+ filter: drop-shadow(0 0 10px #fffdef);
2415
+ z-index: 2;
2416
  }
2417
 
2418
  .uploadbutton:hover .star-4 {
2419
+ position: absolute;
2420
+ top: 30%;
2421
+ left: 80%;
2422
+ width: 8px;
2423
+ height: auto;
2424
+ filter: drop-shadow(0 0 10px #fffdef);
2425
+ z-index: 2;
2426
  }
2427
 
2428
  .uploadbutton:hover .star-5 {
2429
+ position: absolute;
2430
+ top: 25%;
2431
+ left: 115%;
2432
+ width: 15px;
2433
+ height: auto;
2434
+ filter: drop-shadow(0 0 10px #fffdef);
2435
+ z-index: 2;
2436
  }
2437
 
2438
  .uploadbutton:hover .star-6 {
2439
+ position: absolute;
2440
+ top: 5%;
2441
+ left: 60%;
2442
+ width: 5px;
2443
+ height: auto;
2444
+ filter: drop-shadow(0 0 10px #fffdef);
2445
+ z-index: 2;
2446
  }
2447
 
2448
  .buttondiv {
2449
+ margin-top: 15px;
2450
+ display: flex;
2451
+ justify-content: center;
2452
  }
2453
 
2454
  input #file-input {
2455
+ height: 100%;
2456
  }
2457
 
 
2458
  /* Responsive layout for smaller screens */
2459
 
2460
  @media (max-width: 1024px) {
2461
+ .col-lg-6 {
2462
+ width: 55%;
2463
+ }
2464
+ .col-lg-3 {
2465
+ width: 45%;
2466
+ padding-top: 0.5em;
2467
+ }
2468
+ #logo img {
2469
+ max-height: 30px;
2470
+ vertical-align: middle;
2471
+ margin-left: 1.5em;
2472
+ }
2473
+ .container {
2474
+ max-width: 90%;
2475
+ }
2476
+ p,
2477
+ input {
2478
+ text-align: center;
2479
+ margin: auto;
2480
+ line-height: normal;
2481
+ }
2482
+ input,
2483
+ textarea {
2484
+ width: 100%;
2485
+ box-sizing: border-box;
2486
+ margin: 0px 0 10px 0;
2487
+ }
2488
  }
2489
 
2490
  @media (max-width: 768px) {
2491
+ .col-lg-6,
2492
+ .col-lg-3 {
2493
+ width: 100%;
2494
+ float: none;
2495
+ /* Remove float for full-width layout */
2496
+ }
2497
+ .container {
2498
+ max-width: 100%;
2499
+ }
2500
  }
2501
 
2502
  @media (max-width: 576px) {
2503
+ .drag-area {
2504
+ padding: 0px 20px;
2505
+ }
2506
+ .image-grid img {
2507
+ width: 100%;
2508
+ }
2509
+ .container {
2510
+ width: 90%;
2511
+ max-width: 100%;
2512
+ padding: 1em;
2513
+ margin: 0 auto;
2514
+ }
2515
+ .drag-area {
2516
+ padding: 0px 20px;
2517
+ /* Adjust padding for smaller screens */
2518
+ }
2519
+ .image-grid img {
2520
+ width: 100%;
2521
+ /* Adjust image width for smaller screens */
2522
+ }
2523
+ p,
2524
+ input {
2525
+ text-align: center;
2526
+ margin: auto;
2527
+ line-height: normal;
2528
+ }
2529
+ input,
2530
+ textarea {
2531
+ width: 100%;
2532
+ box-sizing: border-box;
2533
+ margin: 0px 0 10px 0;
2534
+ display: block;
2535
+ }
2536
+ .drag-area img {
2537
+ width: 90%;
2538
+ height: 90%;
2539
+ object-fit: contain;
2540
+ z-index: -1;
2541
+ padding-top: 8px;
2542
+ }
2543
+ .wall {
2544
+ position: absolute;
2545
+ width: 100vw;
2546
+ height: 100vh;
2547
+ background-color: #fff;
2548
+ }
2549
  }
2550
 
2551
  #error-message {
2552
+ color: #ff0000;
2553
+ font-size: 14px;
2554
+ margin-top: 8px;
2555
+ }
static/js/site.js CHANGED
@@ -1,160 +1,80 @@
1
- $(document).ready(function() {
2
- /* Video Lightbox */
3
- if (!!$.prototype.simpleLightboxVideo) {
4
- $('.video').simpleLightboxVideo();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  }
 
6
 
7
- /*ScrollUp*/
8
- if (!!$.prototype.scrollUp) {
9
- $.scrollUp();
 
 
10
  }
11
-
12
- /*Responsive Navigation*/
13
- $("#nav-mobile").html($("#nav-main").html());
14
- $("#nav-trigger span").on("click", function() {
15
- if ($("nav#nav-mobile ul").hasClass("expanded")) {
16
- $("nav#nav-mobile ul.expanded").removeClass("expanded").slideUp(250);
17
- $(this).removeClass("open");
18
- } else {
19
- $("nav#nav-mobile ul").addClass("expanded").slideDown(250);
20
- $(this).addClass("open");
21
- }
22
- });
23
-
24
- $("#nav-mobile").html($("#nav-main").html());
25
- $("#nav-mobile ul a").on("click", function() {
26
- if ($("nav#nav-mobile ul").hasClass("expanded")) {
27
- $("nav#nav-mobile ul.expanded").removeClass("expanded").slideUp(250);
28
- $("#nav-trigger span").removeClass("open");
29
- }
30
- });
31
-
32
- /* Sticky Navigation */
33
- if (!!$.prototype.stickyNavbar) {
34
- $('#header').stickyNavbar();
35
  }
36
-
37
- $('#content').waypoint(function(direction) {
38
- if (direction === 'down') {
39
- $('#header').addClass('nav-solid fadeInDown');
40
- } else {
41
- $('#header').removeClass('nav-solid fadeInDown');
42
- }
43
- });
44
-
45
  });
46
 
47
-
48
  /* Preloader and animations */
49
- $(window).load(function() { // makes sure the whole site is loaded
50
- $('#status').fadeOut(); // will first fade out the loading animation
51
- $('#preloader').delay(350).fadeOut('slow'); // will fade out the white DIV that covers the website.
52
- $('body').delay(450).css({ 'overflow-y': 'visible' });
53
-
54
- /* WOW Elements */
55
- if (typeof WOW == 'function') {
56
- new WOW().init();
57
- }
58
-
59
- /* Parallax Effects */
60
- if (!!$.prototype.enllax) {
61
- $(window).enllax();
62
- }
63
-
64
  });
65
- document.addEventListener('DOMContentLoaded', function() {
66
- var canvasContainer = document.getElementById('canvas-container');
67
- var canvas = new fabric.Canvas('c3', { width: canvasContainer.offsetWidth, height: canvasContainer.offsetHeight });
68
-
69
- var image = document.getElementById('my-image');
70
- var originalScale;
71
-
72
- function resizeCanvas() {
73
- canvas.setWidth(canvasContainer.offsetWidth);
74
- canvas.setHeight(canvasContainer.offsetHeight);
75
-
76
- if (canvas.item(0)) {
77
- var fabricImg = canvas.item(0);
78
- var scaleX = canvas.width / fabricImg.width;
79
- var scaleY = canvas.height / fabricImg.height;
80
- var minScale = Math.min(scaleX, scaleY);
81
-
82
- originalScale = minScale;
83
-
84
- fabricImg.set({
85
- left: canvas.width / 2 - (fabricImg.width * minScale) / 2,
86
- top: canvas.height / 2 - (fabricImg.height * minScale) / 2,
87
- scaleX: minScale,
88
- scaleY: minScale
89
- });
90
-
91
- canvas.renderAll();
92
- }
93
- }
94
-
95
- fabric.Image.fromURL(image.src, function(fabricImg) {
96
- var scaleX = canvas.width / fabricImg.width;
97
- var scaleY = canvas.height / fabricImg.height;
98
- var minScale = Math.min(scaleX, scaleY);
99
-
100
- originalScale = minScale;
101
-
102
- fabricImg.set({
103
- left: canvas.width / 2 - (fabricImg.width * minScale) / 2,
104
- top: canvas.height / 2 - (fabricImg.height * minScale) / 2,
105
- scaleX: minScale,
106
- scaleY: minScale
107
- });
108
-
109
- canvas.add(fabricImg);
110
  });
111
-
112
- window.addEventListener('resize', function() {
113
- resizeCanvas();
114
- });
115
-
116
- canvas.on('mouse:down', function(options) {
117
- if (options.target) {
118
- options.target.set({
119
- opacity: 0.5,
120
- borderColor: 'red',
121
- cornerColor: 'green',
122
- cornerSize: 6,
123
- transparentCorners: false
124
- });
125
- canvas.renderAll();
126
- }
127
- });
128
-
129
- canvas.on('mouse:up', function(options) {
130
- if (options.target) {
131
- options.target.set({
132
- opacity: 1,
133
- borderColor: null,
134
- cornerColor: null
135
- });
136
- canvas.renderAll();
137
- }
138
- });
139
-
140
- document.getElementById('reset-button').addEventListener('click', function() {
141
- if (canvas.item(0)) {
142
- canvas.item(0).set({
143
- scaleX: originalScale,
144
- scaleY: originalScale
145
- });
146
- canvas.renderAll();
147
- }
148
- });
149
-
150
- canvas.on('object:moving', function(options) {
151
- // Handle object moving (dragging)
152
- });
153
-
154
- canvas.on('object:scaling', function(options) {
155
- // Handle object scaling
156
- });
157
-
158
- // Initial canvas resize
159
- resizeCanvas();
160
- });
 
1
+ $(document).ready(function () {
2
+ /* Video Lightbox */
3
+ if (!!$.prototype.simpleLightboxVideo) {
4
+ $(".video").simpleLightboxVideo();
5
+ }
6
+
7
+ /*ScrollUp*/
8
+ if (!!$.prototype.scrollUp) {
9
+ $.scrollUp();
10
+ }
11
+
12
+ /*Responsive Navigation*/
13
+ $("#nav-mobile").html($("#nav-main").html());
14
+ $("#nav-trigger span").on("click", function () {
15
+ if ($("nav#nav-mobile ul").hasClass("expanded")) {
16
+ $("nav#nav-mobile ul.expanded").removeClass("expanded").slideUp(250);
17
+ $(this).removeClass("open");
18
+ } else {
19
+ $("nav#nav-mobile ul").addClass("expanded").slideDown(250);
20
+ $(this).addClass("open");
21
  }
22
+ });
23
 
24
+ $("#nav-mobile").html($("#nav-main").html());
25
+ $("#nav-mobile ul a").on("click", function () {
26
+ if ($("nav#nav-mobile ul").hasClass("expanded")) {
27
+ $("nav#nav-mobile ul.expanded").removeClass("expanded").slideUp(250);
28
+ $("#nav-trigger span").removeClass("open");
29
  }
30
+ });
31
+
32
+ /* Sticky Navigation */
33
+ if (!!$.prototype.stickyNavbar) {
34
+ $("#header").stickyNavbar();
35
+ }
36
+
37
+ $("#content").waypoint(function (direction) {
38
+ if (direction === "down") {
39
+ $("#header").addClass("nav-solid fadeInDown");
40
+ } else {
41
+ $("#header").removeClass("nav-solid fadeInDown");
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
+ });
 
 
 
 
 
 
 
 
44
  });
45
 
 
46
  /* Preloader and animations */
47
+ $(window).load(function () {
48
+ // makes sure the whole site is loaded
49
+ $("#status").fadeOut(); // will first fade out the loading animation
50
+ $("#preloader").delay(350).fadeOut("slow"); // will fade out the white DIV that covers the website.
51
+ $("body").delay(450).css({ "overflow-y": "visible" });
52
+
53
+ /* WOW Elements */
54
+ if (typeof WOW == "function") {
55
+ new WOW().init();
56
+ }
57
+
58
+ /* Parallax Effects */
59
+ if (!!$.prototype.enllax) {
60
+ $(window).enllax();
61
+ }
62
  });
63
+ document.addEventListener("DOMContentLoaded", function () {
64
+ const imageContainers = document.querySelectorAll(".image-container");
65
+
66
+ imageContainers.forEach(function (container) {
67
+ container.addEventListener("click", function () {
68
+ const imageUrl = this.querySelector("img").src;
69
+ const zoomedImageContainer = document.createElement("div");
70
+ zoomedImageContainer.className = "zoomed-image-container";
71
+ zoomedImageContainer.innerHTML =
72
+ '<img src="' + imageUrl + '" alt="Zoomed Image" />';
73
+ document.body.appendChild(zoomedImageContainer);
74
+
75
+ zoomedImageContainer.addEventListener("click", function () {
76
+ this.remove();
77
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  });
79
+ });
80
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/js/slideshow.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Function to load images from a folder
2
+ function loadImagesFromFolder(folder) {
3
+ return new Promise((resolve, reject) => {
4
+ fetch(folder)
5
+ .then(response => response.text())
6
+ .then(text => {
7
+ const parser = new DOMParser();
8
+ const htmlDoc = parser.parseFromString(text, 'text/html');
9
+ const images = Array.from(htmlDoc.querySelectorAll('a'))
10
+ .filter(a => /\.(jpe?g|png|gif)$/i.test(a.href))
11
+ .map(a => a.href);
12
+ resolve(images);
13
+ })
14
+ .catch(error => {
15
+ reject(error);
16
+ });
17
+ });
18
+ }
19
+
20
+ // Function to display slideshow
21
+ function displaySlideshow(images) {
22
+ const canvas = document.getElementById('c3');
23
+ const ctx = canvas.getContext('2d');
24
+ const img = document.getElementById('my-image');
25
+
26
+ let currentIndex = 0;
27
+
28
+ // Function to draw current image on canvas
29
+ function drawImageOnCanvas(index) {
30
+ img.src = images[index];
31
+ img.onload = () => {
32
+ canvas.width = img.width;
33
+ canvas.height = img.height;
34
+ ctx.drawImage(img, 0, 0);
35
+ };
36
+ }
37
+
38
+ // Initial drawing
39
+ drawImageOnCanvas(currentIndex);
40
+
41
+ // Switch to the next image in the array
42
+ function nextImage() {
43
+ currentIndex = (currentIndex + 1) % images.length;
44
+ drawImageOnCanvas(currentIndex);
45
+ }
46
+
47
+ // Start slideshow
48
+ const slideshowInterval = setInterval(nextImage, 2000); // Change interval as needed
49
+
50
+ // Stop slideshow after all images have been shown
51
+ setTimeout(() => {
52
+ clearInterval(slideshowInterval);
53
+ }, images.length * 2000); // Adjust duration based on image count
54
+ }
55
+
56
+ // Usage
57
+ const folderPath = 'temp/uploads';
58
+ loadImagesFromFolder(folderPath)
59
+ .then(images => {
60
+ displaySlideshow(images);
61
+ })
62
+ .catch(error => {
63
+ console.error('Error loading images:', error);
64
+ });
templates/extractor.html CHANGED
@@ -42,12 +42,51 @@
42
  flex: 2;
43
  background-color: #ddd;
44
  padding: 20px;
45
- overflow-y: hidden;
46
  max-height: 100vh;
47
  width: 100%;
 
48
  box-shadow: inset 0 15px 30px rgba(0, 0, 0, 0.1);
 
49
  }
50
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  .right-column {
52
  flex: 2;
53
  background-color: #ffffff;
@@ -103,7 +142,6 @@
103
 
104
  #canvas-container {
105
  position: relative;
106
- overflow: hidden;
107
  width: 100%;
108
  height: 100%;
109
  }
@@ -164,9 +202,6 @@
164
 
165
  .receipt {
166
  margin: 20px 20px;
167
- border: 1px solid #ccc;
168
- border-radius: 10px;
169
- font: 14px;
170
  }
171
 
172
  .receipt1 {
@@ -178,21 +213,6 @@
178
  border-radius: 10px;
179
  }
180
 
181
- .filenm {
182
- padding: 1em 1.8em;
183
- box-sizing: border-box;
184
- border-radius: 10px;
185
- display: flex;
186
- transition: 0.2s background;
187
- align-items: center;
188
- gap: 0.6em;
189
- background: rgba(255, 255, 255, 0.6);
190
- backdrop-filter: blur(10px);
191
- margin-right: 10px;
192
- font-size: 14px;
193
- font-weight: 300;
194
- }
195
-
196
  .receipt h1 {
197
  text-align: center;
198
  }
@@ -206,7 +226,9 @@
206
  border-collapse: collapse;
207
  margin-bottom: 20px;
208
  }
209
-
 
 
210
  .receipt table th,
211
  .receipt table td {
212
  border: 1px solid #ccc;
@@ -216,11 +238,19 @@
216
  .receipt table th {
217
  background-color: #f0f0f0;
218
  text-align: left;
 
 
 
219
  }
220
 
221
- .receipt tfoot td {
222
- text-align: right;
223
- font-weight: bold;
 
 
 
 
 
224
  }
225
 
226
  #dataTable {
@@ -306,7 +336,9 @@
306
  border-radius: 10px;
307
  z-index: -1;
308
  }
309
-
 
 
310
  .exportbutton {
311
  margin-right: 17px;
312
  box-sizing: border-box;
@@ -541,6 +573,85 @@
541
  width: 40%;
542
  height: 40%;
543
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
544
  </style>
545
  <script src="https://cdn.lordicon.com/lordicon.js"></script>
546
  </head>
@@ -550,35 +661,25 @@
550
  <!-- Flash message will be displayed here -->
551
  </div>
552
  <div class="containerz">
553
-
554
  <div class="left-column">
555
  <button class="backbutton" id="submitButton" onclick="window.location.href='{{ url_for('index') }}'">
556
  <i class="fa-solid fa-arrow-left"></i>
557
  <span>Back</span>
558
- </button>
559
- <div id="filenm">
560
- <div style="display: flex; align-items: center; position: absolute; top: 0px; right: 0;">
561
- <span class="filenm">
562
- <lord-icon
563
- src="https://cdn.lordicon.com/xpgofwru.json"
564
- trigger="in"
565
- delay ="500"
566
- state="hover-file-2"
567
- colors="primary:#ff8b4a"
568
- style="width:20px;height:20px">
569
- </lord-icon>
570
- {{ old_name }}</span>
571
- </button>
572
- </div>
573
- </div>
574
-
575
-
576
  <div id="canvas-container">
577
- <canvas id="c3"></canvas> {% if uploaded_file %}
578
- <img src="{{ url_for('static', filename='uploads/' + uploaded_file) }}" id="my-image" hidden> {% else %}
579
- <p>No file uploaded.</p>
 
 
 
 
 
 
 
 
 
580
  {% endif %}
581
-
582
  </div>
583
  </div>
584
  <div class="right-column">
@@ -594,19 +695,36 @@
594
  <p class="desc">Verify receipt details attentively, acknowledging occasional misclassification, which may arise from variations in image quality or format.</p>
595
  </div>
596
  <div class="receipt">
597
- <div class="details">
598
- <div style="display: flex; align-items: center;">
599
- {% if prediction_result.lower() == 'receipt' %}
600
- <lord-icon src="https://cdn.lordicon.com/lomfljuq.json" trigger="in" delay="1500" colors="primary:#16c72e" state="morph-check-in-1" style="width:25px;height:25px">
601
- </lord-icon>
602
- <p class="valid">The image uploaded is a Valid Receipt.</p>
603
- {% else %}
604
- <lord-icon src="https://cdn.lordicon.com/zxvuvcnc.json" trigger="in" delay="1500" state="morph-cross-in" colors="primary:#e83a30" style="width:25px;height:25px">
605
- </lord-icon>
606
- <p class="valid">The image uploaded is NOT a Receipt Please return and upload again.</p>
607
- {% endif %}
608
- </div>
609
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
610
  </div>
611
  <hr style="color: #ccc; width:95%; opacity:0.35;">
612
  <div class="labels" style="margin: 0 0 0 20px;">
 
42
  flex: 2;
43
  background-color: #ddd;
44
  padding: 20px;
 
45
  max-height: 100vh;
46
  width: 100%;
47
+ max-width: 100%;
48
  box-shadow: inset 0 15px 30px rgba(0, 0, 0, 0.1);
49
+ overflow-y: auto;
50
  }
51
+ #canvas-container {
52
+ display: flex;
53
+ flex-wrap: wrap; /* Wrap items to next line when they exceed the container width */
54
+ justify-content: center; /* Center items horizontally */
55
+ gap: 10px; /* Add some space between images */
56
+ max-width: 100%; /* Ensure images don't exceed the container width */
57
+ margin-top: 70px;
58
+ }
59
+
60
+ .image-container {
61
+ width: 200px; /* Set your desired width */
62
+ height: 300px; /* Set your desired height */
63
+ background-color: white; /* White background */
64
+ padding: 30px 30px 40px 30px; /* Add padding */
65
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
66
+ border-radius:10px;
67
+ }
68
+ .image-container:hover{
69
+ transition: all 0.3s;
70
+ transform: translateY(1.5px);
71
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.4);
72
+ }
73
+ .image-container img {
74
+ width: 100%;
75
+ height: 100%;
76
+ object-fit: contain;
77
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.1);
78
+ transition: all 0.3s;
79
+ }
80
+ p.images-name {
81
+ text-overflow: ellipsis;
82
+ white-space: nowrap;
83
+ overflow: hidden;
84
+ font-size: 10px;
85
+ margin: 5px 0 0 0 ;
86
+ text-align: center;
87
+ padding: 0;
88
+ }
89
+
90
  .right-column {
91
  flex: 2;
92
  background-color: #ffffff;
 
142
 
143
  #canvas-container {
144
  position: relative;
 
145
  width: 100%;
146
  height: 100%;
147
  }
 
202
 
203
  .receipt {
204
  margin: 20px 20px;
 
 
 
205
  }
206
 
207
  .receipt1 {
 
213
  border-radius: 10px;
214
  }
215
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  .receipt h1 {
217
  text-align: center;
218
  }
 
226
  border-collapse: collapse;
227
  margin-bottom: 20px;
228
  }
229
+ .receipt table {
230
+ border-radius: 10px;
231
+ }
232
  .receipt table th,
233
  .receipt table td {
234
  border: 1px solid #ccc;
 
238
  .receipt table th {
239
  background-color: #f0f0f0;
240
  text-align: left;
241
+ font-size:16px;
242
+ font-weight:500;
243
+ text-align:center;
244
  }
245
 
246
+ .receipt table td {
247
+ text-align:center;
248
+ font-size: 14px;
249
+ max-width: 150px; /* Set the maximum width */
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ white-space: nowrap;
253
+ padding: 0 20px ;
254
  }
255
 
256
  #dataTable {
 
336
  border-radius: 10px;
337
  z-index: -1;
338
  }
339
+ .details{
340
+
341
+ }
342
  .exportbutton {
343
  margin-right: 17px;
344
  box-sizing: border-box;
 
573
  width: 40%;
574
  height: 40%;
575
  }
576
+ .red-border {
577
+ border: 2px solid red;
578
+ }
579
+
580
+ .green-border {
581
+ border: 2px solid green;
582
+ }
583
+
584
+ ::-webkit-scrollbar {
585
+ display: none;
586
+ }
587
+
588
+ .image-container:hover .tooltiptext {
589
+ visibility: visible;
590
+ opacity: 1;
591
+ }
592
+
593
+ .tooltiptext {
594
+ font-size: 12px;
595
+ visibility: hidden;
596
+ width: 160px;
597
+ background-color: #333;
598
+ color: #fff;
599
+ text-align: center;
600
+ border-radius: 8px;
601
+ padding: 5px;
602
+ position: absolute;
603
+ z-index: 99;
604
+ bottom: 105%;
605
+ left: 50%;
606
+ margin-left: -80px;
607
+ opacity: 0;
608
+ transition: opacity 0.3s;
609
+ }
610
+
611
+ .tooltiptext::after {
612
+ content: "";
613
+ position: absolute;
614
+ top: 100%;
615
+ left: 50%;
616
+ margin-left: -5px;
617
+ border-width: 5px;
618
+ border-style: solid;
619
+ border-color: #333 transparent transparent transparent;
620
+ }
621
+ .zoomed-image-container {
622
+ position: fixed;
623
+ top: 0;
624
+ left: 0;
625
+ width: 50%;
626
+ height: 100%;
627
+ background-color: rgba(0, 0, 0, 0.8);
628
+ display: flex;
629
+ justify-content: center;
630
+ align-items: center;
631
+ z-index: 999;
632
+ }
633
+
634
+ .zoomed-image-container img {
635
+ max-width: 90%;
636
+ max-height: 90%;
637
+ object-fit: contain;
638
+ }
639
+ @media (max-width: 576px) {
640
+ .zoomed-image-container {
641
+ position: fixed;
642
+ top: 0;
643
+ left: 0;
644
+ width: 100%;
645
+ height: 45%;
646
+ background-color: rgba(0, 0, 0, 0.8);
647
+ display: flex;
648
+ justify-content: center;
649
+ align-items: center;
650
+ z-index: 999;
651
+ }
652
+ }
653
+ /* Optional: If you want to hide the scrollbar in Firefox */
654
+ scrollbar-width: none;
655
  </style>
656
  <script src="https://cdn.lordicon.com/lordicon.js"></script>
657
  </head>
 
661
  <!-- Flash message will be displayed here -->
662
  </div>
663
  <div class="containerz">
 
664
  <div class="left-column">
665
  <button class="backbutton" id="submitButton" onclick="window.location.href='{{ url_for('index') }}'">
666
  <i class="fa-solid fa-arrow-left"></i>
667
  <span>Back</span>
668
+ </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
669
  <div id="canvas-container">
670
+ {% if image_paths %}
671
+ {% for image_path, prediction_results_copy in predictions.items() %}
672
+ <div class="image-container {% if prediction_results_copy == 'non-receipt' %}red-border{% elif prediction_results_copy == 'receipt' %}green-border{% endif %}">
673
+ <div class="tooltiptext">Click to view fullscreen</div>
674
+ <img src="{{ url_for('static', filename='temp/img_display/' + image_path) }}" id="my-image" alt="uploads" />
675
+ <div class="image-name">
676
+ <p class="images-name">{{image_path}}</p>
677
+ </div>
678
+ </div>
679
+ {% endfor %}
680
+ {% else %}
681
+ <p>No files uploaded.</p>
682
  {% endif %}
 
683
  </div>
684
  </div>
685
  <div class="right-column">
 
695
  <p class="desc">Verify receipt details attentively, acknowledging occasional misclassification, which may arise from variations in image quality or format.</p>
696
  </div>
697
  <div class="receipt">
698
+ <table>
699
+ <thead>
700
+ <tr>
701
+ <th>File Name</th>
702
+ <th>Prediction Result</th>
703
+ </tr>
704
+ </thead>
705
+ <tbody>
706
+ {% for image_path, prediction_results_copy in predictions.items() %}
707
+ <tr>
708
+ <td>{{ image_path }}</td>
709
+ <td>
710
+ <div class="details">
711
+ <div style="display: flex; align-items: center; justify-content: center;">
712
+ {% if prediction_results_copy.lower() == 'receipt' %}
713
+ <lord-icon src="https://cdn.lordicon.com/lomfljuq.json" trigger="in" delay="1500" colors="primary:#16c72e" state="morph-check-in-1" style="width:25px;height:25px">
714
+ </lord-icon>
715
+ <p class="valid">Valid Receipt</p>
716
+ {% else %}
717
+ <lord-icon src="https://cdn.lordicon.com/zxvuvcnc.json" trigger="in" delay="1500" state="morph-cross-in" colors="primary:#e83a30" style="width:25px;height:25px">
718
+ </lord-icon>
719
+ <p class="valid">Not a Receipt</p>
720
+ {% endif %}
721
+ </div>
722
+ </div>
723
+ </td>
724
+ </tr>
725
+ {% endfor %}
726
+ </tbody>
727
+ </table>
728
  </div>
729
  <hr style="color: #ccc; width:95%; opacity:0.35;">
730
  <div class="labels" style="margin: 0 0 0 20px;">
templates/index.html CHANGED
@@ -120,13 +120,13 @@
120
  <form action="/upload" method="POST" enctype="multipart/form-data">
121
  <div class="container">
122
  <div class="drag-area" id="container">
123
- <div class="icon">
124
- <img src="/static/images/uplogo.gif">
125
- </div>
126
- <p>Upload files here or click to upload</p>
127
- <input type="file" name="file" id="file-input">
128
- <p id="uploaded-file-name">{% if uploaded_file %}Uploaded File: {{ uploaded_file }}{% endif %}</p>
129
- </div>
130
  </div>
131
  <div class="buttondiv">
132
  <button class="uploadbutton wow bounceInUp" data-wow-offset="3" data-wow-duration="1.5s" data-wow-delay="0.5s" type="submit" onclick="uploadClicked()">
 
120
  <form action="/upload" method="POST" enctype="multipart/form-data">
121
  <div class="container">
122
  <div class="drag-area" id="container">
123
+ <div class="icon">
124
+ <img src="/static/images/uplogo.gif">
125
+ </div>
126
+ <p>Upload files here or click to upload</p>
127
+ <input type="file" name="files[]" id="file-input" multiple>
128
+ <p id="uploaded-file-name">{% if uploaded_file %}Uploaded File: {{ uploaded_file }}{% endif %}</p>
129
+ </div>
130
  </div>
131
  <div class="buttondiv">
132
  <button class="uploadbutton wow bounceInUp" data-wow-offset="3" data-wow-duration="1.5s" data-wow-delay="0.5s" type="submit" onclick="uploadClicked()">