accurascan_kyc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +635 -0
  3. package/accurascan-kyc.podspec +38 -0
  4. package/android/build.gradle +118 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +18 -0
  7. package/android/src/main/java/com/accurascankyc/AccurascanKycModule.java +507 -0
  8. package/android/src/main/java/com/accurascankyc/AccurascanKycPackage.java +28 -0
  9. package/android/src/main/java/com/accurascankyc/ActivityFaceMatch.java +533 -0
  10. package/android/src/main/java/com/accurascankyc/BorderTextView.java +82 -0
  11. package/android/src/main/java/com/accurascankyc/OcrActivity.java +1263 -0
  12. package/android/src/main/java/com/accurascankyc/OcrResultActivity.java +736 -0
  13. package/android/src/main/java/com/accurascankyc/ReactNativeJson.java +123 -0
  14. package/android/src/main/java/com/accurascankyc/UnsafeOkHttpClient.java +57 -0
  15. package/android/src/main/res/drawable/btn_bg_gray.xml +6 -0
  16. package/android/src/main/res/drawable/btn_bg_red.xml +6 -0
  17. package/android/src/main/res/drawable/btn_bg_trasparent_bottom.xml +6 -0
  18. package/android/src/main/res/drawable/flip_camera_icon.png +0 -0
  19. package/android/src/main/res/drawable/ic_close.xml +5 -0
  20. package/android/src/main/res/drawable/round_border_rect.xml +12 -0
  21. package/android/src/main/res/drawable/splash.png +0 -0
  22. package/android/src/main/res/drawable-v24/ic_launcher_foreground.png +0 -0
  23. package/android/src/main/res/drawable-xhdpi/bg_home.png +0 -0
  24. package/android/src/main/res/drawable-xhdpi/ic_barcode.png +0 -0
  25. package/android/src/main/res/drawable-xhdpi/ic_biometric.png +0 -0
  26. package/android/src/main/res/drawable-xhdpi/ic_check.png +0 -0
  27. package/android/src/main/res/drawable-xhdpi/ic_liveness.png +0 -0
  28. package/android/src/main/res/drawable-xhdpi/ic_result.png +0 -0
  29. package/android/src/main/res/drawable-xhdpi/ic_scan.png +0 -0
  30. package/android/src/main/res/drawable-xhdpi/img_button_overlay.png +0 -0
  31. package/android/src/main/res/layout/activity_ocr_result.xml +18 -0
  32. package/android/src/main/res/layout/activity_splash.xml +26 -0
  33. package/android/src/main/res/layout/custom_frame_layout.xml +144 -0
  34. package/android/src/main/res/layout/ocr_activity.xml +28 -0
  35. package/android/src/main/res/layout-land/custom_frame_layout.xml +144 -0
  36. package/android/src/main/res/layout-land/ocr_activity.xml +41 -0
  37. package/android/src/main/res/menu/menu_land_port.xml +7 -0
  38. package/android/src/main/res/mipmap-hdpi/logo_loign.png +0 -0
  39. package/android/src/main/res/mipmap-mdpi/logo_loign.png +0 -0
  40. package/android/src/main/res/mipmap-xhdpi/ic_document_verified.png +0 -0
  41. package/android/src/main/res/mipmap-xhdpi/logo_loign.png +0 -0
  42. package/android/src/main/res/mipmap-xxhdpi/logo_loign.png +0 -0
  43. package/android/src/main/res/values/colors.xml +31 -0
  44. package/android/src/main/res/values/strings.xml +42 -0
  45. package/android/src/main/res/values/styles.xml +191 -0
  46. package/ios/AccurascanKyc-Bridging-Header.h +2 -0
  47. package/ios/AccurascanKyc.m +34 -0
  48. package/ios/AccurascanKyc.swift +649 -0
  49. package/ios/AccurascanKyc.xcodeproj/project.pbxproj +283 -0
  50. package/ios/AccurascanKyc.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
  51. package/ios/FMController.swift +587 -0
  52. package/ios/LVController.swift +346 -0
  53. package/ios/MainStoryboard_iPhone.storyboard +338 -0
  54. package/ios/ViewController.swift +2686 -0
  55. package/ios/resources/back_icon.png +0 -0
  56. package/ios/resources/flip_camera_icon.png +0 -0
  57. package/ios/resources/flip_document_icon.png +0 -0
  58. package/ios/resources/ic_logo.png +0 -0
  59. package/lib/commonjs/index.js +13 -0
  60. package/lib/commonjs/index.js.map +1 -0
  61. package/lib/module/index.js +6 -0
  62. package/lib/module/index.js.map +1 -0
  63. package/lib/typescript/index.d.ts +3 -0
  64. package/lib/typescript/index.d.ts.map +1 -0
  65. package/package.json +161 -0
  66. package/src/index.tsx +5 -0
@@ -0,0 +1,2686 @@
1
+
2
+ import UIKit
3
+ import AVFoundation
4
+ import AccuraOCR
5
+
6
+ class ViewController: UIViewController {
7
+
8
+ @IBOutlet weak var _viewLayer: UIView!
9
+ @IBOutlet weak var _imageView: UIImageView!
10
+ @IBOutlet weak var _imgFlipView: UIImageView!
11
+ @IBOutlet weak var _lblTitle: UILabel!
12
+ @IBOutlet weak var _constant_height: NSLayoutConstraint!
13
+ @IBOutlet weak var _constant_width: NSLayoutConstraint!
14
+
15
+ @IBOutlet weak var AspectRatio: NSLayoutConstraint!
16
+ @IBOutlet weak var lblOCRMsg: UILabel!
17
+ @IBOutlet weak var lblTitleCountryName: UILabel!
18
+
19
+ @IBOutlet weak var topView: UIView!
20
+ @IBOutlet weak var viewStatusBar: UIView!
21
+ @IBOutlet weak var viewNavigationBar: UIView!
22
+
23
+ @IBOutlet weak var cameraFrame: UIImageView!
24
+ @IBOutlet weak var logoView: UIView!
25
+
26
+ @IBOutlet weak var cameraView1: UIView!
27
+
28
+ @IBOutlet weak var cameraView2: UIView!
29
+
30
+ @IBOutlet weak var cameraView3: UIView!
31
+ @IBOutlet weak var cameraView4: UIView!
32
+
33
+ @IBOutlet weak var backBtn: UIButton!
34
+ @IBOutlet weak var camFlpbtnLbl: UIButton!
35
+
36
+ var accuraErrorCode:NSDictionary = [:]
37
+ var accuraTitleMsg:NSDictionary = [:]
38
+ var isBarcodeEnabled: Bool = false
39
+ var isResultShow = false
40
+ var barcodeData: String = ""
41
+ var isImageView = true
42
+
43
+ var accuraCameraWrapper: AccuraCameraWrapper? = nil
44
+
45
+ var shareScanningListing: NSMutableDictionary = [:]
46
+
47
+ var documentImage: UIImage? = nil
48
+ var docfrontImage: UIImage? = nil
49
+ var camImg: UIImage? = nil
50
+
51
+ var frontImageRotation = ""
52
+ var backImageRotation = ""
53
+
54
+ var docName = "Document"
55
+ var reactViewController:UIViewController? = nil
56
+
57
+ //MARK:- Variable
58
+ var cardid : Int? = 0
59
+ var countryid : Int? = 0
60
+ var imgViewCard : UIImage?
61
+ var isCheckCard : Bool = false
62
+ var isCheckCardMRZ : Bool = false
63
+ var isCheckcardBack : Bool = false
64
+ var isCheckCardBackFrint : Bool = false
65
+ var isCheckScanOCR : Bool = false
66
+ var arrCardSide : [String] = [String]()
67
+ var isCardSide : Bool?
68
+ var isBack : Bool?
69
+ var isFront : Bool?
70
+ var isConnection : Bool?
71
+ var imgViewCardFront : UIImage?
72
+ var dictSecuretyData : NSMutableDictionary = [:]
73
+ var dictFaceDataFront: NSMutableDictionary = [:]
74
+ var dictFaceDataBack: NSMutableDictionary = [:]
75
+ var dictOCRTypeData:NSMutableDictionary = [:]
76
+ var arrBackFrontImage : [UIImageView] = [UIImageView]()
77
+ var isbothSideAvailable = false
78
+ var stUrl : String?
79
+ var arrimgCountData = [String]()
80
+ var cardType: Int? = 0
81
+ var MRZDocType:Int? = 0
82
+
83
+ var arrImageName : [String] = [String]()
84
+
85
+ var dictScanningData:NSDictionary = NSDictionary()
86
+
87
+ var isflipanimation : Bool?
88
+
89
+ var isBarCode = false
90
+ var isChangeMRZ : Bool?
91
+ var imgPhoto : UIImage?
92
+
93
+ var isCheckFirstTime : Bool?
94
+ var mrzElementName: String = ""
95
+ var dictScanningMRZData: NSMutableDictionary = [:]
96
+ var setImage : Bool?
97
+ var isFrontDataComplate: Bool?
98
+ var isBackDataComplate: Bool?
99
+ var stCountryCardName: String?
100
+ var cardImage: UIImage?
101
+ var frameImg: UIImage?
102
+ var isBackSide: Bool?
103
+
104
+ var arrFrontResultKey : [String] = []
105
+ var arrFrontResultValue : [String] = []
106
+ var arrBackResultKey : [String] = []
107
+ var arrBackResultValue : [String] = []
108
+ var isCheckMRZData: Bool?
109
+ var secondCallData: Bool?
110
+
111
+ var isFirstTimeStartCamara: Bool?
112
+ var countface = 0
113
+ var statusBarRect = CGRect()
114
+ var bottomPadding:CGFloat = 0.0
115
+ var topPadding: CGFloat = 0.0
116
+ var callBack: RCTResponseSenderBlock? = nil
117
+
118
+ override func viewDidLoad() {
119
+
120
+ super.viewDidLoad()
121
+ topView.backgroundColor = .clear
122
+
123
+ // let viewController = UIApplication.shared.delegate?.window??.rootViewController
124
+ // viewController?.present(self, animated: true, completion: nil)
125
+ // Do any additional setup after loading the view.
126
+
127
+ statusBarRect = UIApplication.shared.statusBarFrame
128
+ let window = UIApplication.shared.windows.first
129
+
130
+ if #available(iOS 11.0, *) {
131
+ bottomPadding = window!.safeAreaInsets.bottom
132
+ topPadding = window!.safeAreaInsets.top
133
+ } else {
134
+ // Fallback on earlier versions
135
+ }
136
+ let strokeTextAttributes: [NSAttributedString.Key : Any] = [
137
+ .strokeColor : accuraErrorCode["CameraScreen_Text_Border_Color"] as! String != "" ? UIColor(hexString: accuraErrorCode["CameraScreen_Text_Border_Color"] as! String): UIColor.clear,
138
+ .foregroundColor : UIColor(hexString: accuraErrorCode["CameraScreen_Text_Color"] as! String),
139
+ .strokeWidth : -3.0,
140
+ ]
141
+
142
+ // if(accuraErrorCode["CameraScreen_Text_Color"] as! String != ""){
143
+ // _lblTitle.textColor = UIColor(hexString: accuraErrorCode["CameraScreen_Text_Color"] as! String)
144
+ // lblOCRMsg.textColor = UIColor(hexString: accuraErrorCode["CameraScreen_Text_Color"] as! String)
145
+ // }
146
+
147
+ if(accuraErrorCode["CameraScreen_Text_Color"] as! String != ""){
148
+ _lblTitle.attributedText = NSAttributedString(string: " ", attributes: strokeTextAttributes)
149
+ lblOCRMsg.attributedText = NSAttributedString(string: " ", attributes: strokeTextAttributes)
150
+ }
151
+
152
+ if(accuraErrorCode["CameraScreen_Color"] as! String == ""){
153
+ cameraView1.backgroundColor = .clear
154
+ cameraView2.backgroundColor = .clear
155
+ cameraView3.backgroundColor = .clear
156
+ cameraView4.backgroundColor = .clear
157
+ }else{
158
+ cameraView1.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String)
159
+ cameraView2.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String)
160
+ cameraView3.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String)
161
+ cameraView4.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String)
162
+ }
163
+ if(accuraErrorCode["CameraScreen_Back_Button"] as! Int == 0){
164
+ backBtn.isHidden = true
165
+ }
166
+
167
+ if(accuraErrorCode["CameraScreen_Change_Button"] as! Int == 0){
168
+ camFlpbtnLbl.isHidden = true
169
+ }
170
+
171
+
172
+ if(accuraErrorCode["isShowLogo"] as! Int == 0){
173
+ logoView.isHidden = true
174
+ }
175
+ if(accuraErrorCode["isFlipImg"] as! Int == 0){
176
+ isImageView = false
177
+ }
178
+ isFirstTimeStartCamara = false
179
+ isCheckFirstTime = false
180
+ if(accuraErrorCode["CameraScreen_Color"] as! String == ""){
181
+ viewStatusBar.backgroundColor = .clear
182
+ viewNavigationBar.backgroundColor = .clear
183
+ }else{
184
+ viewStatusBar.backgroundColor = .clear//UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String) //UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
185
+ viewNavigationBar.backgroundColor = .clear//UIColor(hexString: accuraErrorCode["CameraScreen_Color"] as! String) //UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
186
+ }
187
+ // viewStatusBar.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Navigation_Color"] as! String) //UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
188
+ // viewNavigationBar.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Navigation_Color"] as! String) //UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
189
+ _imageView.layer.masksToBounds = false
190
+ _imageView.clipsToBounds = true
191
+ ChangedOrientation()
192
+ var width : CGFloat = 0
193
+ var height : CGFloat = 0
194
+ width = UIScreen.main.bounds.size.width
195
+ height = UIScreen.main.bounds.size.height
196
+ width = width * 0.95
197
+ height = height * 0.35
198
+
199
+ let status = AVCaptureDevice.authorizationStatus(for: .video)
200
+ // frameImg = AccurascanKyc.getImageFromUri(path: accuraErrorCode["setCameraFrame"] as! String)
201
+ // if ((accuraErrorCode["setCameraFrame"] as! String) != "") {
202
+ // cameraFrame.image = frameImg
203
+ // }else{
204
+ if ((accuraErrorCode["CameraScreen_Frame_Color"] as! String) == "") {
205
+ _viewLayer.layer.borderColor = UIColor.white.cgColor
206
+ _viewLayer.layer.borderWidth = 3.0
207
+ }else{
208
+ _viewLayer.layer.borderColor = UIColor(hexString: accuraErrorCode["CameraScreen_Frame_Color"] as! String).cgColor
209
+ _viewLayer.layer.borderWidth = 3.0
210
+ }
211
+ // }
212
+ // _viewLayer.layer.borderColor = UIColor(hexString: accuraErrorCode["CameraScreen_Frame_Color"] as! String).cgColor
213
+ // _viewLayer.layer.borderWidth = 3.0
214
+
215
+ self._imgFlipView.isHidden = true
216
+ if status == .authorized {
217
+ isCheckFirstTime = true
218
+ if isBarCode {
219
+ accuraCameraWrapper = AccuraCameraWrapper.init(delegate: self, andImageView: _imageView, andLabelMsg: self.lblOCRMsg, andurl: 1, isBarcodeEnable: isBarcodeEnabled, countryID: Int32(self.countryid!), setBarcodeType: selectedTypes)
220
+ }else{
221
+ self.setOCRData()
222
+
223
+ }
224
+ let shortTap = UITapGestureRecognizer(target: self, action: #selector(handleTapToFocus(_:)))
225
+ shortTap.numberOfTapsRequired = 1
226
+ shortTap.numberOfTouchesRequired = 1
227
+ self.view.addGestureRecognizer(shortTap)
228
+ } else if status == .denied {
229
+ let alert = UIAlertController(title: "AccuraSdk", message: "It looks like your privacy settings are preventing us from accessing your camera.", preferredStyle: .alert)
230
+ let yesButton = UIAlertAction(title: "OK", style: .default) { _ in
231
+ if #available(iOS 10.0, *) {
232
+ UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
233
+ } else {
234
+ UIApplication.shared.openURL(URL(string: UIApplication.openSettingsURLString)!)
235
+ }
236
+ }
237
+ alert.addAction(yesButton)
238
+ self.present(alert, animated: true, completion: nil)
239
+ } else if status == .restricted {
240
+ } else if status == .notDetermined {
241
+ AVCaptureDevice.requestAccess(for: .video) { granted in
242
+ if granted {
243
+ self.isCheckFirstTime = true
244
+ self.isFirstTimeStartCamara = true
245
+ DispatchQueue.main.async {
246
+ self._imageView.setNeedsLayout()
247
+ self._imageView.layoutSubviews()
248
+ if self.isBarCode {
249
+ self.accuraCameraWrapper = AccuraCameraWrapper.init(delegate: self, andImageView: self._imageView, andLabelMsg: self.lblOCRMsg, andurl: 1, isBarcodeEnable: self.isBarcodeEnabled, countryID: Int32(self.countryid!), setBarcodeType: self.selectedTypes)
250
+ }else{
251
+ self.setOCRData()
252
+
253
+ }
254
+ if(self.isCheckScanOCR)
255
+ {
256
+
257
+ }
258
+ self.ChangedOrientation()
259
+ self.accuraCameraWrapper?.startCamera()
260
+ }
261
+ let shortTap = UITapGestureRecognizer(target: self, action: #selector(self.handleTapToFocus(_:)))
262
+ shortTap.numberOfTapsRequired = 1
263
+ shortTap.numberOfTouchesRequired = 1
264
+ } else {
265
+ // print("Not granted access")
266
+ }
267
+ }
268
+ }
269
+
270
+ }
271
+
272
+ override func viewWillLayoutSubviews() {
273
+ super.viewWillLayoutSubviews()
274
+ self._imageView.setNeedsLayout()
275
+ self._imageView.layoutSubviews()
276
+ self._imageView.layoutIfNeeded()
277
+ }
278
+
279
+ override func viewWillAppear(_ animated: Bool) {
280
+ super.viewWillAppear(animated)
281
+ countface = 0
282
+ self.shareScanningListing.removeAllObjects()
283
+ isBackSide = false
284
+ isCheckMRZData = false
285
+ self.ChangedOrientation()
286
+ if self.accuraCameraWrapper == nil {
287
+ if isBarCode {
288
+ accuraCameraWrapper = AccuraCameraWrapper.init(delegate: self, andImageView: _imageView, andLabelMsg: self.lblOCRMsg, andurl: 1, isBarcodeEnable: isBarcodeEnabled, countryID: Int32(self.countryid!), setBarcodeType: selectedTypes)
289
+ }else{
290
+ self.setOCRData()
291
+
292
+ }
293
+ // setOCRData()
294
+ }
295
+
296
+ if isFirstTimeStartCamara!{
297
+
298
+ accuraCameraWrapper?.startCamera()
299
+ }
300
+ }
301
+
302
+ override func viewDidAppear(_ animated: Bool) {
303
+ super.viewDidAppear(animated)
304
+ if !isFirstTimeStartCamara! && isCheckFirstTime!{
305
+
306
+ isFirstTimeStartCamara = true
307
+ accuraCameraWrapper?.startCamera()
308
+ }
309
+
310
+ }
311
+
312
+ override func viewDidDisappear(_ animated: Bool) {
313
+ super.viewDidDisappear(animated)
314
+ }
315
+
316
+ override func viewWillDisappear(_ animated: Bool) {
317
+ accuraCameraWrapper?.stopCamera()
318
+ accuraCameraWrapper?.closeOCR()
319
+ accuraCameraWrapper = nil
320
+ _imageView.image = nil
321
+ super.viewWillDisappear(animated)
322
+ }
323
+
324
+
325
+ @IBAction func buttonFlipAction(_ sender: UIButton) {
326
+ accuraCameraWrapper?.switchCamera()
327
+ }
328
+
329
+ var selectedTypes: BarcodeType = .all
330
+ func setSelectedTypes(types: String) {
331
+ switch types
332
+ {
333
+ case "ALL FORMATS":
334
+ self.selectedTypes = .all
335
+ case "EAN-8":
336
+ self.selectedTypes = .ean8
337
+ case "EAN-13":
338
+ self.selectedTypes = .ean13
339
+ case "PDF417":
340
+ self.selectedTypes = .pdf417
341
+ case "AZTEC":
342
+ self.selectedTypes = .aztec
343
+ case "CODE 128":
344
+ self.selectedTypes = .code128
345
+ case "CODE 39":
346
+ self.selectedTypes = .code39
347
+ case "CODE 93":
348
+ self.selectedTypes = .code93
349
+ case "DATA MATRIX":
350
+ self.selectedTypes = .dataMatrix
351
+ case "ITF":
352
+ self.selectedTypes = .itf
353
+ case "QR CODE":
354
+ self.selectedTypes = .qrcode
355
+ case "UPC-E":
356
+ self.selectedTypes = .upce
357
+ case "UPC-A":
358
+ self.selectedTypes = .upca
359
+ case "CODABAR":
360
+ self.selectedTypes = .codabar
361
+ default:
362
+ break
363
+ }
364
+ }
365
+
366
+ //MARK:- Other Method
367
+ func setOCRData(){
368
+ arrFrontResultKey.removeAll()
369
+ arrBackResultKey.removeAll()
370
+ arrFrontResultValue.removeAll()
371
+ arrBackResultValue.removeAll()
372
+ dictSecuretyData.removeAllObjects()
373
+ dictFaceDataBack.removeAllObjects()
374
+ dictFaceDataFront.removeAllObjects()
375
+ dictScanningMRZData.removeAllObjects()
376
+ isCheckCard = false
377
+ isCheckcardBack = false
378
+ isCheckCardBackFrint = false
379
+ isflipanimation = false
380
+ imgPhoto = nil
381
+ isFrontDataComplate = false
382
+ isBackDataComplate = false
383
+
384
+ accuraCameraWrapper = AccuraCameraWrapper.init(delegate: self, andImageView: _imageView, andLabelMsg: lblOCRMsg, andurl: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String, cardId: Int32(cardid!), countryID: Int32(countryid!), isScanOCR: isCheckScanOCR, andcardName: docName, andcardType: Int32(cardType!), andMRZDocType: Int32(MRZDocType!))
385
+ accuraCameraWrapper?.setMinFrameForValidate(5)
386
+
387
+ }
388
+
389
+ @IBAction func backAction(_ sender: UIButton) {
390
+ self.dismiss(animated: true)
391
+ }
392
+
393
+ @objc private func ChangedOrientation() {
394
+ var width: CGFloat = 0.0
395
+ var height: CGFloat = 0.0
396
+
397
+ let orientastion = UIApplication.shared.statusBarOrientation
398
+ if(orientastion == UIInterfaceOrientation.portrait) {
399
+ width = UIScreen.main.bounds.size.width * 0.95
400
+
401
+ height = (UIScreen.main.bounds.size.height - (self.bottomPadding + self.topPadding + self.statusBarRect.height)) * 0.35
402
+ // viewNavigationBar.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Navigation_Color"] as! String)//UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
403
+ } else {
404
+
405
+ self.viewNavigationBar.backgroundColor = .clear
406
+ height = UIScreen.main.bounds.size.height * 0.62
407
+ width = UIScreen.main.bounds.size.width * 0.51
408
+ }
409
+
410
+ _constant_width.constant = width
411
+ if(self.cardType == 2) {
412
+ self._constant_height.constant = height / 2
413
+ } else {
414
+ self._constant_height.constant = height
415
+ }
416
+ DispatchQueue.main.async {
417
+ UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseIn, animations: {
418
+ self.view.layoutIfNeeded()
419
+ }) { _ in
420
+
421
+ }
422
+ }
423
+ }
424
+
425
+ @objc func handleTapToFocus(_ tapGesture: UITapGestureRecognizer?) {
426
+ let acd = AVCaptureDevice.default(for: .video)
427
+ if tapGesture!.state == .ended {
428
+ let thisFocusPoint = tapGesture!.location(in: _viewLayer)
429
+ let focus_x = Double(thisFocusPoint.x / _viewLayer.frame.size.width)
430
+ let focus_y = Double(thisFocusPoint.y / _viewLayer.frame.size.height)
431
+ if acd?.isFocusModeSupported(.autoFocus) ?? false && acd?.isFocusPointOfInterestSupported != nil {
432
+ do {
433
+ try acd?.lockForConfiguration()
434
+
435
+ if try acd?.lockForConfiguration() != nil {
436
+ acd?.focusMode = .autoFocus
437
+ acd?.focusPointOfInterest = CGPoint(x: CGFloat(focus_x), y: CGFloat(focus_y))
438
+ acd?.unlockForConfiguration()
439
+ }
440
+ } catch {
441
+ }
442
+ }
443
+ }
444
+ }
445
+
446
+ func flipAnimation() {
447
+ DispatchQueue.main.async {
448
+ self._imgFlipView.isHidden = false
449
+ UIView.animate(withDuration: 1.5, animations: {
450
+ UIView.setAnimationTransition(.flipFromLeft, for: self._imgFlipView, cache: true)
451
+ AudioServicesPlaySystemSound(1315)
452
+ }) { _ in
453
+ self._imgFlipView.isHidden = true
454
+ }
455
+ }
456
+
457
+ }
458
+ var mutableArray: NSMutableArray = []
459
+ var keyArr: NSMutableArray = []
460
+ var valueArr: NSMutableArray = []
461
+ func decodework (type: String) -> Bool {
462
+ keyArr.removeAllObjects()
463
+ valueArr.removeAllObjects()
464
+ let Customer_Family_Name = "DCS"
465
+ let Family_Name = "DAB"
466
+
467
+ let Customer_Given_Name = "DCT"
468
+ let Name_Suffix = "DCU"
469
+ let Street_Address_1 = "DAG"
470
+ let City = "DAI"
471
+ let Jurisdction_Code = "DAJ"
472
+ let ResidenceJurisdictionCode = "DAO"
473
+ let MedicalIndicatorCodes = "DBG"
474
+ let NonResidentIndicator = "DBI"
475
+ let SocialSecurityNumber = "DBK"
476
+ let DateOfBirth = "DBL"
477
+
478
+ let Postal_Code = "DAK"
479
+ let Customer_Id_Number = "DAQ"
480
+ let Expiration_Date = "DBA"
481
+ let Sex = "DBC"
482
+ let Customer_Full_Name = "DAA"
483
+ let Customer_First_Name = "DAC"
484
+ let Customer_Middle_Name = "DAD"
485
+ let Street_Address_2 = "DAH"
486
+ let Street_Address_1_optional = "DAL"
487
+ let Street_Address_2_optional = "DAM"
488
+ let Date_Of_Birth = "DBB"
489
+ let NameSuff = "DAE"
490
+ let NamePref = "DAF"
491
+ let LicenseClassification = "DAR"
492
+ let LicenseRestriction = "DAS"
493
+ let LicenseEndorsement = "DAT"
494
+ let IssueDate = "DBD"
495
+ let OrganDonor = "DBH"
496
+ let HeightFT = "DAU"
497
+ let FullName = "DAA"
498
+ let GivenName = "DAC"
499
+ let HeightCM = "DAV"
500
+ let WeightLBS = "DAW"
501
+ let WeightKG = "DAX"
502
+ let EyeColor = "DAY"
503
+ let HairColor = "DAZ"
504
+ let IssueTimeStemp = "DBE"
505
+ let NumberDuplicate = "DBF"
506
+ let UniqueCustomerId = "DBJ"
507
+ let SocialSecurityNo = "DBM"
508
+ let Under18 = "DDH"
509
+ let Under19 = "DDI"
510
+ let Under21 = "DDJ"
511
+ let PermitClassification = "PAA"
512
+ let VeteranIndicator = "DDL"
513
+ let PermitIssue = "PAD"
514
+ let PermitExpire = "PAB"
515
+ let PermitRestriction = "PAE"
516
+ let PermitEndorsement = "PAF"
517
+ let CourtRestriction = "ZVA"
518
+ let InventoryControlNo = "DCK"
519
+ let RaceEthnicity = "DCL"
520
+ let StandardVehicleClass = "DCM"
521
+ let DocumentDiscriminator = "DCF"
522
+ let VirginiaSpecificClass = "DCA"
523
+ let VirginiaSpecificRestrictions = "DCB"
524
+ let PhysicalDescriptionWeight = "DCD"
525
+ let CountryTerritoryOfIssuance = "DCG"
526
+ let FederalCommercialVehicleCodes = "DCH"
527
+ let PlaceOfBirth = "DCI"
528
+ let AuditInformation = "DCJ"
529
+ let StandardEndorsementCode = "DCN"
530
+ let StandardRestrictionCode = "DCO"
531
+ let JurisdictionSpecificVehicleClassificationDescription = "DCP"
532
+ let JurisdictionSpecific = "DCQ"
533
+ let JurisdictionSpecificRestrictionCodeDescription = "DCR"
534
+ let ComplianceType = "DDA"
535
+ let CardRevisionDate = "DDB"
536
+ let HazMatEndorsementExpiryDate = "DDC"
537
+ let LimitedDurationDocumentIndicator = "DDD"
538
+ let FamilyNameTruncation = "DDE"
539
+ let FirstNamesTruncation = "DDF"
540
+ let MiddleNamesTruncation = "DDG"
541
+ let OrganDonorIndicator = "DDK"
542
+ let PermitIdentifier = "PAC"
543
+
544
+
545
+ mutableArray.add(Customer_Full_Name)
546
+ mutableArray.add(Customer_Family_Name)
547
+ mutableArray.add(Family_Name)
548
+
549
+ mutableArray.add(Customer_Given_Name)
550
+ mutableArray.add(Name_Suffix)
551
+ mutableArray.add(Street_Address_1)
552
+ mutableArray.add(City)
553
+ mutableArray.add(Jurisdction_Code)
554
+ mutableArray.add(ResidenceJurisdictionCode)
555
+ mutableArray.add(MedicalIndicatorCodes)
556
+ mutableArray.add(NonResidentIndicator)
557
+ mutableArray.add(SocialSecurityNumber)
558
+ mutableArray.add(DateOfBirth)
559
+ mutableArray.add(VirginiaSpecificClass)
560
+ mutableArray.add(VirginiaSpecificRestrictions)
561
+ mutableArray.add(PhysicalDescriptionWeight)
562
+ mutableArray.add(CountryTerritoryOfIssuance)
563
+ mutableArray.add(FederalCommercialVehicleCodes)
564
+ mutableArray.add(PlaceOfBirth)
565
+ mutableArray.add(AuditInformation)
566
+ mutableArray.add(StandardEndorsementCode)
567
+ mutableArray.add(JurisdictionSpecificVehicleClassificationDescription)
568
+ mutableArray.add(JurisdictionSpecific)
569
+ mutableArray.add(PermitIdentifier)
570
+ mutableArray.add(OrganDonorIndicator)
571
+ mutableArray.add(MiddleNamesTruncation)
572
+ mutableArray.add(FirstNamesTruncation)
573
+ mutableArray.add(FamilyNameTruncation)
574
+ mutableArray.add(HazMatEndorsementExpiryDate)
575
+ mutableArray.add(LimitedDurationDocumentIndicator)
576
+ mutableArray.add(CardRevisionDate)
577
+ mutableArray.add(ComplianceType)
578
+ mutableArray.add(JurisdictionSpecificRestrictionCodeDescription)
579
+ mutableArray.add(StandardRestrictionCode)
580
+
581
+ mutableArray.add(Postal_Code)
582
+ mutableArray.add(Customer_Id_Number)
583
+ mutableArray.add(Expiration_Date)
584
+ mutableArray.add(Sex)
585
+ mutableArray.add(Customer_First_Name)
586
+ mutableArray.add(Customer_Middle_Name)
587
+ mutableArray.add(Street_Address_2)
588
+ mutableArray.add(Street_Address_1_optional)
589
+ mutableArray.add(Street_Address_2_optional)
590
+ mutableArray.add(Date_Of_Birth)
591
+ mutableArray.add(NameSuff)
592
+ mutableArray.add(NamePref)
593
+ mutableArray.add(LicenseClassification)
594
+ mutableArray.add(LicenseRestriction)
595
+ mutableArray.add(LicenseEndorsement)
596
+ mutableArray.add(IssueDate)
597
+ mutableArray.add(OrganDonor)
598
+ mutableArray.add(HeightFT)
599
+ mutableArray.add(FullName)
600
+ mutableArray.add(GivenName)
601
+ mutableArray.add(HeightCM)
602
+ mutableArray.add(WeightLBS)
603
+ mutableArray.add(WeightKG)
604
+ mutableArray.add(EyeColor)
605
+ mutableArray.add(HairColor)
606
+ mutableArray.add(IssueTimeStemp)
607
+ mutableArray.add(NumberDuplicate)
608
+ mutableArray.add(UniqueCustomerId)
609
+ mutableArray.add(SocialSecurityNo)
610
+ mutableArray.add(Under18)
611
+ mutableArray.add(Under19)
612
+ mutableArray.add(Under21)
613
+ mutableArray.add(PermitClassification)
614
+ mutableArray.add(VeteranIndicator)
615
+ mutableArray.add(PermitIssue)
616
+ mutableArray.add(PermitExpire)
617
+ mutableArray.add(PermitRestriction)
618
+ mutableArray.add(PermitEndorsement)
619
+ mutableArray.add(CourtRestriction)
620
+ mutableArray.add(InventoryControlNo)
621
+ mutableArray.add(RaceEthnicity)
622
+ mutableArray.add(StandardVehicleClass)
623
+ mutableArray.add(DocumentDiscriminator)
624
+
625
+ var emptyDictionary = [String: String]()
626
+ var passDict = [String: String]()
627
+
628
+ let fullstrArr = type.components(separatedBy: "\n")
629
+ for object in fullstrArr {
630
+ var str = object as String
631
+ if str.contains("ANSI") {
632
+ let parts = str.components(separatedBy: "DL")
633
+ if parts.count > 1 {
634
+ str = parts[parts.count-1]
635
+ }
636
+
637
+
638
+ }
639
+ let count = str.count
640
+
641
+ if count > 3 {
642
+ (str as NSString).substring(with: NSRange(location: 0, length: 3))
643
+ let key = str.index(str.startIndex, offsetBy:3)
644
+ let key1 = String(str[..<key])
645
+
646
+ let indexsd = str.index(str.startIndex, offsetBy: 3)
647
+ let tempstr = str[indexsd...] // "Hello>>>"
648
+ if (tempstr != "NONE") {
649
+ emptyDictionary.updateValue(String(tempstr), forKey: key1)
650
+
651
+ }
652
+
653
+ }
654
+ }
655
+ if((emptyDictionary["DAA"]) != nil) {
656
+ passDict.updateValue(emptyDictionary["DAA"]!, forKey: "FULL NAME: ")
657
+ if(keyArr .contains("FULL NAME: ")) {
658
+ }
659
+ else {
660
+ valueArr.add(emptyDictionary["DAA"]!)
661
+ keyArr.add("FULL NAME: ")
662
+ }
663
+ }
664
+
665
+ if((emptyDictionary["DAB"]) != nil) {
666
+ passDict.updateValue(emptyDictionary["DAB"]!, forKey: "LAST NAME:")
667
+ if(keyArr .contains("LAST NAME:")) {
668
+ }
669
+ else {
670
+ valueArr.add(emptyDictionary["DAB"]!)
671
+ keyArr.add("LAST NAME:")
672
+ }
673
+
674
+
675
+ }
676
+
677
+ if((emptyDictionary["DAC"]) != nil) {
678
+ passDict.updateValue(emptyDictionary["DAC"]!, forKey: "FIRST NAME:")
679
+ if(keyArr .contains("FIRST NAME: ") ) {
680
+
681
+ }
682
+ else {
683
+ valueArr.add(emptyDictionary["DAC"]!)
684
+ keyArr.add("FIRST NAME: ")
685
+ }
686
+
687
+
688
+ }
689
+
690
+
691
+ if((emptyDictionary["DAD"]) != nil) {
692
+ passDict.updateValue(emptyDictionary["DAD"]!, forKey: "MIDDLE NAME:")
693
+ if(keyArr .contains("MIDDLE NAME:")) {
694
+ }
695
+ else {
696
+
697
+ valueArr.add(emptyDictionary["DAD"]!)
698
+ keyArr.add("MIDDLE NAME:")
699
+ }
700
+
701
+
702
+ }
703
+
704
+ if((emptyDictionary["DAE"]) != nil) {
705
+ passDict.updateValue(emptyDictionary["DAE"]!, forKey: "NAME SUFFIX: ")
706
+ if(keyArr .contains("NAME SUFFIX: ")) {
707
+ }
708
+ else {
709
+
710
+ valueArr.add(emptyDictionary["DAE"]!)
711
+ keyArr.add("NAME SUFFIX: ")
712
+ }
713
+ }
714
+
715
+ if((emptyDictionary["DAF"]) != nil) {
716
+ passDict.updateValue(emptyDictionary["DAF"]!, forKey: "NAME PREFIX: ")
717
+ if(keyArr .contains("NAME PREFIX: ")) {
718
+ }
719
+ else {
720
+
721
+ valueArr.add(emptyDictionary["DAF"]!)
722
+ keyArr.add("NAME PREFIX: ")
723
+ }
724
+ }
725
+
726
+ if((emptyDictionary["DAG"]) != nil) {
727
+ passDict.updateValue(emptyDictionary["DAG"]!, forKey: "MAILING STREET ADDRESS1: ")
728
+ if(keyArr .contains("MAILING STREET ADDRESS1: ")) {
729
+ }
730
+ else {
731
+
732
+ valueArr.add(emptyDictionary["DAG"]!)
733
+ keyArr.add("MAILING STREET ADDRESS1: ")
734
+ }
735
+
736
+ }
737
+
738
+ if((emptyDictionary["DAH"]) != nil) {
739
+ passDict.updateValue(emptyDictionary["DAH"]!, forKey: "MAILING STREET ADDRESS2: ")
740
+ if(keyArr .contains("MAILING STREET ADDRESS2: ")) {
741
+ }
742
+ else {
743
+
744
+ valueArr.add(emptyDictionary["DAH"]!)
745
+ keyArr.add("MAILING STREET ADDRESS2: ")
746
+ }
747
+ }
748
+
749
+ if((emptyDictionary["DAI"]) != nil) {
750
+ passDict.updateValue(emptyDictionary["DAI"]!, forKey: "MAILING CITY:")
751
+ if(keyArr .contains("MAILING CITY:")) {
752
+ }
753
+ else {
754
+
755
+ valueArr.add(emptyDictionary["DAI"]!)
756
+ keyArr.add("MAILING CITY:")
757
+ }
758
+
759
+ }
760
+
761
+
762
+ if((emptyDictionary["DAJ"]) != nil) {
763
+ passDict.updateValue(emptyDictionary["DAJ"]!, forKey: "MAILING JURISDICTION CODE: ")
764
+ if(keyArr .contains("MAILING JURISDICTION CODE: ")) {
765
+ }
766
+ else {
767
+
768
+ valueArr.add(emptyDictionary["DAJ"]!)
769
+ keyArr.add("MAILING JURISDICTION CODE: ")
770
+ }
771
+
772
+ }
773
+
774
+ if((emptyDictionary["DAK"]) != nil) {
775
+ passDict.updateValue(emptyDictionary["DAK"]!, forKey: "MAILING POSTAL CODE:")
776
+ if(keyArr .contains("MAILING POSTAL CODE:")) {
777
+ }
778
+ else {
779
+
780
+ valueArr.add(emptyDictionary["DAK"]!)
781
+ keyArr.add("MAILING POSTAL CODE: ")
782
+ }
783
+
784
+
785
+ }
786
+
787
+ if((emptyDictionary["DAL"]) != nil) {
788
+ passDict.updateValue(emptyDictionary["DAL"]!, forKey: "RESIDENCE STREET ADDRESS1: ")
789
+ if(keyArr .contains("RESIDENCE STREET ADDRESS1: ")) {
790
+ }
791
+ else {
792
+
793
+ valueArr.add(emptyDictionary["DAL"]!)
794
+ keyArr.add("RESIDENCE STREET ADDRESS1: ")
795
+ }
796
+ }
797
+
798
+ if((emptyDictionary["DAM"]) != nil) {
799
+ passDict.updateValue(emptyDictionary["DAM"]!, forKey: "RESIDENCE STREET ADDRESS2: ")
800
+ if(keyArr .contains("RESIDENCE STREET ADDRESS2: ")) {
801
+ }
802
+ else {
803
+
804
+ valueArr.add(emptyDictionary["DAM"]!)
805
+ keyArr.add("RESIDENCE STREET ADDRESS2: ")
806
+ }
807
+ }
808
+
809
+ if((emptyDictionary["DAN"]) != nil) {
810
+ passDict.updateValue(emptyDictionary["DAN"]!, forKey: "RESIDENCE CITY: ")
811
+ if(keyArr .contains("RESIDENCE CITY: ")) {
812
+ }
813
+ else {
814
+
815
+ valueArr.add(emptyDictionary["DAN"]!)
816
+ keyArr.add("RESIDENCE CITY: ")
817
+ }
818
+ }
819
+
820
+ if((emptyDictionary["DAO"]) != nil) {
821
+ passDict.updateValue(emptyDictionary["DAO"]!, forKey: "RESIDENCE JURISDICTION CODE: ")
822
+ if(keyArr .contains("RESIDENCE JURISDICTION CODE: ")) {
823
+ }
824
+ else {
825
+
826
+ valueArr.add(emptyDictionary["DAO"]!)
827
+ keyArr.add("RESIDENCE JURISDICTION CODE: ")
828
+ }
829
+
830
+ }
831
+
832
+ if((emptyDictionary["DAP"]) != nil) {
833
+ passDict.updateValue(emptyDictionary["DAP"]!, forKey: "RESIDENCE POSTAL CODE: ")
834
+ if(keyArr .contains("RESIDENCE POSTAL CODE: ")) {
835
+ }
836
+ else {
837
+
838
+ valueArr.add(emptyDictionary["DAP"]!)
839
+ keyArr.add("RESIDENCE POSTAL CODE: ")
840
+ }
841
+
842
+ }
843
+
844
+ if((emptyDictionary["DAQ"]) != nil) {
845
+ passDict.updateValue(emptyDictionary["DAQ"]!, forKey: "LICENCE OR ID NUMBER: ")
846
+ if(keyArr .contains("LICENCE OR ID NUMBER: ")) {
847
+ }
848
+ else {
849
+
850
+ valueArr.add(emptyDictionary["DAQ"]!)
851
+ keyArr.add("LICENCE OR ID NUMBER: ")
852
+ }
853
+ }
854
+
855
+ if((emptyDictionary["DAR"]) != nil) {
856
+ passDict.updateValue(emptyDictionary["DAR"]!, forKey: "LICENCE CLASSIFICATION CODE: ")
857
+ if(keyArr .contains("LICENCE CLASSIFICATION CODE: ")) {
858
+ }
859
+ else {
860
+
861
+ valueArr.add(emptyDictionary["DAR"]!)
862
+ keyArr.add("LICENCE CLASSIFICATION CODE: ")
863
+ }
864
+ }
865
+
866
+ if((emptyDictionary["DAS"]) != nil) {
867
+ passDict.updateValue(emptyDictionary["DAS"]!, forKey: "LICENCE RESTRICTION CODE: ")
868
+ if(keyArr .contains("LICENCE RESTRICTION CODE: ")) {
869
+ }
870
+ else {
871
+
872
+ valueArr.add(emptyDictionary["DAS"]!)
873
+ keyArr.add("LICENCE RESTRICTION CODE: ")
874
+ }
875
+ }
876
+
877
+ if((emptyDictionary["DAT"]) != nil) {
878
+ passDict.updateValue(emptyDictionary["DAT"]!, forKey: "LICENCE ENDORSEMENT CODE: ")
879
+ if(keyArr .contains("LICENCE ENDORSEMENT CODE: ")) {
880
+ }
881
+ else {
882
+
883
+ valueArr.add(emptyDictionary["DAT"]!)
884
+ keyArr.add("LICENCE ENDORSEMENT CODE: ")
885
+ }
886
+ }
887
+
888
+ if((emptyDictionary["DAU"]) != nil) {
889
+ passDict.updateValue(emptyDictionary["DAU"]!, forKey: "HEIGHT IN FT_IN: ")
890
+ if(keyArr .contains("HEIGHT IN FT_IN: ")) {
891
+ }
892
+ else {
893
+
894
+ valueArr.add(emptyDictionary["DAU"]!)
895
+ keyArr.add("HEIGHT IN FT_IN:")
896
+ }
897
+ }
898
+
899
+ if((emptyDictionary["DAV"]) != nil) {
900
+ passDict.updateValue(emptyDictionary["DAV"]!, forKey: "HEIGHT IN CM: ")
901
+ if(keyArr .contains("HEIGHT IN CM: ")) {
902
+ }
903
+ else {
904
+
905
+ valueArr.add(emptyDictionary["DAV"]!)
906
+ keyArr.add("HEIGHT IN CM: ")
907
+ }
908
+ }
909
+
910
+ if((emptyDictionary["DAW"]) != nil) {
911
+ passDict.updateValue(emptyDictionary["DAW"]!, forKey: "WEIGHT IN LBS: ")
912
+ if(keyArr .contains("WEIGHT IN LBS: ")) {
913
+ }
914
+ else {
915
+
916
+ valueArr.add(emptyDictionary["DAW"]!)
917
+ keyArr.add("WEIGHT IN LBS: ")
918
+ }
919
+
920
+
921
+ }
922
+
923
+ if((emptyDictionary["DAX"]) != nil) {
924
+ passDict.updateValue(emptyDictionary["DAX"]!, forKey: "WEIGHT IN KG:")
925
+ if(keyArr .contains("WEIGHT IN KG:")) {
926
+ }
927
+ else {
928
+
929
+ valueArr.add(emptyDictionary["DAX"]!)
930
+ keyArr.add("WEIGHT IN KG:")
931
+ }
932
+ }
933
+
934
+ if((emptyDictionary["DAY"]) != nil) {
935
+ passDict.updateValue(emptyDictionary["DAY"]!, forKey: "EYE COLOR: ")
936
+ if(keyArr .contains("EYE COLOR: ")) {
937
+ }
938
+ else {
939
+
940
+ valueArr.add(emptyDictionary["DAY"]!)
941
+ keyArr.add("EYE COLOR:")
942
+ }
943
+
944
+ }
945
+
946
+ if((emptyDictionary["DAZ"]) != nil) {
947
+ passDict.updateValue(emptyDictionary["DAZ"]!, forKey: "HAIR COLOR: ")
948
+ if(keyArr .contains("HAIR COLOR: ")) {
949
+ }
950
+ else {
951
+
952
+ valueArr.add(emptyDictionary["DAZ"]!)
953
+ keyArr.add("HAIR COLOR:")
954
+ }
955
+
956
+
957
+
958
+ }
959
+
960
+ if((emptyDictionary["DBA"]) != nil) {
961
+ passDict.updateValue(emptyDictionary["DBA"]!, forKey: "LICENSE EXPIRATION DATE: ")
962
+ if(keyArr .contains("LICENSE EXPIRATION DATE: ")) {
963
+ }
964
+ else {
965
+
966
+ var str = emptyDictionary["DBA"]
967
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
968
+
969
+ str?.insert("/", at: index!)
970
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
971
+ str?.insert("/", at: index1!)
972
+
973
+ valueArr.add(str as Any)
974
+ keyArr.add("LICENSE EXPIRATION DATE: ")
975
+ }
976
+ }
977
+ if((emptyDictionary["DBB"]) != nil) {
978
+ passDict.updateValue(emptyDictionary["DBB"]!, forKey: "DATE OF BIRTH: ")
979
+ if(keyArr .contains("DATE OF BIRTH: ")) {
980
+ }
981
+ else {
982
+ var str = emptyDictionary["DBB"]
983
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
984
+
985
+ str?.insert("/", at: index!)
986
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
987
+ str?.insert("/", at: index1!)
988
+
989
+ valueArr.add(str as Any)
990
+ keyArr.add("DATE OF BIRTH:")
991
+ }
992
+
993
+
994
+
995
+ }
996
+
997
+ if((emptyDictionary["DBC"]) != nil) {
998
+ passDict.updateValue(emptyDictionary["DBC"]!, forKey: "SEX: ")
999
+ if(keyArr .contains("SEX: ")) {
1000
+ }
1001
+ else {
1002
+ if(emptyDictionary["DBC"] == "1") {
1003
+
1004
+ valueArr.add("MALE")
1005
+ }
1006
+ else {
1007
+ valueArr.add("FEMALE")
1008
+ }
1009
+
1010
+ keyArr.add("SEX: ")
1011
+ }
1012
+
1013
+
1014
+
1015
+ }
1016
+
1017
+ if((emptyDictionary["DBD"]) != nil) {
1018
+ passDict.updateValue(emptyDictionary["DBD"]!, forKey: "LICENSE OR ID DOCUMENT ISSUE DATE: ")
1019
+ if(keyArr .contains("LICENSE OR ID DOCUMENT ISSUE DATE: ")) {
1020
+ }
1021
+ else {
1022
+
1023
+ var str = emptyDictionary["DBD"]
1024
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1025
+
1026
+ str?.insert("/", at: index!)
1027
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1028
+ str?.insert("/", at: index1!)
1029
+
1030
+ valueArr.add(str as Any)
1031
+ keyArr.add("LICENSE OR ID DOCUMENT ISSUE DATE: ")
1032
+ }
1033
+ }
1034
+
1035
+ if((emptyDictionary["DBE"]) != nil) {
1036
+ passDict.updateValue(emptyDictionary["DBE"]!, forKey: "ISSUE TIMESTAMP: ")
1037
+ if(keyArr .contains("ISSUE TIMESTAMP: ")) {
1038
+ }
1039
+ else {
1040
+ valueArr.add(emptyDictionary["DBE"]!)
1041
+ keyArr.add("ISSUE TIMESTAMP:")
1042
+ }
1043
+ }
1044
+
1045
+ if((emptyDictionary["DBF"]) != nil) {
1046
+ passDict.updateValue(emptyDictionary["DBF"]!, forKey: "NUMBER OF DUPLICATES: ")
1047
+ if(keyArr .contains("NUMBER OF DUPLICATES: ")) {
1048
+ }
1049
+ else {
1050
+
1051
+ valueArr.add(emptyDictionary["DBF"]!)
1052
+ keyArr.add("NUMBER OF DUPLICATES: ")
1053
+ }
1054
+
1055
+ }
1056
+
1057
+ if((emptyDictionary["DBG"]) != nil) {
1058
+ passDict.updateValue(emptyDictionary["DBG"]!, forKey: "RMEDICAL INDICATOR CODES: ")
1059
+ if(keyArr .contains("MEDICAL INDICATOR CODES: ")) {
1060
+ }
1061
+ else {
1062
+
1063
+ valueArr.add(emptyDictionary["DBG"]!)
1064
+ keyArr.add("MEDICAL INDICATOR CODES: ")
1065
+ }
1066
+
1067
+ }
1068
+
1069
+ if((emptyDictionary["DBH"]) != nil) {
1070
+ passDict.updateValue(emptyDictionary["DBH"]!, forKey: "ORGAN DONOR: ")
1071
+ if(keyArr .contains("ORGAN DONOR: ")) {
1072
+ }
1073
+ else {
1074
+
1075
+ valueArr.add(emptyDictionary["DBH"]!)
1076
+ keyArr.add("ORGAN DONOR: ")
1077
+ }
1078
+ }
1079
+
1080
+ if((emptyDictionary["DBI"]) != nil) {
1081
+ passDict.updateValue(emptyDictionary["DBI"]!, forKey: "NON-RESIDENT INDICATOR: ")
1082
+ if(keyArr .contains("NON-RESIDENT INDICATOR: ")) {
1083
+ }
1084
+ else {
1085
+
1086
+ valueArr.add(emptyDictionary["DBI"]!)
1087
+ keyArr.add("NON-RESIDENT INDICATOR: ")
1088
+ }
1089
+
1090
+ }
1091
+
1092
+ if((emptyDictionary["DBJ"]) != nil) {
1093
+ passDict.updateValue(emptyDictionary["DBJ"]!, forKey: "UNIQUE CUSTOMER IDENTIFIER: ")
1094
+ if(keyArr .contains("UNIQUE CUSTOMER IDENTIFIER: ")) {
1095
+ }
1096
+ else {
1097
+
1098
+ valueArr.add(emptyDictionary["DBJ"]!)
1099
+ keyArr.add("UNIQUE CUSTOMER IDENTIFIER: ")
1100
+ }
1101
+ }
1102
+
1103
+ if((emptyDictionary["DBK"]) != nil) {
1104
+ passDict.updateValue(emptyDictionary["DBK"]!, forKey: "SOCIAL SECURITY NUMBER: ")
1105
+ if(keyArr .contains("SOCIAL SECURITY NUMBER: ")) {
1106
+ }
1107
+ else {
1108
+
1109
+ valueArr.add(emptyDictionary["DBK"]!)
1110
+ keyArr.add("SOCIAL SECURITY NUMBER: ")
1111
+ }
1112
+
1113
+ }
1114
+ if((emptyDictionary["DBL"]) != nil) {
1115
+ passDict.updateValue(emptyDictionary["DBL"]!, forKey: "DATE OF BIRTH: ")
1116
+ if(keyArr .contains("DATE OF BIRTH: ")) {
1117
+ }
1118
+ else {
1119
+
1120
+ valueArr.add(emptyDictionary["DBL"]!)
1121
+ keyArr.add("DATE OF BIRTH: ")
1122
+ }
1123
+ }
1124
+
1125
+ if((emptyDictionary["DBM"]) != nil) {
1126
+ passDict.updateValue(emptyDictionary["DBM"]!, forKey: "SOCIAL SECURITY NUMBER: ")
1127
+ if(keyArr .contains("SOCIAL SECURITY NUMBER: ")) {
1128
+ }
1129
+ else {
1130
+
1131
+ valueArr.add(emptyDictionary["DBM"]!)
1132
+ keyArr.add("SOCIAL SECURITY NUMBER: ")
1133
+ }
1134
+ }
1135
+
1136
+ if((emptyDictionary["DBN"]) != nil) {
1137
+ passDict.updateValue(emptyDictionary["DBN"]!, forKey: "FULL NAME: ")
1138
+ if(keyArr .contains("FULL NAME: ")) {
1139
+ }
1140
+ else {
1141
+
1142
+ valueArr.add(emptyDictionary["DBN"]!)
1143
+ keyArr.add("FULL NAME: ")
1144
+ }
1145
+ }
1146
+
1147
+ if((emptyDictionary["DBO"]) != nil) {
1148
+ passDict.updateValue(emptyDictionary["DBO"]!, forKey: "LAST NAME: ")
1149
+ if(keyArr .contains("LAST NAME: ")) {
1150
+ }
1151
+ else {
1152
+
1153
+ valueArr.add(emptyDictionary["DBO"]!)
1154
+ keyArr.add("LAST NAME: ")
1155
+ }
1156
+ }
1157
+
1158
+ if((emptyDictionary["DBP"]) != nil) {
1159
+ passDict.updateValue(emptyDictionary["DBP"]!, forKey: "FIRST NAME: ")
1160
+ if(keyArr .contains("FIRST NAME: ")) {
1161
+ }
1162
+ else {
1163
+
1164
+ valueArr.add(emptyDictionary["DBP"]!)
1165
+ keyArr.add("FIRST NAME: ")
1166
+ }
1167
+ }
1168
+
1169
+ if((emptyDictionary["DBQ"]) != nil) {
1170
+ passDict.updateValue(emptyDictionary["DBQ"]!, forKey: "MIDDLE NAME: ")
1171
+ if(keyArr .contains("MIDDLE NAME: ")) {
1172
+ }
1173
+ else {
1174
+
1175
+ valueArr.add(emptyDictionary["DBQ"]!)
1176
+ keyArr.add("MIDDLE NAME: ")
1177
+ }
1178
+
1179
+ }
1180
+
1181
+ if((emptyDictionary["DBR"]) != nil) {
1182
+ passDict.updateValue(emptyDictionary["DBR"]!, forKey: "SUFFIX: ")
1183
+ if(keyArr .contains("SUFFIX: ")) {
1184
+ }
1185
+ else {
1186
+
1187
+ valueArr.add(emptyDictionary["DBR"]!)
1188
+ keyArr.add("SUFFIX: ")
1189
+ }
1190
+
1191
+ }
1192
+
1193
+ if((emptyDictionary["DBS"]) != nil) {
1194
+ passDict.updateValue(emptyDictionary["DBS"]!, forKey: "PREFIX: ")
1195
+ if(keyArr .contains("PREFIX: ")) {
1196
+ }
1197
+ else {
1198
+
1199
+ valueArr.add(emptyDictionary["DBS"]!)
1200
+ keyArr.add("PREFIX: ")
1201
+ }
1202
+
1203
+ }
1204
+
1205
+ if((emptyDictionary["DCA"]) != nil) {
1206
+ passDict.updateValue(emptyDictionary["DCA"]!, forKey: "VIRGINIA SPECIFIC CLASS: ")
1207
+ if(keyArr .contains("VIRGINIA SPECIFIC CLASS: ")) {
1208
+ }
1209
+ else {
1210
+
1211
+
1212
+
1213
+ valueArr.add(emptyDictionary["DCA"]!)
1214
+ keyArr.add("VIRGINIA SPECIFIC CLASS: ")
1215
+ }
1216
+ }
1217
+
1218
+ if((emptyDictionary["DCB"]) != nil) {
1219
+ passDict.updateValue(emptyDictionary["DCB"]!, forKey: "VIRGINIA SPECIFIC RESTRICTIONS: ")
1220
+ if(keyArr .contains("VIRGINIA SPECIFIC RESTRICTIONS: ")) {
1221
+ }
1222
+ else {
1223
+
1224
+
1225
+
1226
+ valueArr.add(emptyDictionary["DCB"]!)
1227
+ keyArr.add("VIRGINIA SPECIFIC RESTRICTIONS: ")
1228
+ }
1229
+ }
1230
+
1231
+ if((emptyDictionary["DCD"]) != nil) {
1232
+ passDict.updateValue(emptyDictionary["DCD"]!, forKey: "VIRGINIA SPECIFIC ENDORSEMENTS: ")
1233
+ if(keyArr .contains("VIRGINIA SPECIFIC ENDORSEMENTS: ")) {
1234
+ }
1235
+ else {
1236
+
1237
+
1238
+
1239
+ valueArr.add(emptyDictionary["DCD"]!)
1240
+ keyArr.add("VIRGINIA SPECIFIC ENDORSEMENTS: ")
1241
+ }
1242
+ }
1243
+
1244
+ if((emptyDictionary["DCE"]) != nil) {
1245
+ passDict.updateValue(emptyDictionary["DCE"]!, forKey: "PHYSICAL DESCRIPTION WEIGHT RANGE: ")
1246
+ if(keyArr .contains("PHYSICAL DESCRIPTION WEIGHT RANGE: ")) {
1247
+ }
1248
+ else {
1249
+
1250
+
1251
+
1252
+ valueArr.add(emptyDictionary["DCE"]!)
1253
+ keyArr.add("PHYSICAL DESCRIPTION WEIGHT RANGE: ")
1254
+ }
1255
+ }
1256
+
1257
+ if((emptyDictionary["DCF"]) != nil) {
1258
+ passDict.updateValue(emptyDictionary["DCF"]!, forKey: "DOCUMENT DISCRIMINATOR: ")
1259
+ if(keyArr .contains("DOCUMENT DISCRIMINATOR: ")) {
1260
+ }
1261
+ else {
1262
+
1263
+ valueArr.add(emptyDictionary["DCF"]!)
1264
+ keyArr.add("DOCUMENT DISCRIMINATOR: ")
1265
+ }
1266
+
1267
+
1268
+ }
1269
+
1270
+ if((emptyDictionary["DCG"]) != nil) {
1271
+ passDict.updateValue(emptyDictionary["DCG"]!, forKey: "COUNTRY TERRITORY OF ISSUANCE: ")
1272
+ if(keyArr .contains("COUNTRY TERRITORY OF ISSUANCE: ")) {
1273
+ }
1274
+ else {
1275
+
1276
+
1277
+
1278
+ valueArr.add(emptyDictionary["DCG"]!)
1279
+ keyArr.add("COUNTRY TERRITORY OF ISSUANCE: ")
1280
+ }
1281
+ }
1282
+
1283
+ if((emptyDictionary["DCH"]) != nil) {
1284
+ passDict.updateValue(emptyDictionary["DCH"]!, forKey: "FEDERAL COMMERCIAL VEHICLE CODES: ")
1285
+ if(keyArr .contains("FEDERAL COMMERCIAL VEHICLE CODES: ")) {
1286
+ }
1287
+ else {
1288
+
1289
+
1290
+
1291
+ valueArr.add(emptyDictionary["DCH"]!)
1292
+ keyArr.add("FEDERAL COMMERCIAL VEHICLE CODES: ")
1293
+ }
1294
+ }
1295
+
1296
+ if((emptyDictionary["DCI"]) != nil) {
1297
+ passDict.updateValue(emptyDictionary["DCI"]!, forKey: "PLACE OF BIRTH: ")
1298
+ if(keyArr .contains("PLACE OF BIRTH: ")) {
1299
+ }
1300
+ else {
1301
+
1302
+
1303
+
1304
+ valueArr.add(emptyDictionary["DCI"]!)
1305
+ keyArr.add("PLACE OF BIRTH: ")
1306
+ }
1307
+ }
1308
+
1309
+ if((emptyDictionary["DCJ"]) != nil) {
1310
+ passDict.updateValue(emptyDictionary["DCJ"]!, forKey: "AUDIT INFORMATION: ")
1311
+ if(keyArr .contains("AUDIT INFORMATION: ")) {
1312
+ }
1313
+ else {
1314
+
1315
+
1316
+
1317
+ valueArr.add(emptyDictionary["DCJ"]!)
1318
+ keyArr.add("AUDIT INFORMATION: ")
1319
+ }
1320
+ }
1321
+
1322
+ if((emptyDictionary["DCK"]) != nil) {
1323
+ passDict.updateValue(emptyDictionary["DCK"]!, forKey: "INVENTORY CONTROL NUMBER: ")
1324
+ if(keyArr .contains("INVENTORY CONTROL NUMBER: ")) {
1325
+ }
1326
+ else {
1327
+ valueArr.add(emptyDictionary["DCK"]!)
1328
+ keyArr.add("INVENTORY CONTROL NUMBER: ")
1329
+ }
1330
+
1331
+
1332
+ }
1333
+
1334
+ if((emptyDictionary["DCL"]) != nil) {
1335
+ passDict.updateValue(emptyDictionary["DCL"]!, forKey: "RACE ETHNICITY: ")
1336
+ if(keyArr .contains("RACE ETHNICITY: ")) {
1337
+ }
1338
+ else {
1339
+
1340
+ valueArr.add(emptyDictionary["DCL"]!)
1341
+ keyArr.add("RACE ETHNICITY: ")
1342
+ }
1343
+
1344
+
1345
+ }
1346
+
1347
+ if((emptyDictionary["DCM"]) != nil) {
1348
+ passDict.updateValue(emptyDictionary["DCM"]!, forKey: "STANDARD VEHICLE CLASSIFICATION: ")
1349
+ if(keyArr .contains("STANDARD VEHICLE CLASSIFICATION: ")) {
1350
+ }
1351
+ else {
1352
+
1353
+ valueArr.add(emptyDictionary["DCM"]!)
1354
+ keyArr.add("STANDARD VEHICLE CLASSIFICATION: ")
1355
+ }
1356
+
1357
+
1358
+ }
1359
+
1360
+ if((emptyDictionary["DCN"]) != nil) {
1361
+ passDict.updateValue(emptyDictionary["DCN"]!, forKey: "STANDARD ENDORSEMENT CODE: ")
1362
+ if(keyArr .contains("STANDARD ENDORSEMENT CODE: ")) {
1363
+ }
1364
+ else {
1365
+
1366
+
1367
+
1368
+ valueArr.add(emptyDictionary["DCN"]!)
1369
+ keyArr.add("STANDARD ENDORSEMENT CODE: ")
1370
+ }
1371
+ }
1372
+
1373
+ if((emptyDictionary["DCO"]) != nil) {
1374
+ passDict.updateValue(emptyDictionary["DCO"]!, forKey: "STANDARD RESTRICTION CODE: ")
1375
+ if(keyArr .contains("STANDARD RESTRICTION CODE: ")) {
1376
+ }
1377
+ else {
1378
+
1379
+
1380
+
1381
+ valueArr.add(emptyDictionary["DCO"]!)
1382
+ keyArr.add("STANDARD RESTRICTION CODE: ")
1383
+ }
1384
+ }
1385
+
1386
+ if((emptyDictionary["DCP"]) != nil) {
1387
+ passDict.updateValue(emptyDictionary["DCP"]!, forKey: "JURISDICTION SPECIFIC VEHICLE CLASSIFICATION DESCRIPTION: ")
1388
+ if(keyArr .contains("JURISDICTION SPECIFIC VEHICLE CLASSIFICATION DESCRIPTION: ")) {
1389
+ }
1390
+ else {
1391
+
1392
+
1393
+
1394
+ valueArr.add(emptyDictionary["DCP"]!)
1395
+ keyArr.add("JURISDICTION SPECIFIC VEHICLE CLASSIFICATION DESCRIPTION: ")
1396
+ }
1397
+ }
1398
+
1399
+ if((emptyDictionary["DCQ"]) != nil) {
1400
+ passDict.updateValue(emptyDictionary["DCQ"]!, forKey: "JURISDICTION-SPECIFIC: ")
1401
+ if(keyArr .contains("JURISDICTION-SPECIFIC: ")) {
1402
+ }
1403
+ else {
1404
+
1405
+
1406
+
1407
+ valueArr.add(emptyDictionary["DCQ"]!)
1408
+ keyArr.add("JURISDICTION-SPECIFIC: ")
1409
+ }
1410
+ }
1411
+
1412
+ if((emptyDictionary["DCR"]) != nil) {
1413
+ passDict.updateValue(emptyDictionary["DCR"]!, forKey: "JURISDICTION SPECIFIC RESTRICTION CODE DESCRIPTION: ")
1414
+ if(keyArr .contains("JURISDICTION SPECIFIC RESTRICTION CODE DESCRIPTION: ")) {
1415
+ }
1416
+ else {
1417
+
1418
+
1419
+
1420
+ valueArr.add(emptyDictionary["DCR"]!)
1421
+ keyArr.add("JURISDICTION SPECIFIC RESTRICTION CODE DESCRIPTION: ")
1422
+ }
1423
+ }
1424
+
1425
+ if((emptyDictionary["DCS"]) != nil) {
1426
+ passDict.updateValue(emptyDictionary["DCS"]!, forKey: "FAMILY NAME:")
1427
+ if(keyArr .contains("FAMILY NAME:")) {
1428
+ }
1429
+ else {
1430
+
1431
+ valueArr.add(emptyDictionary["DCS"]!)
1432
+ keyArr.add("FAMILY NAME:")
1433
+ }
1434
+
1435
+
1436
+ }
1437
+
1438
+ if((emptyDictionary["DCT"]) != nil) {
1439
+ passDict.updateValue(emptyDictionary["DCT"]!, forKey: "GIVEN NAME:")
1440
+ if(keyArr .contains("GIVEN NAME:")) {
1441
+ }
1442
+ else {
1443
+
1444
+ valueArr.add(emptyDictionary["DCT"]!)
1445
+ keyArr.add("GIVEN NAME:")
1446
+ }
1447
+
1448
+
1449
+ }
1450
+
1451
+ if((emptyDictionary["DCU"]) != nil) {
1452
+ passDict.updateValue(emptyDictionary["DCU"]!, forKey: "SUFFIX:")
1453
+ if(keyArr .contains("SUFFIX:")) {
1454
+ }
1455
+ else {
1456
+
1457
+ valueArr.add(emptyDictionary["DCU"]!)
1458
+ keyArr.add("SUFFIX:")
1459
+ }
1460
+
1461
+
1462
+ }
1463
+
1464
+ if((emptyDictionary["DDA"]) != nil) {
1465
+ passDict.updateValue(emptyDictionary["DDA"]!, forKey: "COMPLIANCE TYPE: ")
1466
+ if(keyArr .contains("COMPLIANCE TYPE: ")) {
1467
+ }
1468
+ else {
1469
+
1470
+
1471
+
1472
+ valueArr.add(emptyDictionary["DDA"]!)
1473
+ keyArr.add("COMPLIANCE TYPE: ")
1474
+ }
1475
+ }
1476
+
1477
+ if((emptyDictionary["DDB"]) != nil) {
1478
+ passDict.updateValue(emptyDictionary["DDB"]!, forKey: "CARD REVISION DATE: ")
1479
+ if(keyArr .contains("CARD REVISION DATE: ")) {
1480
+ }
1481
+ else {
1482
+
1483
+
1484
+ var str = emptyDictionary["DDB"]
1485
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1486
+
1487
+ str?.insert("/", at: index!)
1488
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1489
+ str?.insert("/", at: index1!)
1490
+
1491
+ valueArr.add(str as Any)
1492
+
1493
+ keyArr.add("CARD REVISION DATE: ")
1494
+ }
1495
+ }
1496
+
1497
+ if((emptyDictionary["DDC"]) != nil) {
1498
+ passDict.updateValue(emptyDictionary["DDC"]!, forKey: "HAZMAT ENDORSEMENT EXPIRY DATE: ")
1499
+ if(keyArr .contains("HAZMAT ENDORSEMENT EXPIRY DATE: ")) {
1500
+ }
1501
+ else {
1502
+
1503
+ var str = emptyDictionary["DDC"]
1504
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1505
+
1506
+ str?.insert("/", at: index!)
1507
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1508
+ str?.insert("/", at: index1!)
1509
+
1510
+ valueArr.add(str as Any)
1511
+
1512
+ keyArr.add("HAZMAT ENDORSEMENT EXPIRY DATE: ")
1513
+ }
1514
+ }
1515
+
1516
+ if((emptyDictionary["DDD"]) != nil) {
1517
+ passDict.updateValue(emptyDictionary["DDD"]!, forKey: "LIMITED DURATION DOCUMENT INDICATOR: ")
1518
+ if(keyArr .contains("LIMITED DURATION DOCUMENT INDICATOR: ")) {
1519
+ }
1520
+ else {
1521
+
1522
+ valueArr.add(emptyDictionary["DDD"]!)
1523
+ keyArr.add("LIMITED DURATION DOCUMENT INDICATOR: ")
1524
+ }
1525
+ }
1526
+
1527
+ if((emptyDictionary["DDE"]) != nil) {
1528
+ passDict.updateValue(emptyDictionary["DDE"]!, forKey: "FAMILY NAMES TRUNCATION: ")
1529
+ if(keyArr .contains("FAMILY NAMES TRUNCATION: ")) {
1530
+ }
1531
+ else {
1532
+
1533
+ valueArr.add(emptyDictionary["DDE"]!)
1534
+ keyArr.add("FAMILY NAMES TRUNCATION: ")
1535
+ }
1536
+ }
1537
+
1538
+ if((emptyDictionary["DDF"]) != nil) {
1539
+ passDict.updateValue(emptyDictionary["DDF"]!, forKey: "FIRST NAMES TRUNCATION: ")
1540
+ if(keyArr .contains("FIRST NAMES TRUNCATION: ")) {
1541
+ }
1542
+ else {
1543
+
1544
+ valueArr.add(emptyDictionary["DDF"]!)
1545
+ keyArr.add("FIRST NAMES TRUNCATION: ")
1546
+ }
1547
+ }
1548
+
1549
+ if((emptyDictionary["DDG"]) != nil) {
1550
+ passDict.updateValue(emptyDictionary["DDG"]!, forKey: "MIDDLE NAMES TRUNCATION: ")
1551
+ if(keyArr .contains("MIDDLE NAMES TRUNCATION: ")) {
1552
+ }
1553
+ else {
1554
+
1555
+ valueArr.add(emptyDictionary["DDG"]!)
1556
+ keyArr.add("MIDDLE NAMES TRUNCATION: ")
1557
+ }
1558
+ }
1559
+
1560
+ if((emptyDictionary["DDH"]) != nil) {
1561
+ passDict.updateValue(emptyDictionary["DDH"]!, forKey: "UNDER 18 UNTIL: ")
1562
+ if(keyArr .contains("UNDER 18 UNTIL: ")) {
1563
+ }
1564
+ else {
1565
+ var dstr = emptyDictionary["DDH"]
1566
+ let index = dstr?.index((dstr?.startIndex)!, offsetBy: 2, limitedBy: (dstr?.endIndex)!)
1567
+
1568
+ dstr?.insert("/", at: index!)
1569
+ let index1 = dstr?.index((dstr?.startIndex)!, offsetBy: 5, limitedBy: (dstr?.endIndex)!)
1570
+ dstr?.insert("/", at: index1!)
1571
+ valueArr.add(dstr as Any)
1572
+ keyArr.add("UNDER 18 UNTIL:")
1573
+
1574
+ }
1575
+ }
1576
+
1577
+ if((emptyDictionary["DDI"]) != nil) {
1578
+ passDict.updateValue(emptyDictionary["DDI"]!, forKey: "UNDER 19 UNTIL: ")
1579
+ if(keyArr .contains("UNDER 19 UNTIL: ")) {
1580
+ }
1581
+ else {
1582
+ var str = emptyDictionary["DDI"]
1583
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1584
+
1585
+ str?.insert("/", at: index!)
1586
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1587
+ str?.insert("/", at: index1!)
1588
+
1589
+ valueArr.add(str as Any)
1590
+ keyArr.add("UNDER 19 UNTIL:")
1591
+ }
1592
+ }
1593
+
1594
+ if((emptyDictionary["DDJ"]) != nil) {
1595
+ passDict.updateValue(emptyDictionary["DDJ"]!, forKey: "UNDER 21 UNTIL: ")
1596
+ if(keyArr .contains("UNDER 21 UNTIL: ")) {
1597
+ }
1598
+ else {
1599
+ var str = emptyDictionary["DDJ"]
1600
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1601
+
1602
+ str?.insert("/", at: index!)
1603
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1604
+ str?.insert("/", at: index1!)
1605
+
1606
+ valueArr.add(str as Any)
1607
+ keyArr.add("UNDER 21 UNTIL: ")
1608
+ }
1609
+ }
1610
+
1611
+ if((emptyDictionary["DDK"]) != nil) {
1612
+ passDict.updateValue(emptyDictionary["DDK"]!, forKey: "ORGAN DONOR INDICATOR: ")
1613
+ if(keyArr .contains("ORGAN DONOR INDICATOR: ")) {
1614
+ }
1615
+ else {
1616
+
1617
+ valueArr.add(emptyDictionary["DDK"]!)
1618
+ keyArr.add("ORGAN DONOR INDICATOR: ")
1619
+ }
1620
+ }
1621
+
1622
+ if((emptyDictionary["DDL"]) != nil) {
1623
+ passDict.updateValue(emptyDictionary["DDL"]!, forKey: "VETERAN INDICATOR: ")
1624
+ if(keyArr .contains("VETERAN INDICATOR: ")) {
1625
+ }
1626
+ else {
1627
+
1628
+ valueArr.add(emptyDictionary["DDL"]!)
1629
+ keyArr.add("VETERAN INDICATOR: ")
1630
+ }
1631
+
1632
+
1633
+ }
1634
+
1635
+ if((emptyDictionary["PAA"]) != nil) {
1636
+ passDict.updateValue(emptyDictionary["PAA"]!, forKey: "PERMIT CLASSIFICATION CODE: ")
1637
+ if(keyArr .contains("PERMIT CLASSIFICATION CODE: ")) {
1638
+ }
1639
+ else {
1640
+
1641
+ valueArr.add(emptyDictionary["PAA"]!)
1642
+ keyArr.add("PERMIT CLASSIFICATION CODE: ")
1643
+ }
1644
+
1645
+
1646
+ }
1647
+
1648
+ if((emptyDictionary["PAB"]) != nil) {
1649
+ passDict.updateValue(emptyDictionary["PAB"]!, forKey: "PERMIT EXPIRATION DATE: ")
1650
+ if(keyArr .contains("PERMIT EXPIRATION DATE: ")) {
1651
+ }
1652
+ else {
1653
+
1654
+ valueArr.add(emptyDictionary["PAB"]!)
1655
+ keyArr.add("PERMIT EXPIRATION DATE: ")
1656
+ }
1657
+
1658
+
1659
+ }
1660
+
1661
+ if((emptyDictionary["PAC"]) != nil) {
1662
+ passDict.updateValue(emptyDictionary["PAC"]!, forKey: "PERMIT IDENTIFIER: ")
1663
+ if(keyArr .contains("PERMIT IDENTIFIER: ")) {
1664
+ }
1665
+ else {
1666
+
1667
+ valueArr.add(emptyDictionary["PAC"]!)
1668
+ keyArr.add("PERMIT IDENTIFIER: ")
1669
+ }
1670
+ }
1671
+
1672
+ if((emptyDictionary["PAD"]) != nil) {
1673
+ passDict.updateValue(emptyDictionary["PAD"]!, forKey: "PERMIT ISSUE DATE: ")
1674
+ if(keyArr .contains("PERMIT ISSUE DATE: ")) {
1675
+ }
1676
+ else {
1677
+ var str = emptyDictionary["PAD"]
1678
+ let index = str?.index((str?.startIndex)!, offsetBy: 2, limitedBy: (str?.endIndex)!)
1679
+
1680
+ str?.insert("/", at: index!)
1681
+ let index1 = str?.index((str?.startIndex)!, offsetBy: 5, limitedBy: (str?.endIndex)!)
1682
+ str?.insert("/", at: index1!)
1683
+
1684
+ valueArr.add(str as Any)
1685
+
1686
+ keyArr.add("PERMIT ISSUE DATE: ")
1687
+ }
1688
+ }
1689
+
1690
+ if((emptyDictionary["PAE"]) != nil) {
1691
+ passDict.updateValue(emptyDictionary["PAE"]!, forKey: "PERMIT RESTRICTION CODE: ")
1692
+ if(keyArr .contains("PERMIT RESTRICTION CODE: ")) {
1693
+ }
1694
+ else {
1695
+
1696
+ valueArr.add(emptyDictionary["PAE"]!)
1697
+ keyArr.add("PERMIT RESTRICTION CODE: ")
1698
+ }
1699
+
1700
+
1701
+ }
1702
+
1703
+ if((emptyDictionary["PAF"]) != nil) {
1704
+ passDict.updateValue(emptyDictionary["PAF"]!, forKey: "PERMIT ENDORSEMENT CODE: ")
1705
+ if(keyArr .contains("PERMIT ENDORSEMENT CODE: ")) {
1706
+ }
1707
+ else {
1708
+
1709
+ valueArr.add(emptyDictionary["PAF"]!)
1710
+ keyArr.add("PERMIT ENDORSEMENT CODE: ")
1711
+ }
1712
+
1713
+
1714
+ }
1715
+
1716
+ if((emptyDictionary["ZVA"]) != nil) {
1717
+ passDict.updateValue(emptyDictionary["ZVA"]!, forKey: "COURT RESTRICTION CODE: ")
1718
+ if(keyArr .contains("COURT RESTRICTION CODE: ")) {
1719
+ }
1720
+ else {
1721
+
1722
+ valueArr.add(emptyDictionary["ZVA"]!)
1723
+ keyArr.add("COURT RESTRICTION CODE: ")
1724
+ }
1725
+ }
1726
+
1727
+ if(emptyDictionary["DAC"] != nil || emptyDictionary["DAD"] != nil || emptyDictionary["DCS"] != nil || emptyDictionary["DAG"] != nil || emptyDictionary["DAI"] != nil || emptyDictionary["DAJ"] != nil || emptyDictionary["DAK"] != nil || emptyDictionary["DBA"] != nil) {
1728
+ return true
1729
+ }
1730
+ else {
1731
+ return false
1732
+ }
1733
+
1734
+ }
1735
+ }
1736
+
1737
+ extension ViewController: VideoCameraWrapperDelegate {
1738
+
1739
+ func isBothSideAvailable(_ isBothAvailable: Bool) {
1740
+ isbothSideAvailable = isBothAvailable
1741
+ accuraCameraWrapper?.cardSide(.FRONT_CARD_SCAN)
1742
+ }
1743
+
1744
+ func onUpdateLayout(_ frameSize: CGSize, _ borderRatio: Float) {
1745
+ var width: CGFloat = 0.0
1746
+ var height: CGFloat = 0.0
1747
+ if(isCheckScanOCR) {
1748
+ if(cardType != 2 && cardType != 3) {
1749
+ let orientastion = UIApplication.shared.statusBarOrientation
1750
+ if(orientastion == UIInterfaceOrientation.portrait) {
1751
+ width = frameSize.width
1752
+ height = frameSize.height
1753
+ // viewNavigationBar.backgroundColor = UIColor(hexString: accuraErrorCode["CameraScreen_Navigation_Color"] as! String)//UIColor(red: 231.0 / 255.0, green: 52.0 / 255.0, blue: 74.0 / 255.0, alpha: 1.0)
1754
+ } else {
1755
+
1756
+ self.viewNavigationBar.backgroundColor = .clear
1757
+ height = (((UIScreen.main.bounds.size.height - 100) * 5) / 5.6)
1758
+ width = (height / CGFloat(borderRatio))
1759
+ print("boreder ratio :- ", borderRatio)
1760
+ }
1761
+ print("layer", width)
1762
+ DispatchQueue.main.async {
1763
+ self._constant_width.constant = width
1764
+
1765
+ self._constant_height.constant = height
1766
+ }
1767
+
1768
+ }
1769
+
1770
+ }
1771
+
1772
+
1773
+ }
1774
+
1775
+ func dlPlateNumber(_ plateNumber: String!, andImageNumberPlate imageNumberPlate: UIImage!) {
1776
+ shareScanningListing["plate_number"] = plateNumber
1777
+ var results:[String: Any] = [:]
1778
+ var frontData:[String: Any] = [:]
1779
+ // var backData:[String: Any] = [:]
1780
+
1781
+ if let frontUri = AccurascanKyc.getImageUri(img: imageNumberPlate, name: nil) {
1782
+ results["front_img"] = frontUri
1783
+ }
1784
+ frontData["PlateNumber"] = plateNumber
1785
+ results["front_data"] = frontData
1786
+ // results["back_data"] = backData
1787
+ results["type"] = "DL_PLATE"
1788
+
1789
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
1790
+ self.dismiss(animated: true)
1791
+
1792
+ }
1793
+
1794
+ func resultData(_ resultmodel: ResultModel!) {
1795
+ AudioServicesPlaySystemSound(SystemSoundID(1315))
1796
+ if isbothSideAvailable {
1797
+ accuraCameraWrapper?.cardSide(.BACK_CARD_SCAN)
1798
+ if(resultmodel.arrayocrBackSideDataKey.count == 0) {
1799
+ flipAnimation()
1800
+ // playSound()
1801
+ return
1802
+ }
1803
+ }
1804
+
1805
+ var results:[String: Any] = [:]
1806
+ var frontData:[String: Any] = [:]
1807
+ var backData:[String: Any] = [:]
1808
+ var mrzData:[String: Any] = [:]
1809
+ if let faceUri = AccurascanKyc.getImageUri(img: resultmodel.faceImage, name: nil) {
1810
+ results["face"] = faceUri
1811
+ }
1812
+ if let frontUri = AccurascanKyc.getImageUri(img: resultmodel.frontSideImage, name: nil) {
1813
+ results["front_img"] = frontUri
1814
+ }
1815
+ if let backUri = AccurascanKyc.getImageUri(img: resultmodel.backSideImage, name: nil) {
1816
+ results["back_img"] = backUri
1817
+ }
1818
+ self.dictFaceDataFront = resultmodel.ocrFaceFrontData
1819
+ for data in dictFaceDataFront {
1820
+ if let k = data.key as? String {
1821
+ if k == "Signature" {
1822
+ if let base64img = data.value as? String {
1823
+ let dataDecoded : Data = Data(base64Encoded: base64img, options: .ignoreUnknownCharacters)!
1824
+ let decodedimage:UIImage = UIImage(data: dataDecoded)!
1825
+ if let sigUri = AccurascanKyc.getImageUri(img: decodedimage, name: nil) {
1826
+ frontData["signature"] = sigUri
1827
+ }
1828
+ }
1829
+ } else {
1830
+ frontData[k] = data.value as? String ?? data.value as? Int ?? ""
1831
+ }
1832
+ }
1833
+
1834
+ }
1835
+
1836
+ self.dictFaceDataBack = resultmodel.ocrFaceBackData
1837
+ for data in dictFaceDataBack {
1838
+ if let k = data.key as? String {
1839
+ if k == "Signature" {
1840
+ if let base64img = data.value as? String {
1841
+ let dataDecoded : Data = Data(base64Encoded: base64img, options: .ignoreUnknownCharacters)!
1842
+ let decodedimage:UIImage = UIImage(data: dataDecoded)!
1843
+ if let sigUri = AccurascanKyc.getImageUri(img: decodedimage, name: nil) {
1844
+ backData["signature"] = sigUri
1845
+ }
1846
+ }
1847
+ } else {
1848
+ backData[k] = data.value as? String ?? data.value as? Int ?? ""
1849
+ }
1850
+ }
1851
+
1852
+ }
1853
+
1854
+ self.dictSecuretyData = resultmodel.ocrSecurityData
1855
+ for data in dictSecuretyData {
1856
+ frontData[data.key as! String] = data.value as? String ?? data.value as? Int ?? ""
1857
+ }
1858
+
1859
+ self.arrFrontResultKey = resultmodel.arrayocrFrontSideDataKey as! [String]
1860
+ self.arrFrontResultValue = resultmodel.arrayocrFrontSideDataValue as! [String]
1861
+ for i in arrFrontResultKey.indices {
1862
+ if arrFrontResultKey[i] != "MRZ" {
1863
+ frontData[arrFrontResultKey[i]] = arrFrontResultValue[i]
1864
+ } else {
1865
+ self.shareScanningListing = resultmodel.shareScanningMRZListing
1866
+ let kK = shareScanningListing.allKeys
1867
+ let vV = shareScanningListing.allValues
1868
+ let dD : NSMutableDictionary = [:]
1869
+ for i in (0 ..< kK.count) {
1870
+ if (kK[i] as! String != "fontImageRotation") && (kK[i] as! String != "backImageRotation"){
1871
+ if kK[i] as! String == "birth" || kK[i] as! String == "expirationDate" || kK[i] as! String == "issuedate" || kK[i] as! String == "issueDate"{
1872
+ let daTE = date(toFormatedDate: (vV[i] as! String))
1873
+ dD.setValue(daTE, forKey: (kK[i] as? String)!)
1874
+ }else{
1875
+ dD.setValue(vV[i] as? String, forKey: (kK[i] as? String)!)
1876
+ }
1877
+ }
1878
+ }
1879
+ mrzData = dD as! [String : Any] //self.getMRZKeyValue()
1880
+ // mrzData["Other Id2"] = shareScanningListing["personalNumber2"]
1881
+ // mrzData["Document Type"] = shareScanningListing["passportType"]
1882
+ }
1883
+ }
1884
+
1885
+ self.arrBackResultKey = resultmodel.arrayocrBackSideDataKey as! [String]
1886
+ self.arrBackResultValue = resultmodel.arrayocrBackSideDataValue as! [String]
1887
+ for i in arrBackResultKey.indices {
1888
+ if arrBackResultKey[i] != "MRZ" {
1889
+ backData[arrBackResultKey[i]] = arrBackResultValue[i]
1890
+ } else {
1891
+ self.shareScanningListing = resultmodel.shareScanningMRZListing
1892
+ let kK = shareScanningListing.allKeys
1893
+ let vV = shareScanningListing.allValues
1894
+ let dD : NSMutableDictionary = [:]
1895
+ for i in (0 ..< kK.count) {
1896
+ if (kK[i] as! String != "fontImageRotation") && (kK[i] as! String != "backImageRotation"){
1897
+ if kK[i] as! String == "birth" || kK[i] as! String == "expirationDate" || kK[i] as! String == "issuedate" || kK[i] as! String == "issueDate"{
1898
+ let daTE = date(toFormatedDate: (vV[i] as! String))
1899
+ dD.setValue(daTE, forKey: (kK[i] as? String)!)
1900
+ }else{
1901
+ dD.setValue(vV[i] as? String, forKey: (kK[i] as? String)!)
1902
+ }
1903
+
1904
+ }
1905
+ }
1906
+ mrzData = dD as! [String : Any] //self.getMRZKeyValue()
1907
+ // mrzData["Other Id2"] = shareScanningListing["personalNumber2"]
1908
+ // mrzData["Document Type"] = shareScanningListing["passportType"]
1909
+ }
1910
+ }
1911
+
1912
+ results["front_data"] = frontData
1913
+ results["back_data"] = backData
1914
+ results["mrz_data"] = mrzData
1915
+ results["type"] = "OCR"
1916
+
1917
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
1918
+ self.dismiss(animated: true)
1919
+ }
1920
+
1921
+ func screenSound() {
1922
+ AudioServicesPlaySystemSound(SystemSoundID(1315))
1923
+ if !self.isflipanimation!{
1924
+ self.isflipanimation = true
1925
+ self.flipAnimation()
1926
+ }
1927
+
1928
+ }
1929
+
1930
+ func recognizeSucceedBarcode(_ message: String!, back BackSideImage: UIImage!, frontImage FrontImage: UIImage!, face FaceImage: UIImage!) {
1931
+ var results:[String: Any] = [:]
1932
+ var frontData:[String: Any] = [:]
1933
+ // var backData:[String: Any] = [:]
1934
+
1935
+ if FrontImage != nil {
1936
+ // imgViewFront = FrontImage
1937
+ if let frontUri = AccurascanKyc.getImageUri(img: FrontImage!, name: nil) {
1938
+ results["front_img"] = frontUri
1939
+ }
1940
+ }
1941
+ if BackSideImage != nil {
1942
+ // imgViewBack = BackSideImage
1943
+ if let frontUri = AccurascanKyc.getImageUri(img: BackSideImage!, name: nil) {
1944
+ results["back_img"] = frontUri
1945
+ }
1946
+ }
1947
+ if FaceImage != nil {
1948
+ if let frontUri = AccurascanKyc.getImageUri(img: FaceImage!, name: nil) {
1949
+ results["face"] = frontUri
1950
+ }
1951
+ // photoImage1 = FaceImage
1952
+ }
1953
+ if(isBarcodeEnabled){
1954
+ let isPDF = self.decodework(type: message)
1955
+ if(isPDF && isResultShow == false)
1956
+ {
1957
+
1958
+ isResultShow = true
1959
+ self.accuraCameraWrapper?.stopCamera()
1960
+ AudioServicesPlaySystemSound(1315)
1961
+ if(isPDF)
1962
+ {
1963
+ if cardType != 1 {
1964
+ results["type"] = "BARCODEPDF417"
1965
+ }
1966
+ let kArr = keyArr as! [String]
1967
+ let valArr = valueArr as! [String]
1968
+ for i in kArr.indices {
1969
+ frontData[kArr[i]] = valArr[i]
1970
+ }
1971
+ frontData["PDF417"] = message
1972
+ results["front_data"] = frontData
1973
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
1974
+ self.dismiss(animated: true)
1975
+ }
1976
+ else{
1977
+ results["type"] = "BARCODE"
1978
+ frontData["barcode"] = message
1979
+ }
1980
+ }
1981
+ else{
1982
+
1983
+ isResultShow = true
1984
+ // mainV.removeAlert()
1985
+ self.accuraCameraWrapper?.stopCamera()
1986
+ if(isPDF)
1987
+ {
1988
+ if cardType != 1 {
1989
+ results["type"] = "BARCODEPDF417"
1990
+ }
1991
+ let kArr = keyArr as! [String]
1992
+ let valArr = valueArr as! [String]
1993
+ for i in kArr.indices {
1994
+ frontData[kArr[i]] = valArr[i]
1995
+ }
1996
+ frontData["PDF417"] = message
1997
+ results["front_data"] = frontData
1998
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
1999
+ self.dismiss(animated: true)
2000
+ }
2001
+ else{
2002
+ results["type"] = "BARCODE"
2003
+ frontData["barcode"] = message
2004
+ results["front_data"] = frontData
2005
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
2006
+ self.dismiss(animated: true)
2007
+ }
2008
+ }
2009
+ // if(isPDF)
2010
+ // {
2011
+ // if cardType != 1 {
2012
+ // results["type"] = "BARCODEPDF417"
2013
+ // }
2014
+ // let kArr = keyArr as! [String]
2015
+ // let valArr = valueArr as! [String]
2016
+ // for i in kArr.indices {
2017
+ // frontData[kArr[i]] = valArr[i]
2018
+ // }
2019
+ // frontData["PDF417"] = message
2020
+ // }
2021
+ // else{
2022
+ // results["type"] = "BARCODE"
2023
+ // frontData["barcode"] = message
2024
+ // results["front_data"] = frontData
2025
+ // }
2026
+ // callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
2027
+ // self.dismiss(animated: true)
2028
+ }
2029
+ else{
2030
+ if(message != "") {
2031
+ // barcodeData = message
2032
+ }
2033
+ if(BackSideImage == nil) {
2034
+ frontData["barcode"] = message
2035
+ frontData["front_data"] = frontData
2036
+ DispatchQueue.main.async {
2037
+ self.accuraCameraWrapper?.cardSide(.BACK_CARD_SCAN)
2038
+ }
2039
+ self.flipAnimation()
2040
+
2041
+ } else if (FrontImage == nil) {
2042
+ self.accuraCameraWrapper?.cardSide(.FRONT_CARD_SCAN)
2043
+ self.flipAnimation()
2044
+ }else {
2045
+ let isPDF = self.decodework(type: message)
2046
+ if(isPDF)
2047
+ {
2048
+ if cardType != 1 {
2049
+ results["type"] = "BARCODEPDF417"
2050
+ }
2051
+ let kArr = keyArr as! [String]
2052
+ let valArr = valueArr as! [String]
2053
+ for i in kArr.indices {
2054
+ frontData[kArr[i]] = valArr[i]
2055
+ }
2056
+ frontData["PDF417"] = message
2057
+ }
2058
+ else{
2059
+ results["type"] = "BARCODE"
2060
+ frontData["barcode"] = message
2061
+ }
2062
+ if(isPDF && isResultShow == false)
2063
+ {
2064
+ if(isPDF)
2065
+ {
2066
+ if cardType != 1 {
2067
+ results["type"] = "BARCODEPDF417"
2068
+ }
2069
+ let kArr = keyArr as! [String]
2070
+ let valArr = valueArr as! [String]
2071
+ for i in kArr.indices {
2072
+ frontData[kArr[i]] = valArr[i]
2073
+ }
2074
+ frontData["PDF417"] = message
2075
+ }
2076
+ else{
2077
+ results["type"] = "BARCODE"
2078
+ frontData["barcode"] = message
2079
+ }
2080
+ isResultShow = true
2081
+ results["back_data"] = frontData
2082
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
2083
+ self.dismiss(animated: true)
2084
+ AudioServicesPlaySystemSound(1315)
2085
+
2086
+ }
2087
+ }
2088
+
2089
+ }
2090
+
2091
+ }
2092
+
2093
+ // func recognizeSucceedBarcode(_ message: String!){
2094
+ //
2095
+ // }
2096
+
2097
+
2098
+ func processedImage(_ image: UIImage!) {
2099
+ // _imageView.image = image
2100
+ }
2101
+
2102
+ func recognizeFailed(_ message: String!) {
2103
+ let alert = UIAlertController(title: "AccuraSDK", message: message, preferredStyle: .alert)
2104
+ let yesButton = UIAlertAction(title: "OK", style: .default) { _ in
2105
+ }
2106
+ alert.addAction(yesButton)
2107
+ self.present(alert, animated: true, completion: nil)
2108
+ }
2109
+
2110
+ func recognizeSucceed(_ scanedInfo: NSMutableDictionary!, recType: RecType, bRecDone: Bool, bFaceReplace: Bool, bMrzFirst: Bool, photoImage: UIImage, docFrontImage: UIImage!, docbackImage: UIImage!) {
2111
+
2112
+ var results:[String: Any] = [:]
2113
+ if(bMrzFirst)
2114
+ {
2115
+ if isBackSide!{
2116
+ if docbackImage != nil {
2117
+ if let frontUri = AccurascanKyc.getImageUri(img: docbackImage, name: nil) {
2118
+ results["back_img"] = frontUri
2119
+ }
2120
+ }
2121
+ documentImage = docbackImage
2122
+ if(docFrontImage != nil) {
2123
+ if let frontUri = AccurascanKyc.getImageUri(img: docFrontImage, name: nil) {
2124
+ results["front_img"] = frontUri
2125
+ }
2126
+ // self.docfrontImage = docFrontImage
2127
+ }
2128
+ }else{
2129
+ documentImage = nil
2130
+ if let frontUri = AccurascanKyc.getImageUri(img: docFrontImage, name: nil) {
2131
+ results["front_img"] = frontUri
2132
+ }
2133
+ self.docfrontImage = docFrontImage
2134
+
2135
+ }
2136
+ self.imageRotation(rotation: "BackImg")
2137
+ self.accuraCameraWrapper?.stopCamera()
2138
+ self._imageView.image = nil
2139
+
2140
+ AudioServicesPlaySystemSound(1315)
2141
+
2142
+ self.shareScanningListing = scanedInfo
2143
+ let shareScanningListing: NSMutableDictionary = self.shareScanningListing
2144
+ if documentImage != nil{
2145
+ shareScanningListing["documentImage"] = documentImage?.jpegData(compressionQuality: 1.0)
2146
+ }
2147
+ shareScanningListing["docfrontImage"] = docfrontImage?.jpegData(compressionQuality: 1.0)
2148
+ shareScanningListing["fontImageRotation"] = frontImageRotation
2149
+ shareScanningListing["backImageRotation"] = backImageRotation
2150
+ var mrzData:[String: String] = [:]
2151
+ if let frontUri = AccurascanKyc.getImageUri(img: photoImage, name: nil){
2152
+ results["face"] = frontUri
2153
+ }
2154
+ let kK = shareScanningListing.allKeys
2155
+ let vV = shareScanningListing.allValues
2156
+ let dD : NSMutableDictionary = [:]
2157
+ for i in (0 ..< kK.count) {
2158
+ if (kK[i] as! String != "fontImageRotation") && (kK[i] as! String != "backImageRotation"){
2159
+ if kK[i] as! String == "birth" || kK[i] as! String == "expirationDate" || kK[i] as! String == "issuedate" || kK[i] as! String == "issueDate"{
2160
+ let daTE = date(toFormatedDate: (vV[i] as! String))
2161
+ dD.setValue(daTE, forKey: (kK[i] as? String)!)
2162
+ }else{
2163
+ dD.setValue(vV[i] as? String, forKey: (kK[i] as? String)!)
2164
+ }
2165
+ }
2166
+ }
2167
+ print("\(shareScanningListing)")
2168
+ mrzData = dD as! [String : String]//self.getMRZKeyValue()
2169
+ results["mrz_data"] = mrzData
2170
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
2171
+ self.dismiss(animated: true)
2172
+ }
2173
+ else{
2174
+ countface += 1
2175
+ if !isBackSide!{
2176
+ if(countface > 2)
2177
+ {
2178
+ countface = 0
2179
+ self.docfrontImage = self._imageView.image
2180
+ self.imageRotation(rotation: "FrontImage")
2181
+ isBackSide = true
2182
+ self.flipAnimation()
2183
+ // return
2184
+ }
2185
+ }
2186
+ else{
2187
+ return
2188
+ }
2189
+ }
2190
+ }
2191
+
2192
+
2193
+ func recognizSuccessBankCard(_ cardDetail: NSMutableDictionary!, andBankCardImage bankCardImage: UIImage!) {
2194
+ var results:[String: Any] = [:]
2195
+ var frontData:[String: Any] = [:]
2196
+ // let backData:[String: Any] = [:]
2197
+ if let frontUri = AccurascanKyc.getImageUri(img: bankCardImage, name: nil) {
2198
+ results["front_img"] = frontUri
2199
+ }
2200
+ for data in cardDetail {
2201
+ frontData[data.key as! String] = data.value as? String ?? data.value as? Int ?? ""
2202
+ }
2203
+ results["front_data"] = frontData
2204
+ // results["back_data"] = backData
2205
+ results["type"] = "BANKCARD"
2206
+
2207
+ callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
2208
+ self.dismiss(animated: true)
2209
+ // let vc : ShowResultVC = self.storyboard?.instantiateViewController(withIdentifier: "ShowResultVC") as! ShowResultVC
2210
+ // vc.scannedData = cardDetail
2211
+ // vc.pageType = .BankCard
2212
+ // vc.bankCardImage = bankCardImage
2213
+ // self.navigationController?.pushViewController(vc, animated: true)
2214
+ }
2215
+
2216
+ func matchedItem(_ image: UIImage!, isCardSide1 cs: Bool, isBack b: Bool, isFront f: Bool, imagePhoto imgp: UIImage!, imageResult: UIImage!) {
2217
+ if f == true{
2218
+ imgViewCardFront = imageResult
2219
+ }else{
2220
+ imgViewCard = imageResult
2221
+ }
2222
+ isCardSide = cs
2223
+ isBack = b
2224
+ isFront = f
2225
+ }
2226
+
2227
+
2228
+ func passDataOtherViewController(){
2229
+
2230
+ }
2231
+
2232
+ func imageRotation(rotation: String) {
2233
+ var strRotation = ""
2234
+ if UIDevice.current.orientation == .landscapeRight {
2235
+ strRotation = "Right"
2236
+ } else if UIDevice.current.orientation == .landscapeLeft {
2237
+ strRotation = "Left"
2238
+ }
2239
+ if rotation == "FrontImg" {
2240
+ frontImageRotation = strRotation
2241
+ } else if rotation == "BackImg" {
2242
+ backImageRotation = strRotation
2243
+ } else {
2244
+ frontImageRotation = strRotation
2245
+ }
2246
+ }
2247
+ func reco_msg(_ message: String!) {
2248
+ var msg = String();
2249
+ if(message == ACCURA_ERROR_CODE_MOTION) {
2250
+ if accuraErrorCode["ACCURA_ERROR_CODE_MOTION"] != nil{
2251
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_MOTION"] as! String
2252
+
2253
+ }else{
2254
+ msg = "Keep Document Steady";
2255
+ }
2256
+ } else if(message == ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME) {
2257
+ if accuraErrorCode["ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME"] != nil{
2258
+
2259
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME"] as! String
2260
+
2261
+ }else{
2262
+ msg = "Keep document in frame";
2263
+ }
2264
+ } else if(message == ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME) {
2265
+ if accuraErrorCode["ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME"] != nil{
2266
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME"] as! String
2267
+
2268
+ }else{
2269
+ msg = "Bring card near to frame";
2270
+ }
2271
+ } else if(message == ACCURA_ERROR_CODE_PROCESSING) {
2272
+ if accuraErrorCode["ACCURA_ERROR_CODE_PROCESSING"] != nil{
2273
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_PROCESSING"] as! String
2274
+
2275
+ }else{
2276
+ msg = "Processing...";
2277
+ }
2278
+ } else if(message == ACCURA_ERROR_CODE_BLUR_DOCUMENT) {
2279
+ if accuraErrorCode["ACCURA_ERROR_CODE_BLUR_DOCUMENT"] != nil{
2280
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_BLUR_DOCUMENT"] as! String
2281
+
2282
+ }else{
2283
+ msg = "Blur detect in document";
2284
+ }
2285
+ } else if(message == ACCURA_ERROR_CODE_FACE_BLUR) {
2286
+ if accuraErrorCode["ACCURA_ERROR_CODE_FACE_BLUR"] != nil{
2287
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_FACE_BLUR"] as! String
2288
+
2289
+ }else{
2290
+ msg = "Blur detected over face";
2291
+ }
2292
+ } else if(message == ACCURA_ERROR_CODE_GLARE_DOCUMENT) {
2293
+ if accuraErrorCode["ACCURA_ERROR_CODE_GLARE_DOCUMENT"] != nil{
2294
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_GLARE_DOCUMENT"] as! String
2295
+
2296
+ }else{
2297
+ msg = "Glare detect in document";
2298
+ }
2299
+ } else if(message == ACCURA_ERROR_CODE_HOLOGRAM) {
2300
+ if accuraErrorCode["ACCURA_ERROR_CODE_HOLOGRAM"] != nil{
2301
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_HOLOGRAM"] as! String
2302
+
2303
+ }else{
2304
+ msg = "Hologram Detected";
2305
+ }
2306
+ } else if(message == ACCURA_ERROR_CODE_DARK_DOCUMENT) {
2307
+ if accuraErrorCode["ACCURA_ERROR_CODE_DARK_DOCUMENT"] != nil{
2308
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_DARK_DOCUMENT"] as! String
2309
+
2310
+ }else{
2311
+ msg = "Low lighting detected";
2312
+ }
2313
+ } else if(message == ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT) {
2314
+ if accuraErrorCode["ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT"] != nil{
2315
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT"] as! String
2316
+
2317
+ }else{
2318
+ msg = "Can not accept Photo Copy Document";
2319
+ }
2320
+ } else if(message == ACCURA_ERROR_CODE_FACE) {
2321
+ if accuraErrorCode["ACCURA_ERROR_CODE_FACE"] != nil{
2322
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_FACE"] as! String
2323
+
2324
+ }else{
2325
+ msg = "Face not detected";
2326
+ }
2327
+ } else if(message == ACCURA_ERROR_CODE_MRZ) {
2328
+ if accuraErrorCode["ACCURA_ERROR_CODE_MRZ"] != nil{
2329
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_MRZ"] as! String
2330
+
2331
+ }else{
2332
+ msg = "MRZ not detected";
2333
+ }
2334
+ } else if(message == ACCURA_ERROR_CODE_PASSPORT_MRZ) {
2335
+ if accuraErrorCode["ACCURA_ERROR_CODE_PASSPORT_MRZ"] != nil{
2336
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_PASSPORT_MRZ"] as! String
2337
+
2338
+ }else{
2339
+ msg = "Passport MRZ not detected";
2340
+ }
2341
+ } else if(message == ACCURA_ERROR_CODE_ID_MRZ) {
2342
+ if accuraErrorCode["ACCURA_ERROR_CODE_ID_MRZ"] != nil{
2343
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_ID_MRZ"] as! String
2344
+
2345
+ }else{
2346
+ msg = "ID MRZ not detected"
2347
+ }
2348
+ } else if(message == ACCURA_ERROR_CODE_VISA_MRZ) {
2349
+ if accuraErrorCode["ACCURA_ERROR_CODE_VISA_MRZ"] != nil{
2350
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_VISA_MRZ"] as! String
2351
+
2352
+ }else{
2353
+ msg = "Visa MRZ not detected"
2354
+ }
2355
+ }else if(message == ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE) {
2356
+ if accuraErrorCode["ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE"] != nil{
2357
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE"] as! String
2358
+
2359
+ }else{
2360
+ msg = "Document is upside down. Place it properly"
2361
+ }
2362
+ }else if(message == ACCURA_ERROR_CODE_WRONG_SIDE) {
2363
+ if accuraErrorCode["ACCURA_ERROR_CODE_WRONG_SIDE"] != nil{
2364
+ msg = accuraErrorCode["ACCURA_ERROR_CODE_WRONG_SIDE"] as! String
2365
+
2366
+ }else{
2367
+ msg = "Scanning wrong side of Document"
2368
+ }
2369
+ }else {
2370
+ msg = message;
2371
+ }
2372
+ lblOCRMsg.text = msg
2373
+ }
2374
+
2375
+
2376
+
2377
+ func reco_titleMessage(_ messageCode: Int32) {
2378
+ print("msgcode:- ",messageCode)
2379
+ switch messageCode {
2380
+ case SCAN_TITLE_OCR_FRONT:
2381
+ if accuraTitleMsg["SCAN_TITLE_OCR_FRONT"] != nil {
2382
+ var frontMsg = accuraTitleMsg["SCAN_TITLE_OCR_FRONT"] as? String;
2383
+ frontMsg = frontMsg!.appending(docName)
2384
+ _lblTitle.text = frontMsg
2385
+ break
2386
+ }else{
2387
+ var frontMsg = "Scan Front side of ";
2388
+ frontMsg = frontMsg.appending(docName)
2389
+ _lblTitle.text = frontMsg
2390
+ break
2391
+ }
2392
+ case SCAN_TITLE_OCR_BACK:
2393
+
2394
+ if accuraTitleMsg["SCAN_TITLE_OCR_BACK"] != nil {
2395
+ var backMsg = accuraTitleMsg["SCAN_TITLE_OCR_BACK"] as? String;
2396
+ backMsg = backMsg!.appending(docName)
2397
+ self._lblTitle.text = backMsg
2398
+
2399
+ break
2400
+ }else{
2401
+ var backMsg = "Scan Back side of ";
2402
+ backMsg = backMsg.appending(docName)
2403
+ DispatchQueue.main.async {
2404
+ self._lblTitle.text = backMsg
2405
+ }
2406
+ break
2407
+ }
2408
+ case SCAN_TITLE_OCR:
2409
+ if accuraTitleMsg["SCAN_TITLE_OCR"] != nil {
2410
+ var backMsg = accuraTitleMsg["SCAN_TITLE_OCR"] as? String;
2411
+ backMsg = backMsg!.appending(docName)
2412
+ _lblTitle.text = backMsg
2413
+ break
2414
+ }else{
2415
+ var backMsg = "Scan ";
2416
+ backMsg = backMsg.appending(docName)
2417
+ _lblTitle.text = backMsg
2418
+ break
2419
+ }
2420
+
2421
+ case SCAN_TITLE_MRZ_PDF417_FRONT:
2422
+ if accuraTitleMsg["SCAN_TITLE_MRZ_PDF417_FRONT"] != nil {
2423
+ _lblTitle.text = accuraTitleMsg["SCAN_TITLE_MRZ_PDF417_FRONT"] as? String;
2424
+ break
2425
+ }else{
2426
+ _lblTitle.text = "Scan Front Side of Document"
2427
+ break
2428
+ }
2429
+ case SCAN_TITLE_MRZ_PDF417_BACK:
2430
+ if accuraTitleMsg["SCAN_TITLE_MRZ_PDF417_BACK"] != nil {
2431
+ DispatchQueue.main.async {
2432
+ self._lblTitle.text = self.accuraTitleMsg["SCAN_TITLE_MRZ_PDF417_BACK"] as? String;
2433
+
2434
+ }
2435
+ break
2436
+ }else{
2437
+ DispatchQueue.main.async {
2438
+ self._lblTitle.text = "Scan Back Side of Document"
2439
+
2440
+ }
2441
+ break
2442
+ }
2443
+
2444
+ case SCAN_TITLE_DLPLATE:
2445
+ if accuraTitleMsg["SCAN_TITLE_DLPLATE"] != nil {
2446
+
2447
+ _lblTitle.text = accuraTitleMsg["SCAN_TITLE_DLPLATE"] as? String;
2448
+ break
2449
+ }else{
2450
+ _lblTitle.text = "Scan Number plate"
2451
+ break
2452
+ }
2453
+
2454
+ case SCAN_TITLE_BARCODE:
2455
+ if accuraTitleMsg["SCAN_TITLE_BARCODE"] != nil {
2456
+ _lblTitle.text = accuraTitleMsg["SCAN_TITLE_BARCODE"] as? String;
2457
+ break
2458
+ }else{
2459
+ _lblTitle.text = "Scan Barcode"
2460
+ break
2461
+ }
2462
+
2463
+ case SCAN_TITLE_BANKCARD:
2464
+ if accuraTitleMsg["SCAN_TITLE_BANKCARD"] != nil {
2465
+ _lblTitle.text = accuraTitleMsg["SCAN_TITLE_BANKCARD"] as? String;
2466
+ break
2467
+ }else{
2468
+ _lblTitle.text = "Scan BankCard"
2469
+ break
2470
+ }
2471
+ default:
2472
+ break
2473
+ }
2474
+ }
2475
+
2476
+ func getMRZKeyValue() -> [String: String] {
2477
+ var mrzData:[String: String] = [:]
2478
+ print("\(shareScanningListing)")
2479
+ if let line = shareScanningListing["lines"] as? String {
2480
+ mrzData["MRZ"] = line
2481
+
2482
+ }
2483
+ if let givenname = shareScanningListing["givenname"] as? String {
2484
+ mrzData["First Name"] = givenname
2485
+ } else if let givenname = shareScanningListing["givenNames"] as? String {
2486
+ mrzData["First Name"] = givenname
2487
+ }
2488
+
2489
+ if let surname = shareScanningListing["surname"] as? String {
2490
+ mrzData["Last Name"] = surname
2491
+
2492
+ } else if let surname = shareScanningListing["surName"] as? String {
2493
+ mrzData["Last Name"] = surname
2494
+
2495
+ }
2496
+
2497
+ if let docnumber = shareScanningListing["passportNumber"] as? String {
2498
+ mrzData["Document No."] = docnumber
2499
+
2500
+ } else if let docnumber = shareScanningListing["docNumber"] as? String {
2501
+ mrzData["Document No."] = docnumber
2502
+
2503
+ }
2504
+ if let documentType = shareScanningListing["passportType"] as? String {
2505
+ mrzData["Document Type"] = documentType
2506
+
2507
+ } else if let docnumber = shareScanningListing["docNumber"] as? String {
2508
+ mrzData["Document No."] = docnumber
2509
+
2510
+ }
2511
+
2512
+ if let docchecksum = shareScanningListing["docchecksum"] as? String {
2513
+ mrzData["Document check No."] = docchecksum
2514
+ } else if let docchecksum = shareScanningListing["docCheckSum"] as? String {
2515
+ mrzData["Document check No."] = docchecksum
2516
+ }
2517
+
2518
+ if let correctdocchecksum = shareScanningListing["correctdocchecksum"] as? String {
2519
+ mrzData["Correct Document check No."] = correctdocchecksum
2520
+
2521
+ } else if let correctdocchecksum = shareScanningListing["correctPassportChecksum"] as? String {
2522
+ mrzData["Correct Document check No."] = correctdocchecksum
2523
+
2524
+ }
2525
+ if let contri = shareScanningListing["country"] as? String {
2526
+ mrzData["Country"] = contri
2527
+
2528
+ }
2529
+ if let nationality = shareScanningListing["nationality"] as? String {
2530
+ mrzData["Nationality"] = nationality
2531
+
2532
+ }
2533
+ if let birth = shareScanningListing["birth"] as? String {
2534
+ mrzData["Date of Birth"] = date(toFormatedDate: birth)
2535
+
2536
+ }
2537
+ if let birthchecksum = shareScanningListing["birthchecksum"] as? String {
2538
+ mrzData["Birth Check No."] = birthchecksum
2539
+
2540
+ } else if let birthchecksum = shareScanningListing["BirthChecksum"] as? String {
2541
+ mrzData["Birth Check No."] = birthchecksum
2542
+
2543
+ }
2544
+ if let correctbirthchecksum = shareScanningListing["correctbirthchecksum"] as? String {
2545
+ mrzData["Correct Birth Check No."] = correctbirthchecksum
2546
+
2547
+ } else if let correctbirthchecksum = shareScanningListing["correctBirthChecksum"] as? String {
2548
+ mrzData["Correct Birth Check No."] = correctbirthchecksum
2549
+
2550
+ }
2551
+ if let expirationdate = shareScanningListing["expirationdate"] as? String {
2552
+ mrzData["Date of Expiry"] = date(toFormatedDate: expirationdate)
2553
+
2554
+ } else if let expirationdate = shareScanningListing["expirationDate"] as? String {
2555
+ mrzData["Date of Expiry"] = date(toFormatedDate: expirationdate)
2556
+
2557
+ }
2558
+ if let expirationchecksum = shareScanningListing["expirationchecksum"] as? String {
2559
+ mrzData["Expiration Check No."] = expirationchecksum
2560
+
2561
+ } else if let expirationchecksum = shareScanningListing["expirationChecksum"] as? String {
2562
+ mrzData["Expiration Check No."] = expirationchecksum
2563
+
2564
+ }
2565
+ if let correctexpirationchecksum = shareScanningListing["correctexpirationchecksum"] as? String {
2566
+ mrzData["Correct Expiration Check No."] = correctexpirationchecksum
2567
+
2568
+ } else if let correctexpirationchecksum = shareScanningListing["correctExpirationChecksum"] as? String {
2569
+ mrzData["Correct Expiration Check No."] = correctexpirationchecksum
2570
+
2571
+ }
2572
+ if let issuedate = shareScanningListing["issuedate"] as? String {
2573
+ mrzData["Date Of Issue"] = date(toFormatedDate: issuedate)
2574
+
2575
+ } else if let issuedate = shareScanningListing["issueDate"] as? String {
2576
+ mrzData["Date Of Issue"] = date(toFormatedDate: issuedate)
2577
+
2578
+ }
2579
+ if let departmentnumber = shareScanningListing["departmentnumber"] as? String {
2580
+ mrzData["Department No."] = departmentnumber
2581
+
2582
+ }else if let departmentnumber = shareScanningListing["departmentNumber"] as? String {
2583
+ mrzData["Department No."] = departmentnumber
2584
+
2585
+ }
2586
+ if let otherid = shareScanningListing["otherid"] as? String {
2587
+ mrzData["Other ID"] = otherid
2588
+
2589
+ } else if let otherid = shareScanningListing["personalNumber"] as? String {
2590
+ mrzData["Other ID"] = otherid
2591
+
2592
+ }
2593
+ if let otherid = shareScanningListing["otherid"] as? String {
2594
+ mrzData["Other ID2"] = otherid
2595
+
2596
+ } else if let otherid = shareScanningListing["personalNumber2"] as? String {
2597
+ if otherid != "" {
2598
+ mrzData["Other ID2"] = otherid
2599
+ }
2600
+ }
2601
+
2602
+
2603
+ if let otheridchecksum = shareScanningListing["personalNumberChecksum"] as? String {
2604
+ mrzData["Other ID Check"] = otheridchecksum
2605
+
2606
+ } else if let otheridchecksum = shareScanningListing["otherIdChecksum"] as? String {
2607
+ mrzData["Other ID Check"] = otheridchecksum
2608
+
2609
+ }
2610
+ if let secondrowchecksum = shareScanningListing["secondrowchecksum"] as? String {
2611
+ mrzData["Second Row Check No."] = secondrowchecksum
2612
+
2613
+ } else if let secondrowchecksum = shareScanningListing["secondRowChecksum"] as? String {
2614
+ mrzData["Second Row Check No."] = secondrowchecksum
2615
+
2616
+ }
2617
+ if let correctsecondrowchecksum = shareScanningListing["correctsecondrowchecksum"] as? String {
2618
+ mrzData["Correct Second Row Check No."] = correctsecondrowchecksum
2619
+
2620
+ } else if let correctsecondrowchecksum = shareScanningListing["correctSecondrowChecksum"] as? String {
2621
+ mrzData["Correct Second Row Check No."] = correctsecondrowchecksum
2622
+
2623
+ }
2624
+ mrzData["sex"] = ""
2625
+ if let sx = shareScanningListing["sex"] as? String {
2626
+ if sx == "F" {
2627
+ mrzData["sex"] = "FEMALE"
2628
+ } else if sx == "M" {
2629
+ mrzData["sex"] = "MALE"
2630
+ } else if sx == "X"{
2631
+ mrzData["sex"] = "OTHER"
2632
+ }else{
2633
+ mrzData["sex"] = sx
2634
+ }
2635
+ }
2636
+
2637
+ return mrzData
2638
+ }
2639
+
2640
+ func date(toFormatedDate dateStr: String?) -> String? {
2641
+ let dateFormatter = DateFormatter()
2642
+ dateFormatter.dateFormat = "yyMMdd"
2643
+ let date: Date? = dateFormatter.date(from: dateStr ?? "")
2644
+ dateFormatter.dateFormat = "dd-MM-yy"
2645
+ if let date = date {
2646
+ return dateFormatter.string(from: date)
2647
+ }
2648
+ return nil
2649
+ }
2650
+
2651
+ func date(to dateStr: String?) -> String? {
2652
+ // Convert string to date object
2653
+ let dateFormat = DateFormatter()
2654
+ dateFormat.dateFormat = "yyMMdd"
2655
+ let date: Date? = dateFormat.date(from: dateStr ?? "")
2656
+ dateFormat.dateFormat = "yy-MM-dd"
2657
+ if let date = date {
2658
+ return dateFormat.string(from: date)
2659
+ }
2660
+ return nil
2661
+ }
2662
+ }
2663
+
2664
+ extension UIColor {
2665
+ convenience init(hexString: String) {
2666
+ let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
2667
+ var int = UInt64()
2668
+ Scanner(string: hex).scanHexInt64(&int)
2669
+ let a, r, g, b: UInt64
2670
+ switch hex.count {
2671
+ case 3: // RGB (12-bit)
2672
+ (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
2673
+ case 6: // RGB (24-bit)
2674
+ (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
2675
+ case 8: // ARGB (32-bit)
2676
+ (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
2677
+ default:
2678
+ (a, r, g, b) = (255, 0, 0, 0)
2679
+ }
2680
+ self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
2681
+ }
2682
+
2683
+ //MARK:- Custom
2684
+
2685
+ }
2686
+