Manos Chorianopoulos

add ContextualViewController

......@@ -14,6 +14,7 @@
1E108A9628A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */; };
1E2966EA2837A21D00F83FAC /* RSBarcodes_Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 1E2966E92837A21D00F83FAC /* RSBarcodes_Swift */; };
1E74838D28378AF40042A589 /* CouponBarcodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */; };
1E87A9EF28C2021200C79F90 /* ContextualViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */; };
1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; };
1EA2BB792865BFE8003F2AB0 /* InboxTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */; };
1EB236AB28816B680063777A /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB236AA28816B680063777A /* ShareViewController.swift */; };
......@@ -169,6 +170,7 @@
1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = pf_square_sans_pro_bold.ttf; sourceTree = "<group>"; };
1E108A9728A3FA9B0008B8E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewController.swift; sourceTree = "<group>"; };
1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextualViewController.swift; sourceTree = "<group>"; };
1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; };
1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxTableViewCell.swift; sourceTree = "<group>"; };
1EB236AA28816B680063777A /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; };
......@@ -449,6 +451,7 @@
E6A77A35282BB4CB0045BBA8 /* MakeItAPresentViewController.swift */,
E6A7785A282933E40045BBA8 /* Helpers */,
E6A77861282933E50045BBA8 /* Main.storyboard */,
1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */,
1EB236AA28816B680063777A /* ShareViewController.swift */,
1EB236AC28816C560063777A /* NumberPopupViewController.swift */,
1EB236AE28816CAB0063777A /* NumbersTableViewCell.swift */,
......@@ -874,6 +877,7 @@
E6A778E2282933E60045BBA8 /* CouponsViewController.swift in Sources */,
E6A77930282933E70045BBA8 /* UIImageView+AFNetworking.m in Sources */,
E6A77900282933E60045BBA8 /* WLInboxItemViewController.m in Sources */,
1E87A9EF28C2021200C79F90 /* ContextualViewController.swift in Sources */,
E6A7793E282933E70045BBA8 /* AFHTTPSessionManager.m in Sources */,
E6A77933282933E70045BBA8 /* UIButton+AFNetworking.m in Sources */,
E6A77919282933E60045BBA8 /* Warply.m in Sources */,
......
//
// ContextualViewController.swift
// SwiftWarplyFramework
//
// Created by Manos Chorianopoulos on 2/9/22.
//
import UIKit
@objc public class ContextualViewController: UIViewController, UIPopoverControllerDelegate {
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var backgroundImage: UIImageView!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var scrollContentView: UIView!
@IBOutlet weak var couponImage: UIImageView!
@IBOutlet weak var couponImageHeight: NSLayoutConstraint!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var redeemButton: UIButton!
public var ccms: swiftApi.LoyaltyContextualOfferModel?
var selectedNumber: String = ""
public var numbersList: Array<String> = []
let uiscreen: CGRect = UIScreen.main.bounds
public override func viewDidLoad() {
super.viewDidLoad()
self.hidesBottomBarWhenPushed = true
// Do any additional setup after loading the view.
getProfileRequest()
setBackButton()
// setNavigationTitle("")
backgroundImage.image = UIImage(named: "coupons_scrollview_white", in: Bundle(for: MyEmptyClass.self), compatibleWith: nil)
scrollView.clipsToBounds = true
scrollView.layer.cornerRadius = 30
scrollView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius
couponImage.load(link: ccms?._imageUrl ?? "", placeholder: UIImage(), cache: URLCache())
couponImage.contentMode = .scaleAspectFill
couponImageHeight.constant = self.uiscreen.height * 0.25
nameLabel.text = ccms?._title ?? ""
descriptionLabel.text = ccms?._subtitle ?? ""
redeemButton.titleLabel?.font = UIFont(name: "PFSquareSansPro-Medium", size: 16)
redeemButton.setTitle("Ενεργοποίηση", for: .normal)
redeemButton.setTitleColor(.white, for: .normal)
redeemButton.backgroundColor = UIColor(red: 0.47, green: 0.75, blue: 0.08, alpha: 1.00)
redeemButton.layer.cornerRadius = 12.0
}
// MARK: - Functions
func showConfirmDialog() -> Void {
let alert = UIAlertController(title: "Ενεργοποίηση υπηρεσίας", message: "Θέλετε να γίνει ενεργοποίηση στο Κινητό μου;", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ενεργοποίηση", style: .default, handler: { action in
switch action.style{
case .default:
self.submitOrderRequest()
case .cancel:
print("cancel")
case .destructive:
print("destructive")
}
}))
alert.addAction(UIAlertAction(title: "Άκυρο", style: .default, handler: { action in
switch action.style{
case .default:
print("default")
case .cancel:
print("cancel")
case .destructive:
print("destructive")
}
}))
self.present(alert, animated: true, completion: nil)
}
func showDialog(_ alertTitle: String, _ alertSubTitle: String) -> Void {
let alert = UIAlertController(title: alertTitle, message: alertSubTitle, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
switch action.style{
case .default:
print("default")
case .cancel:
print("cancel")
case .destructive:
print("destructive")
}
}))
self.present(alert, animated: true, completion: nil)
}
// MARK: - API CALLS
func getProfileRequest() {
swiftApi().getProfileAsync(getProfileCallback)
}
func getProfileCallback (_ profileData: swiftApi.ProfileModel?) -> Void {
if (profileData != nil) {
DispatchQueue.main.async {
self.numbersList = profileData?._msisdnList ?? []
}
} else {
}
}
func submitOrderRequest() {
swiftApi().submitOrderAsync(campaign_session_uuid: "", user_msisdn: self.selectedNumber, businessService: (ccms?._businessService ?? ""), offerName: (ccms?._offerName ?? ""), productType: (ccms?._productType ?? ""), provDuration: (ccms?._provDuration ?? ""), noOfRecurrance: (ccms?._noOfRecurrance ?? ""), price: (ccms?._price ?? ""), discount: (ccms?._discount ?? ""), voiceCategory: (ccms?._voiceCategory ?? ""), dataCategory: (ccms?._dataCategory ?? ""), minsValue: (ccms?._minsValue ?? ""), dataValue: (ccms?._dataValue ?? ""), provStepValueMins: (ccms?._provStepValueMins ?? ""),
OfferAudienceLevel: (ccms?._offerAudienceLevel ?? ""), UACIOfferTrackingCode: (ccms?._uaciOfferTrackingCode ?? ""), OFFERCODE1: (ccms?._offerCode1 ?? ""), SCORE: (ccms?._score ?? ""), ZONE: (ccms?._zone ?? ""), WAVE: (ccms?._wave ?? ""), VALIDITY: (ccms?._validity ?? ""), TREATMENT_CODE: (ccms?._treatmentCode ?? ""),
submitOrderCallback)
}
func submitOrderCallback (_ response: swiftApi.GenericResponseModel?) -> Void {
if (response != nil) {
DispatchQueue.main.async {
if (response?.getStatus == 1) {
self.showDialog("Το αίτημά σου ολοκληρώθηκε επιτυχώς!","Θα ενημερωθείς άμεσα για την ενεργοποίηση του πακέτου σου.")
// self.postEventRequest()
} else {
self.showDialog("Αποτυχία","Κάτι πήγε στραβά")
}
}
} else {
self.showDialog("Αποτυχία","Κάτι πήγε στραβά")
}
}
// MARK: - Actions
@IBAction func redeemButtomAction(_ sender: Any) {
self.numbersPopupTapped(sender)
}
}
// MARK: NumbersPopup
extension ContextualViewController: NumbersPopupDelegate {
@objc func numbersPopupTapped(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
let pp = storyboard.instantiateViewController(withIdentifier: "NumberPopupViewController") as! SwiftWarplyFramework.NumberPopupViewController
pp.InitWithController(controller: self,
numbersList: self.numbersList,
sender: sender,
delegate: self)
}
func presentedPopup() {
// Code for when popup is presented
}
func dismissedPopup() {
// Code for when popup is dismissed
}
func optionSelected(_ option: String) {
// Code for when option is selected
self.selectedNumber = option
DispatchQueue.main.async {
self.showConfirmDialog()
}
}
}
......@@ -160,7 +160,10 @@ extension GiftsViewController: UITableViewDelegate, UITableViewDataSource{
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (campaigns[indexPath.row]._ccms != nil) {
// TODO: open new screen with param campaigns[indexPath.row]._ccms
let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
let vc = storyboard.instantiateViewController(withIdentifier: "ContextualViewController") as! SwiftWarplyFramework.ContextualViewController
vc.ccms = campaigns[indexPath.row]._ccms
self.navigationController?.pushViewController(vc, animated: true)
} else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") {
let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns()
......
......@@ -110,7 +110,10 @@ extension MFYViewController: UITableViewDelegate, UITableViewDataSource{
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (campaigns[indexPath.row]._ccms != nil) {
// TODO: open new screen with param campaigns[indexPath.row]._ccms
let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
let vc = storyboard.instantiateViewController(withIdentifier: "ContextualViewController") as! SwiftWarplyFramework.ContextualViewController
vc.ccms = campaigns[indexPath.row]._ccms
self.navigationController?.pushViewController(vc, animated: true)
} else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") {
let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns()
......
......@@ -2515,6 +2515,127 @@
</objects>
<point key="canvasLocation" x="4654" y="129"/>
</scene>
<!--Contextual View Controller-->
<scene sceneID="PWP-CL-8VJ">
<objects>
<viewController storyboardIdentifier="ContextualViewController" id="KhM-xm-T4L" customClass="ContextualViewController" customModule="SwiftWarplyFramework" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="oKn-aG-Yzh">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gV8-Ze-9jD">
<rect key="frame" x="0.0" y="44" width="414" height="852"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coupons_scrollview_white" translatesAutoresizingMaskIntoConstraints="NO" id="7rs-yJ-Kvn">
<rect key="frame" x="0.0" y="0.0" width="414" height="852"/>
</imageView>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fVG-0L-fYi">
<rect key="frame" x="0.0" y="2" width="414" height="850"/>
<subviews>
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NHe-cF-AMf">
<rect key="frame" x="0.0" y="0.0" width="414" height="852"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="I4T-wN-u9w">
<rect key="frame" x="0.0" y="0.0" width="414" height="200"/>
<constraints>
<constraint firstAttribute="height" constant="200" id="jg1-IY-gKs"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Πάρε δωρεάν μηνιαία πακέτα με πάνες στα supermarket Σκλαβενίτης!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8BE-qj-xn5">
<rect key="frame" x="20" y="230" width="374" height="34"/>
<fontDescription key="fontDescription" name="PFSquareSansPro-Medium" family="PF Square Sans Pro" pointSize="17"/>
<color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Χρησιμοποίησε τον παρακάτω κωδικό και πάρε δωρεάν πακέτο πάνες Pampers αποκλειστικά στα Supermarket Σκλαβενίτης" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mbx-MR-VPL">
<rect key="frame" x="20" y="289" width="374" height="51"/>
<fontDescription key="fontDescription" name="PFSquareSansPro-Regular" family="PF Square Sans Pro" pointSize="17"/>
<color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qnn-bi-fLK">
<rect key="frame" x="83" y="440" width="248" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="aPk-mJ-VfN"/>
</constraints>
<fontDescription key="fontDescription" name="PFSquareSansPro-Medium" family="PF Square Sans Pro" pointSize="16"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Απόκτησέ το">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="redeemButtomAction:" destination="KhM-xm-T4L" eventType="touchUpInside" id="EqO-ze-Bau"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="8BE-qj-xn5" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" constant="20" id="0Go-Zc-Qdz"/>
<constraint firstAttribute="trailing" secondItem="I4T-wN-u9w" secondAttribute="trailing" id="38i-gl-gom"/>
<constraint firstItem="I4T-wN-u9w" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" id="Kwd-Io-bdQ"/>
<constraint firstItem="mbx-MR-VPL" firstAttribute="top" secondItem="8BE-qj-xn5" secondAttribute="bottom" constant="25" id="MoO-Rt-CES"/>
<constraint firstItem="qnn-bi-fLK" firstAttribute="top" secondItem="mbx-MR-VPL" secondAttribute="bottom" constant="100" id="T9O-Lp-JKw"/>
<constraint firstAttribute="trailing" secondItem="mbx-MR-VPL" secondAttribute="trailing" constant="20" id="Tx9-8c-EZY"/>
<constraint firstItem="mbx-MR-VPL" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" constant="20" id="aL7-MN-hd4"/>
<constraint firstItem="qnn-bi-fLK" firstAttribute="centerX" secondItem="NHe-cF-AMf" secondAttribute="centerX" id="hKA-X6-Nnh"/>
<constraint firstItem="qnn-bi-fLK" firstAttribute="width" secondItem="NHe-cF-AMf" secondAttribute="width" multiplier="0.6" id="lN0-41-F3G"/>
<constraint firstAttribute="trailing" secondItem="8BE-qj-xn5" secondAttribute="trailing" constant="20" id="n53-MH-KG1"/>
<constraint firstItem="I4T-wN-u9w" firstAttribute="top" secondItem="NHe-cF-AMf" secondAttribute="top" id="osK-5K-XQJ"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="qnn-bi-fLK" secondAttribute="bottom" constant="30" id="uLb-eO-qwF"/>
<constraint firstItem="8BE-qj-xn5" firstAttribute="top" secondItem="I4T-wN-u9w" secondAttribute="bottom" constant="30" id="wFo-Wh-noH"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="NHe-cF-AMf" firstAttribute="top" secondItem="SCq-zB-WYb" secondAttribute="top" id="9bq-gO-haD"/>
<constraint firstItem="NHe-cF-AMf" firstAttribute="width" secondItem="Ian-NJ-q5c" secondAttribute="width" id="AEN-vd-IM6"/>
<constraint firstItem="NHe-cF-AMf" firstAttribute="leading" secondItem="SCq-zB-WYb" secondAttribute="leading" id="Dx1-nO-YiW"/>
<constraint firstItem="NHe-cF-AMf" firstAttribute="trailing" secondItem="SCq-zB-WYb" secondAttribute="trailing" id="Rcp-KC-FVf"/>
<constraint firstItem="NHe-cF-AMf" firstAttribute="bottom" secondItem="SCq-zB-WYb" secondAttribute="bottom" id="l90-nv-T7G"/>
</constraints>
<viewLayoutGuide key="contentLayoutGuide" id="SCq-zB-WYb"/>
<viewLayoutGuide key="frameLayoutGuide" id="Ian-NJ-q5c"/>
</scrollView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="7rs-yJ-Kvn" firstAttribute="leading" secondItem="gV8-Ze-9jD" secondAttribute="leading" id="2f9-NI-DVc"/>
<constraint firstItem="fVG-0L-fYi" firstAttribute="leading" secondItem="gV8-Ze-9jD" secondAttribute="leading" id="8Wo-dr-SYr"/>
<constraint firstAttribute="bottom" secondItem="fVG-0L-fYi" secondAttribute="bottom" id="F1h-dY-Qy9"/>
<constraint firstItem="7rs-yJ-Kvn" firstAttribute="top" secondItem="gV8-Ze-9jD" secondAttribute="top" id="Qqw-BH-PAa"/>
<constraint firstAttribute="bottom" secondItem="7rs-yJ-Kvn" secondAttribute="bottom" id="Syn-fK-lXo"/>
<constraint firstAttribute="trailing" secondItem="fVG-0L-fYi" secondAttribute="trailing" id="chL-lE-bqc"/>
<constraint firstItem="NHe-cF-AMf" firstAttribute="height" relation="greaterThanOrEqual" secondItem="gV8-Ze-9jD" secondAttribute="height" id="l9o-Lk-50b"/>
<constraint firstItem="fVG-0L-fYi" firstAttribute="top" secondItem="gV8-Ze-9jD" secondAttribute="top" constant="2" id="qnB-Bi-4Qj"/>
<constraint firstAttribute="trailing" secondItem="7rs-yJ-Kvn" secondAttribute="trailing" id="tpM-bQ-uV4"/>
</constraints>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="meX-xg-hMW"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="gV8-Ze-9jD" firstAttribute="leading" secondItem="oKn-aG-Yzh" secondAttribute="leading" id="KUg-ao-Irx"/>
<constraint firstAttribute="bottom" secondItem="gV8-Ze-9jD" secondAttribute="bottom" id="M8J-yM-s5M"/>
<constraint firstItem="gV8-Ze-9jD" firstAttribute="top" secondItem="meX-xg-hMW" secondAttribute="top" id="OLd-wY-Edr"/>
<constraint firstAttribute="trailing" secondItem="gV8-Ze-9jD" secondAttribute="trailing" id="xnp-Tu-oyE"/>
</constraints>
</view>
<connections>
<outlet property="backgroundImage" destination="7rs-yJ-Kvn" id="UAm-Qy-V21"/>
<outlet property="couponImage" destination="I4T-wN-u9w" id="ONJ-uz-Emz"/>
<outlet property="couponImageHeight" destination="jg1-IY-gKs" id="yR6-wT-6A3"/>
<outlet property="descriptionLabel" destination="mbx-MR-VPL" id="LTL-7G-TUu"/>
<outlet property="mainView" destination="gV8-Ze-9jD" id="1YA-yr-IUE"/>
<outlet property="nameLabel" destination="8BE-qj-xn5" id="ysf-YK-z6C"/>
<outlet property="redeemButton" destination="qnn-bi-fLK" id="GzF-I5-zC3"/>
<outlet property="scrollContentView" destination="NHe-cF-AMf" id="Jgu-0v-nhF"/>
<outlet property="scrollView" destination="fVG-0L-fYi" id="Ia7-im-DSP"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LXH-Az-i1V" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="5412" y="129"/>
</scene>
</scenes>
<resources>
<image name="active_code_logo" width="69.5" height="69"/>
......