From ebc46c06d7c9b3ab2383c29f320f13c41459dc79 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 5 Dec 2019 15:59:19 +0530 Subject: [PATCH 01/91] crash for token id fix. --- js/OstWalletSdk.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/OstWalletSdk.js b/js/OstWalletSdk.js index 5c42f73..13b42c1 100644 --- a/js/OstWalletSdk.js +++ b/js/OstWalletSdk.js @@ -46,7 +46,8 @@ class OstWalletRNSdk { * @public */ setupDevice(userId, tokenId, workflow) { - OstWalletSdk.setupDevice(userId, tokenId, workflow.uuid); + let tokenIdString = tokenId.toString() + OstWalletSdk.setupDevice(userId, tokenIdString, workflow.uuid); } /** From 2b72b4d73f0b94f4726729c7f0d088bf8fde743c Mon Sep 17 00:00:00 2001 From: Aniket Date: Mon, 9 Dec 2019 16:50:43 +0530 Subject: [PATCH 02/91] wallet settings page added. --- js/WalletSetting/WalletSettingController.js | 0 js/WalletSetting/index.js | 307 ++++++++++++++++++++ js/WalletSetting/style.js | 31 ++ js/index.js | 3 + 4 files changed, 341 insertions(+) create mode 100644 js/WalletSetting/WalletSettingController.js create mode 100644 js/WalletSetting/index.js create mode 100644 js/WalletSetting/style.js diff --git a/js/WalletSetting/WalletSettingController.js b/js/WalletSetting/WalletSettingController.js new file mode 100644 index 0000000..e69de29 diff --git a/js/WalletSetting/index.js b/js/WalletSetting/index.js new file mode 100644 index 0000000..fd08f60 --- /dev/null +++ b/js/WalletSetting/index.js @@ -0,0 +1,307 @@ +import React, {PureComponent} from 'react'; +import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; +import inlineStyle from './style' +import {optionIds, walletSettingController} from './WalletSettingController'; +import {LoadingModal} from '../../theme/components/LoadingModalCover'; +import Colors from "../../theme/styles/Colors"; +import BackArrow from '../CommonComponents/BackArrow'; +import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; +import {ostSdkErrors} from "../../services/OstSdkErrors"; +import CurrentUser from "../../models/CurrentUser"; +import CameraPermissionsApi from "../../services/CameraPermissionsApi"; +import DeviceInfo from 'react-native-device-info'; +import AndroidOpenSettings from 'react-native-android-open-settings'; + +class WalletSettingList extends PureComponent { + static navigationOptions = (options) => { + return { + title: 'Wallet Settings', + headerBackTitle: null, + headerStyle: { + backgroundColor: Colors.white, + borderBottomWidth: 0, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.1, + shadowRadius: 3 + }, + headerTitleStyle: { + fontFamily: 'AvenirNext-Medium' + }, + headerBackImage: + }; + }; + + constructor(props) { + super(props); + this.state = { + list: [], + refreshing: false, + }; + + this._initiateEventTextMap() + } + + _initiateEventTextMap() { + this.eventLoaderTextMap = {}; + + this._createEventLoaderData( + optionIds.addSession, + "Adding Session", + "Waiting for confirmation", + "Session added"); + + this._createEventLoaderData( + optionIds.updateBiometricPreference, + "Updating Biometric", + "Waiting for confirmation", + "Biometric updated"); + + this._createEventLoaderData( + optionIds.resetPin, + "Resetting PIN...", + "Waiting for confirmation", + "PIN has been successfully reset"); + + this._createEventLoaderData( + optionIds.recoverDevice, + "Recovering device", + "Waiting for confirmation", + "Device recovery initiated"); + + this._createEventLoaderData( + optionIds.abortRecovery, + "Cancelling recovery", + "Waiting for confirmation", + "Aborted recovery"); + + this._createEventLoaderData( + optionIds.viewMnemonics, + "", + "", + ""); + + this._createEventLoaderData( + optionIds.authorizeWithQR, + "Authorizing device", + "Waiting for confirmation", + "Device authorized"); + + + this._createEventLoaderData( + optionIds.authorizeWithMnemonics, + "Authorizing device", + "Waiting for confirmation", + "Device authorized"); + + this._createEventLoaderData( + optionIds.showQR, + "", + "Waiting for confirmation", + "Device authorized"); + } + + _createEventLoaderData(id, startText, ackText, successText){ + let loaderData = { + id: id, + + startText: startText, + + // Acknowledgement text + acknowledgedText: ackText, + + // Success Text + successText: successText, + }; + + this.eventLoaderTextMap[ id ] = loaderData; + return loaderData; + } + + _getFlowCompleteText() { + let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].successText; + return text + } + + _getFlowStartedText() { + let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].startText; + return text + } + + _getRequestAcknowledgedText() { + let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].acknowledgedText; + return text + } + + _getFlowFailedText(workflowContext, ostError) { + return ostSdkErrors.getErrorMessage(workflowContext, ostError) + } + + componentDidMount() { + LoadingModal.show("Fetching Settings..."); + this.refreshList(); + } + + refreshList = (onFetch) => { + let refreshState = this.state.refreshing; + + walletSettingController.refresh((optionsData) => { + this.setState({ + list: optionsData, + refreshing: !refreshState + }); + + if (onFetch) { + onFetch() + }else { + LoadingModal.hide() + } + + }, true); + }; + + onSettingItemTapped = (item) => { + this._processTappedOption(item); + }; + + async _processTappedOption(item) { + if ( optionIds.walletDetails === item.id ) { + this.props.navigation.navigate('WalletDetails'); + return; + } else if (item.id === optionIds.authorizeWithQR) { + let cameraResult = await CameraPermissionsApi.requestPermission('camera'); + if ((cameraResult == 'denied' || cameraResult == 'restricted')) { + LoadingModal.showFailureAlert("Allow access to your camera to scan QR", '', 'Enable Camera Access', (isBtnTapped) => { + if (isBtnTapped) { + this.enableAccess(); + } + }); + return; + } + } + this._perfromWorkflow(item) + } + + _perfromWorkflow(item) { + let workflowInfo = walletSettingController.perform(item.id); + if ( workflowInfo ) { + this.onWorkflowStarted( workflowInfo ); + } else { + //Some coding error occurred. + console.log("PepoError", "ws_indx_osit_1", "Some coding error occurred"); + } + } + + enableAccess() { + if (Platform.OS == 'android') { + if (AndroidOpenSettings) { + AndroidOpenSettings.appDetailsSettings(); + } + } else { + Linking.canOpenURL('app-settings:') + .then((supported) => { + if (!supported) { + console.log("Can't handle settings url"); + } else { + return Linking.openURL('app-settings:'); + } + }) + .catch((err) => console.error('An error occurred', err)); + } + } + + onWorkflowStarted = (workflowInfo) => { + this.workflowInfo = workflowInfo; + // Show loader. + //LoadingModal.show(''); + + // Subscribe to events. + walletSettingController.setUIDelegate(this); + }; + + requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { + // LoadingModal.show(this._getRequestAcknowledgedText()) + }; + + flowComplete = (ostWorkflowContext , ostContextEntity) => { + this.refreshList(() => { + if (this.canShowAlert(ostWorkflowContext)) { + let text = this._getFlowCompleteText(); + // LoadingModal.showSuccessAlert(text); + }else { + // LoadingModal.hide() + } + + }); + }; + + onUnauthorized = (ostWorkflowContext , ostError) => { + LoadingModal.showFailureAlert("Device is not authorized. Please authorize device again.", null, "Logout", () => { + CurrentUser.logout({ + device_id: DeviceInfo.getUniqueID() + }); + }) + }; + + saltFetchFailed = (ostWorkflowContext , ostError) => { + LoadingModal.showFailureAlert("There is some issue while fetching salt. Please retry", null, "Retry", (isButtonTapped) => { + if (isButtonTapped) { + let retryItem = walletSettingController.optionsMap[this.workflowInfo.workflowOptionId]; + this.onSettingItemTapped(retryItem); + } + }) + }; + + userCancelled = (ostWorkflowContext , ostError) => { + LoadingModal.hide(); + }; + + deviceTimeOutOfSync = (ostWorkflowContext , ostError) => { + this.workflowFailed(ostWorkflowContext, ostError); + }; + + workflowFailed = (ostWorkflowContext , ostError) => { + let text = this._getFlowFailedText(ostWorkflowContext, ostError); + // LoadingModal.showFailureAlert(text, null, "Dismiss"); + }; + + canShowAlert(workflowContext) { + if (workflowContext.WORKFLOW_TYPE === 'GET_DEVICE_MNEMONICS') { + return false + } + + return true + } + + _keyExtractor = (item, index) => `id_${item.id}`; + + _renderItem = ({ item, index }) => { + return ( + this.onSettingItemTapped(item)}> + + {item.heading} + {item.description} + + + ); + }; + + render() { + return ( + + + + ); + } +} + +export default WalletSettingList; diff --git a/js/WalletSetting/style.js b/js/WalletSetting/style.js new file mode 100644 index 0000000..361fe49 --- /dev/null +++ b/js/WalletSetting/style.js @@ -0,0 +1,31 @@ +import DefaultStyleGenerator from "../../theme/styles/DefaultStyleGenerator"; +import { StyleSheet } from 'react-native'; + +let stylesMap = StyleSheet.create({ + + list: { + flex: 1, + backgroundColor: "#fff", + paddingTop: 15 + }, + title: { + color: "#2A293B", + fontSize: 18, + marginTop: 15 + }, + subtitle: { + color: "#2A293B", + fontSize: 12, + marginTop: 5, + marginBottom: 15 + }, + listComponent: { + flex: 1, + marginLeft: 20, + marginRight: 20, + borderBottomWidth: 1, + borderBottomColor: Colors.whisper + } +}); +export default styles = stylesMap + diff --git a/js/index.js b/js/index.js index e82b3d2..f11f10f 100644 --- a/js/index.js +++ b/js/index.js @@ -16,6 +16,8 @@ import OstWalletError from './OstRNError/OstRNError'; import OstJsonApi from './OstJsonApi'; import OstWalletUIWorkflowCallback from './OstWalletUIWorkflowCallback'; import OstWalletSdkUI from './OstWalletSdkUI'; +import OstWalletSetting from './WalletSetting'; + export { OstWalletSdk, OstWalletSdkEvents, @@ -25,4 +27,5 @@ export { OstJsonApi, OstWalletSdkUI, OstWalletUIWorkflowCallback, + OstWalletSetting } From 1f4f364a0f6e421ead226c5f1ec411016335a277 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 11:19:15 +0530 Subject: [PATCH 03/91] Work in progress, do not pull. --- js/OstWalletSdk.js | 10 +- js/OstWalletSdkUI.js | 16 +- js/WalletSetting/WalletSettingController.js | 0 js/WalletSettings/OstWalletSettings.js | 91 ++++ .../SettingsComponent.js} | 30 +- js/WalletSettings/WalletDetails.js | 333 +++++++++++++ js/WalletSettings/WalletSettingsController.js | 449 ++++++++++++++++++ js/WalletSettings/helpers.js | 32 ++ js/WalletSettings/index.js | 20 + .../ost-wallet-settings-config.json | 87 ++++ .../style.js => WalletSettings/styles.js} | 3 +- js/WalletSettings/walletDetailsStyles.js | 53 +++ js/constants/DeviceStatus.js | 15 + js/constants/UserStatus.js | 12 + js/constants/helpers.js | 10 + js/index.js | 10 +- package.json | 3 +- 17 files changed, 1152 insertions(+), 22 deletions(-) delete mode 100644 js/WalletSetting/WalletSettingController.js create mode 100644 js/WalletSettings/OstWalletSettings.js rename js/{WalletSetting/index.js => WalletSettings/SettingsComponent.js} (96%) create mode 100644 js/WalletSettings/WalletDetails.js create mode 100644 js/WalletSettings/WalletSettingsController.js create mode 100644 js/WalletSettings/helpers.js create mode 100644 js/WalletSettings/index.js create mode 100644 js/WalletSettings/ost-wallet-settings-config.json rename js/{WalletSetting/style.js => WalletSettings/styles.js} (80%) create mode 100644 js/WalletSettings/walletDetailsStyles.js create mode 100644 js/constants/DeviceStatus.js create mode 100644 js/constants/UserStatus.js create mode 100644 js/constants/helpers.js diff --git a/js/OstWalletSdk.js b/js/OstWalletSdk.js index 13b42c1..5006052 100644 --- a/js/OstWalletSdk.js +++ b/js/OstWalletSdk.js @@ -33,7 +33,7 @@ class OstWalletRNSdk { fCallback = config; } - OstWalletSdk.initialize( endpoint , fConfig, (error)=>{ + OstWalletSdk.initialize( endpoint , fConfig, (error) => { fCallback && fCallback( error , !error ); }); } @@ -230,7 +230,7 @@ class OstWalletRNSdk { * @public */ getToken(tokenId, callback) { - OstWalletSdk.getToken(tokenId, (tokenEntity)=>{ + OstWalletSdk.getToken(tokenId, (tokenEntity) => { callback( tokenEntity ); }); } @@ -243,7 +243,7 @@ class OstWalletRNSdk { * @public */ getUser(userId, callback) { - OstWalletSdk.getUser(userId, (userEntity)=>{ + OstWalletSdk.getUser(userId, (userEntity) => { callback( userEntity ); }); } @@ -256,7 +256,7 @@ class OstWalletRNSdk { * @public */ getCurrentDeviceForUserId(userId, callback) { - OstWalletSdk.getCurrentDeviceForUserId(userId, (device)=>{ + OstWalletSdk.getCurrentDeviceForUserId(userId, (device) => { callback( device ); }); } @@ -291,7 +291,7 @@ class OstWalletRNSdk { minimumSpendingLimitInWei = String( minimumSpendingLimitInWei ); } console.log("getActiveSessionsForUserId userId", userId); - OstWalletSdk.getActiveSessionsForUserId(userId, minimumSpendingLimitInWei, (activeSessions)=>{ + OstWalletSdk.getActiveSessionsForUserId(userId, minimumSpendingLimitInWei, (activeSessions) => { theCallback && theCallback( activeSessions ); }); } diff --git a/js/OstWalletSdkUI.js b/js/OstWalletSdkUI.js index 2958959..693d597 100644 --- a/js/OstWalletSdkUI.js +++ b/js/OstWalletSdkUI.js @@ -14,6 +14,9 @@ import OstWalletUIWorkflowCallback from './OstWalletUIWorkflowCallback'; import OstWalletUICoreCallback from './OstWalletUICoreCallback'; import * as OstWalletSdkUICallbackManager from './callbackHandlers/OstWalletSdkUICallbackManager'; +/// TEMP-CODE: Code to intercept theme-config. +let themeConfig = null; + class OstWalletRNSdkUI { /** @@ -21,7 +24,18 @@ class OstWalletRNSdkUI { * @param {object} config - Config for theme */ setThemeConfig(config) { - OstWalletSdkUI.setThemeConfig(config) + /// TEMP-CODE: Code to intercept theme-config. + themeConfig = config; + + OstWalletSdkUI.setThemeConfig(config); + } + + getThemeConfig() { + return new Promise((resolve,reject) => { + /// TEMP-CODE: Code to intercept theme-config. + /// @Aniket/@Sachin: Please expose proper-getters. + resolve(themeConfig); + }); } /** diff --git a/js/WalletSetting/WalletSettingController.js b/js/WalletSetting/WalletSettingController.js deleted file mode 100644 index e69de29..0000000 diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js new file mode 100644 index 0000000..0eac05c --- /dev/null +++ b/js/WalletSettings/OstWalletSettings.js @@ -0,0 +1,91 @@ +import WalletSettingsConfig from "./ost-wallet-settings-config"; +import objectMerge from "lodash.merge"; + +const ItemsThatNeedCamera = ["add-another-device"]; + +class OstWalletSettingsClass { + constructor() { + // Define the config. + this.setMasterConfig(); + } + + setMasterConfig( externalConfig ) { + externalConfig = externalConfig || {}; + let masterConfig = JSON.parse(JSON.stringify(WalletSettingsConfig)); + + // Deep Merge. + objectMerge(masterConfig, externalConfig); + this.masterConfig = masterConfig; + + // As deep merge may also merge Arrays. + if ( externalConfig[ "item-display-order" ] ) { + this.masterConfig[ "item-display-order" ] = externalConfig[ "item-display-order" ]; + } + + this._processDisplayOrder(); + } + + getMasterConfig() { + return this.masterConfig; + } + + getAllItemConfigs() { + return this.masterConfig["item-configs"]; + } + + getDisplayOrder() { + return this.masterConfig[ "item-display-order" ]; + } + + getItemConfig( itemId ) { + let allConfigs = this.getAllItemConfigs(); + return allConfigs[ itemId ]; + } + + getItemContentConfig( itemId ) { + let config = this.getItemConfig( itemId ); + if ( config ) { + return config[ "content-config" ]; + } + return null; + } + + getSessionSpendingLimit() { + let itemConfig = this.getItemConfig( "add-session" ) || {}; + let config = itemConfig.config || {}; + return config[ "spending-limit" ] || "0"; + } + + getSessionExpirationTime() { + let itemConfig = this.getItemConfig( "add-session" ) || {}; + let config = itemConfig.config || {}; + return config[ "expiration-time" ] || "0"; + } + + _processDisplayOrder() { + const allItemConfigs = this.getAllItemConfigs(); + const displayOrder = this.getDisplayOrder(); + for( itemId in allItemConfigs ) { if ( allItemConfigs.hasOwnProperty( itemId ) ) { + const itemConfig = allItemConfigs[ itemId ]; + + // Should this item be shown? + if ( displayOrder.indexOf( itemId ) < 0 ) { + itemConfig.shouldShow = false; + } else { + itemConfig.shouldShow = true; + } + + // Does this item need Camera? + if ( ItemsThatNeedCamera.indexOf(itemId) < 0 ) { + itemConfig.needsCamera = false; + } else { + itemConfig.needsCamera = true; + } + }} + } + +}; + +const OstWalletSettings = new OstWalletSettingsClass(); + +export default OstWalletSettings; \ No newline at end of file diff --git a/js/WalletSetting/index.js b/js/WalletSettings/SettingsComponent.js similarity index 96% rename from js/WalletSetting/index.js rename to js/WalletSettings/SettingsComponent.js index fd08f60..bfa7e4c 100644 --- a/js/WalletSetting/index.js +++ b/js/WalletSettings/SettingsComponent.js @@ -1,16 +1,24 @@ import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; -import inlineStyle from './style' -import {optionIds, walletSettingController} from './WalletSettingController'; -import {LoadingModal} from '../../theme/components/LoadingModalCover'; -import Colors from "../../theme/styles/Colors"; -import BackArrow from '../CommonComponents/BackArrow'; -import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; -import {ostSdkErrors} from "../../services/OstSdkErrors"; -import CurrentUser from "../../models/CurrentUser"; -import CameraPermissionsApi from "../../services/CameraPermissionsApi"; +import inlineStyle from './styles' + + + + + import DeviceInfo from 'react-native-device-info'; import AndroidOpenSettings from 'react-native-android-open-settings'; +import {optionIds, WalletSettingController} from './WalletSettingController'; + + +import {ostSdkErrors} from "../../services/OstSdkErrors"; +import CameraPermissionsApi from "../../services/CameraPermissionsApi"; + + +import CurrentUser from "../../models/CurrentUser"; +import BackArrow from '../CommonComponents/BackArrow'; +import Colors from "../../theme/styles/Colors"; +import {LoadingModal} from '../../theme/components/LoadingModalCover'; class WalletSettingList extends PureComponent { static navigationOptions = (options) => { @@ -282,8 +290,8 @@ class WalletSettingList extends PureComponent { return ( this.onSettingItemTapped(item)}> - {item.heading} - {item.description} + {item.heading} + {item.description} ); diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js new file mode 100644 index 0000000..d9f1dcb --- /dev/null +++ b/js/WalletSettings/WalletDetails.js @@ -0,0 +1,333 @@ +import React, {PureComponent} from 'react'; +import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View, Image, Clipboard} from 'react-native'; +import inlineStyle from './walletDetailsStyles'; +import {LoadingModal} from '../../theme/components/LoadingModalCover'; +import Colors from "../../theme/styles/Colors"; +import BackArrow from '../CommonComponents/BackArrow'; + +import iconCopy from '../../assets/icon-copy.png'; +import viewIcon from '../../assets/open-view.png'; + +import { OstWalletSdk, OstWalletSdkUI, OstJsonApi} from '@ostdotcom/ost-wallet-sdk-react-native'; +import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; +import {ostSdkErrors} from "../../services/OstSdkErrors"; +import CurrentUser from "../../models/CurrentUser"; +import {IS_STAGING, TOKEN_ID, VIEW_END_POINT} from "../../constants"; + +import InAppBrowser from '../../services/InAppBrowser'; +import Toast from '../../theme/components/NotificationToast'; + + + +class WalletDetails extends PureComponent { + static navigationOptions = (options) => { + return { + title: 'Wallet Details', + headerBackTitle: null, + headerStyle: { + backgroundColor: Colors.white, + borderBottomWidth: 0, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.1, + shadowRadius: 3 + }, + headerTitleStyle: { + fontFamily: 'AvenirNext-Medium' + }, + headerBackImage: + }; + }; + + constructor(props) { + super(props); + this.state = { + list: [], + refreshing: false + }; + } + + componentDidMount() { + this.userId = CurrentUser.getOstUserId(); + this.ostUser = null; + this.ostDevice = null; + this.token = null; + this.cells = null; + this.onRefresh(); + } + + + onRefresh = () => { + if( this.state.refreshing ) { + return; + } + this.setState({ + refreshing: true + }); + this._fetchToken(); + }; + + _fetchToken() { + OstWalletSdk.getToken(TOKEN_ID, (token) => { + this.token = token; + + this._fetchUser(); + }) + } + + _fetchUser() { + OstWalletSdk.getUser(this.userId, (userData) => { + if ( !userData ) { + // What to do here? + } + + // Store user data. + this.ostUser = userData; + + // Get the device. + this._fetchDevice(); + }); + } + + _fetchDevice() { + OstWalletSdk.getCurrentDeviceForUserId(this.userId, (device) => { + if( device && OstWalletSdkHelper.canDeviceMakeApiCall( device ) ) { + this._fetchDeviceFromServer(device); + return; + } + // Make do with what we have. + this._onDeviceFetch(device); + }); + } + + _fetchDeviceFromServer(localDevice) { + OstJsonApi.getCurrentDeviceForUserId(this.userId,( deviceApiResponse ) => { + this._onDeviceFetch(deviceApiResponse) + }, ( error ) => { + let ostError = OstWalletSdkHelper.jsonToOstRNError( error ); + let errorMessage = ostSdkErrors.getErrorMessage( null, ostError ); + LoadingModal.showFailureAlert(errorMessage, "", "OK", ()=> { + // Close this view. + this.props.navigation.goBack(null); + }); + }); + } + + _onDeviceFetch(deviceApiResponse) { + if (deviceApiResponse) { + let resultType = deviceApiResponse["result_type"]; + let device = deviceApiResponse[ resultType ]; + this.ostDevice = device; + this._buildList(); + + }else { + LoadingModal.showFailureAlert("Something went wrong", "", "OK", ()=> { + // Close this view. + this.props.navigation.goBack(null); + }); + } + } + + _buildList() { + let cells = []; + //Ordering Cells Logic. + if ( IS_STAGING ) { + cells.push( this._buildUserIdData() ); + } + cells.push( this._buildUserStatusData() ); + cells.push( this._buildTokenIdData() ); + cells.push( this._buildTokenHolderAddressData() ); + cells.push( this._buildDeviceAddressData() ); + cells.push( this._buildDeviceStatusData() ); + cells.push( this._buildDeviceManagerAddressData() ); + cells.push( this._buildRecoveryKeyAddressData() ); + cells.push( this._buildRecoveryOwnerAddressData() ); + + this.setState({ + list: cells, + refreshing: false + }) + } + + _buildTokenIdData() { + return { + "cellType": "text", + "heading": "Token ID", + "text": TOKEN_ID + }; + } + + _buildUserIdData() { + return { + "cellType": "copy", + "heading": "OST User ID", + "text": this.ostUser.id + }; + } + + _buildUserStatusData() { + return { + "cellType": "status", + "heading": "User Status", + "text": this.ostUser.status + }; + } + + _buildTokenHolderAddressData() { + let link = VIEW_END_POINT + 'token/th-'+ this._getAuxChainId() + '-' + this._getUtilityBandedToken() + '-' + this.ostUser.token_holder_address; + return { + "cellType": "link", + "heading": "Token Holder Address", + "text": this.ostUser.token_holder_address, + "link": link + }; + } + + _buildDeviceManagerAddressData() { + let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.device_manager_address; + return { + "cellType": "link", + "heading": "Device Manager Address", + "text": this.ostUser.device_manager_address, + "link": link + }; + } + + _buildRecoveryKeyAddressData() { + return { + "cellType": "copy", + "heading": "Recovery Key Address", + "text": this.ostUser.recovery_address + }; + } + + _buildRecoveryOwnerAddressData() { + let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.recovery_owner_address; + return { + "cellType": "link", + "heading": "Recovery Owner Address", + "text": this.ostUser.recovery_owner_address, + "link": link + }; + } + + _buildDeviceAddressData() { + return { + "cellType": "copy", + "heading": "Device Address", + "text": this.ostDevice.address + }; + } + + _buildDeviceStatusData() { + return { + "cellType": "status", + "heading": "Device Status", + "text": this.ostDevice.status + }; + } + + _getUtilityBandedToken() { + return (this.token.auxiliary_chains[0]).utility_branded_token || '0x' + } + + _getAuxChainId() { + return ((this.token.auxiliary_chains[0]).chain_id).toString(10) || '0' + } + + onCopyCellTapped = async (item) => { + await Clipboard.setString(item.text); + Toast.show({text: "Copied to Clipboard", icon:'success'}); + }; + + onLinkCellTapped = (item) => { + InAppBrowser.openBrowser(item.link); + }; + + render() { + return ( + + + + ); + } + + _keyExtractor = (item, index) => `id_${item.heading}_${item.text}`; + + _renderItem = ({ item, index }) => { + switch ( item.cellType ) { + case "text": + return this._renderTextCell({item, index}); + case "status": + return this._renderStatusCell({item, index}); + case "copy": + return this._renderCopyCell({item, index}); + case "link": + return this._renderLinkCell({item, index}); + default: + return this._renderTextCell({item, index}); + } + }; + + _renderTextCell = ({item, index}) => { + return ( + + {item.heading} + {item.text} + + ); + }; + + _renderStatusCell = ({item, index}) => { + return ( + + {item.heading} + {item.text} + + ); + }; + + _renderCopyCell = ({item, index}) => { + return ( + this.onCopyCellTapped(item)}> + + {item.heading} + + + {item.text} + + + + + + ); + }; + + _renderLinkCell = ({item, index}) => { + return ( + this.onLinkCellTapped(item)}> + + {item.heading} + + + {item.text} + + + + + + ); + }; +} + +export default WalletDetails; diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js new file mode 100644 index 0000000..2d78db2 --- /dev/null +++ b/js/WalletSettings/WalletSettingsController.js @@ -0,0 +1,449 @@ +import OstWalletSdk from '../OstWalletSdk'; +import OstWalletSdkUI from '../OstWalletSdkUI'; +import OstJsonApi from '../OstJsonApi'; +import OstUserStatus from "../constants/UserStatus"; +import OstDeviceStatus from "../constants/DeviceStatus"; +import OstWalletSettings from "./OstWalletSettings"; +import OstWalletSdkHelper from './helpers'; + +const optionIds = { + walletDetails: "wallet-details", + recoverDevice: "recover-device", + abortRecovery: "abort-recovery", + addSession: "add-session", + resetPin: "reset-pin", + viewMnemonics: "show-mnemonics", + authorizeWithMnemonics: "authorize-device-with-mnemonics", + authorizeWithQR: "add-another-device", + showQR: "show-device-qr-code", + enableBiometrics: "enable-biometrics", + disableBiometrics: "disable-biometrics" +}; + +class WalletSettingController { + + constructor(ostUserId, ostWalletUIWorkflowCallback) { + this.userId = ostUserId; + this._initialize(); + this.optionsOrdering = OstWalletSettings.getDisplayOrder(); + this.userStatusMap = OstUserStatus; + this.deviceStatusMap = OstDeviceStatus; + this.currentWorkflow = null; + this.uiDelegate = null; + } + + _initialize(ostUserId) { + this.optionsMap = {}; + this._initializeOptions(); + } + + _initializeOptions() { + for( optionId in optionIds ) { + this._createOptionsData(optionId); + } + } + + refresh( callback, onlyPerformable ) { + this._ensureUserIdValidity(); + onlyPerformable = onlyPerformable || false; + + if ( !this.userId ) { + //Ost user id is null. + setTimeout(() => { + let data = this._getData(onlyPerformable); + callback( data ); + }, 0); + + // Done. + return; + } + + this.refreshCallback = callback; + this.onlyPerformable = onlyPerformable; + + OstWalletSdk.getUser(this.userId, (userData) => { + if ( !userData ) { + // What to do here? + } + + // Store user data. + this.ostUser = userData; + + // Get the device. + + this._fetchBiometricPreference(); + }); + } + + _fetchBiometricPreference() { + OstWalletSdk.isBiometricEnabled(this.userId, (isBiometricEnabled) => { + this.isBiometricEnabled = isBiometricEnabled; + this._fetchDevice(); + }); + } + + _fetchDevice() { + OstWalletSdk.getCurrentDeviceForUserId(this.userId, (device) => { + if( device && OstWalletSdkHelper.canDeviceMakeApiCall( device ) ) { + this._fetchDeviceFromServer(device); + return; + } + // Make do with what we have. + this._onDeviceFetch(device); + }); + } + + _fetchDeviceFromServer(localDevice) { + OstJsonApi.getCurrentDeviceForUserId(this.userId,( device ) => { + + this._onDeviceFetch(device) + + }, ( error ) => { + let ostError = OstWalletSdkHelper.jsonToOstRNError(error); + //ToDo: Show the error and close the wallet settings. + this._onDeviceFetch({ + "local_device": localDevice, + "resut_type": "local_device" + }); + }); + } + + _onDeviceFetch(device) { + if ( null == device) { + + } + let resultType = device["result_type"] + , data = device[resultType] + ; + + this.ostDevice = data; + + this._fetchPendingRecovery(); + } + + _fetchPendingRecovery() { + OstJsonApi.getPendingRecoveryForUserId(this.userId, ( data ) => { + this._onPendingRecoveryFetch(data) + }, ( error ) => { + this._onPendingRecoveryFetch() + }) + } + + _onPendingRecoveryFetch(pendingRecovery) { + this.pendingRecovery = pendingRecovery; + + this._onDataFetched() + } + + _onDataFetched() { + let deviceStatus = this._getDeviceStatus(); + let userStatus = this._getUserStatus(); + + this._resetOptions(); + + if (userStatus == this.userStatusMap.activated) { + if (deviceStatus) { + this._updateOptionsData(optionIds.walletDetails, false, true); + } + + if (deviceStatus == this.deviceStatusMap.authorized) { + this._updateOptionsData(optionIds.addSession, false, true); + this._updateOptionsData(optionIds.viewMnemonics, false, true); + this._updateOptionsData(optionIds.authorizeWithQR, false, true); + this._updateOptionsData(optionIds.resetPin, false, true); + + let biometricMessage = (this.isBiometricEnabled || false) ? 'Disable Biometrics' : 'Enable Biometric'; + this._updateOptionsData(optionIds.updateBiometricPreference, false, true, biometricMessage); + } + + if (deviceStatus == this.deviceStatusMap.registered) { + this._updateOptionsData(optionIds.recoverDevice, false, true); + this._updateOptionsData(optionIds.authorizeWithMnemonics, false, true); + this._updateOptionsData(optionIds.showQR, false, true); + } + + if (this.pendingRecovery) { + this._updateOptionsData(optionIds.abortRecovery, false, true); + }else { + this._updateOptionsData(optionIds.abortRecovery, false, false); + } + + if (deviceStatus == this.deviceStatusMap.revoked) { + this._initializeOptions() + } + + }else { + this._initializeOptions() + } + + let data = this._getData(this.onlyPerformable); + this.refreshCallback(data) + } + + _resetOptions() { + let cnt = 0, len = this.optionsOrdering.length; + for ( cnt=0; cnt< len; cnt++ ) { + let optionKey = this.optionsOrdering[cnt]; + let option = this.optionsMap[optionKey]; + option.inProgress = false; + option.canPerform = false; + } + } + + _getData(onlyPerformable) { + let filteredData = []; + let cnt = 0, len = this.optionsOrdering.length; + for ( cnt=0; cnt< len; cnt++ ) { + let optionKey = this.optionsOrdering[ cnt ]; + let option = this.optionsMap[optionKey]; + if (onlyPerformable) { + if ( !option.canPerform || !option.shouldShow ){ + // Skip this. + continue; + } + } + + filteredData.push(option); + } + + return filteredData + } + + _ensureUserIdValidity() { + if ( !this._isUserIdValid() ) { + this._initialize(); + } + } + + _isUserIdValid() { + let delegate = this._getWorkflowDelegate(); + if ( typeof delegate.getCurrentUserOstId === 'function' ) { + let appOstUserId = delegate.getCurrentUserOstId(); + return appOstUserId === this.userId; + } + + // Default to true. + return true; + } + + _createOptionsData(id){ + + let itemConfig = OstWalletSettings.getItemConfig(); + if ( !itemConfig ) { + const err = new Error(`Content configuration for itemId ${id} is not defined.`) + throw err; + } + + let contentConfig = OstWalletSettings.getItemContentConfig(); + if ( !contentConfig ) { + const err = new Error(`Content configuration for itemId ${id} is not defined.`); + throw err; + } + + let optionsData = { + id: id, + + // Heading + heading: contentConfig.heading || "", + + // Description + description: contentConfig.description || "", + + // Show this item be shown? + shouldShow: itemConfig.shouldShow, + + // Does Item need Camera? + needsCamera: itemConfig.needsCamera, + + // Is this workflow in progress? + inProgress: false, + + // Can the action be performed? + // False by default. Hide the view when false. + canPerform: false + }; + + this.optionsMap[ id ] = optionsData; + return optionsData; + } + + _updateOptionsData(id, inProgress, canPerform, message = null) { + let optionData = this.optionsMap[id]; + optionData.inProgress = inProgress || false; + optionData.canPerform = canPerform || false; + + if (message) { + optionData.heading = message; + } + } + + _getUserStatus() { + let uStatus = ''; + if ( this.ostUser ) { + uStatus = this.ostUser.status || uStatus; + } + return uStatus.toLowerCase(); + } + + _getDeviceStatus() { + let dStatus = ''; + if ( this.ostDevice ) { + dStatus = this.ostDevice.status || dStatus; + } + return dStatus.toLowerCase(); + } + + /** + * + * @param optionId + * + * @returns workflowInfo - Information of the workflow. + */ + + perform( optionId ) { + if ( !this._isUserIdValid() ) { + return null; + } + + let activeWorkflow = this.getActiveWorkflowInfo(); + if ( activeWorkflow ) { + return activeWorkflow; + } + + let delegate = this._getWorkflowDelegate(), + workflowId = null, + userId = this.userId + ; + + console.log("WalletSettings ost userId", userId); + + switch( optionId ) { + case optionIds.addSession: + workflowId = OstWalletSdkUI.addSession(userId, OstWalletSettings.getSessionExpirationTime() , OstWalletSettings.getSessionSpendingLimit(), delegate); + break; + + case optionIds.recoverDevice: + workflowId = OstWalletSdkUI.initiateDeviceRecovery(userId, null, delegate); + break; + + case optionIds.abortRecovery: + workflowId = OstWalletSdkUI.abortDeviceRecovery(userId, delegate); + break; + + case optionIds.resetPin: + workflowId = OstWalletSdkUI.resetPin(userId, delegate); + break; + + case optionIds.viewMnemonics: + workflowId = OstWalletSdkUI.getDeviceMnemonics(userId, delegate); + break; + + case optionIds.authorizeWithMnemonics: + workflowId = OstWalletSdkUI.authorizeCurrentDeviceWithMnemonics(userId, delegate); + break; + + case optionIds.authorizeWithQR: + workflowId = OstWalletSdkUI.scanQRCodeToAuthorizeDevice(userId, delegate); + break; + + case optionIds.showQR: + workflowId = OstWalletSdkUI.getAddDeviceQRCode(userId, delegate); + break; + + case optionIds.updateBiometricPreference: + workflowId = OstWalletSdkUI.updateBiometricPreference(userId, !this.isBiometricEnabled, delegate); + break; + + default: + return null; + } + + this.currentWorkflow = this._createWorkflowInfo(workflowId, optionId); + + return this.currentWorkflow; + } + + getActiveWorkflowInfo() { + let workflowInfo = this.currentWorkflow; + if ( !workflowInfo ) { + return null; + } + if ( workflowInfo.isFlowInterrupted || workflowInfo.isFlowComplete ) { + return null; + } + return workflowInfo; + } + + _createWorkflowInfo(workflowId, optionId) { + return { + workflowId: workflowId, + workflowOptionId: optionId, + isRequestAcknowledge: false, + isFlowInterrupted: false, + isFlowComplete: false + }; + } + + setUIDelegate( uiDelegate ) { + this.uiDelegate = uiDelegate; + } + + _getWorkflowDelegate() { + let delegate = CurrentUser.newPassphraseDelegate(); + // + delegate.requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { + if ( this.uiDelegate ) { + this.uiDelegate.requestAcknowledged(ostWorkflowContext, ostContextEntity); + } + + this.currentWorkflow.isRequestAcknowledge = true + }; + + delegate.flowComplete = (ostWorkflowContext , ostContextEntity) => { + if ( this.uiDelegate ) { + this.uiDelegate.flowComplete(ostWorkflowContext, ostContextEntity); + } + this.currentWorkflow.isFlowComplete = true + }; + + delegate.onUnauthorized = (ostWorkflowContext, ostError) => { + if ( this.uiDelegate ) { + this.uiDelegate.onUnauthorized(ostWorkflowContext, ostError); + } + this.currentWorkflow.isFlowInterrupted = true + }; + + delegate.saltFetchFailed = () => { + if ( this.uiDelegate ) { + this.uiDelegate.saltFetchFailed(); + } + this.currentWorkflow.isFlowInterrupted = true + }; + + delegate.userCancelled = (ostWorkflowContext, ostError) => { + if ( this.uiDelegate ) { + this.uiDelegate.userCancelled(ostWorkflowContext, ostError); + } + this.currentWorkflow.isFlowInterrupted = true + }; + + delegate.deviceTimeOutOfSync = (ostWorkflowContext, ostError) => { + if ( this.uiDelegate ) { + this.uiDelegate.deviceTimeOutOfSync(ostWorkflowContext, ostError); + } + this.currentWorkflow.isFlowInterrupted = true + }; + + delegate.workflowFailed = (ostWorkflowContext, ostError) => { + if ( this.uiDelegate ) { + this.uiDelegate.workflowFailed(ostWorkflowContext, ostError); + } + this.currentWorkflow.isFlowInterrupted = true + }; + + return delegate; + } + +}; + +export {WalletSettingController , optionIds} diff --git a/js/WalletSettings/helpers.js b/js/WalletSettings/helpers.js new file mode 100644 index 0000000..36156b1 --- /dev/null +++ b/js/WalletSettings/helpers.js @@ -0,0 +1,32 @@ +import OstDeviceStatus from "../constants/DeviceStatus"; + +export default { + "canDeviceMakeApiCall": ( device ) => { + if (!device) { + return false; + } + + switch( device.status ) { + case DeviceStatus.REGISTERED: + case DeviceStatus.AUTHORIZING: + case DeviceStatus.AUTHORIZED: + case DeviceStatus.REVOKING: + case DeviceStatus.RECOVERING: + return true; + default: + return false; + } + }, + + "jsonToOstRNError": ( ostErrorJson ) => { + if ( ostErrorJson instanceof OstWalletError ) { + return ostErrorJson; + } + let ostError = new OstWalletError( ostErrorJson ); + if ( ostError.isApiError() ) { + ostError = new OstWalletApiError( ostErrorJson ); + } + return ostError; + } + +}; \ No newline at end of file diff --git a/js/WalletSettings/index.js b/js/WalletSettings/index.js new file mode 100644 index 0000000..a44a922 --- /dev/null +++ b/js/WalletSettings/index.js @@ -0,0 +1,20 @@ +/** + * + * This is a wrapper export. + * OstWalletSettings - Singleton instance of OstWalletSettingsClass. + * OstWalletSettingsComponent - react native component. + * WalletSettingsConfig - Default Sdk Config. + * + */ + +import OstWalletSettings from "./OstWalletSettings"; +import OstWalletSettingsComponent from "./SettingsComponent"; +import WalletSettingsConfig from "./ost-wallet-settings-config"; + +const OstWalletSettingsDefaultConfig = JSON.parse(JSON.stringify(WalletSettingsConfig)); + +export { + OstWalletSettings, + OstWalletSettingsComponent, + OstWalletSettingsDefaultConfig +}; \ No newline at end of file diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json new file mode 100644 index 0000000..069dba5 --- /dev/null +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -0,0 +1,87 @@ +{ + "item-display-order": [ + "wallet-details", + "recover-device", + "abort-recovery", + "add-session", + "reset-pin", + "show-mnemonics", + "authorize-device-with-mnemonics", + "add-another-device", + "show-device-qr-code", + "enable-biometrics", + "disable-biometrics" + ], + "item-configs": { + "wallet-details": { + "content-config": { + "heading": "Wallet Details", + "description": "View your wallet details." + } + }, + "recover-device": { + "content-config": { + "heading": "Recover Device", + "description": "Recover your device." + } + }, + "abort-recovery": { + "content-config": { + "heading": "Abort Device Recovery", + "description": "Abort Device Recovery." + } + }, + "add-session": { + "content-config": { + "heading": "Add Session", + "description": "Add Session to do transaction." + }, + "config": { + "spending-limit": "0", + "expiration-time": "0" + } + }, + "reset-pin": { + "content-config": { + "heading": "Wallet Details", + "description": "View your wallet details" + } + }, + "show-mnemonics": { + "content-config": { + "heading": "Show Mnemonics", + "description": "While not required, writing down your 12 word mnemonic phrase provides an additional backup in case you forget your PIN." + } + }, + "authorize-device-with-mnemonics": { + "content-config": { + "heading": "Authorize Device with Mnemonics", + "description": "Authorize current device by using mnemonics." + } + }, + "add-another-device": { + "content-config": { + "heading": "Add Another Device", + "description": "Scan QR Code to add another device." + } + }, + "show-device-qr-code": { + "content-config": { + "heading": "Show Device QR Code", + "description": "Scan QR Code from the device authorized device to authorize this device." + } + }, + "enable-biometrics": { + "content-config": { + "heading": "Enable Biometrics", + "description": "Use biometrics to authorize new Sessions and to confirm high value transactions." + } + }, + "disable-biometrics": { + "content-config": { + "heading": "Disable Biometrics", + "description": "Turn off biometrics and use PIN to authorize new Sessions and to confirm high value transactions." + } + } + } +} \ No newline at end of file diff --git a/js/WalletSetting/style.js b/js/WalletSettings/styles.js similarity index 80% rename from js/WalletSetting/style.js rename to js/WalletSettings/styles.js index 361fe49..6f8c0c1 100644 --- a/js/WalletSetting/style.js +++ b/js/WalletSettings/styles.js @@ -1,4 +1,3 @@ -import DefaultStyleGenerator from "../../theme/styles/DefaultStyleGenerator"; import { StyleSheet } from 'react-native'; let stylesMap = StyleSheet.create({ @@ -24,7 +23,7 @@ let stylesMap = StyleSheet.create({ marginLeft: 20, marginRight: 20, borderBottomWidth: 1, - borderBottomColor: Colors.whisper + borderBottomColor: 'red' } }); export default styles = stylesMap diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js new file mode 100644 index 0000000..61227ec --- /dev/null +++ b/js/WalletSettings/walletDetailsStyles.js @@ -0,0 +1,53 @@ +import DefaultStyleGenerator from "../../theme/styles/DefaultStyleGenerator"; +import Colors from '../../theme/styles/Colors'; + +let stylesMap = { + + list: { + flex: 1, + backgroundColor: Colors.white + }, + title: { + color: Colors.grey, + fontSize: 13, + marginTop: 15, + fontFamily: 'AvenirNext-DemiBold' + }, + text: { + color: Colors.valhalla, + fontSize: 15, + marginBottom: 15, + fontFamily: 'AvenirNext-Regular' + }, + + statusText: { + color: Colors.green, + fontSize: 15, + marginTop: 5, + marginBottom: 15, + fontFamily: 'AvenirNext-Regular' + }, + + linkView: { + marginTop: 5, + flex: 2, + marginRight: 0, + }, + + linkText: { + color: Colors.azureBlue, + marginBottom: 15, + fontSize: 15, + flexWrap: 'wrap', + fontFamily: 'AvenirNext-Regular' + }, + + listComponent: { + flex: 1, + marginHorizontal: 20, + borderBottomWidth: 1, + borderBottomColor: Colors.whisper + } +}; +export default styles = DefaultStyleGenerator.generate(stylesMap); + diff --git a/js/constants/DeviceStatus.js b/js/constants/DeviceStatus.js new file mode 100644 index 0000000..810f5d8 --- /dev/null +++ b/js/constants/DeviceStatus.js @@ -0,0 +1,15 @@ +import helpers from "./helpers"; + +const deviceStatusMap = { + CREATED: "CREATED", + REGISTERED: "REGISTERED", + AUTHORIZING: "AUTHORIZING", + AUTHORIZED: "AUTHORIZED", + REVOKING: "REVOKING", + RECOVERING: "RECOVERING", + REVOKED: "REVOKED" +}; + +helpers.addLowerCaseConstants( deviceStatusMap ); + +export default deviceStatusMap; \ No newline at end of file diff --git a/js/constants/UserStatus.js b/js/constants/UserStatus.js new file mode 100644 index 0000000..19764df --- /dev/null +++ b/js/constants/UserStatus.js @@ -0,0 +1,12 @@ +import helpers from "./helpers"; + +const userStatusMap = { + CREATED: "CREATED", + ACTIVATING: "ACTIVATING", + ACTIVATED: "ACTIVATED", + UNKNOWN: "UNKNOWN" +}; + +helpers.addLowerCaseConstants( userStatusMap ); + +export default userStatusMap; \ No newline at end of file diff --git a/js/constants/helpers.js b/js/constants/helpers.js new file mode 100644 index 0000000..3c3aeb5 --- /dev/null +++ b/js/constants/helpers.js @@ -0,0 +1,10 @@ +export default { + "addLowerCaseConstants": (constants) => { + let lowerCaseCopy = {}; + for( constantName in constants ) { if ( constants.hasOwnProperty(constantName) ) { + const lowerCaseName = constantName.toLowerCase(); + lowerCaseCopy[ lowerCaseName ] = constants[ constantName ]; + }} + Object.assign(constants, lowerCaseCopy); + } +}; \ No newline at end of file diff --git a/js/index.js b/js/index.js index f11f10f..926588c 100644 --- a/js/index.js +++ b/js/index.js @@ -16,7 +16,9 @@ import OstWalletError from './OstRNError/OstRNError'; import OstJsonApi from './OstJsonApi'; import OstWalletUIWorkflowCallback from './OstWalletUIWorkflowCallback'; import OstWalletSdkUI from './OstWalletSdkUI'; -import OstWalletSetting from './WalletSetting'; +import {OstWalletSettings, OstWalletSettingsComponent, OstWalletSettingsDefaultConfig} from './WalletSettings'; +import OstUserStatus from "./constants/UserStatus"; +import OstDeviceStatus from "./constants/DeviceStatus"; export { OstWalletSdk, @@ -27,5 +29,9 @@ export { OstJsonApi, OstWalletSdkUI, OstWalletUIWorkflowCallback, - OstWalletSetting + OstWalletSettingsDefaultConfig, + OstWalletSettings, + OstWalletSettingsComponent, + OstUserStatus, + OstDeviceStatus } diff --git a/package.json b/package.json index 2ace797..3634e94 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "license": " Apache-2.0", "peerDependencies": { "react-native": "^0.41.2", - "eventemitter3": "~4.0.0" + "eventemitter3": "~4.0.0", + "lodash.merge": "^4.6.2" } } From c4179deae2d2c36fcb4386f48a82e9982db92cc4 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 13:48:35 +0530 Subject: [PATCH 04/91] Settings - Work in progress - 2 --- js/WalletSettings/SettingsComponent.js | 28 ++---- js/WalletSettings/WalletDetails.js | 4 +- js/WalletSettings/WalletSettingsController.js | 10 +- js/WalletSettings/helpers.js | 32 ------- js/WalletSettings/walletDetailsStyles.js | 3 +- js/constants/DeviceStatus.js | 2 +- js/constants/UserStatus.js | 2 +- js/delegates/InternalWorkflowDelegate.js | 94 +++++++++++++++++++ js/helpers/OstWalletSdkHelper.js | 86 +++++++++++++++++ .../helpers.js => helpers/constantsHelper.js} | 0 10 files changed, 203 insertions(+), 58 deletions(-) delete mode 100644 js/WalletSettings/helpers.js create mode 100644 js/delegates/InternalWorkflowDelegate.js create mode 100644 js/helpers/OstWalletSdkHelper.js rename js/{constants/helpers.js => helpers/constantsHelper.js} (100%) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index bfa7e4c..8b60c93 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -1,26 +1,18 @@ import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; import inlineStyle from './styles' - - - - - -import DeviceInfo from 'react-native-device-info'; -import AndroidOpenSettings from 'react-native-android-open-settings'; -import {optionIds, WalletSettingController} from './WalletSettingController'; - - +import {optionIds, walletSettingController} from './WalletSettingController'; +import {LoadingModal} from '../../theme/components/LoadingModalCover'; +import Colors from "../../theme/styles/Colors"; +import BackArrow from '../CommonComponents/BackArrow'; +import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; import {ostSdkErrors} from "../../services/OstSdkErrors"; -import CameraPermissionsApi from "../../services/CameraPermissionsApi"; - - import CurrentUser from "../../models/CurrentUser"; -import BackArrow from '../CommonComponents/BackArrow'; -import Colors from "../../theme/styles/Colors"; -import {LoadingModal} from '../../theme/components/LoadingModalCover'; +import CameraPermissionsApi from "../../services/CameraPermissionsApi"; +import DeviceInfo from 'react-native-device-info'; +import AndroidOpenSettings from 'react-native-android-open-settings'; -class WalletSettingList extends PureComponent { +class SettingsComponent extends PureComponent { static navigationOptions = (options) => { return { title: 'Wallet Settings', @@ -312,4 +304,4 @@ class WalletSettingList extends PureComponent { } } -export default WalletSettingList; +export default SettingsComponent; diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index d9f1dcb..2c4ece7 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -109,7 +109,7 @@ class WalletDetails extends PureComponent { }, ( error ) => { let ostError = OstWalletSdkHelper.jsonToOstRNError( error ); let errorMessage = ostSdkErrors.getErrorMessage( null, ostError ); - LoadingModal.showFailureAlert(errorMessage, "", "OK", ()=> { + LoadingModal.showFailureAlert(errorMessage, "", "OK", () => { // Close this view. this.props.navigation.goBack(null); }); @@ -124,7 +124,7 @@ class WalletDetails extends PureComponent { this._buildList(); }else { - LoadingModal.showFailureAlert("Something went wrong", "", "OK", ()=> { + LoadingModal.showFailureAlert("Something went wrong", "", "OK", () => { // Close this view. this.props.navigation.goBack(null); }); diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 2d78db2..47a0aa8 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -4,7 +4,8 @@ import OstJsonApi from '../OstJsonApi'; import OstUserStatus from "../constants/UserStatus"; import OstDeviceStatus from "../constants/DeviceStatus"; import OstWalletSettings from "./OstWalletSettings"; -import OstWalletSdkHelper from './helpers'; +import OstWalletSdkHelper from '../helpers/OstWalletSdkHelper'; +import InternalWorkflowDelegate from "../delegates/InternalWorkflowDelegate" const optionIds = { walletDetails: "wallet-details", @@ -30,6 +31,11 @@ class WalletSettingController { this.deviceStatusMap = OstDeviceStatus; this.currentWorkflow = null; this.uiDelegate = null; + if ( !ostWalletUIWorkflowCallback || !(ostWalletUIWorkflowCallback instanceof OstWalletUIWorkflowCallback) ) { + let err = new Error("Delegate must be an instanceof OstWalletUIWorkflowCallback"); + throw err; + } + this.externalDelegate = ostWalletUIWorkflowCallback; } _initialize(ostUserId) { @@ -389,7 +395,7 @@ class WalletSettingController { } _getWorkflowDelegate() { - let delegate = CurrentUser.newPassphraseDelegate(); + let delegate = new InternalWorkflowDelegate( this.userId, this.externalDelegate); // delegate.requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { if ( this.uiDelegate ) { diff --git a/js/WalletSettings/helpers.js b/js/WalletSettings/helpers.js deleted file mode 100644 index 36156b1..0000000 --- a/js/WalletSettings/helpers.js +++ /dev/null @@ -1,32 +0,0 @@ -import OstDeviceStatus from "../constants/DeviceStatus"; - -export default { - "canDeviceMakeApiCall": ( device ) => { - if (!device) { - return false; - } - - switch( device.status ) { - case DeviceStatus.REGISTERED: - case DeviceStatus.AUTHORIZING: - case DeviceStatus.AUTHORIZED: - case DeviceStatus.REVOKING: - case DeviceStatus.RECOVERING: - return true; - default: - return false; - } - }, - - "jsonToOstRNError": ( ostErrorJson ) => { - if ( ostErrorJson instanceof OstWalletError ) { - return ostErrorJson; - } - let ostError = new OstWalletError( ostErrorJson ); - if ( ostError.isApiError() ) { - ostError = new OstWalletApiError( ostErrorJson ); - } - return ostError; - } - -}; \ No newline at end of file diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 61227ec..10019de 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -49,5 +49,4 @@ let stylesMap = { borderBottomColor: Colors.whisper } }; -export default styles = DefaultStyleGenerator.generate(stylesMap); - +export default styles = DefaultStyleGenerator.generate(stylesMap); \ No newline at end of file diff --git a/js/constants/DeviceStatus.js b/js/constants/DeviceStatus.js index 810f5d8..24bbbbe 100644 --- a/js/constants/DeviceStatus.js +++ b/js/constants/DeviceStatus.js @@ -1,4 +1,4 @@ -import helpers from "./helpers"; +import helpers from "../helpers/constantsHelper"; const deviceStatusMap = { CREATED: "CREATED", diff --git a/js/constants/UserStatus.js b/js/constants/UserStatus.js index 19764df..0080a80 100644 --- a/js/constants/UserStatus.js +++ b/js/constants/UserStatus.js @@ -1,4 +1,4 @@ -import helpers from "./helpers"; +import helpers from "../helpers/constantsHelper"; const userStatusMap = { CREATED: "CREATED", diff --git a/js/delegates/InternalWorkflowDelegate.js b/js/delegates/InternalWorkflowDelegate.js new file mode 100644 index 0000000..967a2f5 --- /dev/null +++ b/js/delegates/InternalWorkflowDelegate.js @@ -0,0 +1,94 @@ +import {OstWalletUIWorkflowCallback} from "@ostdotcom/ost-wallet-sdk-react-native"; +import OstWalletSdkHelper from "./OstWalletSdkHelper"; + +class InternalWorkflowDelegate extends OstWalletUIWorkflowCallback { + constructor(userId, externalDelegate) { + super(); + this.userId = userId; + this.externalDelegate = externalDelegate; + if ( !externalDelegate || !(externalDelegate instanceof OstWalletUIWorkflowCallback) ) { + let err = new Error("Delegate must be an instanceof OstWalletUIWorkflowCallback"); + throw err; + } + } + + isUserIdValid() { + if ( typeof externalDelegate.getCurrentUserOstId === 'function') { + return this.userId === externalDelegate.getCurrentUserOstId(); + } + return true; + } + + getPassphrase(userId, ostWorkflowContext, passphrasePrefixAccept) { + return externalDelegate.getPassphrase(userId, ostWorkflowContext, passphrasePrefixAccept); + } + + flowInterrupt(ostWorkflowContext , ostError) { + let externalDelegate = this.externalDelegate; + // Check if device is unauthorized. + if (OstWalletSdkHelper.isDeviceUnauthorizedError(ostError)) { + this.onUnauthorized(ostWorkflowContext, ostError ); + if ( typeof externalDelegate.onUnauthorized === 'function') { + return externalDelegate.onUnauthorized(ostWorkflowContext, ostError); + } + return externalDelegate.flowInterrupt(ostWorkflowContext, ostError); + } + + //TODO: Check if device's clock is out of sync. + else if (OstWalletSdkHelper.isDeviceTimeOutOfSync(ostError)) { + this.deviceTimeOutOfSync(ostWorkflowContext, ostError ); + if ( typeof externalDelegate.deviceTimeOutOfSync === 'function') { + return externalDelegate.deviceTimeOutOfSync(ostWorkflowContext, ostError); + } + return externalDelegate.flowInterrupt(ostWorkflowContext, ostError); + } + + // Check if workflow has been cancelled by user. + else if (OstWalletSdkHelper.isUserCancelled(ostError)) { + this.userCancelled(ostWorkflowContext, ostError ); + if ( typeof externalDelegate.userCancelled === 'function') { + return externalDelegate.userCancelled(ostWorkflowContext, ostError); + } + // Others should override this method and show the error. + return externalDelegate.flowInterrupt(ostWorkflowContext, ostError); + } + + // Trigger generic error handler. + else { + this.workflowFailed(ostWorkflowContext, ostError); + if ( typeof externalDelegate.workflowFailed === 'function') { + return externalDelegate.workflowFailed(ostWorkflowContext, ostError); + } + // Others should override this method and show the error. + return externalDelegate.flowInterrupt(ostWorkflowContext, ostError); + } + } + + onUnauthorized(ostWorkflowContext, ostError) { + // Others should override this method and show the error. + // + } + + deviceTimeOutOfSync(ostWorkflowContext, ostError) { + // Others should override this method and show the error. + // + } + + saltFetchFailed( response ) { + // Others should override this method and show the error. + // + } + + userCancelled(ostWorkflowContext, ostError) { + // Others should override this method and show the error. + // + } + + workflowFailed(ostWorkflowContext , ostError) { + // Others should override this method and show the error. + // + } + +}; + +export default InternalWorkflowDelegate; diff --git a/js/helpers/OstWalletSdkHelper.js b/js/helpers/OstWalletSdkHelper.js new file mode 100644 index 0000000..7664e5a --- /dev/null +++ b/js/helpers/OstWalletSdkHelper.js @@ -0,0 +1,86 @@ +import OstWalletApiError from '../OstRNError/OstRNApiError'; +import OstWalletError from '../OstRNError/OstRNError'; +import OstDeviceStatus from "../constants/DeviceStatus"; + +class OstWalletSdkHelper { + constructor() {} + + static isDeviceUnauthorizedError(ostError ) { + if ( ostError.isApiError() ) { + // OstError is base error class. + // If this flag is true, we have received an object of OstApiError. + // OstApiError is derived from OstError. + // In javascript, you don't need to typecast, so we shall use the same object. + + // Check if user's device is revoked. + if ( ostError.isApiSignerUnauthorized() ) { + // IMPORTANT: User's Device has been revoked. + // Application must logout the user in this case. + return true; + } + } else if ("DEVICE_NOT_SETUP" === ostError.getErrorCode() ) { + // User's device is not set-up. + // IMPORTANT: User's Device has been revoked. + // Application must logout the user in this case. + + return true; + } else if ("DEVICE_NOT_REGISTERED" === ostError.getErrorCode() ) { + // User's device is not registered. + // IMPORTANT: User's Device can't make api calls. + // Application must logout the user in this case. + return true; + } + + return false + } + + static isUserCancelled (ostError) { + if ( "WORKFLOW_CANCELLED" === ostError.getErrorCode() ) { + return true + } + + if ( "WORKFLOW_CANCELED" === ostError.getErrorCode() ) { + return true + } + + return false + } + + static canDeviceMakeApiCall(device) { + if (!device) { + return false; + } + switch( device.status ) { + case DeviceStatus.REGISTERED: + case DeviceStatus.AUTHORIZING: + case DeviceStatus.AUTHORIZED: + case DeviceStatus.REVOKING: + case DeviceStatus.RECOVERING: + return true; + default: + return false; + } + } + + static isDeviceTimeOutOfSync(ostError) { + if ( ostError.isApiError() ) { + if (ostError.isDeviceTimeOutOfSync()) { + return true + } + } + return false + } + + static jsonToOstRNError( ostErrorJson ) { + if ( ostErrorJson instanceof OstWalletError ) { + return ostErrorJson; + } + let ostError = new OstWalletError( ostErrorJson ); + if ( ostError.isApiError() ) { + ostError = new OstWalletApiError( ostErrorJson ); + } + return ostError; + } +} + +export default new OstWalletSdkHelper(); diff --git a/js/constants/helpers.js b/js/helpers/constantsHelper.js similarity index 100% rename from js/constants/helpers.js rename to js/helpers/constantsHelper.js From 3a2e96265ccdbaca40337a6dbd0a7e6dcc29e2c2 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 14:04:32 +0530 Subject: [PATCH 05/91] Remove DeviceInfo and CurrentUser dependency --- js/WalletSettings/SettingsComponent.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 8b60c93..5dbcea6 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -7,11 +7,15 @@ import Colors from "../../theme/styles/Colors"; import BackArrow from '../CommonComponents/BackArrow'; import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; import {ostSdkErrors} from "../../services/OstSdkErrors"; -import CurrentUser from "../../models/CurrentUser"; + import CameraPermissionsApi from "../../services/CameraPermissionsApi"; -import DeviceInfo from 'react-native-device-info'; + import AndroidOpenSettings from 'react-native-android-open-settings'; +/// REMOVED +// import DeviceInfo from 'react-native-device-info'; +// import CurrentUser from "../../models/CurrentUser"; + class SettingsComponent extends PureComponent { static navigationOptions = (options) => { return { @@ -240,9 +244,11 @@ class SettingsComponent extends PureComponent { onUnauthorized = (ostWorkflowContext , ostError) => { LoadingModal.showFailureAlert("Device is not authorized. Please authorize device again.", null, "Logout", () => { - CurrentUser.logout({ - device_id: DeviceInfo.getUniqueID() - }); + //TODO bubble - Deal with this. + + // CurrentUser.logout({ + // device_id: DeviceInfo.getUniqueID() + // }); }) }; From c39a62501457b0516df37381b0f522b2bae992fe Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 14:35:04 +0530 Subject: [PATCH 06/91] react-native-android-open-settings - Added optional peer dependencies --- js/WalletSettings/SettingsComponent.js | 6 +++++- package.json | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 5dbcea6..6ccc2f5 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -10,7 +10,11 @@ import {ostSdkErrors} from "../../services/OstSdkErrors"; import CameraPermissionsApi from "../../services/CameraPermissionsApi"; -import AndroidOpenSettings from 'react-native-android-open-settings'; + +let AndroidOpenSettings = null; +import('react-native-android-open-settings').then((pack) => { + AndroidOpenSettings = pack.default; +}); /// REMOVED // import DeviceInfo from 'react-native-device-info'; diff --git a/package.json b/package.json index 3634e94..ee8e4b5 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "peerDependencies": { "react-native": "^0.41.2", "eventemitter3": "~4.0.0", - "lodash.merge": "^4.6.2" + "lodash.merge": "^4.6.2", + "react-native-android-open-settings": "^1.3.0" } } From 5a59f092f9cfcfb36ea00fc972d19cfe2ff35544 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 14:53:59 +0530 Subject: [PATCH 07/91] Fix WalletSettingController import. --- js/WalletSettings/SettingsComponent.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 6ccc2f5..940a725 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -1,16 +1,18 @@ +// Working IMPORTS. import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; +import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; + +// To-Be-Fixed. import inlineStyle from './styles' -import {optionIds, walletSettingController} from './WalletSettingController'; import {LoadingModal} from '../../theme/components/LoadingModalCover'; import Colors from "../../theme/styles/Colors"; import BackArrow from '../CommonComponents/BackArrow'; -import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; import {ostSdkErrors} from "../../services/OstSdkErrors"; - import CameraPermissionsApi from "../../services/CameraPermissionsApi"; - +// Fixed. +import {optionIds, WalletSettingController} from './WalletSettingController'; let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { AndroidOpenSettings = pack.default; @@ -50,6 +52,7 @@ class SettingsComponent extends PureComponent { refreshing: false, }; + this.controller = new WalletSettingController(this.props.ostUserId, this.props.delegate); this._initiateEventTextMap() } @@ -156,7 +159,7 @@ class SettingsComponent extends PureComponent { refreshList = (onFetch) => { let refreshState = this.state.refreshing; - walletSettingController.refresh((optionsData) => { + this.controller.refresh((optionsData) => { this.setState({ list: optionsData, refreshing: !refreshState @@ -194,7 +197,7 @@ class SettingsComponent extends PureComponent { } _perfromWorkflow(item) { - let workflowInfo = walletSettingController.perform(item.id); + let workflowInfo = this.controller.perform(item.id); if ( workflowInfo ) { this.onWorkflowStarted( workflowInfo ); } else { @@ -227,7 +230,7 @@ class SettingsComponent extends PureComponent { //LoadingModal.show(''); // Subscribe to events. - walletSettingController.setUIDelegate(this); + this.controller.setUIDelegate(this); }; requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { @@ -259,7 +262,7 @@ class SettingsComponent extends PureComponent { saltFetchFailed = (ostWorkflowContext , ostError) => { LoadingModal.showFailureAlert("There is some issue while fetching salt. Please retry", null, "Retry", (isButtonTapped) => { if (isButtonTapped) { - let retryItem = walletSettingController.optionsMap[this.workflowInfo.workflowOptionId]; + let retryItem = this.controller.optionsMap[this.workflowInfo.workflowOptionId]; this.onSettingItemTapped(retryItem); } }) From c7d6cfe3ddb892194e522ea426239dee3de42cd8 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 15:19:31 +0530 Subject: [PATCH 08/91] Add react-navigation compatibility --- js/WalletSettings/SettingsComponent.js | 13 ++++++++++++- js/WalletSettings/WalletSettingsController.js | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 940a725..2b2c096 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -52,7 +52,18 @@ class SettingsComponent extends PureComponent { refreshing: false, }; - this.controller = new WalletSettingController(this.props.ostUserId, this.props.delegate); + + let ostUserId = this.props.ostUserId; + let delegate = this.props.ostWalletUIWorkflowCallback; + + /// If using react-navigation. + let navigation = this.props.navigation; + if ( navigation && navigation.getParam ) { + ostUserId = ostUserId || navigation.getParam("ostUserId"); + delegate = delegate || navigation.getParam("ostWalletUIWorkflowCallback"); + } + + this.controller = new WalletSettingController(ostUserId, delegate); this._initiateEventTextMap() } diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 47a0aa8..ba8cd68 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -32,7 +32,7 @@ class WalletSettingController { this.currentWorkflow = null; this.uiDelegate = null; if ( !ostWalletUIWorkflowCallback || !(ostWalletUIWorkflowCallback instanceof OstWalletUIWorkflowCallback) ) { - let err = new Error("Delegate must be an instanceof OstWalletUIWorkflowCallback"); + let err = new Error("ostWalletUIWorkflowCallback can not be null and must be an instanceof OstWalletUIWorkflowCallback"); throw err; } this.externalDelegate = ostWalletUIWorkflowCallback; From a2773d6501723335f1aa1a62aa4d83e6216d8fc1 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 16:38:12 +0530 Subject: [PATCH 09/91] Temp being. --- js/WalletSettings/SettingsComponent.js | 99 +++++++++++------------- js/delegates/InternalWorkflowDelegate.js | 2 +- 2 files changed, 47 insertions(+), 54 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 2b2c096..c000a96 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -1,50 +1,28 @@ // Working IMPORTS. import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; -import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; +import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; -// To-Be-Fixed. +// To-Be-Reomved. import inlineStyle from './styles' -import {LoadingModal} from '../../theme/components/LoadingModalCover'; -import Colors from "../../theme/styles/Colors"; -import BackArrow from '../CommonComponents/BackArrow'; -import {ostSdkErrors} from "../../services/OstSdkErrors"; -import CameraPermissionsApi from "../../services/CameraPermissionsApi"; +// import {LoadingModal} from '../../theme/components/LoadingModalCover'; +// import {ostSdkErrors} from "../../services/OstSdkErrors"; +// import CameraPermissionsApi from "../../services/CameraPermissionsApi"; // Fixed. -import {optionIds, WalletSettingController} from './WalletSettingController'; +import {optionIds, WalletSettingsController} from './WalletSettingsController'; let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { AndroidOpenSettings = pack.default; }); /// REMOVED +// import BackArrow from '../CommonComponents/BackArrow'; +// import Colors from "../../theme/styles/Colors"; // import DeviceInfo from 'react-native-device-info'; // import CurrentUser from "../../models/CurrentUser"; class SettingsComponent extends PureComponent { - static navigationOptions = (options) => { - return { - title: 'Wallet Settings', - headerBackTitle: null, - headerStyle: { - backgroundColor: Colors.white, - borderBottomWidth: 0, - shadowColor: '#000', - shadowOffset: { - width: 0, - height: 1 - }, - shadowOpacity: 0.1, - shadowRadius: 3 - }, - headerTitleStyle: { - fontFamily: 'AvenirNext-Medium' - }, - headerBackImage: - }; - }; - constructor(props) { super(props); this.state = { @@ -63,7 +41,7 @@ class SettingsComponent extends PureComponent { delegate = delegate || navigation.getParam("ostWalletUIWorkflowCallback"); } - this.controller = new WalletSettingController(ostUserId, delegate); + this.controller = new WalletSettingsController(ostUserId, delegate); this._initiateEventTextMap() } @@ -159,11 +137,14 @@ class SettingsComponent extends PureComponent { } _getFlowFailedText(workflowContext, ostError) { - return ostSdkErrors.getErrorMessage(workflowContext, ostError) + /// TODO bubble ostSdkErrors was here. + // return ostSdkErrors.getErrorMessage(workflowContext, ostError) + return ""; } componentDidMount() { - LoadingModal.show("Fetching Settings..."); + /// TODO bubble LoadingModal was here. + // LoadingModal.show("Fetching Settings..."); this.refreshList(); } @@ -179,7 +160,8 @@ class SettingsComponent extends PureComponent { if (onFetch) { onFetch() }else { - LoadingModal.hide() + /// TODO bubble LoadingModal was here. + // LoadingModal.hide() } }, true); @@ -194,13 +176,18 @@ class SettingsComponent extends PureComponent { this.props.navigation.navigate('WalletDetails'); return; } else if (item.id === optionIds.authorizeWithQR) { - let cameraResult = await CameraPermissionsApi.requestPermission('camera'); + /// TODO bubble CameraPermissionsApi.requestPermission was here. + // let cameraResult = await CameraPermissionsApi.requestPermission('camera'); + let cameraResult = ""; if ((cameraResult == 'denied' || cameraResult == 'restricted')) { - LoadingModal.showFailureAlert("Allow access to your camera to scan QR", '', 'Enable Camera Access', (isBtnTapped) => { - if (isBtnTapped) { - this.enableAccess(); - } - }); + /// TODO bubble LoadingModal was here. + + // LoadingModal.showFailureAlert("Allow access to your camera to scan QR", '', 'Enable Camera Access', (isBtnTapped) => { + // if (isBtnTapped) { + // this.enableAccess(); + // } + // }); + return; } } @@ -261,26 +248,32 @@ class SettingsComponent extends PureComponent { }; onUnauthorized = (ostWorkflowContext , ostError) => { - LoadingModal.showFailureAlert("Device is not authorized. Please authorize device again.", null, "Logout", () => { - //TODO bubble - Deal with this. + /// TODO bubble LoadingModal was here. + + // LoadingModal.showFailureAlert("Device is not authorized. Please authorize device again.", null, "Logout", () => { + // //TODO bubble - Deal with this. - // CurrentUser.logout({ - // device_id: DeviceInfo.getUniqueID() - // }); - }) + // // CurrentUser.logout({ + // // device_id: DeviceInfo.getUniqueID() + // // }); + // }) }; saltFetchFailed = (ostWorkflowContext , ostError) => { - LoadingModal.showFailureAlert("There is some issue while fetching salt. Please retry", null, "Retry", (isButtonTapped) => { - if (isButtonTapped) { - let retryItem = this.controller.optionsMap[this.workflowInfo.workflowOptionId]; - this.onSettingItemTapped(retryItem); - } - }) + /// TODO bubble LoadingModal was here. + + // LoadingModal.showFailureAlert("There is some issue while fetching salt. Please retry", null, "Retry", (isButtonTapped) => { + // if (isButtonTapped) { + // let retryItem = this.controller.optionsMap[this.workflowInfo.workflowOptionId]; + // this.onSettingItemTapped(retryItem); + // } + // }) }; userCancelled = (ostWorkflowContext , ostError) => { - LoadingModal.hide(); + /// TODO bubble LoadingModal was here. + + // LoadingModal.hide(); }; deviceTimeOutOfSync = (ostWorkflowContext , ostError) => { diff --git a/js/delegates/InternalWorkflowDelegate.js b/js/delegates/InternalWorkflowDelegate.js index 967a2f5..451d255 100644 --- a/js/delegates/InternalWorkflowDelegate.js +++ b/js/delegates/InternalWorkflowDelegate.js @@ -1,5 +1,5 @@ import {OstWalletUIWorkflowCallback} from "@ostdotcom/ost-wallet-sdk-react-native"; -import OstWalletSdkHelper from "./OstWalletSdkHelper"; +import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; class InternalWorkflowDelegate extends OstWalletUIWorkflowCallback { constructor(userId, externalDelegate) { From e498fca21801abd5c9e42cfbc0decc9ef528abc1 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 16:49:24 +0530 Subject: [PATCH 10/91] Correct the typo --- js/WalletSettings/WalletSettingsController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index ba8cd68..4123c29 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -21,7 +21,7 @@ const optionIds = { disableBiometrics: "disable-biometrics" }; -class WalletSettingController { +class WalletSettingsController { constructor(ostUserId, ostWalletUIWorkflowCallback) { this.userId = ostUserId; @@ -452,4 +452,4 @@ class WalletSettingController { }; -export {WalletSettingController , optionIds} +export {WalletSettingsController , optionIds} From a736fc35fe93bee6fc2f174eb3db720fa2a2d7e7 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 17:30:35 +0530 Subject: [PATCH 11/91] minor fixes. --- js/WalletSettings/WalletSettingsController.js | 19 +++++++++++++------ js/delegates/InternalWorkflowDelegate.js | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 4123c29..923e691 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -5,6 +5,7 @@ import OstUserStatus from "../constants/UserStatus"; import OstDeviceStatus from "../constants/DeviceStatus"; import OstWalletSettings from "./OstWalletSettings"; import OstWalletSdkHelper from '../helpers/OstWalletSdkHelper'; +import OstWalletUIWorkflowCallback from '../OstWalletUIWorkflowCallback'; import InternalWorkflowDelegate from "../delegates/InternalWorkflowDelegate" const optionIds = { @@ -35,6 +36,11 @@ class WalletSettingsController { let err = new Error("ostWalletUIWorkflowCallback can not be null and must be an instanceof OstWalletUIWorkflowCallback"); throw err; } + + if ( !ostUserId ) { + let err = new Error("ostUserId can not be null and must be a String"); + throw err; + } this.externalDelegate = ostWalletUIWorkflowCallback; } @@ -45,7 +51,7 @@ class WalletSettingsController { _initializeOptions() { for( optionId in optionIds ) { - this._createOptionsData(optionId); + this._createOptionsData( optionIds[optionId] ); } } @@ -222,8 +228,8 @@ class WalletSettingsController { } _isUserIdValid() { - let delegate = this._getWorkflowDelegate(); - if ( typeof delegate.getCurrentUserOstId === 'function' ) { + let delegate = this.externalDelegate; + if ( delegate && typeof delegate.getCurrentUserOstId === 'function' ) { let appOstUserId = delegate.getCurrentUserOstId(); return appOstUserId === this.userId; } @@ -234,13 +240,13 @@ class WalletSettingsController { _createOptionsData(id){ - let itemConfig = OstWalletSettings.getItemConfig(); + let itemConfig = OstWalletSettings.getItemConfig( id ); if ( !itemConfig ) { - const err = new Error(`Content configuration for itemId ${id} is not defined.`) + const err = new Error(`Item configuration for itemId ${id} is not defined.`) throw err; } - let contentConfig = OstWalletSettings.getItemContentConfig(); + let contentConfig = OstWalletSettings.getItemContentConfig( id ); if ( !contentConfig ) { const err = new Error(`Content configuration for itemId ${id} is not defined.`); throw err; @@ -395,6 +401,7 @@ class WalletSettingsController { } _getWorkflowDelegate() { + console.trace(); let delegate = new InternalWorkflowDelegate( this.userId, this.externalDelegate); // delegate.requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { diff --git a/js/delegates/InternalWorkflowDelegate.js b/js/delegates/InternalWorkflowDelegate.js index 451d255..344fb9c 100644 --- a/js/delegates/InternalWorkflowDelegate.js +++ b/js/delegates/InternalWorkflowDelegate.js @@ -1,5 +1,5 @@ -import {OstWalletUIWorkflowCallback} from "@ostdotcom/ost-wallet-sdk-react-native"; import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; +import OstWalletUIWorkflowCallback from '../OstWalletUIWorkflowCallback'; class InternalWorkflowDelegate extends OstWalletUIWorkflowCallback { constructor(userId, externalDelegate) { From b416b2e03f30029a319effed0b1e07ac34c69744 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 17:47:54 +0530 Subject: [PATCH 12/91] Minnor Fixes. --- js/WalletSettings/SettingsComponent.js | 2 ++ js/WalletSettings/WalletSettingsController.js | 4 ++-- js/helpers/OstWalletSdkHelper.js | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index c000a96..48b4cc3 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -14,6 +14,8 @@ import {optionIds, WalletSettingsController} from './WalletSettingsController'; let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { AndroidOpenSettings = pack.default; +}).catch( (err) => { + //Ignore. }); /// REMOVED diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 923e691..483ad6f 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -294,7 +294,7 @@ class WalletSettingsController { if ( this.ostUser ) { uStatus = this.ostUser.status || uStatus; } - return uStatus.toLowerCase(); + return uStatus.toUpperCase(); } _getDeviceStatus() { @@ -302,7 +302,7 @@ class WalletSettingsController { if ( this.ostDevice ) { dStatus = this.ostDevice.status || dStatus; } - return dStatus.toLowerCase(); + return dStatus.toUpperCase(); } /** diff --git a/js/helpers/OstWalletSdkHelper.js b/js/helpers/OstWalletSdkHelper.js index 7664e5a..a68719a 100644 --- a/js/helpers/OstWalletSdkHelper.js +++ b/js/helpers/OstWalletSdkHelper.js @@ -51,11 +51,11 @@ class OstWalletSdkHelper { return false; } switch( device.status ) { - case DeviceStatus.REGISTERED: - case DeviceStatus.AUTHORIZING: - case DeviceStatus.AUTHORIZED: - case DeviceStatus.REVOKING: - case DeviceStatus.RECOVERING: + case OstDeviceStatus.REGISTERED: + case OstDeviceStatus.AUTHORIZING: + case OstDeviceStatus.AUTHORIZED: + case OstDeviceStatus.REVOKING: + case OstDeviceStatus.RECOVERING: return true; default: return false; @@ -83,4 +83,4 @@ class OstWalletSdkHelper { } } -export default new OstWalletSdkHelper(); +export default OstWalletSdkHelper; From aa821865140c9697bcca4795723f9d92ef832484 Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Tue, 10 Dec 2019 19:58:31 +0530 Subject: [PATCH 13/91] Add commit hash of team/theme-config-get --- android/build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 9bdfb78..1ded4ed 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,10 +14,13 @@ allprojects { repositories { google() jcenter() + maven { url "https://jitpack.io" } } } apply plugin: 'com.android.library' +apply plugin: 'maven' +group = 'com.github.ostdotcom' android { compileSdkVersion 28 @@ -45,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.ost:ost-wallet-sdk-android:2.3.6' + api 'com.github.ostdotcom:ost-wallet-sdk-android:ca21350b35e3a26b0887f056e8b5b3f2a4bd11a1' } From ea41d12532d0d41f0ab0015b2f5c89c1451f02f2 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 10 Dec 2019 20:01:07 +0530 Subject: [PATCH 14/91] setting fix --- js/WalletSettings/SettingsComponent.js | 20 +++++++++---------- js/WalletSettings/WalletSettingsController.js | 7 +++++-- .../ost-wallet-settings-config.json | 2 +- js/delegates/InternalWorkflowDelegate.js | 1 + 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 48b4cc3..95d105d 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -145,27 +145,24 @@ class SettingsComponent extends PureComponent { } componentDidMount() { - /// TODO bubble LoadingModal was here. - // LoadingModal.show("Fetching Settings..."); this.refreshList(); } refreshList = (onFetch) => { - let refreshState = this.state.refreshing; - + if (this.state.refreshing) { + return + } + this.setState({ + refreshing: true + }) this.controller.refresh((optionsData) => { this.setState({ list: optionsData, - refreshing: !refreshState + refreshing: false }); - if (onFetch) { - onFetch() - }else { - /// TODO bubble LoadingModal was here. - // LoadingModal.hide() + onFetch(optionsData) } - }, true); }; @@ -317,6 +314,7 @@ class SettingsComponent extends PureComponent { renderItem={this._renderItem} keyExtractor={this._keyExtractor} visible={false} + onRefresh={this.refreshList} /> ); diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 483ad6f..2c67602 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -164,8 +164,11 @@ class WalletSettingsController { this._updateOptionsData(optionIds.authorizeWithQR, false, true); this._updateOptionsData(optionIds.resetPin, false, true); - let biometricMessage = (this.isBiometricEnabled || false) ? 'Disable Biometrics' : 'Enable Biometric'; - this._updateOptionsData(optionIds.updateBiometricPreference, false, true, biometricMessage); + if (this.isBiometricEnabled || false) { + this._updateOptionsData(optionIds.disableBiometrics, false, true, "Disable Biometrics"); + }else { + this._updateOptionsData(optionIds.enableBiometrics, false, true, "Enable Biometric"); + } } if (deviceStatus == this.deviceStatusMap.registered) { diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index 069dba5..e403259 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -43,7 +43,7 @@ }, "reset-pin": { "content-config": { - "heading": "Wallet Details", + "heading": "Reset Pin", "description": "View your wallet details" } }, diff --git a/js/delegates/InternalWorkflowDelegate.js b/js/delegates/InternalWorkflowDelegate.js index 344fb9c..f149e24 100644 --- a/js/delegates/InternalWorkflowDelegate.js +++ b/js/delegates/InternalWorkflowDelegate.js @@ -20,6 +20,7 @@ class InternalWorkflowDelegate extends OstWalletUIWorkflowCallback { } getPassphrase(userId, ostWorkflowContext, passphrasePrefixAccept) { + let externalDelegate = this.externalDelegate; return externalDelegate.getPassphrase(userId, ostWorkflowContext, passphrasePrefixAccept); } From 4af4d01228ce5d70130f4d058a1f2cf2f2c0c535 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 10 Dec 2019 20:48:22 +0530 Subject: [PATCH 15/91] wallet details added --- js/WalletSettings/SettingsComponent.js | 10 ++- js/WalletSettings/WalletDetails.js | 92 ++++++++++++------------ js/WalletSettings/walletDetailsStyles.js | 33 ++++----- 3 files changed, 69 insertions(+), 66 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 95d105d..530b2aa 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -2,6 +2,7 @@ import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; +import WalletDetails from './WalletDetails' // To-Be-Reomved. import inlineStyle from './styles' @@ -30,6 +31,7 @@ class SettingsComponent extends PureComponent { this.state = { list: [], refreshing: false, + modalVisible: false }; @@ -172,7 +174,10 @@ class SettingsComponent extends PureComponent { async _processTappedOption(item) { if ( optionIds.walletDetails === item.id ) { - this.props.navigation.navigate('WalletDetails'); + // this.props.navigation.navigate('WalletDetails'); + this.setState({ + modalVisible: true + }) return; } else if (item.id === optionIds.authorizeWithQR) { /// TODO bubble CameraPermissionsApi.requestPermission was here. @@ -307,6 +312,8 @@ class SettingsComponent extends PureComponent { render() { return ( + <> + + ); } } diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 2c4ece7..8fb17d3 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -1,21 +1,24 @@ import React, {PureComponent} from 'react'; -import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View, Image, Clipboard} from 'react-native'; +import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View, Image, Clipboard, Modal} from 'react-native'; import inlineStyle from './walletDetailsStyles'; -import {LoadingModal} from '../../theme/components/LoadingModalCover'; -import Colors from "../../theme/styles/Colors"; -import BackArrow from '../CommonComponents/BackArrow'; +// import {LoadingModal} from '../../theme/components/LoadingModalCover'; +// import Colors from "../../theme/styles/Colors"; +// import BackArrow from '../CommonComponents/BackArrow'; -import iconCopy from '../../assets/icon-copy.png'; -import viewIcon from '../../assets/open-view.png'; +// import iconCopy from '../../assets/icon-copy.png'; +// import viewIcon from '../../assets/open-view.png'; -import { OstWalletSdk, OstWalletSdkUI, OstJsonApi} from '@ostdotcom/ost-wallet-sdk-react-native'; -import OstWalletSdkHelper from "../../helpers/OstWalletSdkHelper"; -import {ostSdkErrors} from "../../services/OstSdkErrors"; -import CurrentUser from "../../models/CurrentUser"; -import {IS_STAGING, TOKEN_ID, VIEW_END_POINT} from "../../constants"; +import OstWalletSdk from '../OstWalletSdk'; +import OstWalletSdkUI from '../OstWalletSdkUI'; +import OstJsonApi from '../OstJsonApi'; +import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; -import InAppBrowser from '../../services/InAppBrowser'; -import Toast from '../../theme/components/NotificationToast'; +// import {ostSdkErrors} from "../../services/OstSdkErrors"; +// import CurrentUser from "../../models/CurrentUser"; +// import {IS_STAGING, TOKEN_ID, VIEW_END_POINT} from "../../constants"; + +// import InAppBrowser from '../../services/InAppBrowser'; +// import Toast from '../../theme/components/NotificationToast'; @@ -25,7 +28,7 @@ class WalletDetails extends PureComponent { title: 'Wallet Details', headerBackTitle: null, headerStyle: { - backgroundColor: Colors.white, + backgroundColor: '#fff', borderBottomWidth: 0, shadowColor: '#000', shadowOffset: { @@ -34,11 +37,7 @@ class WalletDetails extends PureComponent { }, shadowOpacity: 0.1, shadowRadius: 3 - }, - headerTitleStyle: { - fontFamily: 'AvenirNext-Medium' - }, - headerBackImage: + } }; }; @@ -48,10 +47,11 @@ class WalletDetails extends PureComponent { list: [], refreshing: false }; + + this.userId = props.userId; } componentDidMount() { - this.userId = CurrentUser.getOstUserId(); this.ostUser = null; this.ostDevice = null; this.token = null; @@ -59,7 +59,6 @@ class WalletDetails extends PureComponent { this.onRefresh(); } - onRefresh = () => { if( this.state.refreshing ) { return; @@ -67,17 +66,9 @@ class WalletDetails extends PureComponent { this.setState({ refreshing: true }); - this._fetchToken(); + this._fetchUser(); }; - _fetchToken() { - OstWalletSdk.getToken(TOKEN_ID, (token) => { - this.token = token; - - this._fetchUser(); - }) - } - _fetchUser() { OstWalletSdk.getUser(this.userId, (userData) => { if ( !userData ) { @@ -88,10 +79,18 @@ class WalletDetails extends PureComponent { this.ostUser = userData; // Get the device. - this._fetchDevice(); + this._fetchToken(userData.token_id); }); } + _fetchToken(tokenId) { + OstWalletSdk.getToken(tokenId.toString(), (token) => { + this.token = token; + + this._fetchDevice(); + }) + } + _fetchDevice() { OstWalletSdk.getCurrentDeviceForUserId(this.userId, (device) => { if( device && OstWalletSdkHelper.canDeviceMakeApiCall( device ) ) { @@ -133,10 +132,7 @@ class WalletDetails extends PureComponent { _buildList() { let cells = []; - //Ordering Cells Logic. - if ( IS_STAGING ) { - cells.push( this._buildUserIdData() ); - } + cells.push( this._buildUserStatusData() ); cells.push( this._buildTokenIdData() ); cells.push( this._buildTokenHolderAddressData() ); @@ -156,7 +152,7 @@ class WalletDetails extends PureComponent { return { "cellType": "text", "heading": "Token ID", - "text": TOKEN_ID + "text": this.token.id }; } @@ -177,22 +173,22 @@ class WalletDetails extends PureComponent { } _buildTokenHolderAddressData() { - let link = VIEW_END_POINT + 'token/th-'+ this._getAuxChainId() + '-' + this._getUtilityBandedToken() + '-' + this.ostUser.token_holder_address; + // let link = VIEW_END_POINT + 'token/th-'+ this._getAuxChainId() + '-' + this._getUtilityBandedToken() + '-' + this.ostUser.token_holder_address; return { "cellType": "link", "heading": "Token Holder Address", "text": this.ostUser.token_holder_address, - "link": link + "link": '' }; } _buildDeviceManagerAddressData() { - let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.device_manager_address; + // let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.device_manager_address; return { "cellType": "link", "heading": "Device Manager Address", "text": this.ostUser.device_manager_address, - "link": link + "link": '' }; } @@ -205,12 +201,12 @@ class WalletDetails extends PureComponent { } _buildRecoveryOwnerAddressData() { - let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.recovery_owner_address; + // let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.recovery_owner_address; return { "cellType": "link", "heading": "Recovery Owner Address", "text": this.ostUser.recovery_owner_address, - "link": link + "link": '' }; } @@ -249,7 +245,11 @@ class WalletDetails extends PureComponent { render() { return ( - + - + ); } @@ -306,7 +306,7 @@ class WalletDetails extends PureComponent { {item.text} - + {/**/} @@ -322,7 +322,7 @@ class WalletDetails extends PureComponent { {item.text} - + {/**/} diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 10019de..70720a5 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -1,31 +1,27 @@ -import DefaultStyleGenerator from "../../theme/styles/DefaultStyleGenerator"; -import Colors from '../../theme/styles/Colors'; +import { StyleSheet } from 'react-native'; -let stylesMap = { +let stylesMap = StyleSheet.create({ list: { flex: 1, - backgroundColor: Colors.white + backgroundColor: "#fff" }, title: { - color: Colors.grey, + color: "#888888", fontSize: 13, - marginTop: 15, - fontFamily: 'AvenirNext-DemiBold' + marginTop: 15 }, text: { - color: Colors.valhalla, + color: "#2A293B", fontSize: 15, - marginBottom: 15, - fontFamily: 'AvenirNext-Regular' + marginBottom: 15 }, statusText: { - color: Colors.green, + color: "#8000FF", fontSize: 15, marginTop: 5, - marginBottom: 15, - fontFamily: 'AvenirNext-Regular' + marginBottom: 15 }, linkView: { @@ -35,18 +31,17 @@ let stylesMap = { }, linkText: { - color: Colors.azureBlue, + color: "#007aff", marginBottom: 15, fontSize: 15, - flexWrap: 'wrap', - fontFamily: 'AvenirNext-Regular' + flexWrap: 'wrap' }, listComponent: { flex: 1, marginHorizontal: 20, borderBottomWidth: 1, - borderBottomColor: Colors.whisper + borderBottomColor: "#ECECEC" } -}; -export default styles = DefaultStyleGenerator.generate(stylesMap); \ No newline at end of file +}); +export default styles = stylesMap; \ No newline at end of file From 1d030c73f427efb6c94a243d7aaadd8596aa2e12 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 10 Dec 2019 20:54:16 +0530 Subject: [PATCH 16/91] Make keys snake case. --- js/WalletSettings/OstWalletSettings.js | 20 ++--- js/WalletSettings/WalletSettingsController.js | 22 +++--- .../ost-wallet-settings-config.json | 74 +++++++++---------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index 0eac05c..ef96a3d 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -1,7 +1,7 @@ import WalletSettingsConfig from "./ost-wallet-settings-config"; import objectMerge from "lodash.merge"; -const ItemsThatNeedCamera = ["add-another-device"]; +const ItemsThatNeedCamera = ["add_another_device"]; class OstWalletSettingsClass { constructor() { @@ -18,8 +18,8 @@ class OstWalletSettingsClass { this.masterConfig = masterConfig; // As deep merge may also merge Arrays. - if ( externalConfig[ "item-display-order" ] ) { - this.masterConfig[ "item-display-order" ] = externalConfig[ "item-display-order" ]; + if ( externalConfig[ "item_display_order" ] ) { + this.masterConfig[ "item_display_order" ] = externalConfig[ "item_display_order" ]; } this._processDisplayOrder(); @@ -30,11 +30,11 @@ class OstWalletSettingsClass { } getAllItemConfigs() { - return this.masterConfig["item-configs"]; + return this.masterConfig["item_configs"]; } getDisplayOrder() { - return this.masterConfig[ "item-display-order" ]; + return this.masterConfig[ "item_display_order" ]; } getItemConfig( itemId ) { @@ -45,21 +45,21 @@ class OstWalletSettingsClass { getItemContentConfig( itemId ) { let config = this.getItemConfig( itemId ); if ( config ) { - return config[ "content-config" ]; + return config[ "content_config" ]; } return null; } getSessionSpendingLimit() { - let itemConfig = this.getItemConfig( "add-session" ) || {}; + let itemConfig = this.getItemConfig( "add_session" ) || {}; let config = itemConfig.config || {}; - return config[ "spending-limit" ] || "0"; + return config[ "spending_limit" ] || "0"; } getSessionExpirationTime() { - let itemConfig = this.getItemConfig( "add-session" ) || {}; + let itemConfig = this.getItemConfig( "add_session" ) || {}; let config = itemConfig.config || {}; - return config[ "expiration-time" ] || "0"; + return config[ "expiration_time" ] || "0"; } _processDisplayOrder() { diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 2c67602..be40f46 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -9,17 +9,17 @@ import OstWalletUIWorkflowCallback from '../OstWalletUIWorkflowCallback'; import InternalWorkflowDelegate from "../delegates/InternalWorkflowDelegate" const optionIds = { - walletDetails: "wallet-details", - recoverDevice: "recover-device", - abortRecovery: "abort-recovery", - addSession: "add-session", - resetPin: "reset-pin", - viewMnemonics: "show-mnemonics", - authorizeWithMnemonics: "authorize-device-with-mnemonics", - authorizeWithQR: "add-another-device", - showQR: "show-device-qr-code", - enableBiometrics: "enable-biometrics", - disableBiometrics: "disable-biometrics" + walletDetails: "wallet_details", + recoverDevice: "recover_device", + abortRecovery: "abort_recovery", + addSession: "add_session", + resetPin: "reset_pin", + viewMnemonics: "show_mnemonics", + authorizeWithMnemonics: "authorize_device_with_mnemonics", + authorizeWithQR: "add_another_device", + showQR: "show_device_qr_code", + enableBiometrics: "enable_biometrics", + disableBiometrics: "disable_biometrics" }; class WalletSettingsController { diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index e403259..1522e57 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -1,84 +1,84 @@ { - "item-display-order": [ - "wallet-details", - "recover-device", - "abort-recovery", - "add-session", - "reset-pin", - "show-mnemonics", - "authorize-device-with-mnemonics", - "add-another-device", - "show-device-qr-code", - "enable-biometrics", - "disable-biometrics" + "item_display_order": [ + "wallet_details", + "recover_device", + "abort_recovery", + "add_session", + "reset_pin", + "show_mnemonics", + "authorize_device_with_mnemonics", + "add_another_device", + "show_device_qr_code", + "enable_biometrics", + "disable_biometrics" ], - "item-configs": { - "wallet-details": { - "content-config": { + "item_configs": { + "wallet_details": { + "content_config": { "heading": "Wallet Details", "description": "View your wallet details." } }, - "recover-device": { - "content-config": { + "recover_device": { + "content_config": { "heading": "Recover Device", "description": "Recover your device." } }, - "abort-recovery": { - "content-config": { + "abort_recovery": { + "content_config": { "heading": "Abort Device Recovery", "description": "Abort Device Recovery." } }, - "add-session": { - "content-config": { + "add_session": { + "content_config": { "heading": "Add Session", "description": "Add Session to do transaction." }, "config": { - "spending-limit": "0", - "expiration-time": "0" + "spending_limit": "0", + "expiration_time": "0" } }, - "reset-pin": { - "content-config": { + "reset_pin": { + "content_config": { "heading": "Reset Pin", "description": "View your wallet details" } }, - "show-mnemonics": { - "content-config": { + "show_mnemonics": { + "content_config": { "heading": "Show Mnemonics", "description": "While not required, writing down your 12 word mnemonic phrase provides an additional backup in case you forget your PIN." } }, - "authorize-device-with-mnemonics": { - "content-config": { + "authorize_device_with_mnemonics": { + "content_config": { "heading": "Authorize Device with Mnemonics", "description": "Authorize current device by using mnemonics." } }, - "add-another-device": { - "content-config": { + "add_another_device": { + "content_config": { "heading": "Add Another Device", "description": "Scan QR Code to add another device." } }, - "show-device-qr-code": { - "content-config": { + "show_device_qr_code": { + "content_config": { "heading": "Show Device QR Code", "description": "Scan QR Code from the device authorized device to authorize this device." } }, - "enable-biometrics": { - "content-config": { + "enable_biometrics": { + "content_config": { "heading": "Enable Biometrics", "description": "Use biometrics to authorize new Sessions and to confirm high value transactions." } }, - "disable-biometrics": { - "content-config": { + "disable_biometrics": { + "content_config": { "heading": "Disable Biometrics", "description": "Turn off biometrics and use PIN to authorize new Sessions and to confirm high value transactions." } From 2ae598631526ed0c9167255266268e0e66c9afac Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 11 Dec 2019 17:10:00 +0530 Subject: [PATCH 17/91] themeconfig added. --- .../sdkWithUI/OstWalletRnSdkUI.m | 6 +++ js/OstWalletSdkUI.js | 18 +++------ js/WalletSettings/SettingsComponent.js | 39 ++++--------------- js/WalletSettings/styles.js | 13 +++---- js/helpers/OstThemeConfigHelper.js | 35 +++++++++++++++++ package.json | 3 +- 6 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 js/helpers/OstThemeConfigHelper.js diff --git a/ios/ostwalletrnsdk/sdkWithUI/OstWalletRnSdkUI.m b/ios/ostwalletrnsdk/sdkWithUI/OstWalletRnSdkUI.m index 3edf468..d72ee65 100644 --- a/ios/ostwalletrnsdk/sdkWithUI/OstWalletRnSdkUI.m +++ b/ios/ostwalletrnsdk/sdkWithUI/OstWalletRnSdkUI.m @@ -23,6 +23,12 @@ @implementation OstWalletRnSdkUI [OstWalletUI setThemeConfig: config]; } +RCT_EXPORT_METHOD(getThemeConfig: (RCTResponseSenderBlock)callback) { + NSDictionary *themeConfig = [OstWalletUI getThemeConfig]; + callback(@[themeConfig]); +} + + RCT_EXPORT_METHOD(setContentConfig: (NSDictionary *)config) { [OstWalletUI setContentConfig: config]; } diff --git a/js/OstWalletSdkUI.js b/js/OstWalletSdkUI.js index 693d597..dedca3d 100644 --- a/js/OstWalletSdkUI.js +++ b/js/OstWalletSdkUI.js @@ -14,9 +14,6 @@ import OstWalletUIWorkflowCallback from './OstWalletUIWorkflowCallback'; import OstWalletUICoreCallback from './OstWalletUICoreCallback'; import * as OstWalletSdkUICallbackManager from './callbackHandlers/OstWalletSdkUICallbackManager'; -/// TEMP-CODE: Code to intercept theme-config. -let themeConfig = null; - class OstWalletRNSdkUI { /** @@ -24,18 +21,15 @@ class OstWalletRNSdkUI { * @param {object} config - Config for theme */ setThemeConfig(config) { - /// TEMP-CODE: Code to intercept theme-config. - themeConfig = config; - OstWalletSdkUI.setThemeConfig(config); } - getThemeConfig() { - return new Promise((resolve,reject) => { - /// TEMP-CODE: Code to intercept theme-config. - /// @Aniket/@Sachin: Please expose proper-getters. - resolve(themeConfig); - }); + getThemeConfig(callback) { + OstWalletSdkUI.getThemeConfig((config) => { + if (callback && typeof callback === 'function') { + callback(config); + } + }) } /** diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 530b2aa..09e5d5f 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -1,17 +1,14 @@ -// Working IMPORTS. import React, {PureComponent} from 'react'; import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View} from 'react-native'; import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; import WalletDetails from './WalletDetails' -// To-Be-Reomved. import inlineStyle from './styles' -// import {LoadingModal} from '../../theme/components/LoadingModalCover'; -// import {ostSdkErrors} from "../../services/OstSdkErrors"; -// import CameraPermissionsApi from "../../services/CameraPermissionsApi"; -// Fixed. import {optionIds, WalletSettingsController} from './WalletSettingsController'; +import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper' +import Colors from "../../../../../src/theme/styles/Colors"; + let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { AndroidOpenSettings = pack.default; @@ -19,22 +16,15 @@ import('react-native-android-open-settings').then((pack) => { //Ignore. }); -/// REMOVED -// import BackArrow from '../CommonComponents/BackArrow'; -// import Colors from "../../theme/styles/Colors"; -// import DeviceInfo from 'react-native-device-info'; -// import CurrentUser from "../../models/CurrentUser"; - class SettingsComponent extends PureComponent { constructor(props) { super(props); this.state = { list: [], refreshing: false, - modalVisible: false + modalVisible: false, }; - let ostUserId = this.props.ostUserId; let delegate = this.props.ostWalletUIWorkflowCallback; @@ -46,6 +36,7 @@ class SettingsComponent extends PureComponent { } this.controller = new WalletSettingsController(ostUserId, delegate); + this.themeConfigHelper = new OstThemeConfigHelper() this._initiateEventTextMap() } @@ -179,21 +170,6 @@ class SettingsComponent extends PureComponent { modalVisible: true }) return; - } else if (item.id === optionIds.authorizeWithQR) { - /// TODO bubble CameraPermissionsApi.requestPermission was here. - // let cameraResult = await CameraPermissionsApi.requestPermission('camera'); - let cameraResult = ""; - if ((cameraResult == 'denied' || cameraResult == 'restricted')) { - /// TODO bubble LoadingModal was here. - - // LoadingModal.showFailureAlert("Allow access to your camera to scan QR", '', 'Enable Camera Access', (isBtnTapped) => { - // if (isBtnTapped) { - // this.enableAccess(); - // } - // }); - - return; - } } this._perfromWorkflow(item) } @@ -300,11 +276,12 @@ class SettingsComponent extends PureComponent { _keyExtractor = (item, index) => `id_${item.id}`; _renderItem = ({ item, index }) => { + let config = this.themeConfigHelper return ( this.onSettingItemTapped(item)}> - {item.heading} - {item.description} + {item.heading} + {item.description} ); diff --git a/js/WalletSettings/styles.js b/js/WalletSettings/styles.js index 6f8c0c1..94817d9 100644 --- a/js/WalletSettings/styles.js +++ b/js/WalletSettings/styles.js @@ -8,22 +8,19 @@ let stylesMap = StyleSheet.create({ paddingTop: 15 }, title: { - color: "#2A293B", - fontSize: 18, - marginTop: 15 + marginTop: 15, + marginRight: 15 }, subtitle: { - color: "#2A293B", - fontSize: 12, marginTop: 5, - marginBottom: 15 + marginBottom: 15, + marginRight: 15 }, listComponent: { flex: 1, marginLeft: 20, - marginRight: 20, borderBottomWidth: 1, - borderBottomColor: 'red' + borderBottomColor: "#DBDBDB" } }); export default styles = stylesMap diff --git a/js/helpers/OstThemeConfigHelper.js b/js/helpers/OstThemeConfigHelper.js new file mode 100644 index 0000000..a5b8d6d --- /dev/null +++ b/js/helpers/OstThemeConfigHelper.js @@ -0,0 +1,35 @@ +import OstWalletSdkUI from '../OstWalletSdkUI' + +export default class OstThemeConfigHelper { + constructor(){ + this.getThemeConfig() + .then((themeConfig) => { + this.themeConfig = themeConfig + }) + } + + async getThemeConfig() { + return new Promise((resolve, reject) => { + OstWalletSdkUI.getThemeConfig((themeConfig) => { + resolve(themeConfig) + }) + }); + } + + getH1Color() { + return this.themeConfig.h1.color + } + + getH1Size() { + return this.themeConfig.h1.size + } + + getH4Color() { + return this.themeConfig.h4.color + } + + getH4Size() { + return this.themeConfig.h4.size + } +} + diff --git a/package.json b/package.json index ee8e4b5..c0aedc6 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "react-native": "^0.41.2", "eventemitter3": "~4.0.0", "lodash.merge": "^4.6.2", - "react-native-android-open-settings": "^1.3.0" + "react-native-android-open-settings": "^1.3.0", + "react-native-permissions": "1.2.0" } } From 3d29e1a8c98bbd00c79cbe92511d722ea45930dd Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 11 Dec 2019 20:30:10 +0530 Subject: [PATCH 18/91] setting fix. --- js/WalletSettings/SettingsComponent.js | 27 ++++++++----- js/WalletSettings/WalletDetails.js | 47 ++++++---------------- js/WalletSettings/styles.js | 9 ++--- js/WalletSettings/walletDetailsStyles.js | 6 ++- js/helpers/OstThemeConfigHelper.js | 50 +++++++++++++++++++----- 5 files changed, 80 insertions(+), 59 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 09e5d5f..469f042 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -36,7 +36,6 @@ class SettingsComponent extends PureComponent { } this.controller = new WalletSettingsController(ostUserId, delegate); - this.themeConfigHelper = new OstThemeConfigHelper() this._initiateEventTextMap() } @@ -166,14 +165,24 @@ class SettingsComponent extends PureComponent { async _processTappedOption(item) { if ( optionIds.walletDetails === item.id ) { // this.props.navigation.navigate('WalletDetails'); - this.setState({ - modalVisible: true - }) + this.showWalletDetails(); return; } this._perfromWorkflow(item) } + showWalletDetails() { + this.setState({ + modalVisible: true + }) + } + + hideWalletDetails() { + this.setState({ + modalVisible: false + }) + } + _perfromWorkflow(item) { let workflowInfo = this.controller.perform(item.id); if ( workflowInfo ) { @@ -276,12 +285,12 @@ class SettingsComponent extends PureComponent { _keyExtractor = (item, index) => `id_${item.id}`; _renderItem = ({ item, index }) => { - let config = this.themeConfigHelper + const config = OstThemeConfigHelper; return ( this.onSettingItemTapped(item)}> - - {item.heading} - {item.description} + + {item.heading} + {item.description} ); @@ -290,7 +299,7 @@ class SettingsComponent extends PureComponent { render() { return ( <> - + this.hideWalletDetails()}/> { - return { - title: 'Wallet Details', - headerBackTitle: null, - headerStyle: { - backgroundColor: '#fff', - borderBottomWidth: 0, - shadowColor: '#000', - shadowOffset: { - width: 0, - height: 1 - }, - shadowOpacity: 0.1, - shadowRadius: 3 - } - }; - }; - constructor(props) { super(props); this.state = { @@ -243,13 +211,24 @@ class WalletDetails extends PureComponent { InAppBrowser.openBrowser(item.link); }; + backButtonTapped = () => { + this.props.onBackButtonPress() + } + render() { return ( + + + + X + + + { return ( - {item.heading} + {item.heading} {item.text} ); diff --git a/js/WalletSettings/styles.js b/js/WalletSettings/styles.js index 94817d9..07a0da1 100644 --- a/js/WalletSettings/styles.js +++ b/js/WalletSettings/styles.js @@ -4,21 +4,20 @@ let stylesMap = StyleSheet.create({ list: { flex: 1, - backgroundColor: "#fff", - paddingTop: 15 + backgroundColor: "#fff" }, title: { marginTop: 15, - marginRight: 15 + marginHorizontal: 15 }, subtitle: { marginTop: 5, marginBottom: 15, - marginRight: 15 + marginHorizontal: 15 }, listComponent: { flex: 1, - marginLeft: 20, + marginLeft: 0, borderBottomWidth: 1, borderBottomColor: "#DBDBDB" } diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 70720a5..7397d6f 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -2,6 +2,10 @@ import { StyleSheet } from 'react-native'; let stylesMap = StyleSheet.create({ + navigationBar:{ + borderBottomWidth: 1, + borderBottomColor: "#DBDBDB" + }, list: { flex: 1, backgroundColor: "#fff" @@ -18,7 +22,7 @@ let stylesMap = StyleSheet.create({ }, statusText: { - color: "#8000FF", + color: "#0F9D58", fontSize: 15, marginTop: 5, marginBottom: 15 diff --git a/js/helpers/OstThemeConfigHelper.js b/js/helpers/OstThemeConfigHelper.js index a5b8d6d..146ea76 100644 --- a/js/helpers/OstThemeConfigHelper.js +++ b/js/helpers/OstThemeConfigHelper.js @@ -1,14 +1,19 @@ import OstWalletSdkUI from '../OstWalletSdkUI' -export default class OstThemeConfigHelper { +class OstThemeConfigHelper { constructor(){ + this.themeConfig = {} + this.updateConfig() + } + + updateConfig() { this.getThemeConfig() .then((themeConfig) => { this.themeConfig = themeConfig }) } - async getThemeConfig() { + getThemeConfig() { return new Promise((resolve, reject) => { OstWalletSdkUI.getThemeConfig((themeConfig) => { resolve(themeConfig) @@ -16,20 +21,45 @@ export default class OstThemeConfigHelper { }); } - getH1Color() { - return this.themeConfig.h1.color + getTextAlignment(alignment) { + if (alignment.toLowerCase() === 'left') { + return 'flex-start' + } + + if (alignment.toLowerCase() === 'center') { + return 'center' + } + + if (alignment.toLowerCase() === 'right') { + return 'flex-end' + } } - getH1Size() { - return this.themeConfig.h1.size + getC1Config() { + let c1Config = this.themeConfig.c1 + return {color: c1Config.color, + fontSize: c1Config.size, + alignSelf: this.getTextAlignment(c1Config.alignment), + fontFamily: c1Config.font} } - getH4Color() { - return this.themeConfig.h4.color + getC2Config() { + let c2Config = this.themeConfig.c2; + return {color: c2Config.color, + fontSize: c2Config.size, + alignSelf: this.getTextAlignment(c2Config.alignment), + fontFamily: c2Config.font} } - getH4Size() { - return this.themeConfig.h4.size + getBorderBottomColor() { + return { + borderBottomColor: this.themeConfig.cell_separator.color + } } + + + } + +export default new OstThemeConfigHelper() \ No newline at end of file From aeea9ab07088e57eb3e209436a1b1437c7cafda1 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 12 Dec 2019 12:46:38 +0530 Subject: [PATCH 19/91] error messages helper added. --- js/OstSdkErrorMessages.json | 94 +++++++++++++++++ js/WalletSettings/OstWalletSettings.js | 6 ++ js/WalletSettings/SettingsComponent.js | 2 + js/helpers/OstSdkErrorHelper.js | 138 +++++++++++++++++++++++++ 4 files changed, 240 insertions(+) create mode 100644 js/OstSdkErrorMessages.json create mode 100644 js/helpers/OstSdkErrorHelper.js diff --git a/js/OstSdkErrorMessages.json b/js/OstSdkErrorMessages.json new file mode 100644 index 0000000..d3234d5 --- /dev/null +++ b/js/OstSdkErrorMessages.json @@ -0,0 +1,94 @@ +{ + "ACTIVATE_USER": { + }, + "ADD_SESSION": { + }, + "GET_DEVICE_MNEMONICS": { + }, + "PERFORM_QR_ACTION": { + }, + "AUTHORIZE_DEVICE_WITH_QR_CODE": { + }, + "AUTHORIZE_DEVICE_WITH_MNEMONICS": { + }, + "INITIATE_DEVICE_RECOVERY": { + }, + "ABORT_DEVICE_RECOVERY": { + }, + "RESET_PIN": { + }, + "LOGOUT_ALL_SESSIONS": { + }, + "UPDATE_BIOMETRIC_PREFERENCE": { + }, + "EXECUTE_TRANSACTION": { + }, + "__DEFAULT_CONTEXT": { + "USER_UNAUTHORIZED": "Device is not authorized. Please authorize device again.", + "DEVICE_OUT_OF_SYNC": "Device time is out of sync. Please check the time on your device reflects current date and time.", + "NETWORK_ERROR": "Request could not be executed due to cancellation, a connectivity problem or timeout.", + "INVALID_MNEMONICS": "The 12 word passphrase you provided is incorrect. ", + "INVALID_QR_TRANSACTION_DATA": "The QR code for executing a transaction is not well formed. To know the data definition for QR code based on type of operations please visit https://dev.ost.com/platform ", + "INVALID_USER_PASSPHRASE": "The 6 digit PIN you entered is not correct.", + "MAX_PASSPHRASE_VERIFICATION_LIMIT_REACHED": "The maximum number of 'authenticating with PIN' attempts has been reached. Please try again a bit later.", + "DEVICE_CAN_NOT_BE_AUTHORIZED": "Unable to authorize this device. Please ensure the device is 'Registered' for this user with OST platform. Only a registered device can be authorized.", + "SESSION_NOT_FOUND": "The device doesn't has any active session. Please authorize a session before doing any transaction. Workflow details provided at https://dev.ost.com/platform/docs/sdk/references ", + "INVALID_QR_CODE": "Incorrect QR code.", + "RECOVERY_KEY_GENERATION_FAILED": "Failed to generate Recovery key. Inspect if a correct input values required are being sent and re-submit the request. ", + "OUT_OF_MEMORY_ERROR": "Device is running low on memory. Reduce the number of App running on your device and re-enter the pin", + "WORKFLOW_FAILED": "Something went wrong, please try again", + "WORKFLOW_VIEW_DESTROYED": "The application interrupted the workflow. The view got terminated while performing the workflow", + "DEVICE_UNAUTHORIZED": "Unable to perform the operation as the device not authorized. For details on how to authorize a device please visit https://dev.ost.com/platform/docs/sdk/references ", + "DEVICE_CAN_NOT_BE_REVOKED": "Cannot complete the revoke device operation. Only an authorized device can be revoked. Please ensure you are trying to revoke a valid device and re-submit the request.", + "WORKFLOW_CANCELED": "WORKFLOW_CANCELLED", + "WORKFLOW_CANCELLED": "WORKFLOW_CANCELLED" + }, + "__DEVELOPER_ERROR_MSG": { + "SDK_ERROR": "An internal SDK error has occurred.", + "INVALID_CERTIFICATE": "Certificate provided by Ost platform is invalid Or it has been compromised. Please re-try in some other network and if the problem persists contact support@ost.com .", + "INVALID_USER_ID": "Unable to recognize the user id. Please inspect for what is being sent, rectify and re-submit.", + "INVALID_API_END_POINT": "Invalid OST server url", + "INVALID_NETWORK_SECURITY_CONFIG": "Invalid network_security_config file", + "INVALID_WORKFLOW_CALLBACK": "Callback is essential for a workflow to continue running, it cannot be null.", + "API_RESPONSE_ERROR": "OST Platform Api ed error.", + "CONFIG_READ_FAILED": "Failed to read config file. Please place the ost-sdk config file in main/assets folder.", + "INVALID_BLOCK_GENERATION_TIME": "Invalid configuration 'BLOCK_GENERATION_TIME'. It must be an Integer greater than zero", + "INVALID_PIN_MAX_RETRY_COUNT": "Invalid configuration 'PIN_MAX_RETRY_COUNT'. It must be an Integer greater than zero", + "INVALID_SESSION_BUFFER_TIME": "Invalid configuration 'SESSION_BUFFER_TIME'. It must be long greater than or equal to zero", + "INVALID_PRICE_POINT_CURRENCY_SYMBOL": "Unable to recognize 'PRICE_POINT_CURRENCY_SYMBOL'. For details on how supported currencies please vist https://dev.ost.com/platform/docs/api ", + "INVALID_REQUEST_TIMEOUT_DURATION": "Invalid configuration 'REQUEST_TIMEOUT_DURATION'. It must be Integer greater than zero.", + "INVALID_NO_OF_SESSIONS_ON_ACTIVATE_USER": "Invalid configuration 'NO_OF_SESSIONS_ON_ACTIVATE_USER'. It must be an Integer greater than zero and less than 6", + "INVALID_API_RESPONSE": "Unable to recognize the API response object sent and so cannot be executed.", + "INVALID_JSON_STRING": "The provided json string is invalid.", + "INVALID_JSON_ARRAY": "The provided json array string is invalid.", + "INVALID_REVOKE_DEVICE_ADDRESS": "Unable to recognise revoke device address. Please ensure you are sending a null value and re-submit the request.", + "NO_PENDING_RECOVERY": "Could not find any pending device recovery request. For details on how to check the status of the recovery please vist https://dev.ost.com/platform/docs/sdk ", + "EIP712_FAILED": "Unable to sign parameters using EIP 712 and verify the signature.", + "RULES_NOT_FOUND": "Unable to recognize the Rule. Please inspect a valid rule name that exists in your economy is passed and its not null.", + "DEVICE_NOT_SETUP": "Unable to recognize the device. Please setup this device for the user using workflow provided at https://dev.ost.com/platform/docs/sdk/references", + "DEVICE_NOT_REGISTERED": "Device is not registered. To make any api to OST server device need to be registered", + "POLLING_TIMEOUT": "Polling timeout. This can be intermittent event with a request failing followed by successful one.", + "INVALID_TOKEN_ID": "The token id sent in Transaction QR code is not matching with the current user's token id. Rectify the value is being sent in token Id field and re-submit the request.", + "INVALID_RECOVER_DEVICE_ADDRESS": "Invalid device address. This address can not be recovered.", + "INVALID_SESSION_EXPIRY_TIME": "The expiry time provided is invalid", + "INVALID_SESSION_SPENDING_LIMIT": "The spending limit provided is invalid should be more than 0", + "RECOVERY_OWNER_ADDRESS_NOT_FOUND": "Recovery owner is not set for this user. This address is set during user activation. Please verify the user has been successfully activated.", + "INSUFFICIENT_DATA": "The device does not have sufficient data to perform this action.", + "INVALID_SESSION_ADDRESS": "Unable to recognize the session address. Inspect if a correct value is being sent and its not null. ", + "FAILED_TO_SIGN_DATA": "Unable to sign data. Visit https://dev.ost.com/platform/docs/sdk for detailed SDK references. Please ensure the input is well formed and re-submit the request.", + "INVALID_DEVICE_ADDRESS": "Incorrect device address. Please inspect the value being sent is correct and not null, rectify and re-submit.", + "GENERATE_PRIVATE_KEY_FAIL": "This is a generic error that occurs when sdk fails to generate any one of Api Key, Device Key or Session Key. This can be intermittent issue, please re-start the workflow. If Problem persists contact support@ost.com .", + "INVALID_PASSPHRASE_PREFIX": "Unable to recognize the Passphrase prefix. Please ensure Passphrase prefix is not null or it's string length is not less than 30. ", + "USER_NOT_ACTIVATED": "The user is not activated yet. Please setup user's wallet to enable their participation in your economy. ", + "USER_ALREADY_ACTIVATED": "The User is already activated", + "USER_ACTIVATING": "User activation flow is already in progress. Please check the status a bit later", + "WORKFLOW_CANCELLED": "Workflow got cancelled, possibly because one or more input parameters require a different type of information.", + "INVALID_NEW_USER_PASSPHRASE": "The new 6 digit PIN you entered is not correct.", + "INVALID_ADDRESS_TO_TRANSFER": "INVALID_ADDRESS_TO_TRANSFER", + "INVALID_AMOUNT": "INVALID_AMOUNT", + "INVALID_WORKFLOW": "INVALID_WORKFLOW", + "INVALID_RECOVERY_ADDRESS": "INVALID_RECOVERY_ADDRESS", + "USER_PASSPHRASE_VALIDATION_LOCKED": "Can not validate user passphrase because of too many wrong attempts.", + "UNKNOWN": "Unknown error" + } +} \ No newline at end of file diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index ef96a3d..3d8d1c8 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -1,6 +1,8 @@ import WalletSettingsConfig from "./ost-wallet-settings-config"; import objectMerge from "lodash.merge"; +import OstSdkErrorHelper from '../helpers/OstSdkErrorHelper' + const ItemsThatNeedCamera = ["add_another_device"]; class OstWalletSettingsClass { @@ -25,6 +27,10 @@ class OstWalletSettingsClass { this._processDisplayOrder(); } + setErrorMessages(externalErrorMessages) { + OstSdkErrorHelper.setErrorMessages(externalErrorMessages); + } + getMasterConfig() { return this.masterConfig; } diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 469f042..f52aceb 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -37,6 +37,8 @@ class SettingsComponent extends PureComponent { this.controller = new WalletSettingsController(ostUserId, delegate); this._initiateEventTextMap() + + OstThemeConfigHelper.updateConfig(); } _initiateEventTextMap() { diff --git a/js/helpers/OstSdkErrorHelper.js b/js/helpers/OstSdkErrorHelper.js new file mode 100644 index 0000000..7c1c380 --- /dev/null +++ b/js/helpers/OstSdkErrorHelper.js @@ -0,0 +1,138 @@ +import OstWalletSdkHelper from "../helper/OstWalletSdkHelper" + +import SdkErrorMessages from "../OstSdkErrorMessages"; + +import objectMerge from "lodash.merge"; + +//NEVER COMMIT WITH developerMode true. +const developerMode = false; +const logErrorMessage = false; +const DEFAULT_ERROR_MSG = "Something went wrong"; +const WORKFLOW_CANCELLED_MSG = "WORKFLOW_CANCELLED"; +const DEFAULT_CONTEXT = "__DEFAULT_CONTEXT"; +const DEVICE_OUT_OF_SYNC = "DEVICE_OUT_OF_SYNC"; +const API_RESPONSE_ERROR = "API_RESPONSE_ERROR"; +const USER_UNAUTHORIZED = "USER_UNAUTHORIZED"; + + +/** + * OstSdkErrors + * To get Message of OstError based on workflow type. + */ +class OstSdkErrorHelper { + constructor() { + this.errorMessages = null + this.setErrorMessages() + } + + setErrorMessages(externalErrorMessages = {}) { + let masterErrorMessages = JSON.parse(JSON.stringify(SdkErrorMessages)) + objectMerge(masterErrorMessages, externalErrorMessages) + this.errorMessages = masterErrorMessages + } + + getErrorMessage(ostWorkflowContext, ostError) { + let errMsg = this._getErrorMessage(ostWorkflowContext, ostError); + if ( logErrorMessage ) { + if ( WORKFLOW_CANCELLED_MSG !== errMsg ) { + try { + // this._postErrorDetails(ostWorkflowContext, ostError, errMsg); + } catch(e) { + //ignore. + } + } + } + return errMsg; + } + + _getErrorMessage(ostWorkflowContext, ostError) { + let errMsg; + // Parameter validation + if (!ostError) { + return DEFAULT_ERROR_MSG; + } + + let errorCode = ostError.getErrorCode(); + + let workflowType = ostWorkflowContext ? ostWorkflowContext.WORKFLOW_TYPE : null; + workflowType = workflowType || DEFAULT_CONTEXT; + + if (OstWalletSdkHelper.isDeviceTimeOutOfSync(ostError)) { + errorCode = DEVICE_OUT_OF_SYNC; + + if ( this.errorMessages[workflowType] ) { + errMsg = this.errorMessages[workflowType][ errorCode ]; + } + + if ( !errMsg ) { + errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; + } + + if ( developerMode ) { + errMsg = errMsg + "\n\n(" + ostError.getApiInternalId() + ")" + } + + return errMsg || DEFAULT_ERROR_MSG; + } + + if ( OstWalletSdkHelper.isDeviceUnauthorizedError(ostError)) { + errorCode = USER_UNAUTHORIZED; + + if ( this.errorMessages[workflowType] ) { + errMsg = this.errorMessages[workflowType][ errorCode ]; + } + + if ( !errMsg ) { + errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; + } + + if ( developerMode ) { + errMsg = errMsg + "\n\n(" + ostError.getApiInternalId() + ")" + } + + return errMsg || DEFAULT_ERROR_MSG; + } + + if ( ostError.isApiError() ) { + if ( !errMsg ) { + let errData = ostError.getApiErrorData(); + if (errData && errData.length > 0) { + let firstErrMsg = errData[0]; + errMsg = firstErrMsg.msg || DEFAULT_ERROR_MSG; + }else { + errMsg = ostError.getApiErrorMessage(); + } + } + + if ( developerMode ) { + errMsg = errMsg + "\n\n(" + ostError.getApiInternalId() + ")" + } + + return errMsg || DEFAULT_ERROR_MSG; + } + + if ( !errorCode ) { + return DEFAULT_ERROR_MSG; + } + + if ( this.errorMessages[workflowType] ) { + errMsg = this.errorMessages[workflowType][ errorCode ]; + } + + if ( !errMsg ) { + errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; + } + + if ( developerMode && errorCode) { + if ( !errMsg ) { + errMsg = errMsg || DEFAULT_ERROR_MSG; + } + + errMsg = errMsg + "\n\n (" + errorCode + "," + ostError.getInternalErrorCode() + ")"; + } + + return errMsg || DEFAULT_ERROR_MSG; + } +} + +export default new OstSdkErrorHelper(); From 70ff7bbdca849d1d6204c7004b65fefabb2b4cbc Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 12 Dec 2019 13:54:36 +0530 Subject: [PATCH 20/91] wallet setting UI and them config fix --- js/WalletSettings/SettingsComponent.js | 20 ++++++++++------ js/WalletSettings/WalletDetails.js | 24 ++++++++++++------- js/WalletSettings/WalletSettingsController.js | 12 ++++++---- .../ost-wallet-settings-config.json | 2 +- js/WalletSettings/walletDetailsStyles.js | 16 ++++++------- js/helpers/OstSdkErrorHelper.js | 2 +- js/helpers/OstThemeConfigHelper.js | 4 ---- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index f52aceb..9f55773 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -25,6 +25,8 @@ class SettingsComponent extends PureComponent { modalVisible: false, }; + OstThemeConfigHelper.updateConfig(); + let ostUserId = this.props.ostUserId; let delegate = this.props.ostWalletUIWorkflowCallback; @@ -37,24 +39,28 @@ class SettingsComponent extends PureComponent { this.controller = new WalletSettingsController(ostUserId, delegate); this._initiateEventTextMap() - - OstThemeConfigHelper.updateConfig(); } _initiateEventTextMap() { this.eventLoaderTextMap = {}; this._createEventLoaderData( - optionIds.addSession, + "Authorize New Session", "Adding Session", "Waiting for confirmation", "Session added"); this._createEventLoaderData( - optionIds.updateBiometricPreference, - "Updating Biometric", + optionIds.enableBiometrics, + "Enabling Biometric Preference", + "Waiting for confirmation", + "Biometric enabled"); + + this._createEventLoaderData( + optionIds.disableBiometrics, + "Disabling Biometric Preference", "Waiting for confirmation", - "Biometric updated"); + "Biometric disabled"); this._createEventLoaderData( optionIds.resetPin, @@ -301,7 +307,7 @@ class SettingsComponent extends PureComponent { render() { return ( <> - this.hideWalletDetails()}/> + this.hideWalletDetails()}/> { return ( - - {item.heading} - {item.text} + + {this.getHeadingComponent(item)} + {item.text} ); }; _renderStatusCell = ({item, index}) => { return ( - - {item.heading} + + {this.getHeadingComponent(item)} {item.text} ); @@ -279,8 +280,8 @@ class WalletDetails extends PureComponent { _renderCopyCell = ({item, index}) => { return ( this.onCopyCellTapped(item)}> - - {item.heading} + + {this.getHeadingComponent(item)} {item.text} @@ -295,8 +296,8 @@ class WalletDetails extends PureComponent { _renderLinkCell = ({item, index}) => { return ( this.onLinkCellTapped(item)}> - - {item.heading} + + {this.getHeadingComponent(item)} {item.text} @@ -307,6 +308,11 @@ class WalletDetails extends PureComponent { ); }; + + + getHeadingComponent(item) { + return({item.heading}) + } } export default WalletDetails; diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index be40f46..89291f0 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -326,8 +326,8 @@ class WalletSettingsController { } let delegate = this._getWorkflowDelegate(), - workflowId = null, - userId = this.userId + workflowId = null, + userId = this.userId ; console.log("WalletSettings ost userId", userId); @@ -365,8 +365,12 @@ class WalletSettingsController { workflowId = OstWalletSdkUI.getAddDeviceQRCode(userId, delegate); break; - case optionIds.updateBiometricPreference: - workflowId = OstWalletSdkUI.updateBiometricPreference(userId, !this.isBiometricEnabled, delegate); + case optionIds.enableBiometrics: + workflowId = OstWalletSdkUI.updateBiometricPreference(userId, true, delegate); + break; + + case optionIds.disableBiometrics: + workflowId = OstWalletSdkUI.updateBiometricPreference(userId, false, delegate); break; default: diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index 1522e57..7e611a0 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -33,7 +33,7 @@ }, "add_session": { "content_config": { - "heading": "Add Session", + "heading": "Authorize New Session", "description": "Add Session to do transaction." }, "config": { diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 7397d6f..c6c4eb9 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -11,21 +11,22 @@ let stylesMap = StyleSheet.create({ backgroundColor: "#fff" }, title: { - color: "#888888", - fontSize: 13, - marginTop: 15 + marginTop: 15, + marginLeft: 15 }, text: { color: "#2A293B", fontSize: 15, - marginBottom: 15 + marginBottom: 15, + marginLeft: 15 }, statusText: { color: "#0F9D58", fontSize: 15, marginTop: 5, - marginBottom: 15 + marginBottom: 15, + marginLeft: 15 }, linkView: { @@ -38,14 +39,13 @@ let stylesMap = StyleSheet.create({ color: "#007aff", marginBottom: 15, fontSize: 15, - flexWrap: 'wrap' + flexWrap: 'wrap', + marginLeft: 15 }, listComponent: { flex: 1, - marginHorizontal: 20, borderBottomWidth: 1, - borderBottomColor: "#ECECEC" } }); export default styles = stylesMap; \ No newline at end of file diff --git a/js/helpers/OstSdkErrorHelper.js b/js/helpers/OstSdkErrorHelper.js index 7c1c380..7558008 100644 --- a/js/helpers/OstSdkErrorHelper.js +++ b/js/helpers/OstSdkErrorHelper.js @@ -1,4 +1,4 @@ -import OstWalletSdkHelper from "../helper/OstWalletSdkHelper" +import OstWalletSdkHelper from "./OstWalletSdkHelper" import SdkErrorMessages from "../OstSdkErrorMessages"; diff --git a/js/helpers/OstThemeConfigHelper.js b/js/helpers/OstThemeConfigHelper.js index 146ea76..a09560f 100644 --- a/js/helpers/OstThemeConfigHelper.js +++ b/js/helpers/OstThemeConfigHelper.js @@ -56,10 +56,6 @@ class OstThemeConfigHelper { borderBottomColor: this.themeConfig.cell_separator.color } } - - - } - export default new OstThemeConfigHelper() \ No newline at end of file From ed2f25acfc611f917e4f6120702b09fc13d38da3 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 12 Dec 2019 13:57:56 +0530 Subject: [PATCH 21/91] remoed unused code --- js/WalletSettings/SettingsComponent.js | 107 ------------------------- 1 file changed, 107 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 9f55773..483d7e2 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -38,110 +38,6 @@ class SettingsComponent extends PureComponent { } this.controller = new WalletSettingsController(ostUserId, delegate); - this._initiateEventTextMap() - } - - _initiateEventTextMap() { - this.eventLoaderTextMap = {}; - - this._createEventLoaderData( - "Authorize New Session", - "Adding Session", - "Waiting for confirmation", - "Session added"); - - this._createEventLoaderData( - optionIds.enableBiometrics, - "Enabling Biometric Preference", - "Waiting for confirmation", - "Biometric enabled"); - - this._createEventLoaderData( - optionIds.disableBiometrics, - "Disabling Biometric Preference", - "Waiting for confirmation", - "Biometric disabled"); - - this._createEventLoaderData( - optionIds.resetPin, - "Resetting PIN...", - "Waiting for confirmation", - "PIN has been successfully reset"); - - this._createEventLoaderData( - optionIds.recoverDevice, - "Recovering device", - "Waiting for confirmation", - "Device recovery initiated"); - - this._createEventLoaderData( - optionIds.abortRecovery, - "Cancelling recovery", - "Waiting for confirmation", - "Aborted recovery"); - - this._createEventLoaderData( - optionIds.viewMnemonics, - "", - "", - ""); - - this._createEventLoaderData( - optionIds.authorizeWithQR, - "Authorizing device", - "Waiting for confirmation", - "Device authorized"); - - - this._createEventLoaderData( - optionIds.authorizeWithMnemonics, - "Authorizing device", - "Waiting for confirmation", - "Device authorized"); - - this._createEventLoaderData( - optionIds.showQR, - "", - "Waiting for confirmation", - "Device authorized"); - } - - _createEventLoaderData(id, startText, ackText, successText){ - let loaderData = { - id: id, - - startText: startText, - - // Acknowledgement text - acknowledgedText: ackText, - - // Success Text - successText: successText, - }; - - this.eventLoaderTextMap[ id ] = loaderData; - return loaderData; - } - - _getFlowCompleteText() { - let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].successText; - return text - } - - _getFlowStartedText() { - let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].startText; - return text - } - - _getRequestAcknowledgedText() { - let text = this.eventLoaderTextMap[this.workflowInfo.workflowOptionId].acknowledgedText; - return text - } - - _getFlowFailedText(workflowContext, ostError) { - /// TODO bubble ostSdkErrors was here. - // return ostSdkErrors.getErrorMessage(workflowContext, ostError) - return ""; } componentDidMount() { @@ -235,7 +131,6 @@ class SettingsComponent extends PureComponent { flowComplete = (ostWorkflowContext , ostContextEntity) => { this.refreshList(() => { if (this.canShowAlert(ostWorkflowContext)) { - let text = this._getFlowCompleteText(); // LoadingModal.showSuccessAlert(text); }else { // LoadingModal.hide() @@ -268,9 +163,7 @@ class SettingsComponent extends PureComponent { }; userCancelled = (ostWorkflowContext , ostError) => { - /// TODO bubble LoadingModal was here. - // LoadingModal.hide(); }; deviceTimeOutOfSync = (ostWorkflowContext , ostError) => { From 84b7fc81e83dd26a0aa08b41d6dfdbf30a5196fd Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 12 Dec 2019 18:53:02 +0530 Subject: [PATCH 22/91] setting details ui component fix. --- js/WalletSettings/OstWalletSettings.js | 11 +++ js/WalletSettings/SettingsComponent.js | 6 ++ js/WalletSettings/WalletDetails.js | 89 ++++++++++++------- .../ost-wallet-settings-config.json | 3 + js/WalletSettings/walletDetailsStyles.js | 38 +++----- 5 files changed, 90 insertions(+), 57 deletions(-) diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index 3d8d1c8..3c14a67 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -68,6 +68,17 @@ class OstWalletSettingsClass { return config[ "expiration_time" ] || "0"; } + getOstViewEndpoint() { + let itemConfig = this.getItemConfig( "wallet_details" ) || {}; + let config = itemConfig.config || {}; + let viewEndpoint = config[ "ost_view_endpoint" ] + + if (viewEndpoint && viewEndpoint.length > 0 && typeof viewEndpoint === 'string') { + return viewEndpoint + } + return null + } + _processDisplayOrder() { const allItemConfigs = this.getAllItemConfigs(); const displayOrder = this.getDisplayOrder(); diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 483d7e2..635ca42 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -16,6 +16,12 @@ import('react-native-android-open-settings').then((pack) => { //Ignore. }); +// try { +// console.log(require.resolve("react-native-android-open-settings")); +// } catch(e) { +// console.error("react-native-android-open-settings is not found"); +// } + class SettingsComponent extends PureComponent { constructor(props) { super(props); diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 366438c..38ae8e7 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -7,7 +7,14 @@ import OstWalletSdkUI from '../OstWalletSdkUI'; import OstJsonApi from '../OstJsonApi'; import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper' +import OstWalletSettings from './OstWalletSettings' +let InAppBrowser = null; +// import('react-native-inappbrowser-reborn').then((pack) => { +// return InAppBrowser = pack.default +// }).catch((err) => { +// // +// }) class WalletDetails extends PureComponent { constructor(props) { @@ -142,22 +149,32 @@ class WalletDetails extends PureComponent { } _buildTokenHolderAddressData() { - // let link = VIEW_END_POINT + 'token/th-'+ this._getAuxChainId() + '-' + this._getUtilityBandedToken() + '-' + this.ostUser.token_holder_address; + let viewEndPoint = OstWalletSettings.getOstViewEndpoint() + let link = null + if (viewEndPoint) { + link = viewEndPoint + 'token/th-'+ this._getAuxChainId() + '-' + this._getUtilityBandedToken() + '-' + this.ostUser.token_holder_address; + } + return { "cellType": "link", "heading": "Token Holder Address", "text": this.ostUser.token_holder_address, - "link": '' + "link": link }; } _buildDeviceManagerAddressData() { - // let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.device_manager_address; + let viewEndPoint = OstWalletSettings.getOstViewEndpoint() + let link = null + if (viewEndPoint) { + link = viewEndPoint + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.device_manager_address; + } + return { "cellType": "link", "heading": "Device Manager Address", "text": this.ostUser.device_manager_address, - "link": '' + "link": link }; } @@ -170,12 +187,16 @@ class WalletDetails extends PureComponent { } _buildRecoveryOwnerAddressData() { - // let link = VIEW_END_POINT + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.recovery_owner_address; + let viewEndPoint = OstWalletSettings.getOstViewEndpoint() + let link = null + if (viewEndPoint) { + link = viewEndPoint + 'address/ad-'+ this._getAuxChainId() + '-' + this.ostUser.recovery_owner_address; + } return { "cellType": "link", "heading": "Recovery Owner Address", "text": this.ostUser.recovery_owner_address, - "link": '' + "link": link }; } @@ -205,15 +226,20 @@ class WalletDetails extends PureComponent { onCopyCellTapped = async (item) => { await Clipboard.setString(item.text); - Toast.show({text: "Copied to Clipboard", icon:'success'}); }; - onLinkCellTapped = (item) => { - InAppBrowser.openBrowser(item.link); + onLinkCellTapped = async (item) => { + if (item.link) { + if(InAppBrowser && await InAppBrowser.isAvailable()) { + + }else { + Linking.openURL(item.link) + } + } }; backButtonTapped = () => { - this.props.onBackButtonPress() + this.props.onBackButtonPress() } render() { @@ -225,9 +251,9 @@ class WalletDetails extends PureComponent { visible={this.props.modalVisible}> - - X - + + X + {this.getHeadingComponent(item)} - {item.text} + {item.text} ); }; @@ -280,15 +306,7 @@ class WalletDetails extends PureComponent { _renderCopyCell = ({item, index}) => { return ( this.onCopyCellTapped(item)}> - - {this.getHeadingComponent(item)} - - - {item.text} - - {/**/} - - + {this.getActionCell(item, false)} ); }; @@ -296,23 +314,28 @@ class WalletDetails extends PureComponent { _renderLinkCell = ({item, index}) => { return ( this.onLinkCellTapped(item)}> - - {this.getHeadingComponent(item)} - - - {item.text} - - {/**/} - - + {this.getActionCell(item, true)} ); }; - getHeadingComponent(item) { return({item.heading}) } + + getActionCell = (item, isLinkCell) => { + return( + + {this.getHeadingComponent(item)} + + + {item.text} + + {/**/} + + + ) + } } export default WalletDetails; diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index 7e611a0..fb8550e 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -17,6 +17,9 @@ "content_config": { "heading": "Wallet Details", "description": "View your wallet details." + }, + "config": { + "ost_view_endpoint": '' } }, "recover_device": { diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index c6c4eb9..3e3e2d7 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -6,46 +6,36 @@ let stylesMap = StyleSheet.create({ borderBottomWidth: 1, borderBottomColor: "#DBDBDB" }, + list: { flex: 1, backgroundColor: "#fff" }, - title: { - marginTop: 15, - marginLeft: 15 + + listComponent: { + flex: 1, + borderBottomWidth: 1, + paddingVertical: 15, + paddingHorizontal: 15 }, - text: { - color: "#2A293B", - fontSize: 15, - marginBottom: 15, - marginLeft: 15 + + title: { + marginBottom: 8 }, statusText: { color: "#0F9D58", fontSize: 15, - marginTop: 5, - marginBottom: 15, - marginLeft: 15 }, - linkView: { - marginTop: 5, - flex: 2, - marginRight: 0, + text: { + color: "#2A293B", + fontSize: 15, }, linkText: { color: "#007aff", - marginBottom: 15, - fontSize: 15, - flexWrap: 'wrap', - marginLeft: 15 - }, - - listComponent: { - flex: 1, - borderBottomWidth: 1, + fontSize: 15 } }); export default styles = stylesMap; \ No newline at end of file From ce7bd285257c662531eddf284896d2a680b28946 Mon Sep 17 00:00:00 2001 From: Aniket Date: Fri, 13 Dec 2019 13:32:16 +0530 Subject: [PATCH 23/91] style for details added. --- js/WalletSettings/SettingsComponent.js | 11 +++++++++-- js/WalletSettings/WalletDetails.js | 9 +++++---- js/WalletSettings/walletDetailsStyles.js | 5 ++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 635ca42..bc3bc9e 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -13,7 +13,7 @@ let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { AndroidOpenSettings = pack.default; }).catch( (err) => { - //Ignore. + }); // try { @@ -31,6 +31,8 @@ class SettingsComponent extends PureComponent { modalVisible: false, }; + this.flatListLayout = null + OstThemeConfigHelper.updateConfig(); let ostUserId = this.props.ostUserId; @@ -206,7 +208,7 @@ class SettingsComponent extends PureComponent { render() { return ( <> - this.hideWalletDetails()}/> + this.hideWalletDetails()} flatlistLayout={this.flatListLayout}/> { + const {x, y, width, height} = event.nativeEvent.layout; + this.flatListLayout = event.nativeEvent.layout; + // do something here like set your initial animated value for the height + }} /> diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 38ae8e7..679b270 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -1,5 +1,5 @@ import React, {PureComponent} from 'react'; -import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View, Image, Clipboard, Modal} from 'react-native'; +import {Alert, FlatList, Linking, Platform, Text, TouchableWithoutFeedback, View, Image, Clipboard, Modal, Dimensions, SafeAreaView} from 'react-native'; import inlineStyle from './walletDetailsStyles'; import OstWalletSdk from '../OstWalletSdk'; @@ -249,13 +249,14 @@ class WalletDetails extends PureComponent { animationType="slide" transparent={false} visible={this.props.modalVisible}> - + - + X - + + Date: Fri, 13 Dec 2019 20:09:24 +0530 Subject: [PATCH 24/91] transaciton hemper added. --- js/TransactionHelper/OstTransactionHelper.js | 146 +++++++++++++++++++ js/WalletSettings/OstWalletSettings.js | 4 +- js/WalletSettings/WalletDetails.js | 36 ++--- js/WalletSettings/walletDetailsStyles.js | 7 +- js/helpers/OstSdkErrorHelper.js | 45 +++--- js/helpers/OstThemeConfigHelper.js | 20 +++ js/index.js | 4 +- 7 files changed, 211 insertions(+), 51 deletions(-) create mode 100644 js/TransactionHelper/OstTransactionHelper.js diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js new file mode 100644 index 0000000..61ed289 --- /dev/null +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -0,0 +1,146 @@ +import BigNumber from 'bignumber.js'; +import OstWalletSdk from '../OstWalletSdk'; +import OstWalletSdkUI from '../OstWalletSdkUI'; +import {sdkErrorHelper, USER_UNAUTHORIZED, DEFAULT_CONTEXT} from '../helpers/OstSdkErrorHelper'; +import OstWalletUIDelegate from '../OstWalletUIWorkflowCallback' +import OstWalletDelegate from '../OstWalletWorkFlowCallback' +import EventEmitter from 'eventemitter3'; + +import uuidv4 from 'uuid/v4'; +import { setInstance } from '../callbackHandlers/OstWalletSdkUICallbackManager'; +import OstWalletUIWorkFlowCallback from "../OstWalletUICoreCallback"; + + +class OstTransactionHelper { + constructor() { + this.transactionConfig = {} + } + + setTxConfig(externalConfig) { + this.transactionConfig = externalConfig + } + + executeDirectTransfer(userId, amounts, addresses, txMeta = null) { + let obj = new OstTransactionExecutor(userId, 'direct transfer', amounts, addresses, txMeta) + obj.perform(); + + return obj.uuid; + } +} + +class OstTransactionExecutor { + constructor(userId, ruleName, amounts, addresses, txMeta = null) { + this.uuid = uuidv4(); + this.ee = new EventEmitter(); + this.userId = userId; + this.amounts = amounts; + this.addresses = addresses; + this.txMeta = txMeta; + this.ruleName = ruleName + + this.totalTxAmount = new BigNumber('0') + + setInstance(this) + } + + async perform() { + try { + //get final tx amount + this.totalTxAmount = this.getTotalTransctionAmount(); + + //check is session available. + const hasSession = await this.hasActiveSession(); + if (!hasSession) { + //craete Session + await this.createNewSession(); + } + + this.executeTransfer() + }catch(err) { + let eName = OstWalletUIWorkFlowCallback.EVENTS.flowInterrupt; + this.ee.emit(eName, err.ostWorkflowContext , err.ostError); + } + } + + getTotalTransctionAmount() { + let totalAmount = new BigNumber('0'); + + for (amount of this.amounts) { + let bnAmount = new BigNumber(amount); + totalAmount = totalAmount.plus(bnAmount); + } + + return totalAmount + } + + hasActiveSession() { + return new Promise((resolve, reject) => { + OstWalletSdk.getActiveSessionsForUserId(this.userId, this.totalTxAmount.toString(10), (activeSessions) => { + if (activeSessions && activeSessions.length > 0) { + resolve(true) + }else { + resolve(false) + } + }); + }); + } + createNewSession() { + return new Promise((resolve, reject) => { + let spendingLimit = this.getSpedingLimit(); + let sessionKeyExpiryTime = this.getExpiryTime(); + let delegate = new OstWalletUIDelegate() + + delegate.flowComplete = (ostWorkflowContext, ostContextEntity) => { + resolve(ostWorkflowContext, ostContextEntity) + }; + + delegate.flowInterrupt = (ostWorkflowContext, ostError) => { + let errObject = {"ostWorkflowContext": ostWorkflowContext, "ostError": ostError} + reject(errObject) + }; + + OstWalletSdkUI.addSession(userId, sessionKeyExpiryTime, spendingLimit, workflowDelegate); + }) + } + + getSpedingLimit() { + return this.totalTxAmount.des + } + + getExpiryTime() { + return 0; + } + + executeTransfer() { + let executeTxDelegate = new OstWalletDelegate() + executeTxDelegate.flowComplete = (workflowContext, contextEntity) => { + let eName = OstWalletUIWorkFlowCallback.EVENTS.flowComplete; + this.ee.emit(eName, workflowContext , contextEntity); + } + + executeTxDelegate.flowInterrupt = (workflowContext, ostError) => { + let eName = OstWalletUIWorkFlowCallback.EVENTS.flowInterrupt; + this.ee.emit(eName, workflowContext , ostError); + } + + executeTxDelegate.requestAcknowledged = (workflowContext, contextEntity) => { + let eName = OstWalletUIWorkFlowCallback.EVENTS.requestAcknowledged; + this.ee.emit(eName, workflowContext , contextEntity); + } + + OstWalletSdk.executeTransaction( + this.userId, + this.addresses, + this.amounts, + this.ruleName, + this.txMeta, + executeTxDelegate + ) + } + + getEventEmitter() { + return this.ee; + } +} + +export default new OstTransactionHelper() \ No newline at end of file diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index 3c14a67..1260444 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -1,7 +1,7 @@ import WalletSettingsConfig from "./ost-wallet-settings-config"; import objectMerge from "lodash.merge"; -import OstSdkErrorHelper from '../helpers/OstSdkErrorHelper' +import {sdkErrorHelper} from '../helpers/OstSdkErrorHelper' const ItemsThatNeedCamera = ["add_another_device"]; @@ -28,7 +28,7 @@ class OstWalletSettingsClass { } setErrorMessages(externalErrorMessages) { - OstSdkErrorHelper.setErrorMessages(externalErrorMessages); + sdkErrorHelper.setErrorMessages(externalErrorMessages); } getMasterConfig() { diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 679b270..d820110 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -299,7 +299,7 @@ class WalletDetails extends PureComponent { return ( {this.getHeadingComponent(item)} - {item.text} + {item.text} ); }; @@ -307,7 +307,15 @@ class WalletDetails extends PureComponent { _renderCopyCell = ({item, index}) => { return ( this.onCopyCellTapped(item)}> - {this.getActionCell(item, false)} + + {this.getHeadingComponent(item)} + + + {item.text} + + {/**/} + + ); }; @@ -315,7 +323,15 @@ class WalletDetails extends PureComponent { _renderLinkCell = ({item, index}) => { return ( this.onLinkCellTapped(item)}> - {this.getActionCell(item, true)} + + {this.getHeadingComponent(item)} + + + {item.text} + + {/**/} + + ); }; @@ -323,20 +339,6 @@ class WalletDetails extends PureComponent { getHeadingComponent(item) { return({item.heading}) } - - getActionCell = (item, isLinkCell) => { - return( - - {this.getHeadingComponent(item)} - - - {item.text} - - {/**/} - - - ) - } } export default WalletDetails; diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 9516047..270b63c 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -5,7 +5,7 @@ let stylesMap = StyleSheet.create({ navigationBar:{ borderBottomWidth: 1, borderBottomColor: "#DBDBDB", - + paddingLeft: 10, justifyContent: 'flex-end' }, @@ -26,11 +26,6 @@ let stylesMap = StyleSheet.create({ marginBottom: 8 }, - statusText: { - color: "#0F9D58", - fontSize: 15, - }, - text: { color: "#2A293B", fontSize: 15, diff --git a/js/helpers/OstSdkErrorHelper.js b/js/helpers/OstSdkErrorHelper.js index 7558008..81d2e92 100644 --- a/js/helpers/OstSdkErrorHelper.js +++ b/js/helpers/OstSdkErrorHelper.js @@ -55,18 +55,11 @@ class OstSdkErrorHelper { let errorCode = ostError.getErrorCode(); let workflowType = ostWorkflowContext ? ostWorkflowContext.WORKFLOW_TYPE : null; - workflowType = workflowType || DEFAULT_CONTEXT; if (OstWalletSdkHelper.isDeviceTimeOutOfSync(ostError)) { errorCode = DEVICE_OUT_OF_SYNC; - if ( this.errorMessages[workflowType] ) { - errMsg = this.errorMessages[workflowType][ errorCode ]; - } - - if ( !errMsg ) { - errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; - } + errMsg = this.getMessageString(workflowType, errorCode) if ( developerMode ) { errMsg = errMsg + "\n\n(" + ostError.getApiInternalId() + ")" @@ -77,14 +70,8 @@ class OstSdkErrorHelper { if ( OstWalletSdkHelper.isDeviceUnauthorizedError(ostError)) { errorCode = USER_UNAUTHORIZED; - - if ( this.errorMessages[workflowType] ) { - errMsg = this.errorMessages[workflowType][ errorCode ]; - } - - if ( !errMsg ) { - errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; - } + + errMsg = this.getMessageString(workflowType, errorCode) if ( developerMode ) { errMsg = errMsg + "\n\n(" + ostError.getApiInternalId() + ")" @@ -115,13 +102,7 @@ class OstSdkErrorHelper { return DEFAULT_ERROR_MSG; } - if ( this.errorMessages[workflowType] ) { - errMsg = this.errorMessages[workflowType][ errorCode ]; - } - - if ( !errMsg ) { - errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; - } + errMsg = this.getMessageString(workflowType, errorCode) if ( developerMode && errorCode) { if ( !errMsg ) { @@ -133,6 +114,20 @@ class OstSdkErrorHelper { return errMsg || DEFAULT_ERROR_MSG; } -} -export default new OstSdkErrorHelper(); + + getMessageString(workflowType, errorCode) { + let errMsg = null + if (workflowType && this.errorMessages[workflowType] ) { + errMsg = this.errorMessages[workflowType][ errorCode ]; + } + + if ( !errMsg ) { + errMsg = this.errorMessages[DEFAULT_CONTEXT][ errorCode ]; + } + + return errMsg + } +} +const sdkErrorHelper = new OstSdkErrorHelper() +export {sdkErrorHelper, DEFAULT_CONTEXT, DEVICE_OUT_OF_SYNC, USER_UNAUTHORIZED}; diff --git a/js/helpers/OstThemeConfigHelper.js b/js/helpers/OstThemeConfigHelper.js index a09560f..6e0e2de 100644 --- a/js/helpers/OstThemeConfigHelper.js +++ b/js/helpers/OstThemeConfigHelper.js @@ -51,6 +51,26 @@ class OstThemeConfigHelper { fontFamily: c2Config.font} } + getCl1Config() { + let cl1Config = this.themeConfig.cl1; + return { + color: cl1Config.color, + fontSize: cl1Config.size, + alignSelf: this.getTextAlignment(cl1Config.alignment), + fontFamily: cl1Config.font + } + } + + getStConfig() { + let st1Config = this.themeConfig.st; + return { + color: st1Config.color, + fontSize: st1Config.size, + alignSelf: this.getTextAlignment(st1Config.alignment), + fontFamily: st1Config.font + } + } + getBorderBottomColor() { return { borderBottomColor: this.themeConfig.cell_separator.color diff --git a/js/index.js b/js/index.js index 926588c..4b096e6 100644 --- a/js/index.js +++ b/js/index.js @@ -19,6 +19,7 @@ import OstWalletSdkUI from './OstWalletSdkUI'; import {OstWalletSettings, OstWalletSettingsComponent, OstWalletSettingsDefaultConfig} from './WalletSettings'; import OstUserStatus from "./constants/UserStatus"; import OstDeviceStatus from "./constants/DeviceStatus"; +import OstTransactionHelper from "./TransactionHelper/OstTransactionHelper"; export { OstWalletSdk, @@ -33,5 +34,6 @@ export { OstWalletSettings, OstWalletSettingsComponent, OstUserStatus, - OstDeviceStatus + OstDeviceStatus, + OstTransactionHelper } From 17e158e7d0d98b5a4587fd43121738713f4891d5 Mon Sep 17 00:00:00 2001 From: Aniket Date: Mon, 16 Dec 2019 13:10:48 +0530 Subject: [PATCH 25/91] fix --- js/TransactionHelper/OstTransactionHelper.js | 41 +++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index 61ed289..2cc8cf5 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -10,14 +10,27 @@ import uuidv4 from 'uuid/v4'; import { setInstance } from '../callbackHandlers/OstWalletSdkUICallbackManager'; import OstWalletUIWorkFlowCallback from "../OstWalletUICoreCallback"; +let transactionConfig = {}; class OstTransactionHelper { constructor() { - this.transactionConfig = {} + + } + + sortConfig(sortData) { + sortData.sort((a, b) => { + let aBnSpendingLimit = new BigNumber(a.spending_limit); + let bBnSpendingLimit = new BigNumber(b.spending_limit); + return aBnSpendingLimit.minus(bBnSpendingLimit); + }); + + return sortData; } setTxConfig(externalConfig) { - this.transactionConfig = externalConfig + let sortedData = this.sortConfig(externalConfig.session_buckets); + externalConfig.session_buckets = sortedData + transactionConfig = externalConfig } executeDirectTransfer(userId, amounts, addresses, txMeta = null) { @@ -86,8 +99,12 @@ class OstTransactionExecutor { } createNewSession() { return new Promise((resolve, reject) => { - let spendingLimit = this.getSpedingLimit(); - let sessionKeyExpiryTime = this.getExpiryTime(); + let bucketForTx = this.getSpedingLimitAndExpiryTimeBucket() + if (!bucketForTx) { + reject(); + } + let spendingLimit = bucketForTx.spending_limit; + let sessionKeyExpiryTime = parseInt(bucketForTx.expiry_time); let delegate = new OstWalletUIDelegate() delegate.flowComplete = (ostWorkflowContext, ostContextEntity) => { @@ -103,12 +120,18 @@ class OstTransactionExecutor { }) } - getSpedingLimit() { - return this.totalTxAmount.des - } + getSpedingLimitAndExpiryTimeBucket(val) { + this.totalTxAmount = new BigNumber(val); + let validBucket = null; + for(bucket of transactionConfig.session_buckets) { + let bucketSpendingLimit = new BigNumber(bucket.spending_limit); + if (this.totalTxAmount.lte(bucketSpendingLimit)) { + validBucket = bucket + break; + } + } - getExpiryTime() { - return 0; + return validBucket } executeTransfer() { From b31e49b4beb0b2dc2a710c1cfe0feee26a59f482 Mon Sep 17 00:00:00 2001 From: Aniket Date: Mon, 16 Dec 2019 19:52:13 +0530 Subject: [PATCH 26/91] default transaction config added. --- js/OstWalletSdk.js | 2 +- js/OstWalletSdkUI.js | 2 +- js/TransactionHelper/OstTransactionHelper.js | 97 +++++++++++++++---- .../ost-transaction-config.json | 16 +++ 4 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 js/TransactionHelper/ost-transaction-config.json diff --git a/js/OstWalletSdk.js b/js/OstWalletSdk.js index 5006052..c0cb2b8 100644 --- a/js/OstWalletSdk.js +++ b/js/OstWalletSdk.js @@ -230,7 +230,7 @@ class OstWalletRNSdk { * @public */ getToken(tokenId, callback) { - OstWalletSdk.getToken(tokenId, (tokenEntity) => { + OstWalletSdk.getToken(tokenId.toString(), (tokenEntity) => { callback( tokenEntity ); }); } diff --git a/js/OstWalletSdkUI.js b/js/OstWalletSdkUI.js index dedca3d..c3d3709 100644 --- a/js/OstWalletSdkUI.js +++ b/js/OstWalletSdkUI.js @@ -90,7 +90,7 @@ class OstWalletRNSdkUI { */ addSession(userId, expiresAfterInSecs, spendingLimit, uiCallback) { let coreUiCallback = this._getCoreUiCallback(uiCallback); - OstWalletSdkUI.addSession(userId, String(expiresAfterInSecs), String(spendingLimit), coreUiCallback.uuid); + OstWalletSdkUI.addSession(userId.toString(), String(expiresAfterInSecs), String(spendingLimit), coreUiCallback.uuid); return coreUiCallback.uuid; } diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index 2cc8cf5..dbd63e9 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -5,16 +5,19 @@ import {sdkErrorHelper, USER_UNAUTHORIZED, DEFAULT_CONTEXT} from '../helpers/Ost import OstWalletUIDelegate from '../OstWalletUIWorkflowCallback' import OstWalletDelegate from '../OstWalletWorkFlowCallback' import EventEmitter from 'eventemitter3'; +import objectMerge from "lodash.merge"; import uuidv4 from 'uuid/v4'; import { setInstance } from '../callbackHandlers/OstWalletSdkUICallbackManager'; import OstWalletUIWorkFlowCallback from "../OstWalletUICoreCallback"; +import defaultTransactionConfig from "./ost-transaction-config"; + let transactionConfig = {}; class OstTransactionHelper { constructor() { - + this.setTxConfig(); } sortConfig(sortData) { @@ -28,9 +31,16 @@ class OstTransactionHelper { } setTxConfig(externalConfig) { - let sortedData = this.sortConfig(externalConfig.session_buckets); - externalConfig.session_buckets = sortedData - transactionConfig = externalConfig + externalConfig = externalConfig || {}; + let masterConfig = JSON.parse(JSON.stringify(defaultTransactionConfig)); + + // Deep Merge. + objectMerge(masterConfig, externalConfig); + + let sortedSessionBuckets = this.sortConfig(masterConfig.session_buckets); + masterConfig.session_buckets = sortedSessionBuckets; + + transactionConfig = masterConfig; } executeDirectTransfer(userId, amounts, addresses, txMeta = null) { @@ -47,9 +57,13 @@ class OstTransactionExecutor { this.ee = new EventEmitter(); this.userId = userId; this.amounts = amounts; + this.decimalAmounts = []; this.addresses = addresses; this.txMeta = txMeta; this.ruleName = ruleName + this.token = null; + this.user = null; + this.totalTxAmount = new BigNumber('0') @@ -58,6 +72,17 @@ class OstTransactionExecutor { async perform() { try { + + + //getUser + await this.getOstUser() + if (!this.user) { + //throw error + } + + //getToken + await this.getToken() + //get final tx amount this.totalTxAmount = this.getTotalTransctionAmount(); @@ -75,11 +100,37 @@ class OstTransactionExecutor { } } + getOstUser() { + return new Promise((resolve, reject) => { + OstWalletSdk.getUser(this.userId, (ostUser) => { + this.user = ostUser; + resolve(ostUser); + }); + }); + } + + getToken() { + return new Promise((resolve, reject) => { + let tokenId = this.user.token_id; + OstWalletSdk.getToken(tokenId, (ostToken) => { + this.token = ostToken; + resolve(ostToken); + }) + }); + } + + getTokenDecimal() { + return this.token.decimals; + } + getTotalTransctionAmount() { let totalAmount = new BigNumber('0'); for (amount of this.amounts) { - let bnAmount = new BigNumber(amount); + let decimalAmount = this.toDecimal(amount); + this.decimalAmounts.push(decimalAmount) + + let bnAmount = new BigNumber(decimalAmount); totalAmount = totalAmount.plus(bnAmount); } @@ -97,6 +148,7 @@ class OstTransactionExecutor { }); }); } + createNewSession() { return new Promise((resolve, reject) => { let bucketForTx = this.getSpedingLimitAndExpiryTimeBucket() @@ -116,17 +168,18 @@ class OstTransactionExecutor { reject(errObject) }; - OstWalletSdkUI.addSession(userId, sessionKeyExpiryTime, spendingLimit, workflowDelegate); + OstWalletSdkUI.addSession(this.userId, sessionKeyExpiryTime, spendingLimit, delegate); }) } - getSpedingLimitAndExpiryTimeBucket(val) { - this.totalTxAmount = new BigNumber(val); - let validBucket = null; + getSpedingLimitAndExpiryTimeBucket() { + let validBucket = {}; for(bucket of transactionConfig.session_buckets) { - let bucketSpendingLimit = new BigNumber(bucket.spending_limit); + let decimalSpedingLimit = this.toDecimal(bucket.spending_limit) + let bucketSpendingLimit = new BigNumber(decimalSpedingLimit); if (this.totalTxAmount.lte(bucketSpendingLimit)) { - validBucket = bucket + Object.assign(validBucket, bucket) + validBucket.spending_limit = decimalSpedingLimit break; } } @@ -134,6 +187,12 @@ class OstTransactionExecutor { return validBucket } + toDecimal(val) { + val = BigNumber(val); + let exp = BigNumber(10).exponentiatedBy(this.getTokenDecimal()); + return val.multipliedBy(exp).toString(10); + } + executeTransfer() { let executeTxDelegate = new OstWalletDelegate() executeTxDelegate.flowComplete = (workflowContext, contextEntity) => { @@ -151,14 +210,14 @@ class OstTransactionExecutor { this.ee.emit(eName, workflowContext , contextEntity); } - OstWalletSdk.executeTransaction( - this.userId, - this.addresses, - this.amounts, - this.ruleName, - this.txMeta, - executeTxDelegate - ) + // OstWalletSdk.executeTransaction( + // this.userId, + // this.addresses, + // this.decimalAmounts, + // this.ruleName, + // this.txMeta, + // executeTxDelegate + // ) } getEventEmitter() { diff --git a/js/TransactionHelper/ost-transaction-config.json b/js/TransactionHelper/ost-transaction-config.json new file mode 100644 index 0000000..2ee0aab --- /dev/null +++ b/js/TransactionHelper/ost-transaction-config.json @@ -0,0 +1,16 @@ +{ + session_buckets: [ + { + expiry_time: 60*60*24*30*2, //2 months + spending_limit: '10' + }, + { + expiry_time: 60*60*24*30, //1 months + spending_limit: '50' + }, + { + expiry_time: 60*60*24, //24 hours + spending_limit: '100' + } + ] +} \ No newline at end of file From a4ed693eb2a1273dad9eeb499240d9fcac9ef97c Mon Sep 17 00:00:00 2001 From: Aniket Date: Mon, 16 Dec 2019 21:27:49 +0530 Subject: [PATCH 27/91] revoke device added. --- js/WalletSettings/WalletSettingsController.js | 26 ++++++++++++------- .../ost-wallet-settings-config.json | 18 +++++++++++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 89291f0..a1c45b5 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -9,6 +9,7 @@ import OstWalletUIWorkflowCallback from '../OstWalletUIWorkflowCallback'; import InternalWorkflowDelegate from "../delegates/InternalWorkflowDelegate" const optionIds = { + activateUser: "activate_user", walletDetails: "wallet_details", recoverDevice: "recover_device", abortRecovery: "abort_recovery", @@ -19,7 +20,8 @@ const optionIds = { authorizeWithQR: "add_another_device", showQR: "show_device_qr_code", enableBiometrics: "enable_biometrics", - disableBiometrics: "disable_biometrics" + disableBiometrics: "disable_biometrics", + revokeDevice: "revoke_device" }; class WalletSettingsController { @@ -153,7 +155,7 @@ class WalletSettingsController { this._resetOptions(); - if (userStatus == this.userStatusMap.activated) { + if ((userStatus == this.userStatusMap.activated) && (deviceStatus !== this.deviceStatusMap.revoked)) { if (deviceStatus) { this._updateOptionsData(optionIds.walletDetails, false, true); } @@ -163,6 +165,7 @@ class WalletSettingsController { this._updateOptionsData(optionIds.viewMnemonics, false, true); this._updateOptionsData(optionIds.authorizeWithQR, false, true); this._updateOptionsData(optionIds.resetPin, false, true); + this._updateOptionsData(optionIds.revokeDevice, false, true); if (this.isBiometricEnabled || false) { this._updateOptionsData(optionIds.disableBiometrics, false, true, "Disable Biometrics"); @@ -183,12 +186,8 @@ class WalletSettingsController { this._updateOptionsData(optionIds.abortRecovery, false, false); } - if (deviceStatus == this.deviceStatusMap.revoked) { - this._initializeOptions() - } - }else { - this._initializeOptions() + //this._updateOptionsData(optionIds.activateUser, false, true); } let data = this._getData(this.onlyPerformable); @@ -200,8 +199,10 @@ class WalletSettingsController { for ( cnt=0; cnt< len; cnt++ ) { let optionKey = this.optionsOrdering[cnt]; let option = this.optionsMap[optionKey]; - option.inProgress = false; - option.canPerform = false; + if (option) { + option.inProgress = false; + option.canPerform = false; + } } } @@ -211,6 +212,9 @@ class WalletSettingsController { for ( cnt=0; cnt< len; cnt++ ) { let optionKey = this.optionsOrdering[ cnt ]; let option = this.optionsMap[optionKey]; + if (!option) { + continue; + } if (onlyPerformable) { if ( !option.canPerform || !option.shouldShow ){ // Skip this. @@ -373,6 +377,10 @@ class WalletSettingsController { workflowId = OstWalletSdkUI.updateBiometricPreference(userId, false, delegate); break; + case optionIds.revokeDevice: + workflowId = OstWalletSdkUI.revokeDevice(userId, null, delegate); + break; + default: return null; } diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index fb8550e..972ddaf 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -1,12 +1,14 @@ { "item_display_order": [ + "activate_user", "wallet_details", "recover_device", - "abort_recovery", + "abort_recovery", "add_session", "reset_pin", "show_mnemonics", - "authorize_device_with_mnemonics", + "authorize_device_with_mnemonics", + "revoke_device", "add_another_device", "show_device_qr_code", "enable_biometrics", @@ -22,6 +24,12 @@ "ost_view_endpoint": '' } }, + "activate_user": { + "content_config": { + "heading": "Activate User", + "description": "Activate user." + } + }, "recover_device": { "content_config": { "heading": "Recover Device", @@ -34,6 +42,12 @@ "description": "Abort Device Recovery." } }, + "revoke_device": { + "content_config": { + "heading": "Revoke Device", + "description": "Revoke Device." + } + }, "add_session": { "content_config": { "heading": "Authorize New Session", From 3b40aaaca01c1d65d044866b06dcb73b215271d0 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 17 Dec 2019 13:22:29 +0530 Subject: [PATCH 28/91] making tx call added. --- js/TransactionHelper/OstTransactionHelper.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index dbd63e9..60e715f 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -210,14 +210,14 @@ class OstTransactionExecutor { this.ee.emit(eName, workflowContext , contextEntity); } - // OstWalletSdk.executeTransaction( - // this.userId, - // this.addresses, - // this.decimalAmounts, - // this.ruleName, - // this.txMeta, - // executeTxDelegate - // ) + OstWalletSdk.executeTransaction( + this.userId, + this.addresses, + this.decimalAmounts, + this.ruleName, + this.txMeta, + executeTxDelegate + ) } getEventEmitter() { From e7524b6cf46588b58cd0154fb2e6e05c89855e2c Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 18 Dec 2019 13:40:49 +0530 Subject: [PATCH 29/91] activate user workflow added. --- js/TransactionHelper/OstTransactionHelper.js | 2 +- .../ost-transaction-config.json | 6 +++--- js/WalletSettings/OstWalletSettings.js | 17 +++++++++++++++- js/WalletSettings/WalletSettingsController.js | 20 +++++++++++++++---- .../ost-wallet-settings-config.json | 6 +++++- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index 60e715f..2698ebf 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -156,7 +156,7 @@ class OstTransactionExecutor { reject(); } let spendingLimit = bucketForTx.spending_limit; - let sessionKeyExpiryTime = parseInt(bucketForTx.expiry_time); + let sessionKeyExpiryTime = parseInt(bucketForTx.expiration_time); let delegate = new OstWalletUIDelegate() delegate.flowComplete = (ostWorkflowContext, ostContextEntity) => { diff --git a/js/TransactionHelper/ost-transaction-config.json b/js/TransactionHelper/ost-transaction-config.json index 2ee0aab..9278d17 100644 --- a/js/TransactionHelper/ost-transaction-config.json +++ b/js/TransactionHelper/ost-transaction-config.json @@ -1,15 +1,15 @@ { session_buckets: [ { - expiry_time: 60*60*24*30*2, //2 months + expiration_time: 60*60*24*30*2, //2 months spending_limit: '10' }, { - expiry_time: 60*60*24*30, //1 months + expiration_time: 60*60*24*30, //1 months spending_limit: '50' }, { - expiry_time: 60*60*24, //24 hours + expiration_time: 60*60*24, //24 hours spending_limit: '100' } ] diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index 1260444..f78130e 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -65,9 +65,24 @@ class OstWalletSettingsClass { getSessionExpirationTime() { let itemConfig = this.getItemConfig( "add_session" ) || {}; let config = itemConfig.config || {}; - return config[ "expiration_time" ] || "0"; + let expirationTime = config[ "expiration_time"] || 0 + return parseInt(expirationTime) } + getActivateUserSpendingLimit() { + let itemConfig = this.getItemConfig( "activate_user" ) || {}; + let config = itemConfig.config || {}; + return config[ "spending_limit" ] || "1"; + } + + getActivateUserExpirationTime() { + let itemConfig = this.getItemConfig( "activate_user" ) || {}; + let config = itemConfig.config || {}; + let expirationTime = config[ "expiration_time"] || 1 + return parseInt(expirationTime) + } + + getOstViewEndpoint() { let itemConfig = this.getItemConfig( "wallet_details" ) || {}; let config = itemConfig.config || {}; diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index a1c45b5..9b99912 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -186,8 +186,8 @@ class WalletSettingsController { this._updateOptionsData(optionIds.abortRecovery, false, false); } - }else { - //this._updateOptionsData(optionIds.activateUser, false, true); + }else if ((userStatus == this.userStatusMap.created) && (deviceStatus === this.deviceStatusMap.registered)){ + this._updateOptionsData(optionIds.activateUser, false, true); } let data = this._getData(this.onlyPerformable); @@ -338,7 +338,11 @@ class WalletSettingsController { switch( optionId ) { case optionIds.addSession: - workflowId = OstWalletSdkUI.addSession(userId, OstWalletSettings.getSessionExpirationTime() , OstWalletSettings.getSessionSpendingLimit(), delegate); + workflowId = OstWalletSdkUI.addSession( + userId, + OstWalletSettings.getSessionExpirationTime() , + OstWalletSettings.getSessionSpendingLimit(), + delegate); break; case optionIds.recoverDevice: @@ -380,7 +384,15 @@ class WalletSettingsController { case optionIds.revokeDevice: workflowId = OstWalletSdkUI.revokeDevice(userId, null, delegate); break; - + + case optionIds.activateUser: + workflowId = OstWalletSdkUI.activateUser( + userId, + OstWalletSettings.getActivateUserExpirationTime(), + OstWalletSettings.getActivateUserSpendingLimit(), + delegate) + break; + default: return null; } diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index 972ddaf..f1580a2 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -28,6 +28,10 @@ "content_config": { "heading": "Activate User", "description": "Activate user." + }, + "config": { + "spending_limit": "1", + "expiration_time": 60 } }, "recover_device": { @@ -55,7 +59,7 @@ }, "config": { "spending_limit": "0", - "expiration_time": "0" + "expiration_time": 0 } }, "reset_pin": { From c510ee7a7420af7abe93bc76f39a1bb315b87f0f Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 18 Dec 2019 15:37:49 +0530 Subject: [PATCH 30/91] wallet setting config modified --- js/WalletSettings/OstWalletSettings.js | 4 ++-- js/WalletSettings/ost-wallet-settings-config.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/WalletSettings/OstWalletSettings.js b/js/WalletSettings/OstWalletSettings.js index f78130e..2d65530 100644 --- a/js/WalletSettings/OstWalletSettings.js +++ b/js/WalletSettings/OstWalletSettings.js @@ -72,13 +72,13 @@ class OstWalletSettingsClass { getActivateUserSpendingLimit() { let itemConfig = this.getItemConfig( "activate_user" ) || {}; let config = itemConfig.config || {}; - return config[ "spending_limit" ] || "1"; + return config[ "spending_limit" ] || "0"; } getActivateUserExpirationTime() { let itemConfig = this.getItemConfig( "activate_user" ) || {}; let config = itemConfig.config || {}; - let expirationTime = config[ "expiration_time"] || 1 + let expirationTime = config[ "expiration_time"] || 0 return parseInt(expirationTime) } diff --git a/js/WalletSettings/ost-wallet-settings-config.json b/js/WalletSettings/ost-wallet-settings-config.json index f1580a2..b6d9bef 100644 --- a/js/WalletSettings/ost-wallet-settings-config.json +++ b/js/WalletSettings/ost-wallet-settings-config.json @@ -30,8 +30,8 @@ "description": "Activate user." }, "config": { - "spending_limit": "1", - "expiration_time": 60 + "spending_limit": "0", + "expiration_time": 0 } }, "recover_device": { From b0d1e6b3ef7b944ea9c08cbc6c21db34c434be3e Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 18 Dec 2019 16:57:43 +0530 Subject: [PATCH 31/91] navigation header added. --- js/WalletSettings/SettingsComponent.js | 25 ++++++++++++++++++------ js/WalletSettings/WalletDetails.js | 15 +++++--------- js/WalletSettings/walletDetailsStyles.js | 12 ++++++++++++ js/helpers/OstThemeConfigHelper.js | 19 ++++++++++++++---- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index bc3bc9e..21ceb82 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -16,13 +16,26 @@ import('react-native-android-open-settings').then((pack) => { }); -// try { -// console.log(require.resolve("react-native-android-open-settings")); -// } catch(e) { -// console.error("react-native-android-open-settings is not found"); -// } - class SettingsComponent extends PureComponent { + + static navigationOptions = ({ navigation, navigationOptions }) => { + let navigationParams = { + title: navigation.getParam('navTitle', 'Wallet Settings'), + headerStyle: { + borderBottomWidth: 0, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.1, + shadowRadius: 3 + } + }; + + return Object.assign(navigationParams, OstThemeConfigHelper.getNavigationHeaderConfig()); + }; + constructor(props) { super(props); this.state = { diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index d820110..68c2963 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -10,11 +10,6 @@ import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper' import OstWalletSettings from './OstWalletSettings' let InAppBrowser = null; -// import('react-native-inappbrowser-reborn').then((pack) => { -// return InAppBrowser = pack.default -// }).catch((err) => { -// // -// }) class WalletDetails extends PureComponent { constructor(props) { @@ -249,10 +244,10 @@ class WalletDetails extends PureComponent { animationType="slide" transparent={false} visible={this.props.modalVisible}> - + - - X + + X @@ -299,7 +294,7 @@ class WalletDetails extends PureComponent { return ( {this.getHeadingComponent(item)} - {item.text} + {item.text} ); }; @@ -327,7 +322,7 @@ class WalletDetails extends PureComponent { {this.getHeadingComponent(item)} - {item.text} + {item.text} {/**/} diff --git a/js/WalletSettings/walletDetailsStyles.js b/js/WalletSettings/walletDetailsStyles.js index 270b63c..e67a259 100644 --- a/js/WalletSettings/walletDetailsStyles.js +++ b/js/WalletSettings/walletDetailsStyles.js @@ -2,6 +2,18 @@ import { StyleSheet } from 'react-native'; let stylesMap = StyleSheet.create({ + closeContainer: { + width: 44, + height: 44, + alignItems: 'center', + justifyContent: 'center' + }, + + closeText: { + color: '#2A293B', + fontSize: 24 + }, + navigationBar:{ borderBottomWidth: 1, borderBottomColor: "#DBDBDB", diff --git a/js/helpers/OstThemeConfigHelper.js b/js/helpers/OstThemeConfigHelper.js index 6e0e2de..6e34883 100644 --- a/js/helpers/OstThemeConfigHelper.js +++ b/js/helpers/OstThemeConfigHelper.js @@ -51,8 +51,8 @@ class OstThemeConfigHelper { fontFamily: c2Config.font} } - getCl1Config() { - let cl1Config = this.themeConfig.cl1; + getLinkConfig() { + let cl1Config = this.themeConfig.link; return { color: cl1Config.color, fontSize: cl1Config.size, @@ -61,8 +61,8 @@ class OstThemeConfigHelper { } } - getStConfig() { - let st1Config = this.themeConfig.st; + getStatusConfig() { + let st1Config = this.themeConfig.status; return { color: st1Config.color, fontSize: st1Config.size, @@ -76,6 +76,17 @@ class OstThemeConfigHelper { borderBottomColor: this.themeConfig.cell_separator.color } } + + getNavigationHeaderConfig() { + let config = this.themeConfig.navigation_bar; + let headerConfig = this.themeConfig.navigation_bar_header; + return { + headerStyle: { + backgroundColor: config.tint_color + }, + headerTintColor: headerConfig.tint_color + } + } } export default new OstThemeConfigHelper() \ No newline at end of file From 44b3dfdad8d779e22d14d9ffc39564679756ada8 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 19 Dec 2019 20:22:58 +0530 Subject: [PATCH 32/91] passphrase delegate bug fix. --- js/TransactionHelper/OstTransactionHelper.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index 2698ebf..cd33013 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -12,6 +12,7 @@ import { setInstance } from '../callbackHandlers/OstWalletSdkUICallbackManager'; import OstWalletUIWorkFlowCallback from "../OstWalletUICoreCallback"; import defaultTransactionConfig from "./ost-transaction-config"; +import OstWalletUIWorkflowCallback from "@ostdotcom/ost-wallet-sdk-react-native/js/OstWalletUIWorkflowCallback"; let transactionConfig = {}; @@ -43,8 +44,8 @@ class OstTransactionHelper { transactionConfig = masterConfig; } - executeDirectTransfer(userId, amounts, addresses, txMeta = null) { - let obj = new OstTransactionExecutor(userId, 'direct transfer', amounts, addresses, txMeta) + executeDirectTransfer(userId, amounts, addresses, txMeta, transferDelegate) { + let obj = new OstTransactionExecutor(userId, 'direct transfer', amounts, addresses, txMeta, transferDelegate) obj.perform(); return obj.uuid; @@ -52,7 +53,7 @@ class OstTransactionHelper { } class OstTransactionExecutor { - constructor(userId, ruleName, amounts, addresses, txMeta = null) { + constructor(userId, ruleName, amounts, addresses, txMeta, transferDelegate) { this.uuid = uuidv4(); this.ee = new EventEmitter(); this.userId = userId; @@ -64,6 +65,13 @@ class OstTransactionExecutor { this.token = null; this.user = null; + if ( !transferDelegate || !(transferDelegate instanceof OstWalletUIWorkflowCallback) ) { + let err = new Error("transferDelegate can not be null and must be an instanceof OstWalletUIWorkflowCallback"); + throw err; + } + + this.delegate = transferDelegate; + this.totalTxAmount = new BigNumber('0') @@ -159,6 +167,10 @@ class OstTransactionExecutor { let sessionKeyExpiryTime = parseInt(bucketForTx.expiration_time); let delegate = new OstWalletUIDelegate() + delegate.getPassphrase = (userId, ostWorkflowContext, OstPassphrasePrefixAccept) => { + this.delegate.getPassphrase(userId, ostWorkflowContext, OstPassphrasePrefixAccept); + } + delegate.flowComplete = (ostWorkflowContext, ostContextEntity) => { resolve(ostWorkflowContext, ostContextEntity) }; From 7ea36acdcd64f9f306692cf7d83e2ea5fc49d9ee Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 16:05:49 +0530 Subject: [PATCH 33/91] getThemeConfig Added --- .../ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java index 075ace1..0a4f7a9 100644 --- a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java +++ b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java @@ -193,6 +193,18 @@ public void setThemeConfig(ReadableMap themeConfig){ OstWalletUI.setThemeConfig(getReactApplicationContext(), themeConfigObject); } + @ReactMethod + public void getThemeConfig(Callback callback){ + JSONObject jsonObject = OstWalletUI.getThemeConfig(getReactApplicationContext()); + ReadableMap readableMap = null; + try { + readableMap = Utils.convertJsonToMap(jsonObject); + } catch (JSONException e) { + e.printStackTrace(); + } + callback.invoke(readableMap); + } + @ReactMethod public void setContentConfig(ReadableMap contentConfig) { JSONObject contentConfigObject = null; From 3fa532eedadc944400397fee60d4da7aa920bc4a Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 16:12:44 +0530 Subject: [PATCH 34/91] getThemeConfig Added without context --- .../main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java index 0a4f7a9..2f19e89 100644 --- a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java +++ b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java @@ -195,7 +195,7 @@ public void setThemeConfig(ReadableMap themeConfig){ @ReactMethod public void getThemeConfig(Callback callback){ - JSONObject jsonObject = OstWalletUI.getThemeConfig(getReactApplicationContext()); + JSONObject jsonObject = OstWalletUI.getThemeConfig(); ReadableMap readableMap = null; try { readableMap = Utils.convertJsonToMap(jsonObject); From 672b9c1ed110c63a7ede7ab9e11c492e6a5cf19b Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 17:26:36 +0530 Subject: [PATCH 35/91] getThemeConfig Added with context --- android/build.gradle | 2 +- .../main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 1ded4ed..f49a072 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.github.ostdotcom:ost-wallet-sdk-android:ca21350b35e3a26b0887f056e8b5b3f2a4bd11a1' + api 'com.github.ostdotcom:ost-wallet-sdk-android:0ccde528a3664694c187a6bd439f006b0e75815c' } diff --git a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java index 2f19e89..0a4f7a9 100644 --- a/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java +++ b/android/src/main/java/com/ostwalletrnsdk/ui/OstWalletUiRnSdkModule.java @@ -195,7 +195,7 @@ public void setThemeConfig(ReadableMap themeConfig){ @ReactMethod public void getThemeConfig(Callback callback){ - JSONObject jsonObject = OstWalletUI.getThemeConfig(); + JSONObject jsonObject = OstWalletUI.getThemeConfig(getReactApplicationContext()); ReadableMap readableMap = null; try { readableMap = Utils.convertJsonToMap(jsonObject); From ec92c4c5214ded14063a35e6108fb6b0697dfe65 Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 18:04:25 +0530 Subject: [PATCH 36/91] hash update --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index f49a072..7722f95 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.github.ostdotcom:ost-wallet-sdk-android:0ccde528a3664694c187a6bd439f006b0e75815c' + api 'com.github.ostdotcom:ost-wallet-sdk-android:e065cf1b9a163a40d1bd50944255c2bd52b6a610' } From 407a19c687289953aa84609d0897c012bb9bb8e7 Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 18:20:30 +0530 Subject: [PATCH 37/91] hash update --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 7722f95..b4f015b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.github.ostdotcom:ost-wallet-sdk-android:e065cf1b9a163a40d1bd50944255c2bd52b6a610' + api 'com.github.ostdotcom:ost-wallet-sdk-android:75eba1078d4865622f0490fa88c5a482ab041c76' } From 0b6137041e198a0a69ab9839db933abc53c62a95 Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Mon, 6 Jan 2020 18:58:21 +0530 Subject: [PATCH 38/91] hash update --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index b4f015b..ce963b4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.github.ostdotcom:ost-wallet-sdk-android:75eba1078d4865622f0490fa88c5a482ab041c76' + api 'com.github.ostdotcom:ost-wallet-sdk-android:a95e4463f46fc4d746ed91992f0c4346754c7681' } From a422334f72d6799bec4dccd9f3b7690be6f56c63 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 7 Jan 2020 17:37:05 +0530 Subject: [PATCH 39/91] config readme added. --- documentation/OstTransactionConfig.md | 31 ++++++++++ documentation/OstWalletSettingsConfig.md | 77 ++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 documentation/OstTransactionConfig.md create mode 100644 documentation/OstWalletSettingsConfig.md diff --git a/documentation/OstTransactionConfig.md b/documentation/OstTransactionConfig.md new file mode 100644 index 0000000..eb23647 --- /dev/null +++ b/documentation/OstTransactionConfig.md @@ -0,0 +1,31 @@ +# OstTransaction Config + +## Introduction + +App developers can configure session `expiration_time` and `spending_limit` while executing transaction. + +To configure the content, the sdk needs to be provided with [JSON object](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON). + +The default configuration can be found [here](https://github.com/ostdotcom/ost-wallet-sdk-react-native/blob/team/wallet_settings/js/TransactionHelper/ost-transaction-config.json). + +## Dictionary Data Structure + +Here is the small sample json representation of the configuration. + +```json +{ + session_buckets: [ + { + expiration_time: 60*60*24*30*2, //2 months + spending_limit: '10' + } + ] +} +``` + +In the above example: + +* The first-level key `session_buckets` corresponds to list of buckets for creating session. The bucket selection is +depends on `spending_limit`. +* The second-level key `expiration_time` corresponds to expiry time of session. +* The second-level key `spending_limit` corresponds to spending limit of session. \ No newline at end of file diff --git a/documentation/OstWalletSettingsConfig.md b/documentation/OstWalletSettingsConfig.md new file mode 100644 index 0000000..9ab91b1 --- /dev/null +++ b/documentation/OstWalletSettingsConfig.md @@ -0,0 +1,77 @@ +# OstWallet Settings Config + +## Introduction + +App developers can configure the text shown on settings page. + +To configure the content, the sdk needs to be provided with [JSON object](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON). + +The default configuration can be found [here](https://github.com/ostdotcom/ost-wallet-sdk-react-native/blob/team/wallet_settings/js/WalletSettings/ost-wallet-settings-config.json). + +## Dictionary Data Structure + +Here is the small sample json representation of the configuration. + +```json +{ + "item_display_order": [ + "activate_user", + ], + "item_configs": { + "activate_user": { + "content_config": { + "heading": "Activate User", + "description": "User is not activated yet." + }, + "config": { + "spending_limit": "0", + "expiration_time": 0 + } + } + } +} +``` +In the above example: + +* The first-level key `item_display_order` corresponds to sequence of allowed workflows. +* The first-level key `item_configs` corresponds to config for workflows. +* The second-level key `activate_user` corresponds to activate user workflow. +* The third-level key `content_config` corresponds to `heading` and `description` of workflows. +* The third-level key `config` corresponds to respective config for workflows. + +## Supported Workflows + +OstWalletSettings supports 13 workflows + +| Configuration Keys | Workflows | +| ------------------------------------------------ |:--------------------------------------------------------------:| +| activate_user | Activate User | +| wallet_details | Wallet Details | +| recover_device | Initialize Recovery | +| add_session | Add Session | +| reset_pin | Reset a User's PIN | +| show_mnemonics | Get Mnemonic Phrase | +| authorize_device_with_mnemonics | Authorize device using mnemonics | +| abort_recovery | Abort Device Recovery | +| revoke_device | Revoke Device | +| add_another_device | Scan QR Code to add another device | +| show_device_qr_code | Get current Device QR code | +| enable_biometrics | Use biometrics to authorize new Sessions and to confirm high value transactions. | +| disable_biometrics | Turn off biometrics and use PIN to authorize new Sessions and to confirm high value transactions. | + +* All workflows have `content_config`. +* `config` varies workflow to workflow. + +## Workflow Config + +Some workflows requires additional data. It can be passed to workflow by setting it in `config`. + +| Workflows | Config Keys | Config Type | +| -------------------------------------- | -------------------------------------------------- | ------------------------------- | +| activate_user | - spending_limit | String | +| | - expiration_time | Number | +| wallet_details | - ost_view_endpoint | String | +| add_session | - spending_limit | String | +| | - expiration_time | Number | + + From 089b16849045e9754e2960b9f5127d700510ba6f Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 7 Jan 2020 17:44:15 +0530 Subject: [PATCH 40/91] Let custom loader show the error. --- js/WalletSettings/SettingsComponent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 21ceb82..d99563c 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -192,7 +192,7 @@ class SettingsComponent extends PureComponent { }; workflowFailed = (ostWorkflowContext , ostError) => { - let text = this._getFlowFailedText(ostWorkflowContext, ostError); + // let text = this._getFlowFailedText(ostWorkflowContext, ostError); // LoadingModal.showFailureAlert(text, null, "Dismiss"); }; From 954b85099e92dfcd5b761b03946c82524f826448 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Tue, 7 Jan 2020 18:38:55 +0530 Subject: [PATCH 41/91] always show wallet details --- js/WalletSettings/WalletDetails.js | 7 ++++--- js/WalletSettings/WalletSettingsController.js | 7 +++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 68c2963..834a65e 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -6,8 +6,9 @@ import OstWalletSdk from '../OstWalletSdk'; import OstWalletSdkUI from '../OstWalletSdkUI'; import OstJsonApi from '../OstJsonApi'; import OstWalletSdkHelper from "../helpers/OstWalletSdkHelper"; -import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper' -import OstWalletSettings from './OstWalletSettings' +import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper'; +import OstWalletSettings from './OstWalletSettings'; +import {sdkErrorHelper, DEFAULT_CONTEXT, DEVICE_OUT_OF_SYNC, USER_UNAUTHORIZED} from "../helpers/OstSdkErrorHelper"; let InAppBrowser = null; @@ -78,7 +79,7 @@ class WalletDetails extends PureComponent { this._onDeviceFetch(deviceApiResponse) }, ( error ) => { let ostError = OstWalletSdkHelper.jsonToOstRNError( error ); - let errorMessage = ostSdkErrors.getErrorMessage( null, ostError ); + let errorMessage = sdkErrorHelper.getErrorMessage( null, ostError ); LoadingModal.showFailureAlert(errorMessage, "", "OK", () => { // Close this view. this.props.navigation.goBack(null); diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 9b99912..f0b0157 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -155,11 +155,10 @@ class WalletSettingsController { this._resetOptions(); - if ((userStatus == this.userStatusMap.activated) && (deviceStatus !== this.deviceStatusMap.revoked)) { - if (deviceStatus) { - this._updateOptionsData(optionIds.walletDetails, false, true); - } + // Always display wallet details if + this._updateOptionsData(optionIds.walletDetails, false, true); + if ((userStatus == this.userStatusMap.activated) && (deviceStatus !== this.deviceStatusMap.revoked)) { if (deviceStatus == this.deviceStatusMap.authorized) { this._updateOptionsData(optionIds.addSession, false, true); this._updateOptionsData(optionIds.viewMnemonics, false, true); From 57fe01bb5226add6c1eaa0acda93f76f46b2b343 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 7 Jan 2020 20:13:21 +0530 Subject: [PATCH 42/91] removed unused code. --- js/WalletSettings/SettingsComponent.js | 42 ------------------- js/WalletSettings/WalletDetails.js | 18 ++++---- js/WalletSettings/WalletSettingsController.js | 1 - 3 files changed, 8 insertions(+), 53 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index d99563c..05a8fb4 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -89,7 +89,6 @@ class SettingsComponent extends PureComponent { async _processTappedOption(item) { if ( optionIds.walletDetails === item.id ) { - // this.props.navigation.navigate('WalletDetails'); this.showWalletDetails(); return; } @@ -113,7 +112,6 @@ class SettingsComponent extends PureComponent { if ( workflowInfo ) { this.onWorkflowStarted( workflowInfo ); } else { - //Some coding error occurred. console.log("PepoError", "ws_indx_osit_1", "Some coding error occurred"); } } @@ -138,49 +136,21 @@ class SettingsComponent extends PureComponent { onWorkflowStarted = (workflowInfo) => { this.workflowInfo = workflowInfo; - // Show loader. - //LoadingModal.show(''); - - // Subscribe to events. this.controller.setUIDelegate(this); }; requestAcknowledged = (ostWorkflowContext , ostContextEntity) => { - // LoadingModal.show(this._getRequestAcknowledgedText()) }; flowComplete = (ostWorkflowContext , ostContextEntity) => { this.refreshList(() => { - if (this.canShowAlert(ostWorkflowContext)) { - // LoadingModal.showSuccessAlert(text); - }else { - // LoadingModal.hide() - } - }); }; onUnauthorized = (ostWorkflowContext , ostError) => { - /// TODO bubble LoadingModal was here. - - // LoadingModal.showFailureAlert("Device is not authorized. Please authorize device again.", null, "Logout", () => { - // //TODO bubble - Deal with this. - - // // CurrentUser.logout({ - // // device_id: DeviceInfo.getUniqueID() - // // }); - // }) }; saltFetchFailed = (ostWorkflowContext , ostError) => { - /// TODO bubble LoadingModal was here. - - // LoadingModal.showFailureAlert("There is some issue while fetching salt. Please retry", null, "Retry", (isButtonTapped) => { - // if (isButtonTapped) { - // let retryItem = this.controller.optionsMap[this.workflowInfo.workflowOptionId]; - // this.onSettingItemTapped(retryItem); - // } - // }) }; userCancelled = (ostWorkflowContext , ostError) => { @@ -188,22 +158,11 @@ class SettingsComponent extends PureComponent { }; deviceTimeOutOfSync = (ostWorkflowContext , ostError) => { - this.workflowFailed(ostWorkflowContext, ostError); }; workflowFailed = (ostWorkflowContext , ostError) => { - // let text = this._getFlowFailedText(ostWorkflowContext, ostError); - // LoadingModal.showFailureAlert(text, null, "Dismiss"); }; - canShowAlert(workflowContext) { - if (workflowContext.WORKFLOW_TYPE === 'GET_DEVICE_MNEMONICS') { - return false - } - - return true - } - _keyExtractor = (item, index) => `id_${item.id}`; _renderItem = ({ item, index }) => { @@ -233,7 +192,6 @@ class SettingsComponent extends PureComponent { onLayout={(event) => { const {x, y, width, height} = event.nativeEvent.layout; this.flatListLayout = event.nativeEvent.layout; - // do something here like set your initial animated value for the height }} /> diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index 834a65e..f6f1d5f 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -75,15 +75,16 @@ class WalletDetails extends PureComponent { } _fetchDeviceFromServer(localDevice) { + OstJsonApi.getCurrentDeviceForUserId(this.userId,( deviceApiResponse ) => { this._onDeviceFetch(deviceApiResponse) }, ( error ) => { - let ostError = OstWalletSdkHelper.jsonToOstRNError( error ); - let errorMessage = sdkErrorHelper.getErrorMessage( null, ostError ); - LoadingModal.showFailureAlert(errorMessage, "", "OK", () => { - // Close this view. - this.props.navigation.goBack(null); - }); + let deviceEntity = { + local_device: localDevice, + result_type: "local_device" + } + + this._onDeviceFetch(deviceEntity); }); } @@ -95,10 +96,7 @@ class WalletDetails extends PureComponent { this._buildList(); }else { - LoadingModal.showFailureAlert("Something went wrong", "", "OK", () => { - // Close this view. - this.props.navigation.goBack(null); - }); + } } diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index f0b0157..468b2c9 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -62,7 +62,6 @@ class WalletSettingsController { onlyPerformable = onlyPerformable || false; if ( !this.userId ) { - //Ost user id is null. setTimeout(() => { let data = this._getData(onlyPerformable); callback( data ); From a8b9375a3ebb73b2a22c2012cf61a5baf3e3ec11 Mon Sep 17 00:00:00 2001 From: Aniket Date: Tue, 7 Jan 2020 22:03:26 +0530 Subject: [PATCH 43/91] wallet details title added. --- js/WalletSettings/SettingsComponent.js | 4 +++- js/WalletSettings/WalletDetails.js | 7 +++++++ js/WalletSettings/WalletSettingsController.js | 2 -- js/helpers/OstThemeConfigHelper.js | 8 ++++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/js/WalletSettings/SettingsComponent.js b/js/WalletSettings/SettingsComponent.js index 05a8fb4..ae9a57c 100644 --- a/js/WalletSettings/SettingsComponent.js +++ b/js/WalletSettings/SettingsComponent.js @@ -8,6 +8,7 @@ import inlineStyle from './styles' import {optionIds, WalletSettingsController} from './WalletSettingsController'; import OstThemeConfigHelper from '../helpers/OstThemeConfigHelper' import Colors from "../../../../../src/theme/styles/Colors"; +import OstWalletSettings from "@ostdotcom/ost-wallet-sdk-react-native/js/WalletSettings/OstWalletSettings"; let AndroidOpenSettings = null; import('react-native-android-open-settings').then((pack) => { @@ -178,9 +179,10 @@ class SettingsComponent extends PureComponent { }; render() { + let walletDetailsData = OstWalletSettings.getItemConfig("wallet_details") return ( <> - this.hideWalletDetails()} flatlistLayout={this.flatListLayout}/> + this.hideWalletDetails()} flatlistLayout={this.flatListLayout}/> + + X + + {this.props.viewData.content_config.heading} + + { this.themeConfig = themeConfig }) } - getThemeConfig() { + _getThemeConfig() { return new Promise((resolve, reject) => { OstWalletSdkUI.getThemeConfig((themeConfig) => { resolve(themeConfig) From 5092a751e0d7dfdb9654a93071d38fe3865bee4a Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Wed, 8 Jan 2020 15:07:05 +0530 Subject: [PATCH 44/91] Bug fix: Run all counter callbacks on UI thread --- .../ostwalletrnsdk/sdkIntracts/BaseSdkInteract.java | 10 ++++++++++ .../sdkIntracts/OstDeviceRegisteredWrap.java | 9 +++++++-- .../sdkIntracts/OstPassphraseAcceptWrap.java | 10 ++++++++-- .../ostwalletrnsdk/sdkIntracts/OstPinAcceptWrap.java | 9 +++++++-- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/BaseSdkInteract.java b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/BaseSdkInteract.java index 86f5525..774e61d 100644 --- a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/BaseSdkInteract.java +++ b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/BaseSdkInteract.java @@ -10,6 +10,9 @@ package com.ostwalletrnsdk.sdkIntracts; +import android.os.Handler; +import android.os.Looper; + import com.ost.walletsdk.workflows.errors.OstErrors; import com.ost.walletsdk.workflows.interfaces.*; import com.ostwalletrnsdk.OstWorkFlowCallbackImpl; @@ -21,6 +24,8 @@ public class BaseSdkInteract { public static HashMap map = new HashMap<>(); + private final Handler handler; + OstBaseInterface sdkCallback; public String getUUID() { @@ -39,6 +44,7 @@ public String getWorkflowCallbackId() { this.uuid = UUID.randomUUID().toString(); this.workflowCallbackId = workflowCallbackId; this.sdkCallback = sdkCallback; + this.handler = new Handler(Looper.getMainLooper()); map.put(this.uuid, this); } @@ -71,4 +77,8 @@ public void cleanUp() { this.sdkCallback = null; map.remove(this.uuid); } + + protected void postOnUIThread(Runnable runnable) { + handler.post(runnable); + } } diff --git a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstDeviceRegisteredWrap.java b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstDeviceRegisteredWrap.java index a769cc2..a7c0b21 100644 --- a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstDeviceRegisteredWrap.java +++ b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstDeviceRegisteredWrap.java @@ -25,8 +25,13 @@ public static OstDeviceRegisteredWrap getInstance(String uuid ){ return (OstDeviceRegisteredWrap) map.get( uuid ); } - void deviceRegistered(JSONObject jsonMethodParams) { - ((OstDeviceRegisteredInterface)getSdkCallbackForAction()).deviceRegistered( jsonMethodParams ); + void deviceRegistered(final JSONObject jsonMethodParams) { + postOnUIThread(new Runnable() { + @Override + public void run() { + ((OstDeviceRegisteredInterface)getSdkCallbackForAction()).deviceRegistered( jsonMethodParams ); + } + }); } @Override diff --git a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPassphraseAcceptWrap.java b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPassphraseAcceptWrap.java index 2392337..78d109e 100644 --- a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPassphraseAcceptWrap.java +++ b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPassphraseAcceptWrap.java @@ -13,8 +13,14 @@ public static OstPassphraseAcceptor getInstance(String uuid ){ return (OstPassphraseAcceptor) map.get( uuid ); } - void setPassphrase( String passphrase ){ - ((OstPassphraseAcceptor)getSdkCallbackForAction()).setPassphrase( passphrase ); + void setPassphrase( final String passphrase ){ + postOnUIThread(new Runnable() { + @Override + public void run() { + ((OstPassphraseAcceptor)getSdkCallbackForAction()).setPassphrase( passphrase ); + } + }); + } public boolean messageReceived(String methodName, String passphrase ) { diff --git a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPinAcceptWrap.java b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPinAcceptWrap.java index f212325..872c247 100644 --- a/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPinAcceptWrap.java +++ b/android/src/main/java/com/ostwalletrnsdk/sdkIntracts/OstPinAcceptWrap.java @@ -22,8 +22,13 @@ public static OstPinAcceptWrap getInstance(String uuid ){ return (OstPinAcceptWrap) map.get( uuid ); } - void pinEntered( UserPassphrase passphrase ){ - ((OstPinAcceptInterface)getSdkCallbackForAction()).pinEntered( passphrase ); + void pinEntered(final UserPassphrase passphrase ){ + postOnUIThread(new Runnable() { + @Override + public void run() { + ((OstPinAcceptInterface)getSdkCallbackForAction()).pinEntered( passphrase ); + } + }); } From 89caac7718c389905aacedbb3adb680cb7f3e3e8 Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 8 Jan 2020 15:48:52 +0530 Subject: [PATCH 45/91] transaciton bucket issue fix. --- js/TransactionHelper/OstTransactionHelper.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/js/TransactionHelper/OstTransactionHelper.js b/js/TransactionHelper/OstTransactionHelper.js index cd33013..85f43ab 100644 --- a/js/TransactionHelper/OstTransactionHelper.js +++ b/js/TransactionHelper/OstTransactionHelper.js @@ -13,6 +13,7 @@ import OstWalletUIWorkFlowCallback from "../OstWalletUICoreCallback"; import defaultTransactionConfig from "./ost-transaction-config"; import OstWalletUIWorkflowCallback from "@ostdotcom/ost-wallet-sdk-react-native/js/OstWalletUIWorkflowCallback"; +import OstRNError from "@ostdotcom/ost-wallet-sdk-react-native/js/OstRNError/OstRNError"; let transactionConfig = {}; @@ -160,9 +161,19 @@ class OstTransactionExecutor { createNewSession() { return new Promise((resolve, reject) => { let bucketForTx = this.getSpedingLimitAndExpiryTimeBucket() + if (!bucketForTx) { - reject(); + const ostWorkflowContext = {"WORKFLOW_TYPE": 'EXECUTE_TRANSACTION'} + const errorData = { + "error_code": "INVALID_BUCKET", + "internal_error_code": "rn_js_th_oth_1", + "error_message": "Valid bucket not found for given transaction value.", + "is_api_error": false + } + const ostError = new OstRNError(errorData) + return reject({"ostWorkflowContext": ostWorkflowContext, "ostError": ostError}); } + let spendingLimit = bucketForTx.spending_limit; let sessionKeyExpiryTime = parseInt(bucketForTx.expiration_time); let delegate = new OstWalletUIDelegate() @@ -185,11 +196,12 @@ class OstTransactionExecutor { } getSpedingLimitAndExpiryTimeBucket() { - let validBucket = {}; + let validBucket = null; for(bucket of transactionConfig.session_buckets) { let decimalSpedingLimit = this.toDecimal(bucket.spending_limit) let bucketSpendingLimit = new BigNumber(decimalSpedingLimit); if (this.totalTxAmount.lte(bucketSpendingLimit)) { + validBucket = {}; Object.assign(validBucket, bucket) validBucket.spending_limit = decimalSpedingLimit break; From 66fed650ca2704312657d958493fa9274db3eda6 Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 8 Jan 2020 20:16:25 +0530 Subject: [PATCH 46/91] settings screen readme added. --- documentation/OstWalletSettings.md | 71 +++++++++++++++++++ documentation/configs/ost-sdk-theme-config.js | 43 +++++++++++ 2 files changed, 114 insertions(+) create mode 100644 documentation/OstWalletSettings.md create mode 100644 documentation/configs/ost-sdk-theme-config.js diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md new file mode 100644 index 0000000..a70d705 --- /dev/null +++ b/documentation/OstWalletSettings.md @@ -0,0 +1,71 @@ +# OstWallet Settings + +## Introduction + +Application developer can incorporate in built `OstWalletSettings`. OstWalletSettings filters available workflows on the basis of current user and device status. + +OstWalletSettings supports 13 workflows: + +* Activate User +* Wallet Details +* Initialize Recovery +* Add Session +* Reset a User's PIN +* Get Mnemonic Phrase +* Authorize device using mnemonics +* Abort Device Recovery +* Revoke Device +* Scan QR Code to add another device +* Get Current Device QR code +* Enable Biometrics +* Disable Biometrics + +## Usage + +Developer can integrate wallet settings into application by importing + +eg. with react-navigation: +```js +import {OstWalletSettingsComponent} from '@ostdotcom/ost-wallet-sdk-react-native'; + +let settingsStack = createStackNavigator( + { + WalletSettingScreen: OstWalletSettingsComponent + } +); +``` + +Passing `ostUserId` and `ostWalletUIWorkflowCallback` to settings page is mandetory. + +eg. with react-navigation: +```js +this.props.navigation.push("WalletSettingScreen", {'ostUserId': CurrentUser.getUserId(), 'ostWalletUIWorkflowCallback': appProvider.getOstSdkUIDelegate()}); +``` + +## UI Modification + +Navigation bar color scheme decided from [OstThemeConfig](). + +OstWalletScreen component color schemes: + +| Component | Property | +| -------------- | ------------ | +| Navigation bar background color | navigation_bar --> tint_color | +| Navigation bar title color | navigation_bar_header --> tint_color | +| Option seperator | cell_separator --> color | +| Wallet details link | link | +| Wallet details stauts | status | + +## Settings Content + +Developer can modify `header` and `description` of settings options. To modify contet, [refer here](../OstWalletSettingsConfig.md). + +```js +import {OstWalletSettings} from "@ostdotcom/ost-wallet-sdk-react-native/js/index"; + +let settingsContentConfig = {} + +OstWalletSettings.setMasterConfig(settingsContentConfig) +``` + + diff --git a/documentation/configs/ost-sdk-theme-config.js b/documentation/configs/ost-sdk-theme-config.js new file mode 100644 index 0000000..9b3a8cf --- /dev/null +++ b/documentation/configs/ost-sdk-theme-config.js @@ -0,0 +1,43 @@ +import colors from '../styles/Colors' + +export default { + + "nav_bar_logo_image": { + "asset_name": "header_icon" + }, + + "navigation_bar": { + "tint_color": colors.brightSky + }, + + "navigation_bar_header": { + "tint_color": '#ffffff' + }, + + "icons": { + "close": { + "tint_color": "#ffffff" + }, + "back":{ + "tint_color": "#ffffff" + } + }, + + "cell_separator": { + "color": "#DBDBDB" + }, + + "link": { + "size": 14, + "color": "#007aff", + "system_font_weight": "medium", + "alignment": "left", + }, + + "status": { + "size": 14, + "color": "#0F9D58", + "system_font_weight": "regular", + "alignment": "left", + } +} From b39ffd9bbef657f3e727e50b1457344d2ede8729 Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 8 Jan 2020 20:18:04 +0530 Subject: [PATCH 47/91] fix --- documentation/OstWalletSettings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index a70d705..1ce10e1 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -35,7 +35,7 @@ let settingsStack = createStackNavigator( ); ``` -Passing `ostUserId` and `ostWalletUIWorkflowCallback` to settings page is mandetory. +While navigating to Settings page, passing `ostUserId` and `ostWalletUIWorkflowCallback` are mandetory. eg. with react-navigation: ```js From 492ad68a2a222814366e7f4ed84dfac796efde00 Mon Sep 17 00:00:00 2001 From: Aniket Date: Wed, 8 Jan 2020 20:21:00 +0530 Subject: [PATCH 48/91] readme updated --- documentation/OstWalletSettings.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index 1ce10e1..629ccf6 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -39,7 +39,9 @@ While navigating to Settings page, passing `ostUserId` and `ostWalletUIWorkflowC eg. with react-navigation: ```js -this.props.navigation.push("WalletSettingScreen", {'ostUserId': CurrentUser.getUserId(), 'ostWalletUIWorkflowCallback': appProvider.getOstSdkUIDelegate()}); +const ostUserId = +const delegate = new UIWorkflowDelegate(ostUserId, {}) +this.props.navigation.push("WalletSettingScreen", {'ostUserId': ostUserId, 'ostWalletUIWorkflowCallback': delegate}); ``` ## UI Modification From 0ec61d7aab59d5fe065696cc30ea8128c763b50a Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Thu, 9 Jan 2020 15:43:52 +0530 Subject: [PATCH 49/91] Update OstWalletSettings.md --- documentation/OstWalletSettings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index 629ccf6..6618421 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -46,7 +46,7 @@ this.props.navigation.push("WalletSettingScreen", {'ostUserId': ostUserId, 'ostW ## UI Modification -Navigation bar color scheme decided from [OstThemeConfig](). +Navigation bar color scheme decided from [OstThemeConfig](../configs/ost-sdk-theme-config.js). OstWalletScreen component color schemes: From e838a0839e6cdd365bafddd08e5a5460a2c9b8e7 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Thu, 9 Jan 2020 15:58:00 +0530 Subject: [PATCH 50/91] Update OstWalletSettings.md --- documentation/OstWalletSettings.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index 6618421..807683e 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -40,10 +40,14 @@ While navigating to Settings page, passing `ostUserId` and `ostWalletUIWorkflowC eg. with react-navigation: ```js const ostUserId = -const delegate = new UIWorkflowDelegate(ostUserId, {}) +const delegate = new OstWalletUIWorkflowCallback(ostUserId, {}) this.props.navigation.push("WalletSettingScreen", {'ostUserId': ostUserId, 'ostWalletUIWorkflowCallback': delegate}); ``` +>Note +> Developer needs to create a class extends from `OstWalletUIWorkflowCallback`. +> Write logic to get passphrase prefix from mappy-server + ## UI Modification Navigation bar color scheme decided from [OstThemeConfig](../configs/ost-sdk-theme-config.js). @@ -54,6 +58,8 @@ OstWalletScreen component color schemes: | -------------- | ------------ | | Navigation bar background color | navigation_bar --> tint_color | | Navigation bar title color | navigation_bar_header --> tint_color | +| Option title | c1 | +| Option description | c2 | | Option seperator | cell_separator --> color | | Wallet details link | link | | Wallet details stauts | status | From 8f1919a34c64a22bc62ebcb1acb2ca268debf916 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Thu, 9 Jan 2020 16:01:35 +0530 Subject: [PATCH 51/91] Update OstWalletSettings.md --- documentation/OstWalletSettings.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index 807683e..f1879e2 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -44,9 +44,19 @@ const delegate = new OstWalletUIWorkflowCallback(ostUserId, {}) this.props.navigation.push("WalletSettingScreen", {'ostUserId': ostUserId, 'ostWalletUIWorkflowCallback': delegate}); ``` ->Note -> Developer needs to create a class extends from `OstWalletUIWorkflowCallback`. -> Write logic to get passphrase prefix from mappy-server +>Note
+> Developer needs to create a class extends from `OstWalletUIWorkflowCallback`.
+> Write logic to get passphrase prefix from mappy-server. + +After receiving passphrase, call setPassphrase method of delegate `passphrasePrefixAccept` +```js +passphrasePrefixAccept.setPassphrase(passphrasePrefixString, currentUserOstId, () => { + passphrasePrefixAccept.cancelFlow(); + workflowDelegate.saltFetchFailed(res); +}); +``` + +else call `passphrasePrefixAccept.cancelFlow();` ## UI Modification From 7b65e98916d3f3bd991c5ddcdd301aad399a38c7 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Thu, 9 Jan 2020 16:04:29 +0530 Subject: [PATCH 52/91] Update OstTransactionConfig.md --- documentation/OstTransactionConfig.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentation/OstTransactionConfig.md b/documentation/OstTransactionConfig.md index eb23647..37a3ab2 100644 --- a/documentation/OstTransactionConfig.md +++ b/documentation/OstTransactionConfig.md @@ -12,12 +12,12 @@ The default configuration can be found [here](https://github.com/ostdotcom/ost-w Here is the small sample json representation of the configuration. -```json +```js { - session_buckets: [ + "session_buckets": [ { - expiration_time: 60*60*24*30*2, //2 months - spending_limit: '10' + "expiration_time": 60*60*24*30*2, //2 months + "spending_limit": "10" } ] } @@ -28,4 +28,4 @@ In the above example: * The first-level key `session_buckets` corresponds to list of buckets for creating session. The bucket selection is depends on `spending_limit`. * The second-level key `expiration_time` corresponds to expiry time of session. -* The second-level key `spending_limit` corresponds to spending limit of session. \ No newline at end of file +* The second-level key `spending_limit` corresponds to spending limit of session. From d399498d771c775a20ba92b4d76dd0da98a468ba Mon Sep 17 00:00:00 2001 From: sachinchauhan Date: Thu, 9 Jan 2020 16:48:45 +0530 Subject: [PATCH 53/91] Git hash update --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index ce963b4..e069e72 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,5 +48,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - api 'com.github.ostdotcom:ost-wallet-sdk-android:a95e4463f46fc4d746ed91992f0c4346754c7681' + api 'com.github.ostdotcom:ost-wallet-sdk-android:69b36e4a6bf62be6aff8ba4408bf8ec8206aad64' } From 96d9b9f52ae658e4b1f9213f30b44a7241b0d159 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 9 Jan 2020 17:29:05 +0530 Subject: [PATCH 54/91] OstTransaction helper added. --- documentation/OstTransactionHelper.md | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 documentation/OstTransactionHelper.md diff --git a/documentation/OstTransactionHelper.md b/documentation/OstTransactionHelper.md new file mode 100644 index 0000000..b8bcb10 --- /dev/null +++ b/documentation/OstTransactionHelper.md @@ -0,0 +1,41 @@ +# OstTransaction Helper + +## Introduction + +Developer can call functions of transaction helper to execute transaction and setting up config for transaction. + +## Set Transaction Config + +Developer can set list of buckets for creating session. Please [ref here](). + +```js +import {OstTransactionHelper} from "@ostdotcom/ost-wallet-sdk-react-native/js/index" + +OstTransactionHelper.setTxConfig(ost-tx-config); +``` + +## Execute Direct Transfer + +Execute direct transfer can be performed by calling + +```js +import {OstTransactionHelper} from "@ostdotcom/ost-wallet-sdk-react-native/js/index" + +const ostUserId = +const txMeta = {"type": "user_to_user", "name": "Tokens sent", "details": "Sending tokens vis direct transafer"}; +const workflowCallback = new OstWalletUIWorkflowCallback() + +let uuid = OstTransactionHelper.executeDirectTransfer(ostUserId, [tokenValue], [token_holder_address], txMeta, workflowCallback); + +OstWalletSdkUI.subscribe(uuid, OstWalletSdkUI.EVENTS.flowComplete, (workflowContext, contextEntity) => { + //functionality for transaction success +}); +OstWalletSdkUI.subscribe(uuid, OstWalletSdkUI.EVENTS.flowInterrupt, (workflowContext, ostError) => { + //functionality for transaction failed +}); +OstWalletSdkUI.subscribe(uuid, OstWalletSdkUI.EVENTS.requestAcknowledged, (workflowContext, contextEntity) => { + //functionality for transaction ack. +}); +``` + +New session will be created with appropriate bucket, if sdk won't get any active session for given spending limit. From 0ddf06ea65a31636abafe80bbc36b36df2d57125 Mon Sep 17 00:00:00 2001 From: Aniket Date: Thu, 9 Jan 2020 20:35:40 +0530 Subject: [PATCH 55/91] wallet details crash fix. --- js/WalletSettings/WalletDetails.js | 23 ++++++++----------- js/WalletSettings/WalletSettingsController.js | 5 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/js/WalletSettings/WalletDetails.js b/js/WalletSettings/WalletDetails.js index fa44537..ddd336e 100644 --- a/js/WalletSettings/WalletDetails.js +++ b/js/WalletSettings/WalletDetails.js @@ -93,11 +93,8 @@ class WalletDetails extends PureComponent { let resultType = deviceApiResponse["result_type"]; let device = deviceApiResponse[ resultType ]; this.ostDevice = device; - this._buildList(); - - }else { - } + this._buildList(); } _buildList() { @@ -122,7 +119,7 @@ class WalletDetails extends PureComponent { return { "cellType": "text", "heading": "Token ID", - "text": this.token.id + "text": this.token ? this.token.id : '' }; } @@ -130,7 +127,7 @@ class WalletDetails extends PureComponent { return { "cellType": "copy", "heading": "OST User ID", - "text": this.ostUser.id + "text": this.ostUser ? this.ostUser.id : '' }; } @@ -138,7 +135,7 @@ class WalletDetails extends PureComponent { return { "cellType": "status", "heading": "User Status", - "text": this.ostUser.status + "text": this.ostUser ? this.ostUser.status : '' }; } @@ -152,7 +149,7 @@ class WalletDetails extends PureComponent { return { "cellType": "link", "heading": "Token Holder Address", - "text": this.ostUser.token_holder_address, + "text": this.ostUser ? this.ostUser.token_holder_address : '', "link": link }; } @@ -167,7 +164,7 @@ class WalletDetails extends PureComponent { return { "cellType": "link", "heading": "Device Manager Address", - "text": this.ostUser.device_manager_address, + "text": this.ostUser ? this.ostUser.device_manager_address : '', "link": link }; } @@ -176,7 +173,7 @@ class WalletDetails extends PureComponent { return { "cellType": "copy", "heading": "Recovery Key Address", - "text": this.ostUser.recovery_address + "text": this.ostUser ? this.ostUser.recovery_address : '' }; } @@ -189,7 +186,7 @@ class WalletDetails extends PureComponent { return { "cellType": "link", "heading": "Recovery Owner Address", - "text": this.ostUser.recovery_owner_address, + "text": this.ostUser ? this.ostUser.recovery_owner_address : '', "link": link }; } @@ -198,7 +195,7 @@ class WalletDetails extends PureComponent { return { "cellType": "copy", "heading": "Device Address", - "text": this.ostDevice.address + "text": this.ostDevice ? this.ostDevice.address : '' }; } @@ -206,7 +203,7 @@ class WalletDetails extends PureComponent { return { "cellType": "status", "heading": "Device Status", - "text": this.ostDevice.status + "text": this.ostDevice ? this.ostDevice.status : '' }; } diff --git a/js/WalletSettings/WalletSettingsController.js b/js/WalletSettings/WalletSettingsController.js index 09692f7..1ecc8af 100644 --- a/js/WalletSettings/WalletSettingsController.js +++ b/js/WalletSettings/WalletSettingsController.js @@ -116,14 +116,15 @@ class WalletSettingsController { //ToDo: Show the error and close the wallet settings. this._onDeviceFetch({ "local_device": localDevice, - "resut_type": "local_device" + "result_type": "local_device" }); }); } _onDeviceFetch(device) { if ( null == device) { - + this._onDataFetched() + return; } let resultType = device["result_type"] , data = device[resultType] From 57b32cf747e9bacc369a075c68483aa34b871d53 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 13:10:09 +0530 Subject: [PATCH 56/91] Update OstTransactionConfig.md --- documentation/OstTransactionConfig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstTransactionConfig.md b/documentation/OstTransactionConfig.md index 37a3ab2..36f7857 100644 --- a/documentation/OstTransactionConfig.md +++ b/documentation/OstTransactionConfig.md @@ -6,7 +6,7 @@ App developers can configure session `expiration_time` and `spending_limit` whil To configure the content, the sdk needs to be provided with [JSON object](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON). -The default configuration can be found [here](https://github.com/ostdotcom/ost-wallet-sdk-react-native/blob/team/wallet_settings/js/TransactionHelper/ost-transaction-config.json). +The default configuration can be found [here](../js/TransactionHelper/ost-transaction-config.json). ## Dictionary Data Structure From a79ec0c2ee33d8a3b1337f48c387f42f5700c888 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 13:13:28 +0530 Subject: [PATCH 57/91] Update OstTransactionHelper.md --- documentation/OstTransactionHelper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstTransactionHelper.md b/documentation/OstTransactionHelper.md index b8bcb10..b399084 100644 --- a/documentation/OstTransactionHelper.md +++ b/documentation/OstTransactionHelper.md @@ -6,7 +6,7 @@ Developer can call functions of transaction helper to execute transaction and se ## Set Transaction Config -Developer can set list of buckets for creating session. Please [ref here](). +Developer can set list of buckets for creating session. You can refer json object [here](../js/TransactionHelper/ost-transaction-config.json). ```js import {OstTransactionHelper} from "@ostdotcom/ost-wallet-sdk-react-native/js/index" From aff78ffdc657c23aabf07825552053c378740506 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 13:20:00 +0530 Subject: [PATCH 58/91] Update OstWalletSettings.md --- documentation/OstWalletSettings.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index f1879e2..7278cf4 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -60,7 +60,7 @@ else call `passphrasePrefixAccept.cancelFlow();` ## UI Modification -Navigation bar color scheme decided from [OstThemeConfig](../configs/ost-sdk-theme-config.js). +Navigation bar color scheme decided from [OstThemeConfig](./configs/ost-sdk-theme-config.js). OstWalletScreen component color schemes: @@ -76,7 +76,7 @@ OstWalletScreen component color schemes: ## Settings Content -Developer can modify `header` and `description` of settings options. To modify contet, [refer here](../OstWalletSettingsConfig.md). +Developer can modify `header` and `description` of settings options. To modify contet, [refer here](./OstWalletSettingsConfig.md). ```js import {OstWalletSettings} from "@ostdotcom/ost-wallet-sdk-react-native/js/index"; From 32118d0af6930e7427eeaf7cc3535f0eb1b9f553 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 13:22:11 +0530 Subject: [PATCH 59/91] Update OstWalletSettingsConfig.md --- documentation/OstWalletSettingsConfig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstWalletSettingsConfig.md b/documentation/OstWalletSettingsConfig.md index 9ab91b1..a06b600 100644 --- a/documentation/OstWalletSettingsConfig.md +++ b/documentation/OstWalletSettingsConfig.md @@ -6,7 +6,7 @@ App developers can configure the text shown on settings page. To configure the content, the sdk needs to be provided with [JSON object](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON). -The default configuration can be found [here](https://github.com/ostdotcom/ost-wallet-sdk-react-native/blob/team/wallet_settings/js/WalletSettings/ost-wallet-settings-config.json). +The default configuration can be found [here](../js/WalletSettings/ost-wallet-settings-config.json). ## Dictionary Data Structure From 969770dfb69c12fccaf342d565184ca4c65e0f0c Mon Sep 17 00:00:00 2001 From: Aniket Date: Fri, 10 Jan 2020 15:22:34 +0530 Subject: [PATCH 60/91] wallet ui readme added. --- documentation/OstWalletUI.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/documentation/OstWalletUI.md b/documentation/OstWalletUI.md index bd7b064..80ad28c 100644 --- a/documentation/OstWalletUI.md +++ b/documentation/OstWalletUI.md @@ -572,8 +572,9 @@ QR-Code Sample: // An error occoured during the workflow. }); ``` +### Execute Transaction -#### Scan QR-Code to Execute Transaction +* By Scanning QR-Code
To execute transaction via device by scanning device QR-Code. QR-Code Sample: @@ -604,7 +605,6 @@ QR-Code Sample: } } ``` - ```js let uiCallback = new UserPassphrasePrefixDelegate(); @@ -634,6 +634,9 @@ QR-Code Sample: }); ``` +* By Calling function
+Helper method creates session if active sessoin for transction amount is not available. To execute transaction via helper method, [ref here]() + ## Ost Wallet UI Events and Listeners ### Subscribe From b9236beb46cf8c66728257af993ca39e0a6608b9 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 15:26:51 +0530 Subject: [PATCH 61/91] Update OstWalletUI.md --- documentation/OstWalletUI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstWalletUI.md b/documentation/OstWalletUI.md index 80ad28c..372f84c 100644 --- a/documentation/OstWalletUI.md +++ b/documentation/OstWalletUI.md @@ -635,7 +635,7 @@ QR-Code Sample: ``` * By Calling function
-Helper method creates session if active sessoin for transction amount is not available. To execute transaction via helper method, [ref here]() +Helper method creates session if active sessoin for transction amount is not available. To execute transaction via helper method, [ref here](./OstTransactionHelper.md) ## Ost Wallet UI Events and Listeners From efc5bb7dd71d0a42959ec64eaef9e71f29838a94 Mon Sep 17 00:00:00 2001 From: rachinkapoor Date: Fri, 10 Jan 2020 16:09:26 +0530 Subject: [PATCH 62/91] Updated read-me --- documentation/OstWalletSettings.md | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/documentation/OstWalletSettings.md b/documentation/OstWalletSettings.md index 7278cf4..d80240b 100644 --- a/documentation/OstWalletSettings.md +++ b/documentation/OstWalletSettings.md @@ -2,7 +2,9 @@ ## Introduction -Application developer can incorporate in built `OstWalletSettings`. OstWalletSettings filters available workflows on the basis of current user and device status. +OstWallet Settings is a pre-built UI Component available exclusively available in `ost-wallet-sdk-react-native` Sdk. +It is a wallet settings page that can be used by end-users to perfrom different wallet operations. +> IMPORTANT: This feature requires application to use [React Navigation](https://reactnavigation.org/docs/en/getting-started.html) package. OstWalletSettings supports 13 workflows: @@ -22,22 +24,20 @@ OstWalletSettings supports 13 workflows: ## Usage -Developer can integrate wallet settings into application by importing +### Create wallet settings stack navigation -eg. with react-navigation: ```js import {OstWalletSettingsComponent} from '@ostdotcom/ost-wallet-sdk-react-native'; let settingsStack = createStackNavigator( { - WalletSettingScreen: OstWalletSettingsComponent + "WalletSettingScreen": OstWalletSettingsComponent } ); ``` -While navigating to Settings page, passing `ostUserId` and `ostWalletUIWorkflowCallback` are mandetory. - -eg. with react-navigation: +### Naviagte to settings page +`ostUserId` and `ostWalletUIWorkflowCallback` are mandetory parameters that need to be passed as params to the `WalletSettingScreen` screen. ```js const ostUserId = const delegate = new OstWalletUIWorkflowCallback(ostUserId, {}) @@ -45,20 +45,10 @@ this.props.navigation.push("WalletSettingScreen", {'ostUserId': ostUserId, 'ostW ``` >Note
-> Developer needs to create a class extends from `OstWalletUIWorkflowCallback`.
-> Write logic to get passphrase prefix from mappy-server. - -After receiving passphrase, call setPassphrase method of delegate `passphrasePrefixAccept` -```js -passphrasePrefixAccept.setPassphrase(passphrasePrefixString, currentUserOstId, () => { - passphrasePrefixAccept.cancelFlow(); - workflowDelegate.saltFetchFailed(res); -}); -``` - -else call `passphrasePrefixAccept.cancelFlow();` +> Developer needs to create a class extends from `OstWalletUIWorkflowCallback` and write logic to get passphrase prefix from their application server. +> Please refer [this](OstWalletUI.md#setup-your-passphrase-prefix-delegate) section for documentation. -## UI Modification +## UI Customization Navigation bar color scheme decided from [OstThemeConfig](./configs/ost-sdk-theme-config.js). From 6d71ef0d91f477720dde27a23910dbc4a97cdaf8 Mon Sep 17 00:00:00 2001 From: AniketAyachit Date: Fri, 10 Jan 2020 16:23:35 +0530 Subject: [PATCH 63/91] Update OstWalletSettingsConfig.md --- documentation/OstWalletSettingsConfig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/OstWalletSettingsConfig.md b/documentation/OstWalletSettingsConfig.md index a06b600..9059d36 100644 --- a/documentation/OstWalletSettingsConfig.md +++ b/documentation/OstWalletSettingsConfig.md @@ -44,7 +44,7 @@ In the above example: OstWalletSettings supports 13 workflows | Configuration Keys | Workflows | -| ------------------------------------------------ |:--------------------------------------------------------------:| +| ------------------------------------------------ |:--------------------------------------------------------------| | activate_user | Activate User | | wallet_details | Wallet Details | | recover_device | Initialize Recovery | From f030f42a60797e2a47cdf79aa7567170b90deaa8 Mon Sep 17 00:00:00 2001 From: Aniket Date: Fri, 10 Jan 2020 17:13:40 +0530 Subject: [PATCH 64/91] images added. --- documentation/images/wallet_details.png | Bin 0 -> 152234 bytes documentation/images/wallet_settings.png | Bin 0 -> 185064 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/images/wallet_details.png create mode 100644 documentation/images/wallet_settings.png diff --git a/documentation/images/wallet_details.png b/documentation/images/wallet_details.png new file mode 100644 index 0000000000000000000000000000000000000000..716819bd767ac1cc8536e4fc07d33eb727748b6c GIT binary patch literal 152234 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≫GaaWZuZZoEuiDqa=UwgAB|f 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

|(N-v4+ABTB&Olk?&r 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 Date: Fri, 10 Jan 2020 17:19:26 +0530 Subject: [PATCH 65/91] wallet images added. --- documentation/images/wallet_details.png | Bin 152234 -> 184718 bytes documentation/images/wallet_settings.png | Bin 185064 -> 151398 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/documentation/images/wallet_details.png b/documentation/images/wallet_details.png index 716819bd767ac1cc8536e4fc07d33eb727748b6c..4ae6f9da277738a555e39c73c9bc4109e8547d67 100644 GIT binary patch literal 184718 zcmeGEXH-*b^FEF%3JMCSAia4wf=HJtT~SdHP*8eDYJh~7a%1A&U89zALsr+v137rzt2$S2 zo`>NnmydXT#xD*BYzRr>LzvUsV1qqf!H(`o;?(p(XkKU4*pnNN4;`jCdi<1t#()1% z#I`)KD(?C}{`#K_6CXb=;12uuThY=UH9yff{`%j)MN_=~uLd1G&dPeqL;Sd-%)gm^ z^!V}Wnq&WaS>Fu5dsm~OQXr-K-@hd=vs!1=y>jVp%_k3R8`7yMU{r~n21cZmN3 z;%|U{1N1M4K4Slg6+eCW9fN)c>3_>ozq8oyH2=S7)o&j3n<)Mp2mZ~Zf0r8n ziFr7*` z)YSU0OZaXRYs`g`_xo5H-yrtU38{V=umhiwuFala9c$cnNS zt+vvZ`-Xr1*pn-VIg4v&u6up`sk)~=Raw{iemWWTfu)B5AP-~+F-z$GJQwXgI>ypu zF{gC-_IF@15+0u%wRNxh<45-Se=A;oNb{t~4L);n(*5JHA77rMKVI!y2bg{FZ|v{X z*!81F&Hdh`&9`f$<-0K7IOUOk9LYAI*htb|uB-klS{-Pwnq6nHJMgcEil-!}Vz>R#`7x)v^4j$O7VawDK1 zr+n?zJXp$7%UXr)-2Omj(Rf|ijv6e$wdGyuL(;^nfTln^qo&`QfwZJfMFeW3R9vOv z;XQx<@egl`DX;t`^Uk!iKk7ZK*?6Vt#`83bS~uv%q650C_nKGR2w$fWaDv0#L`pb& zEm3U{mNj0A3@Hx+t~O-4A+HA^fD6Y4rsPa`Hfkr?)KW=i@7BNYZPmaZ4XD}ZA1K`Z zt~4uaYBcybew-BkIm22D(`O5`5d18SCWs*3tyzz$<(D>{Rcl1zPIC-`7gP8SM?mxW_uPh9c=GRis27- zRkUjy8t}FQPD~OawnD1|*IA-462aSGI1q|P`(uz*_%D;)z(^aV5-XKJtG&*`L>qgP zL)C%8uo@p`;iyzrWIg_zjei}#>4a~q8UH_RAFF&Rc$=X&2lC-KFx9Wsq+)0bwC}sRK*HaI@@LvAVN0CoV@hvkbP;7`J%OE z+MS#lnU;UNN|*oAADvYQ_m(Fz_4pYKN+Cx5R8@<$uK|Ya$o`CZ+B;xx6vp(GW z$#)4;+KAYK98lJ)`CaRc%lt3wGYkaS9kyV$8*Vt@@AbjDqi7 zB&DRs(&ow&XFXMZj$dKCVwF2U)$R!$mC7THW%Pfuqp?b6FMOn+HNF|AjF1zz8K82tE;I1342{?4P`8#JHt z=Qo8v_;l>M7h_%%-2ex{!KmUjTC?O@Mew&A(4fmg&3S{%n1r8mUMZHg_|zy&t{dKm^>D+gPF|8So$`24M%=TZ#A9~zYDFIiRDuEVDSsL@0RWrRW zh@60`NKw`dtm30I%}meL-}*9-b8<$Hl_0$AeEH`|IrUcR_JMUvt_zt;_m-{ z3RQDkdhc~TikZ{S6L`dhm5X{=_*ZHQOFb_zQv;dD#Q(fkeTR>3TLZX)uxJ=FgGIp& zM_wMttZww2EuWh0oxQ#&(1{pvD}ANaNZV3K+2b|!rS4*m6TYh%nJ8{8c*U2(aisK~ z|6;Q z=}}`_a|mAi1dUPQRL9GCePnp^oC@W|d#I>i3QhR2Hczv`UYn*i2fMZ0Lt}AXe4^8J z?f6RXp7rPDd(PvN=mh;!pUsqMjSKX)LHwT!{*VdO=z6BMQOeSkxfK`>rDmV!A+t|u zR+heUm>&$eQI48(1b z$ytk|iCbCv_;#*5;*V_&hl!Ama^1rd)ZNr90^`jziJeOeZT^i3s*T5({qJ#{p;&x! z66Y_6+RCu}6$LV2N2^Lc_gkv2Mf?o6hIRZYMen@?j)cqpwblT_7yL%QXq_XxsnhX! z-t1n!h(SfByd7ay-&&Z~Ppz7AkCD!-6RLAwZ`z_VM%Yj-e%P?yl0Y03x(_~EU;OEg z2cc$R1Dj#0wsC&WEbT!OaIkMp{6snvbF*t_T~5Y4Z5u3@`kZU+ooS4_>-fre`1 zv!kZLLZ)?CU*oNm5GF=o2}6~kpYkU?$|h{CxA5yp9s3s`en=5FKp7jVZ6^j=-+W)i zTqW;Yy7(7i4CB4fx0!WYdGiqZ6%`a-lbLFD@<&1bG`oNFkTZCXy8ACEPh`ehKqF=8 z79(t1jkQe~{B>R~cwogw#ihsgyH?|DuAcOM0L5ecuI(1G>FDvRe6WS7K#FV~#+yB} zgu>ON4ZPjNdXr5Vied1?^2XtXX9jeusHoT*5|a-ikz`r0vp6tMZ%p*{`XoHqFl&Pv zd@rPM9f8O9hF0|Zd}2pmSXw2GJW{eho);tv6pl`0#l6U}GaJw!*#ro0u!rt#rsfR8 zDby^qXWUwo^X(ji*WpELIYfdLZmQ%uA{)J}aA#aSTRH-ZD^SF30;p~uUT*F;LIU%d z@9ks?%MqAO&QxGhF;?NcU3zuJiWe zF9GawLE^LKkf$PR{tjZ-VV<4fffUazo5x@W=py&-OS>(@czy{Tu8Yww8*MN0WRT`re+SeX>+y66fYis>}Q4 z4BA|IVnd*wbcQETN;IgT6YktUFJAf7C?pjy`alb_mY;8 z;+|{bNyCbtfbdsGoOD_jdk*g0=kX4E$?D2ChJ7yWYBq6w_vzvM`~LlgkwiBq6FT?) zxpLmWc=E@b$BzNxKD#=PH4yaPxU$sM^(RW_{!v$6z1TjP1imzEIysP#uh5&$!e><` z3-;Af@4VVUhhRNYj2X5(1G$ggGBB8CmNetRamu>Zt`~IDr^|)B?{TI3&)S;P9xw;=!`#d#dwdLnho)jeK_A z8Q+j&uFkzas)l{|^zi8RqbBFVA%j+(;??}Uhdu!dnJ_C3c8DB|X$=9DD~RA-nfi1@ zwDb{Sti~C8x=5@&W#iGqjgFI}52S-?WGea}B*Mg1msT5m4Gxb6)=ZnO+Nu5pRbL7f zMX#%Wai9O|$`z&paqA>JH-&9I#5WW&ncLtBPUe%gHP75G$YJ_~ydSS>Q4?x0%q5;|ULNY!Y4{p| zaav;IH~wab0hNZ)!v;d>$T2u#yb#^dJSMDX=O}i3cY7SSOObCt3dA!tS zcVQr@L!xjU=%{GKuNkDfVJSy;s)@cn@x<7$rY^@i)X@n$!p0p`IZ?20*@Icdgm(6J zivH!KP6ZkZRuDH#H|}R9eV8WIQXnclu$_hZfnxAZhFxPKOWuPnz{X3KHeH748Vb17 zrgO1y?Y>&I%8aR{t|IM>rR<~NTE52W`Xd+jli|6>r5=_ippzy&XNAXmSdIiepu4eT zM5}97Q@eU-w&9b8yEburctm@So!xmDzdAz2M8>?;kGIC!Rdeav$VKlw2+9;hRG+)a&+8gv~M@>{%1?cO%KVSA< zGsd{1T6OYcJxMcQWg^c|;zV!N2Ne$`us2z+(0JlQ(}YQnxKi~KQ5~uMRDTBr_yB zSN)5V)_&Arn2Cj2KCr6*OBRHJNOdN|5L3C3u@}-dU)@7)PnxrLGUWLpWc0v`Q89L3 zzZF^HP7w+e`Q3(BmgGwShe(L|U_uEfQ7+4tm@DL4;T8YssY!k2wvv&!glr;iYt}Q! z&^2i5b_U85?RR;kJ%7?RWRa zp>)@x))WMyAqS05j}WSq_d`4JYjJ-?1vCQu4GgGaA__Tw;%n;A7?Xp%Nt#qx4V z67kx%8rZbL-A>ep(V{Wm{&4M@?V_cju0Q$2!n00@HTPQH@&QXL`gBLEg)Exi|Ghs&+E1zIE5%Ww^X_mvGmZ;i!6z z?X5i%F~Q(PQTe_Gk&CU#0cb053-69N1O@D3i5udDMc-QqFl= zO5SqN-JWCi(i}G=c#gKqV3O5^A=zbLfmMjDdsdWvp|JI9-2-8N;*Ct*-`+TELnQI)_Jx94~UG95e64 z-|KwTxInz@xBu2=`b$%j(FWPkn7bENcRq6UOcSEkm+_m<=Mku~ZYBS|JrQ4-m1^*L zKE0R6+!IZ$XwTF?!ZQ-iJ%{A+@*vr?X`q$6FZd`v&5=!QwqOSajU^1S1*^I5T%2RQ z77&qYjGYPeYAef%|5mOAlV7}Vnk@M&TljjeI`{DorE)VgkQ7U5qDFk#z^~LJ1lZ9K z`<^9u?`qsaG5O!)IrDSsur^{JlceKT_w6e?N9)YxLe+vqjzl~I@?p!Rq`>dpVthNQ z+t1NTcbcUqm;@dyzg&R0?31$-O#J)l9qq@T>tLLyQ3^HLRxeg}j;_vh(l^_SYZRMx zjCXKZ&J9zh042v#l~{a?y3C*HBNd*cW6yv**a4xZ5k)INBQw8i8=dNd+t*z1CA5$P(AjP?LL2AAU4 zirwvqjK?LDOO5<7X@i;_F0Liu*2Ai{&D9=*2je*sF)^G;wJlw3yyNHGZ6Mme`4p!`1rnC@b1arAvF7-u!~#K;fm>DW(ene|20-6%>;U6hd3pQOxxFHh7e<{`5_A~;82i_Q zYDUcsJ{=jlbFI0aK?ZLu0LC*b!=jA`djxGe!90MhE3|%Gv0By67hpEgQ$0QLsIKaJ zSXs=@@T%C(cOw1IgxZ%$t6z`$s78XMGlgXE&dl(ckzHHvWe?PdyD2warZpYx zjdp_Bg>Ubi6ZCB^UUlIYiL5C~9AXSZza|!C&Pm05&u*^N!SB=%T6FsVrNC5~IK%zu zV)LEGyp9fN^y~AUc}zSLv)DZ$+-JVCr3a-fW?@zb1HPPs^B))Q@=HqHkA+yC+C$BAi_`ExXdQR znFym}qE8Ky9XQh>fp=Kh_wk$>*P7U^&ST=bI5ScFLFv29fD!Dg45{fq@$+f?Mwp0< ze5YGmw~GSIxY`Ox-X|N1$LmC>S}lMpc_+dXJ)+*5bg%3{?mfOBLH^3$46ASJ=)?cj zQS!A3`=&4kuN1FoJ9?}=$!p>!lP5j4$8Mp%o}O!@_CFdQD=w~-Cmg;E?C#iX?#MyK z=&79n1C5O)gkS-P*cH@XKa1#M;+W4-eUW8~+WwBO>P)C=U=;xLV?9SFw5SX}glG5a z-v<3Z@B~;CLk?m~B^)Y3vGvK?e~2V}qtN#1If*)Tmpzt0Zmx$g18o^2m1;B?qWRQ< z?`WytY5PGPE1pufLRnz-$uHadSmSd;fe?mezxDAXMJ?FKxYYLn;e*gLGX|lMqKe7b zET=c1_D^pB-OhCW-MiE{cKVbDMu5H1=36`A|K4&azCpVc!>P-uaQVOsi8j8phuYkG zm1DEex=Us2=jk3qphtvXV`_u^`#)}-qjd@L#Tb@F)Bjz)hDD20(@R-NOx8biq#utM zdrn&uE-|iHNH8v3t8!(E94Th%EwUx71TA{fRgmTqUu6*B2$13>DS)&KY@T!LG=l8 zPUZN;;n>kQiJMHI<=y zJ&E62{klSZcQ<9bMJdW9fvFXRftJE{UNt`v2#q)@4?Fv!z32R0vc0Jic6%ip8Q)uA z3HNIEK|;=YVCqJZiQmYOMhLwuyRnX=S-oz+8#$7Wv6_X|rJnGg&HKhc04;@9P@07= zLpy5e5}@vB;b+@;pUBzfDi-SSP;~Rjzo0JdWQaYcGf3QdPi`$pOV=$8BufMhFs1x_ zL%%SIt;nZt7-RtxJ(`AQ0UAoKKahjzsc+P8BQ0iJd2EZ0@=XVWu8#)!PQz^{j(&IP zyC53&`uPU2<)mXagPe<3#ttfjElKo>f~LherE<#h)1^M^-wsP%2W1nm8f;m_l-M+c_E@)tOZ2t?Oh$}iOZ z6ZP5xjXS;)VXVg8W_+&QM~Vo5`l;_tm~T72bm{`Nn5PQzeiv4Ut z?l%(#$_fpR&xeg1JRJ1qbJbaxm;D>(u%7d8D2xd-g;cMh&xW%Yh^EJPZ>s*}G2eCk)N&!s3NS0Kw~M}jO@&3i(2}#tb?WZLf?9} z?U*CtuxU(ycr|YMBC}*nrq%{B6Q7Z3qjB)g_iI{E#Jxdgrlwq7AXL(Iaz)nruLVXO zcSV$6?)tpDFGU>TZv3FNegY7$%6)9&WM=P7rp+Fb7_p_r$1lX=8N57!NQXt8l2;1C zhBMkAL!c2ponYCTo*wfzp>26~Q*}1?j3E#28A}6oIYJt2GJ{GG6T!y$8?4@EUEO4I znEqe+^{p_{$UC)s27c#-)h*|vO6eLkyI9G=fi#SxSoxP|_RGn7yD_R>_^Qrtdh zKbjk24ZtG;BQm!#vss&UzjQ@!`!!Z^oI>!(xDRd+&c~>qkuS1h=l{TUrj^&%JJ{os z8>lk{w3*PSO1BbpZF*;-$P7B5*HNewHnx)#`k%A#!`UBydzn3BkRe<0%%EO} z$-+M?#Di90HiSXF=T}&SA_jXX?p_57wZVw(Z_hC2;Dhg%oU>Q0%<*|?Rm_L2Jt0~{ ztz&1T`lD$?u=_xYr!Je+*V3dY27pJxC*lm#22I8*z*L#4o+!Wf43NlHAeVjMIDO{)=gow7(~r8u8n&hQL+Hdw#eNIK|C59M8_kXm%yC$s$0HK@@SCZ^pE;8OCyxbvfzS4uM6QMIZk`}D{%^459+*+o_ZN6yYpRrQA=|_fnNmz*e zT&olj41j<%wbp~~a!C1J^~xKY-|pp?tzmVgwlP$elW2+vF^>W7pRs-Gwf&uY9v=$R zJ)co!npZQWTO~&mpiw0^8Cz0o)3RNvMn_pEv|KN%L!hK(9-0znU*VG#3VTNo)xJJ0 z2c|mNl4*nNl_uRSdz3Fhcj!YRqE4RRs}puLhbYn6!qej%RY;NStr-CO$A74o6iIVf zAh!u#8#R~3BCR~~4!L-_ZFL=k=);|1jN*IS(9dMP+I>k>6@RFptBY`(oAjZQ(_{B& zpyqqS=yOrqBsWWn`O4aMfOr7>e5e}m07ozh_uJhUVL?apgG9ljX)Mvfqit75_pGlV z_2sSi{R++(0Y=%Y0PdtAN6o{d6^NPz?Z$V)j^V<^Fcq|CS7ej4bcQK;qi2zE?P9cZ z>q5LNw};M`wLJGdtrku8m1*yyQ0l1S+T${oruOuG7qJu58Xn>fd`xN8j*7FX{7i$E z`$-CLe|p~gVDDyPk;s@5zSyj>n>|=0y9>oTjtm?x%JBlaz@5cL zWn~+l9NXw2i@O0DDvLnJ7p$vo_6_n}+MyTUhHucXoLfp5U)hFyFP}?`~DrS>q*< z^{N8>L4Z(=oO)^F$)a@e#ZDEqtoQjUDVfsMbwC0g)J$ML+b5mwib zaU+m1gOq#J*^BFYD}IeEqX*(ALe>LjS5SS>H0~Oojki&QA+1KCtmN&Neh;sVqC5-N zaTg_3F0VUo)91<2$9^)N!cV5V#)l>GG2O(RohI8Kp!Hr~o{p+0w|4#X>h1c5U=P_T zfejRq2d4QDbFk}YGomy4EMGF<`gP&R*(M$41F~aT*SfR`o5#2LE@~J|6xSI?=VM-5 z1FGf>4uq*%oV!KKLS}LlZYhu(1~>AvvZ)kLC5=lp$et?Bux-iVj%fvm$@|FK z)=S=^X=!KI>-K6I|7n1A660+jARCIv@+(;*-~@{Qo=d*pPBJCF`Yb<7Vr#fL+DVu*THDtaO9 zqD_zc=eWAxaF+FkolDu98WEXvx^eQFYTyEYQ?AdXBfBMG+)K0LKs>In5Si~xQ^b1n zO4}0OljAmbyILnV;(!d4*9#uWE>O#zN-;s%A_zqW(sT|O=;yrK%`M;D&5B_PVUJl3< zIHzpKiR$otXfQsLT#vOfQDC;f6`*BmgZ8`R`vwxCV#uTck3Q~RXKUx+*m=SNqlBzi zJp0YCR#^wYJ|gLoStsPOLFsNjh%Cs1tKuk)ne#*LLQa%pbvTRjchRHjDF^9RC*sqH ztz&I|<%b@w=2@7UXjIg|V-ciHt5EKk&svHzRz1bWDe=U0-ls|8Bv|=Ha@uV-@8A~~ zfGc4iSUq&$O&w;RGTxF^SI+jT+C!_n`SWAMJza-}wj)G+y&V8mSVOWTXz$NBcJ~-V zGSr$t#4Vfg|EDha{()MPc^8!oddeSFN^3xE?BV<59IoX`UhQmSDO4P&8?q;xmTi6( zD<#^sPWV`n?pLEVflNki&Ug)&wf7m`-A^G@Wb>^i!PLjG(Vz9ndK z!;ygNhUsz2Cfni=ETii2w4-DDF&4Y==+3E%&}7qtceR-f?j1wgc1T`w6|+O4&elV# zF&%GRYSm{zqIF@|=HY`Ef_$drckdwrcUC4pn(fx)(pOxY>EU3#eI;JP)4aj1hvdz6 z)5X2^z$;}$6qKIJ4__?tG;dp2apUl5$n-2+AVKg1%D`Tp$fR85aO9$+9p7SSQlLex z>n;CzAiURbg}3vAt|*5`)Z0>wFJx3iGNvuiSYDm>4!in(pYK|1ufN1oA8kV60P#M~ zyL*<`Y`da@8iggKgdL#8N$LtgcQa~Udvv&}&UbILlQC(JwmTco0Rw=BE(&B#E2ZMY zcCC*1^-r`^SB^!T#)KKSDv~Vkj3YuKqCbu;OyopDKGDNw_g2K+RMV{dy5C*T(b>j3 z^We69gACOURy>A?WWgPG`xWv5-fkc2Y~)NRTWm{<4nj5ITaR^5$mbG^ACaSfp7$LK zpsDRqxS-toHI2UFmi1<{2x>+FCYo#Ec0wU^4I340H#Vlr)_evYA39^D$yFj@|15VP z*~`85+!Q{U!WiE|$S-sPn3C-`-g^c&-3M1>f-i;Yi?pih1v)R6nQep{I(s84;$cE& z@-pDF?iJS~6OEc5HA){(DqowJ&^?Hed|nn&e_>6C_L?4fXw-IQ)!-cMbA4^Ax?F2~ z_cZbL-W+lIltgHE8H&9`S(-=~FNo=0LR7WR4yS1$mC0fh_22&)rxw0WubuJw(2_WuTob4$RKp&YrV+SMkdcNfkP^v z%polE2FvrgjCtTN&k0ZH)cbF zxv%9G!CS(6dh9$cPI)Z~m8cA4!tz&(P92a+!dcYG&)HJj_NkQP!4l|Cht@)-AfBMx ziZhkKsKa1-o83l&je}S|!MZEyGYZrb$(cfZ!LnWQsA$rvN|cEoWkaH8zixJLgYg&) zl_Is6(FD`LVw;OJ}5tjp;d`Rs>C>As!Q>^S|%jbOX6reWPLh<}ctJIU}==#D$iwZk^y>{_my zUnKLeSnyu`D?(*LwR&`FQpbL7#M@78yt?o?gHuu=x%$@fjH;!ZD57RZy^cLJq7A*H z*&7O4R&agTl9^LBY5>N+-@=;(ZVJTp>dZyzDXuo_C!+4RD#op>b3=88FAf~hO@+Ee zjvrtfXZId=z6hB+MZ@)fH=U~L(NSe4z~fKaG{ZFc&4@B;6|sY!RPTCa@=4F!FJSi~ zqwX|ICtaR3fZ-h~#aSIL~(88H#9_Fb-8#&A1yvv7)G_ zcRzV$6ub&U2|Mz=C7F}cH`;ZT%-E(?L)vsuvqrqB;%5Ay(VPgDfg1IYg?`WRC=64D z?+RoKzk1%JeTHP^h4UrlE#&7+*T#ozcAtxzn67qsaKNjsmaX69tTG{sMAroYOUC3$ z^+5y>MUl>~mobZ3QRR+*|4Y>M4a&ot!+hHfE`imeafj7$Pt&77LHDT>jmw3QJI$X4 zdRrspeyQX&im2)r;Cz7<%>x>0opoHRo@h5dWhQa3!4?JIe|S(XR~b8QN?Lf7lz#hV z?(0rk=Bd;Wo8-mHY)sJNS`(*LQ9b<_;bHg^Ijn??i5EuoG1E=R;5v0r7gcm^0FR<4Bqsf((4D8 zhm&_Qp{$50-=j&aHxGklnY>)=m;>%5c+79<6i+8TUjs{u6d{c>a)QbG<-6M4V3-HzTm$-*GDJy~mXv(%&Mr(B4ZG*8za zcaa%xnWy})?SX+nGpK8OIeFmq%eE9A-^mbb=R^gcKTjQTWUMT#3#}98a>;)dT4VK1 zFTrgZ#7o$N$gN$ycItbH)#!w9dAGqjA_za|TDT3f+Ey#7^5zxTh9hwYd~Cm1y6ZeFj$KwvvE{tZpkId$Do!5ED4tQYNeH zz1S+8(NkET$ogE#4+gn_{WG<7jM3w;pk|G(uOz094!KvyA^`$~iqXTInHdVa6A2^H+{#f@)F3j>^8|-u6x@hM-?pFH2BaWcu$nv81D5^?f zs)*%gceGE4(3@1>;a0myyk*ywD=?5ay=UUTxPw9dUbT?j4wErL5&b z;`BiPN7ZP3_xc~qA9Kq~AwZa#8E6rk(=iCQT9GLp&eN#T8}QH5o_l)Zx>*f~=_MS? z6wn#eR58c}I+Wo=ajqqX66Z>N26NG<4?D^qGvya&1e>(s!S{GZNs(v2j07WC3sWC$ zd*zhHcL$24BlZ9X7D0Ah;fOkS3&r)ObWzo6k4a{DT3kmui>OIqg0g5fT$RkBeRhen zD$38;N;~{cnxU2OyzBqfkPn41ofl}T)U;qaHpqEY-`9}K0MpT%#=XAZ^4!Mzq_6zY z_M?Px#Sg=YD)!v-i7wst`EhOo^OGn8{E56!vNGzOA56(%rieb$Q7tyk#`RGa9b0Zj zFO_f5d)Z3;8KoZoq(-Dx!9GLhl?i0Q?xuWcK(b?wE4EUoTLE z3KJBBv$sANsON>Cf=qlOfpK|XiR5zv z9>J+kXT?yJBb_gt?h$BKQ|We$J;9@SD-+bkkbYVwX>cRqTcN3?A_7kAX;lRZEGON* zyR;B7DrU*y%dL1pbl0rFKxbhG+S*G{+rsNz44X2hzM>?VynBt~GU-jiI85(p!Gg)h z{EM0f-xO$64^>ao`we$cwm%zpD+qu3^A!%ic}}=_Q`=^zzwikZH$#y0F@=1vteE-%CDuegA`t?&sGYG5xeit1%|OUhLFDtUWl z$M0rfspx~}PA*PQgGtewNzrnZ+hX|BM82`pOx@D|m{t6%qu?W9eR5O@-k@7D$B>Qg zoSThr5{Z=SttwQTkZm=0VJ4%N&M{w@U(41{f>M@~#~)tgAFDLO_UdIz3g8tN=UtPj zLRyQ|QWbY2IEou90U6yDHF^esZ?~5^Ba#Z6mon(zUj#!P{=i7u4`fSfl#mrQ}uKxYl?7&E;f?s7)IMEFLC#UOQD z^R6ZE$o@BqERB`fP@ z5y$p<=HUA{Ao4;?Fd?w4A;&`A>e7wn(D~ZpYnQz z3SU<$BsbyPO`ZT>nVv_lS`(%CB&0ln-9$}wTVmJ|SG@N;{+nO^^! zIl;$J@c`ut|2*W^;ozN*J^U7Yrfloa5!v<&%WvtH#uw8!&@FC&ZTC|vXw}@1;{uNl z(fspApUF{MEhi;yZRcY&oEPqzOPe}akVJTMb|IxO?(8cKx442$aD6b{H`)I4#*W#O zS5iCOpj1IG_W6RB9{Y)oW-|xSETpF{LjKXnlMLMRRSjNG7r~iT?`#a4j%VP`<~c{g zWh)~8Qs<2S8WS|N5@V5CFmhvj{w(XO?&*osEi?lggjKxv{UM|5eT-4C4u=w!^)k{Z z^v`{3|3MT@o1IpX*0YJPL(WE)EM*~s#dU@*vgb>qK0tdby_z(w0o)JRMM7}3@-@5H z5(8U=8|my3ySxMyOW?9GVflzI%k4H@@EH>4trb2Rh&tIsxVmPCA2fod<@cmX@wI#G zCkwr0Eakgvz`UZ8%e>5ZgYgpi19QhMr47%E9rdeGx=I`VOYW5?PmO>_L$_3QVo0jI zoWukqhb)5gL5kdz%16lo))awUs-M8Wk3D?miH ziBN0!lUf#u`b*WHH(*iED!muw@ijT_Y52sF4pDVVaXm26aRRC->~CNN>2$sxx>28+ zAt!tI@X=EmhyMAa=KZ1m=j+~8D}X%KgdK9s*F~sR97Y>SKUx1-$+qQ&Lp`?5YB?pU zK<-6($9T`cYuy^O;3d=t(KB4qE`oqw7^$uN;4RTUF*?mz(Rl53M%g`C_cFqIE@&@s zMWL|KVrX$GSZCMCYshrMGFkhQ-jXr;qiqN?odv>LG|NV5wa{bg{_(L3M#L02IhkKE zU6p%fmF)!G_*A^t&SIp8^Hr#%#mrF`w;=9*dE8WwLd`HHl6F-0^A?-1c0)$HOiYZs zx6yV=KaDTO)CCnbm#e5CE)LpLE7Q`0ac15vF{^D~oau2(x(bS!>(iFu=z^_dlNL}g z5igTX5ZvcR%;Zw1`>PjuuSffrX+wz0A!DCy%W{d9JQLkFGJ1$pqp7U(na|VM*)&2| zw5DUHo>)Gb0EMceH)z23W>u|7^>y2jjhnm5B`b_tB}#%0OCdNw&(vz#swoUDXl{jim~E#^$yPmOFMcICdhRCh`d|U6Q}@e|Cqu zSz&)NJY1Q&)Ar7o|G~LF`=coV?K|7R5pU@F+{fH8z`*A|E;&V%T78*Q&?NC8e~BXe zg13$0NmBGXzo2(~3pM$hIo#!hZ3AGjuTxzw&eX1i@s5@R5LCy;G7vL28fdfn8$ zveL(52VCJ?6e2=wq###=r9*Mz6keYlv>>7E52 zZh_LqySd~gz2K-grA9YzH0%5=mHNsrgac*C9gy3KLD0ltS_ncOJC#o>rs_VthL!Wd z1v?_Wgui~0uCXK?yV<@>e`$7J=Ko{wJ;R#ny0uY7Kor4(f`Al7M1+V^rGqFS2q+*e zbfpu5gc=A4D5x|62})ObN$3eJR4Ixi^gsdu#Lzua(_{F z;n3D?mH}a=)Cw;MPNv*4UwHUulI9i};D-K`ujuxotv_vZXB6AayE6!$b&C<7!^P1eYhPFz9%Epao#CoblX*% zY9d=Vn8#Qq4+O+`PF!sxD$}_jK%Vb^d)zML;|$2pP{(<$fAPoEi(Nl{z#H2%@5T9= zv@iXuqyFpJ)H+VTaB|1ZUH+Fp{r9u}xcCqD^y`Z<=RyD5o&VjRoa?gu^B{p9^W6Vm z*UT}aWBm7_h5Y|D82|GxNmKfXGZ{c=#J_Jg{~X_A45FO$39`2>()ybAC`L_X3d(XsDlXv;k!ufx^=RXexA@ma+muhpJ{_X$&!xR7SQ2ul5{xMts zJCy&sD*qqM^8bf{clC@R`=l5pfs+kCTI}QY$J_%Tx-nzupu{UKuGmHW0mc6}SC*A{ zie6&)Lge*~;JLWw&b-)gfvtBs7+kd&*(JN{FPxSlm51nKE>SJr6+zboL z^=FeD1N$u|=rwtb_v6V*LjQi^KQ5E==+$|oOW4dEmMT+0-N-WQ?3UqyA17ZU7M?se z8X=26_=mat`=K_y_z*uhYAD6ix%Ee%tMbcte(2~dq(@EdR%XZR!WM4DNJJy zgL&)3JHg&CU&Zi7*^B)C6j{Ry1yJiA4wMP9QvHc4$h9SJUB<6^L)pc zgi(k1aKw?BIUvsYmfdLvK2cBKcC}j9Un@^IQeycMC6ubwcznE_b0pQmp%W^_{p)8}QCr;WUgGG)pE|)WXldQ~Ag^VU|UUKA-C~|LLmX$4su5%MTSd z-yQt?etr4WiT6PVe87IKMJI5jb=$>%F|06#qxwk)krCJK)L5DB(qxRN(;4oo8mtFR zrp#N@u&84Z0M740Lj^*mcuJQW`s2nTx$(C=6N7*LF`3X?TQXPHtd>vm9DM$Mq2Rq9 zeGd-JVLj)mryzRiTCYlInmZc`dj(MWV^^!B%g{yz1-Es3kmZZKcPqxwuf${_#SJ)A zRqYaf(UI$sok{#}o!`fv74u1Xw-hO#%+ZPsQCNvTIPFk@JOIvP zanIZt3zV(Ls&tpk8=l7I-n%&pR}rbhxee7jd=;77oq;Pe0-sy4l>A?4Qdi#GaUu|g zLG#jz*ca(BuF<|lF zGyHBl?CVKOUEsuV5A_k}fzZ_aw%RhyZQTxi5EzZv{Mc6$t zd;Pc7a0{t5%RJW?=9^z&fD;C0;?j`WUDuNKq(^qIw+w45Q7t@#EYNb`VL@vnOPZOQ z?@>8VA&4XqUfG>~zVs#aQz$Qhh_RVrbKCi9=Y2$a8p!>a?8?*5CO-#AaWp|i{mcI(dE|Oy#^|T5mbJU)$9IOTYILe2-@a-H##Ccc>FGCq{vq^EW zij(i{N{XXte@FZ3@vP3jcwZOV#_9@x>rke3xyDcPa&U$z8PuEBk`#;Jj1-Tdfe z9X<6$I9)Dor82p&`NrvA4Eopko0K7~VA$|p?viu%#SZzeQW?&KdHLNfJ}Vfh|SeTqG%?2^%=$sGA!bZ3P^FF5xHNj;7PtDu4o0I>Gv}AGfH& z!aT-R^2)p^DQO_T`OQ8<&d6dh^KSQ8;ujw0+sgyGC7D2JHi!=hvj}#MhO+F9+6tQ* z#hi?)$65tf)sDir*GFeYXz(_zR3H7hE|(v?-c^)LZ_+Rk_vs>`XJ)Wk_JN`YaF@C% z7O#SK5TIyFVDvHcl;IFXS>z4$xf*!918`D034+1$xeFWM=CA98TUmTs9=lnlS4sm^ zN4~&)S;6N5wN^%FaELkJT$KZQsa~`6s3Q*!kuNB7cu_7aKVj~7&+N@IOqDN5>49qC z@NG(J?jBO!`++Ql<~ymqLFqAl$^dSFSj*{z=eekOd`xtxw49Zi^~^3T;dI&7ywu#P&eKt$<)5dVev?GqO&_ zx##sw%Ij`bbo$oITLHA6A=JOw!A{@*2xquw**ui0zx|dOE`D>CQ`d%9c9P(FI6RyU z1oV1)kOk8z-dXfryyn?%24HTZ`Ms-o1tb$3P((7jL#>-nk~GmuM6rK<&%sh3xXNr^ zSLqW1brlGHIaN}oS6QnQ0_j`qtt&d9t@UsvN02(9cN@9{Jjb7f+?xrid6sg2o1d+Y zpfuo74&k~zNf-`B=i)%4ouDHZ@`>LXi4pZ+at}ggt=Mlkf|O}=SNk@vob(2Xk4ec% zyWCPa_x_?1W4D;Xwe6z~=Fb`mI8c?BHQBcI#p1d0RE~!Bna=9Tt>)fIMzD4Bn!C)lteVHci8fm`#S9`ukSK<_6;EOAiH?5)N;u?ZY(&D(QJmslkvu=*TME zOZKabq3H0_8o5kq{S0D_(GsxnyIjTHewFWL{8#4hJqY)KJNlQ#zK%AT>0GTWklIqT znD}KSr&CIyI7KHY8BC7Wm*x)h=gYB-ZMGUZc~|?TV^D%L8J^dwk4|Jy>6A8H*_nK8 zhb@?iJRzFV1_F2Ix!!{Ap|4wJ4ULOvg`+ubGoB6GG#)LSP7gGV!sGpDI8Zm-JkT9nQN%j*+-Eac z-Tu3Dy-~SfK@0)XJ=a`d4746CMgOK$FT;fuDh4#Ewa4*44&Nk{3Mm5KAb{czS3LF3 zFLLS@*V+5&Hdh$?#a?)faBsQCx_@Zb$86rTWt*DXJGwVM6PrHL zXGqH^#{1{k76Y4NR$vpKBm55*C~k54%i8OZYSehl+@otpwt`-^k_hVen?19{CkxHTAzU?CoS2U`l)SWuH4bQ)-Tz; zSWys2IeU+`Md>q&;N<+?OL~aCySuRG|AQ2vQGsbB`;Djs>_|SQXjd8Yjfl_`<_cXR?E@xhOfYFb9^fLYB~1%ZOjsBq2s-WTmPq8?svP)qZx?>8q+-E3LiaviU*r7S&fJWOKbWIF`K^qEPAmHhM4TO1pFPjwTr=2~{%x$r!P*$!iuAG5b` zf8Cj&Qt6XpJFyR+L@~t&uWnkHQ$Mo~^dk;Ce?FDm|E6t0T>f=e!|;Mt`Gv;)wUPF$=FD%dRJi$y{}1sn_3#y4d+Np^u*0 zt_AFU>q{?7O_N;QcG^wqsV8%%8xa}ie5pN`$7~Kk_iH821vWA}3iO>XBJG$_6}%~) zXKkrXAv=!dg`~i<0xvyO?!o*ErFe#r@n+xKy zT+{v#J?=lYO|{ueWrFQ|;HGn~lV}5IY1-YK)}8c2zwQZm z2*|P!(j1wY+34hf4D$NrzB5_y{mX=t#-)b=cE>YAJj||!*fd%CQj#h0Iv&0#OUt|Z zNN&}EQ(qqvu<+$x=;8F6kOm7dZA>$UJXF!;Lk)A)}LLe0P;}!-Y-Yi=(&E4ZAN22tdb- z+gx#%xu62`4=d6`it%lgLzHWL`i;8;Bg8Q5K5o34!x3dc;@6C}3(igOp>H5zh-R5(^q2xX$V;F@VSDS->+-rLj!JXF~lc4^tCY)HYD z%HU0k7)mxqf0H(&Y?1@10MaY1+e^Q91B*ADOe+1jJ}Y}VM>1O`4=;K)a4nOT+>*C? zzK3^{;oSL=7}1t`s~Y?a3|GXoW;V3&Ry7->TK{fFS4tnk0H0cThZ0YkmG&PSg0^+w zk{fPE4N^V@=U+sQ;5sO@b@vwhCfs<(r`@d@17D=i*AyKjNBG%^GKiips}BP!1e8Rx zN$uj;otrH7gQuY75*wn0mkQiGYEuz1|;Rw#?3K+Wph&`879bkz$j=vj<`yr`kwFr=n%iFqaP&)CY<^GW@(K}~iS(=50 zkP?aX_0bxN;JiNH{wDiJj@fLYPZZN_z_CR@&#u-tjbfBDbo5HC?cnOu7Ebp@!xPo2 zfo?ICg$G~C$<3?v-ykRE-9RCJ>1dL_P3m4I+}&HVnt7{m(X>E_{#h6=D?9a4$t-L=sM4S>E--%ZAvW#l3y*yl!z$5`^62W~}~?Z}VR)+%@T* zAl0_h+X5R(c5#D%h3IugZF+wrk-#F-RsNE_uR(or3oJ)RRxF^{Zq3bpi`p>hWcBE zf#tesmN5Fc7bRDg@f?egCv_wKDSaJYq+=Q8+e}eB!d@!{m`GiRaViLSYwIkthSnCC zyB!o#X8yw#Ek5MkY9j7m^OHj`y}_C`&{I2bSTgHIavmylMmSoewGqMOP^^SX;cu^a=&Ejb++dB zKkE2mWbP+PNG?(kzw9a`G%i_JgWfajaGk{J$+@#~WwO)|D8h=H-6b3?1$HUE)!GA9 z!?IU0Rb4*DCiq14Y`F^A6D=0?15yXt0kWs>er{i&OjHVER*&mlbzgVZyd`T&MTJMU z@4B}$qzN@Ke|Brj0n_QCj z&9%Df<|FDYn#K>W?^;?FLsm3DZ4DlNB0QtlS?;06jOla**Rn}nMX7|YJQd#Ec{Z^n1xxHV0{4IH{eJ6bK)U#&g}->Hto74M*`m(@ zNL4I8W9uDB%MoGY;Y2}Xxk_SElyh2) z&?8C+*@cCYtCz4!2}^4lJc5DHb&FajGDCTMk;$UpHh8|PVF;q>H3>mPl?%W6$^^K^N3uXk^mOM_=X>G3^Z3Oyg2-SL#Im zFr!fm=fQv#`}I31{@=mxR|QA8N$`DXnE2DX0jF8@wm?oY1uKChVa#RMVrt}1Po6e3V44@+k(~u0S4Sk zmhRHt*My&CzI#CE9R~UFArpxcLAQU~nj|}?ES+jUk!uY0D&q~oyWGO(LI+;Q+}X%; zMm;S*>$0#crm6Sdf7{p^eEw{an0V5Xf-=tJG_9d27|2VUGzPa>E3|V z&%MCq#<{U4B(2$Cl=rY~^2!S7Ag$>H;1vi`XR)&0j^NekQT+P3HMmHwE@=7V`u*-! z%)Q=`$-!kldAEb3!5n#PH8l^5nl33tybO+jh9E~-`T}M6(79o8#{B{McsEUkJ?>cm z=L^jJfx%1*-~CG0_18pPN7A0}cQJ*`ngj9bro502|5DQL~6oiTNPJ;K9w}n(009;aI-mVY+Ai1J|$)N z@G?q5rC}YtMCWEul>KB6^NM0&Y8jxisC08?Qo6akhZ@$sZ>Ce~7I0Lx# z;VOppg{@tqRHVBENLSq&X{M}fP$kxXNVQTa=nXM#j8UnomC8=C{V=egZQ49UsJ1yl zgkQt+bB<-?2t@<*5E#_c=BXc_Q&N0OGulGtS**mY$|t6FFS(5_T@GC#L`>>k0oX_e z%yw5#kMx{yyo@lrqhb;eM3wz)Wm1w^ISsVvC1K-~#V5h*G~_^tDctqe(k7$r=XHhQ z&$h~cu@_c0&1@*bSn5>20Vk!P2I6h~vo<_JfxZG3i5v?Xr9OjCb6!z&fyF`VXJRR; zYQfUWFgvXtPUn@?{`ae1&{3A1ZfkeT7?Vr3RO$>k^K<jz;?U@gUS2nm z1v>hV zW0RR~QD45tinz)>tOfTYN(a%=OF(g1Q&cV&z4sCCmm8xooU$SF(&_oqhUJqve)=HY zz~H^Ktty>ak52CV*^MRx71P;nYf)8;jrZ%Y=%K(PLatW;`9XQ6#*~f%Zr)0a#9rM^ zuy2_r4pNOVcUysrPT8RpXlaP|2X_)hcB3!?KYtf>5dS=Q$cZLq%uB6-fMsWAmN zd4@|tasA%RQFJ=`AX-N+{p#8+NDXs9!l8~VCC_9Wz8xRhrcES=lWbB zM_58g2&~h>r?*MNWO9E8Zvi==IWQ@n8@cKWJLKE1-ouY7q8pP=Zt5Vherefqlo1FD z_PInz#A}1qN~&rL3psXkWw@{}@Z;oa_^eP3slF5wTMa8dIKg%r>9Y-T;I4Azn}s$F4QBI^1_v0gs-} z%;!TBJA2b7K`<4D12)T-E!5|kahGX3rt7z(Uoo*F)9*|9e zo!?G~x!A*&I6R~&V*aEPkeLb98L=&{CuIQ0^Z6T>Cx#^O;}!Z^pmd?B6G&7KlTgQN z2IS@;lb!~zLGut>(Wr_ERzPKUJIeR)sG2X;;ax1sJBmqoS!wzLx8cZc{V_k@KvXl$ zz@SMR8MxF^Rw#=hLT&Q9M+1KvH<1d27z9YY2`YmgGcu|13MqFj3g-q4f?+dz; zC4jsVu8?016ld81u#GW?*DXP}Mm3L+#pBaIBSGEb?Wpl)&+h1falIhiyh1)4IvQ3_ zT5Aj7QuutSp*yS;*Na0kMS;_fN+*j7mIugO$n)tm3pTt7{OT*UHOBpktQ)1)uJ@0H z-eF)%x&2!UT#_J>CavG0#ZqT2hw10Ov|W)$&B@UhG+4`hYJXCh(9cj@Uk@kOTQDFU zZL@{91_k2RzQXHoCj0lFs@Iq8e4*P+^Y5`vx;$}%Pcq1;j`YFC#r}Q4GT)~>uplh;Jn6xf-vRk|-tJk1(-LqYDln~Sa zcbM8MMSkdDMD`eCbzvK3;fo3;e8}(O8d(}ljTop^B!6bO&?~iFChPrX+Ptc>h{D&N zyW32BcR3Bp`!t_R^C1;~49yG^y~<29owLNuRHSxtCcoB@3`F^V6S2H$D~NlmGtm{N zdt3)J7G#)mFR>zFvYHlCwhDH8k|7?i2fIYrIkpDIQ}Tv@x3Aolbu1eiZ#0~>S28%! z6laR?44@72ZhiPgm~Nq6bd(G=jOPi~$_wfwd5weDQ-4SM^8A*WW5 zK~W|Z+GxM=yN3OFcDJgMW6?-jo5xNRR(W4tPwa}vM>j1iuDsV@vdcv2CZYEzfXTV z?2xGK%$8-W!@SB(*e_?MGn0NLk5{61A$E(&rEd8#-oc?kF9-Df?&2PC-u!txVK?u@ zBP7k=$HdPM(2_Oh%qLvC?D_m{TUe%;_eJ+IvvZrRPaUwoeq|`9JxwIND(;!LumUa< z0XAAZFh{JjO_`6DRk%{6UAl5+Mb?lC#AK<#)8yuOdFj{dm{ET1^{ z30lcjA#!=qw9qwB4oNaSv%fJb&X_dp-Aa;9mvt&iRFUgve|a0-6fiuu|H-3Vf>g?{ zI1b~*SLXVncHFb|3NM&Gyeq3SD6i@B2nd2atrPuzI9EUVK zD}9=(*v~*%{fOQC{5HRb1X7XoEix-2`**j~b65r`I{vtK@+mz%nx&n*XQF2BQ86UV zOP6%bPyX!VF_;kVdD$R*PbU!aIupEE`8$dF?2Bul>u}Om%pZ=A@-QAN5?GWMjXGa# zvdGN5cjh%~O-GSf|Ly}^VNc~EKtMpXZBKTFVlcP4%516FUrG-Q@5YbPH9-X7Nt`Mk zSv10ZoblHs&oCqy8T;wl(8A8Qs?&O8?wz=xhnUzrrA6+SPV=EB17{wvCF}b?XtK6%F-M!d zqQxe|zgP15-Ya|wcvjBqUM=Ca7!_*_w|&xM$VYssNYBgAa-T=;@-L;;_Yqt|)ma4t zqllHrUNE>`@mF>3Ivf1aiLW7F4EQ-0bvxj_fC<=XFJ+TOHvZl|p5!`T|Q zTI5>1Te%oF&w2U@4024#I$?lXgj(r(_~F% zUoAzq_h%6c7W{QrWeQ@_j(|bublx(~lCTF|g>`M88($8pD)5C`V zoF#nAkK~tc$8EZcE{OeVaQP~9pg^hS>4E#umA6-pAC*P^9()8~5j+?9is?@9S9LtD zhg&F7w=JanaJBG~e)G&ujN-3?c)bhfdsiI{KMvV!3KTzjf&N6apyv_%Zp;3lMNf4a zwQekb7IDh(2i?&1v7#p)vPyb=r1WzTuqI|EjPO0L;o+Fx_#je+>lQtzA71Nx>o?x3 z!j!;84{`j6s7BPsDcKZs=H}>oK5#-X3Si|WscVpK&^tr%4*&jc5Cl@9i{mzEIqB6q z4{Y8Gy{YAfM)mZ#3G@BMWX7RGz6XKixJR^YmxIt;6r~zgzeTpd%c<)=)&YA>kIQgF zsR{xWu-hKP#+x3Zx97gBKXH7dWMfHCDNI|paBBZZYAHGP4tvTqphQ`?tlp_-HJK-Q zGpXb$w&WSd)trPbU zI6u!l6TDwmgc)%UnBB>`bgrPZ9#j3wxGz~FfwpIwLjmJVjv z6&Kp)O@4_nipvS+D5fyll^X}+Dy1ku*01%;yt zrItzW*W(rdehahf#hXhW)eQ*N1oGJMv7O991?(%uyIkFx-$M#iP z4Ec=HeF>lKWJ!d|on~eLJo5+Y-a?{Z#Qt=5YigyMl0?cgGda_!U*t6E4;P$G#a?HV+uZ#2lTKw2| z4)n$UM@{~nmLtn};X+v!#bClxD03)_GRTts8JQt@KOFfhnxI?YB^xXHBu!b{HFb-U z3;_6HJH|wRFq@mp+xz%#RXm=3>2m_99_6`?t|N*MSG9UH4_VEq5XZ_|yzbpG9OnJG z=HZt8SXDCMwcpbp)=f{Ujc)VeFNhzmF|%*{K7%jdZpu-ECo8wVhM#V68IB zf+;5aplZie#8uF5%J(Sw+^X*nLxs!|p||5}EvLv8!Qgav`ALD61tfa*tn+EYHG>bs zaL~wv-iSr-CIiu@9btyp2_2AwA~)rK6~ML_k!AoB4zbAmm^Qt zEAV0M&Zd2PQ_T~!1#bbJ`FZB_B3kuH>DJ{I{QUM~#<sWhZMzQSRTn!4=sW+Ko=Dh_k-E{X z93^+pB^J=-kj<*)61WJVve`G9SPk47arH4%u&6&V!TYLGZRyURLbixF*YrM11Uoo@ zPNPdqxa(VcX*>5E-%hU|vZm<2n$PM_N8AO%AY;SH*JUWqQh99s%7kFR38iJD9asVb-9cimK+!J`oe) zdGFXE_$JbC*2;&%{n1v((XXk6>9Fa<*}1v-r6&=LnwuTOSzBAh%Yy5}iI3gY;;_?dHbCy)*|Pg<$ORjI z9)}dDqxkP#*I+1gYs=+8O`CssiC`{jXfftBcZ;Koz=S14#4hGk?P%>$f=V$mHJ^Ui z3z;ti8y~4qxdY7d)bXWh3N5EnhUH}6G2IJq4|6+P${xaI0lmr_s*qPh?hZ55lMk$o zRj7_M4_R-|ZMh}Xh`!iK*WpqZDISATa>P?57M?>o;hRD>1Dug!^)kJ?#eVo*6XE&^ z&^!dVx$1L`4IEsWZGHqq)TeJS1dihYu z;5$93C!u@WfIkMh&ETwXIP4bRSp zRJ0z&a1>`CQH_8BoS8tlwQQ+dO@a#^Sfk<_;ee4Q>Qv|^1|MBU=1ix}%;WsQr>wyw zpFV3j%{dLvOz&N$xE^|va<1`@qLA9ixp9TAD7?q-Z8e?qHZ8!OzuPt(*&h#uTW_yc zmmit2Ep_j8F~BOBwLSFDj*=SWr#4#Qnj@O13+}W%ix1NDCU0>4k@3KHOI&AaB6LOE ziNNN0{BlX+QGb^4owqK>AE3>iY|_K^{-4T=&yFrx6I1Kx{&IWA)nrM2^5?RZ;Rk`rXJ_3~?0Ki4 z*5p;S+WPRAw9VKI-(>u}B~lgoyxOc+DW0x8d*@sZ_!|ZLGX*#PrkS)1zyEsZh3(ZT z-(dkQwKXc>b9!7xq&kl-4UL{Xum)S45xBC#FSNaTUr%h2*%D20MqWxW@edP0tSHu_ z-uf|;nd)GY-MyqkZzS<+^vx*Wu}SALXCnRMyH%T2epXLy51%T=f#_}Y5LIZiJ57oo z5i~^p?|1nV>ZOy_i^K6Q_*7ykcJoS_*7oyhr!JXkCsgt0&_M3{KDpCr>|z@@AKnJi z{g`*F_P{i}pTdE?^yeWK!QL3g{iYt@?AU>4j0)MWa(NHPif&{hDXs33ibK0p|2J5) zvtOV}(Qyu)HAZn;i+E)d*Azc(YB}bvme*)k$=8xYY#Jixya$XQPGP~&6(O|Ky2Zzu5!amvr2A5+~6&_;;;}Nn=g+LUAMb$6IR>R0^ zX5NPqOKWiMRH>!y2-^z{h`>1?+2G!4`q}XI?B&Eh39>TkiAbFu8pmd!=TSC+9_5x< zd5J!U!-vZ2Ii2s~qgF}d^9Y>vk%LQ8qUQDmJxE{zcAjvJYs@h1*m#pS<5KZZeY%<- z1rRIo$nh_~&QT~)Xwhh+_302-ES6r?FC^_ynY&+|dQ!ZnRC%#ZFK6Fp^hSW`?7Fh4 zs+@17e$BdbXOR84?`)79l*O(s_>Z=8guyePoj+sn#>bOkr-=&$PVq6G*EqA6m$9( zL2>9w1>pk{!jl##@4gKym)ont(A(z(bgRcNT6P2fy)Ys0e>m3@CCP4@hX z8KAM}X0GIk+h(&3fWdfV+wO*!=7_}ye}jYbnBvC1acQIz5w|q z;a_@iZ`I>|9}9`=TXAXU{K|&<=TQ#c#eBtg-CgwB#ds zK7?^i@3O57)m7hK)2nG@I{^;Me%(pi!t;(OJty(^@x}tQt>BYm=%M3Ix_x}&pZzgR zdn4wglP5@STg#6g4fOlyM>1(1oh(KBE24L77gKi-Nbj9?q6bRjSm@GKdgVf3niF)i zopG^y+s376kk|43PreH(bFL6Mf;RpE1A|rcm$nqQ(7{G?;eNUNoHjypCwbtAfu_}%Hx`$Fann($ruu+9Q_{EM}|@3nksB8$$mzee~)P4f>-Jxn=G%Cle@ zRwXC!-|z$8?6+pw6d)m&UF^IBFt%uPEH4C&4yl zKsu{}6MK(?*C%($UwGMm&CdoOST+>MiTLZ@QFEjy>_XR35(73|b3H=7*%9MqcJ0CN zQ6J@k<|DLyARm3a$K~tBKQ7gu9r|8OloS5wFi96#URa(x^4_V&XC9na6Rc!R2;{YK z9PQ<0R4{H1(~@0VWYd%5DYTUJC`i4(DqLwVuNeq47euv>ImBhCQFFBBlsfBz)V zIXiknb@=Gb?_G>fOOL{DOizFn+~}%oh|kyd&2kum{XZF(7mcr&JR5{n?`ReKS*_6a z5xn717oe(6y-!5@)ZPHCd#hSatVb$HR@d8n*v-L3Q@!u6H*9a$%r{!_kJj9}D7}hc zS?`z$g1wmjamTGyLI(};JRJpNJ6ylgnDh=%{k#DkR0YltG`YQkiKESshN8&MknStZ zbUe~M$*2|7p`htxebgI4u8>&ajvglM;cq9kX~j8hRZzwGC~s8|`E@#5G)_d%xZSvm zhURwNPIvA*hYQ5q7K{46Z!pFIcOZFQDSw?obd2M`^2m-{uM%el?w{f+W~0~Ugf0pH zS-R<9D6yR}EsGLHTeI-_okgKjS8ro{bN{2#!`u3JYB4@=IV2Z5zDrkzbw_$<*raOU zXS~wCsM8|__GCqD$~Dr*R(Su;o1*meJjhZS9#;8Y1_N6WLl5^v$*WODjgH!~R^t`wBpMdqEsWS)jVsl04ncpS@YAcv@C?%ZZIo zl(bPTo4M#@6ZBvhuW7*1P~wHiQcS^OK zb#()Iz=EVSfnwLsYeKqOd?6kS-@nw=wXw2hSa@RhsbOTCNuF7Hd&E}qlRQWg-duI%|Z9vi~ zkET6FPiBxBhN;$rvm!qAz>7Rnd-jVACNPpjL+z$7s!3JX}prT4t=oXuP3Es40WKzHeKzAEfmuq^h-{Im9cbqqb+1mx-~O! z{`_dJi!4ZbrR3hgY#uQ{yHuqyc)ZE+9mmg2z~k1`MrG)aq0snNbkk1BzWIQZmKbjS z<_zzws<>=iArL!M3++5P^Tr47u(m$E8&F3c5^2}#xq>W(f2FBfZ|4tYYEQTmqZfcB z>%68BM9Y2{<_+k9oW%%Tj7=w@Q%XB+f)7LkcE4R2YP^&o=ZgggPMc3y_U6Oc=oLPG z{Ni*&aM)d+{(62oNN;;nah<$$S!iV0Vl{Rj?UC&KDAMLD$exbAyWEe@c=jx=>n=+^ zXbwX**;KXcKo+akRthgm@L1hgSL|acIP)c+m+oEF`WdZDNdPvUdl>uswP%*brCc#| zweTXdtO1(IP0`H`OTj`No&WAqz$bC1*!%67{)pwX6hT`Tq>ZKs`9}eO zeV%(ixgT17aRCFeJg8+)2R(M3w?;S{8toEPx2eeP!P%%=9p85kWUyoH;KdPfyz)_2 znsQbDqc6&hN5{&gdpFI2U$dDq`<{l+ECBHHbHm!g<9J|>uXjG#G$!NP+4BE0PTgyIHK%R5_i#IUDi>j4^C5XV2#UC6cl=M_p{B#c={_O0 z`N^1I>IkPLCxivfPe>V@_JYuho`fpu8`XX1+h&$YeeX^nL?3?j`rF*PSVBoD?3Am3}?C`W}%Ay36|!ez-Z$< zj!phqh><@0QTqvU2nqHmtWc@v+9&%FLr^eXqh0%i2m?pQr!Bqgr@GH4990#K;5TLV zHoLYaV11y3p!+8j@vaNKn{XxC_U5DIB#HT(daP>o4pT^weVkc)*kd$KUXk2FGoxy6 z?b7QV))0xwcVp%4H+uZjzt{bq6TNYZNTw_zI6EP?C&nW4TxvAn?Z!; zJn)D*6E?}lJY@-;$NgH)^vdA)#D-QGpRF>U#UBz%q{y-8%(DkXTdGA3P!+%X)_8Fu zsuZhaWOSi3W4HsTRdmqM`HQX<6;#u)L(-Y9PtD^B{W4>g!C+8~3fE&U%8i~s<)M-m zwxh^{wfuHoawk2tOq`WS0%llUp9t}JGnOkiJW^m1hTw+n&R_W}KpfY!tzhPDlAiXa ztEAhKY|DHeH(l6Sb>VuXswa{f?d7p^b0R3zB)=!pf9Avc7sdjne9L|DZ<ZgExRgKIlw%ncU+^WNCLtWGYcG|ttu8-z_WV%$9NT9eYc;oZy!IsuuDYuN)N zE*bw%+Au2+QJo1xHeHalIQS(RFe;DLo-{DX;DxMvTZ8ZN4(Q2#$`Yk_)7forto<@Q zU$-v*$?wbKsMQ_%GFAqH$7(dfyAHgigOqZ?!3H}S%rOQ7Rb3#_!c8~b)RB|)VKAas z%6|^9o_`j>y8pB(XCio|Olr#}*aOv2o2yALZxU?_)Z6;c!t}qBh;=EiVuqD`Ry=pY z^P+={2Q2Gcu44`^=gr@d;JIsp931>CTXfgFedf5b%ahuMucET!UU|WN6GmDpd6i~7 z)~t0V6eT3sCB;@Zxxru{ggz7fw}Cnax~B*k3HnZ~*s+kq$h4<5I7(V!J^PUEb4Yhu z;V92XJx5WaY(-p+nf2hsqNB00er~2&<%~daMI;lwkYc_4(sX-R+j#96iq-Wd1&U#S z^TFwW9M>fGl5yhuHV?H=`7SQ1NEho!5l^{Ba&P@EwaIneaX^`>+I2FgUWR*%~{mux_eaACNA=R6+a}%;Su)tvMjx zF=w9Z8rl44yjPtMT8uiz@LA|Xt{=xP1pPvPV(t{fQ>Mj!v=#&cnR{tGYvkhUn$XeF z(L2o>h0;PqCjEt{|G=Wp!YeT@;ldIU5*uB8#vZk`wFwCIV_SA~JQ^PMr`qCN(<|8V zYRus)DY?uZ3A2O=U1qLLc)Y?{k#>odR5G|b(-d$9(4c2DouTM%JO``d;+wJ@@a%e& zYFQ#QEdDn6hnMzjuw}8!|6%Vv!uVfT+|^ zq)7<~Y`_Mnh)C}(A)$ue5kZkoAe2y~LlRIRKp^nVoM*fBxVO*w`MvM;o*!P<0%F!$ zbB#I1J;u22v7VFOZb&)7Pi4V}4Ps0B0*J2{8DiPVQE=*dVcAR4(MXDj>y;anj!ra5 z=$LaAHnS?aU}5VNtCsCTOhd?owoYnB8yUTHY1Q4~^Nj6u4<;GA;bwHK>d3uZUkrQ# zMR^QsYsU-pct$bSa)?J#n2j$^ow)oD8j zHJ)5i~ zhnZs($x5+u61;Gxw8Gs82)yW=|gW# zE?f<^q3V_N%=lnSYAflZt$3T;riPZh4adK((CC_C{)oX8G+%_K$x(0Vzs62iREgk`uE~4!Wf=(?i zPoOWIN1OHU|G0EqrA}+V$)%k#@~fP|X$y_mT^zE!1Lmaq%(oeTiUM{pT&j(H1{U`F zGyZnuF9{}wOniK-M2l08Vf$e5?e{wwZ;QN$|4jYQgQN~L8-OJ^;%z(oeTc|ETru4^ z(~JNJLI!2?{nM5F_&W(b@WJ;9M)Lo0I8`=%IF+r%++PzQzTd#V9r-_}52wn{d=vIh zy4WB0rwWojoXY4e^`D;TkKf5}Ngqx{%ucub@yYzW3F%Am!WOJhHdlu4KRkdRZ~Oo6 zrEJz**_p-Xj}db+Gll9eFp$2l>eZ{}PM3@e|Gptz9l^a3Ha5FAWEqu~lZ8LypK5+z zB?&e2?hMW7E>0?aq{@%Wyo15!02tiH^FogC=Rf@PxxIJkp7hg&+-2r}TdW^F_Md;~ z;s@k&*5;!O|LKDOFnStM`L#1W&8W}|MbCVA#m>V?ZQ=;{&Ayy zzaoFhylN1Nqg1U9=fTJ_&o_@^rbKdRhkKH${) zY3X|Izn$s(#r<`}&k8CE-H$$<_>UhvPu~Vpp6U93Ki$7C?u*^PRBTkH4*bUtM$@Yq zOO;*1|7pWq4Fskk$?vlFKYg(I1~@kz)pGtPYfHNbOyj?1`D-KouUY=TXO{dj=PT5J z&)_#@@LnZHdM{M<$qj`lEuT1Y&Rk`tC7DMN&XClL$YFl#w+d9Be-b-qY$ zvxgVO$|erUjXytsiS>#5aaG}5@aS8 zuI6Xr)n~!b@#~rUOO;lKT)q+u+k;7W+7lGhD=ST|Jpb)PLkN4+)2GZIK780$0oOM) zFg6yh*_;$l&(6Lk?J#sUGu}Pst`*-+*8`*r?vY!aTEBKS@|S?~P|tF?!T6cu?Afy~ zJVp?G{nUuW&9uW0Sxf9pP2(?Yt&MjL4H0vyr(*2Vii#wMGP*iC_@%!t&vd3rxD)Yt zgRVhAP$=|kkIqdw%__=(-5|$)><;WaFRGo(wQ7AT_TEsbbG|fuiF$WgXrK-}4^aUD zfdZFltt0ZT)@SiNaK7IEC19wy0#De9FnFdC!u%;lO2cc=_#jhoH+_zM6IyRKUluK)}$Oa<+nM`=crSQBUOZ&&}P(? z=c?Tj*pJHcbM3&sOp=n4DzNE3BRJ}{J{k4wn7EA0y0TJ4zaY#?t1`bcr)I5D{O*^} zjS?lWv)Ee;>N~Cty;&~uJnVuFkI#)Ff zqne(ECd8k!2=FLz*cf2I@NF%IoT6;w^kI>Sn-hX}ggp5kj_zzCpW<7;`i`Wq^t8VI zl3=5YmBT5x>fg`!XS_=i-gh*yGFKS;w)kX6E9211$I_7BZ##E?*3;9Ik7ZP^^jdY9 zkCu0{t+*28HUDY3FEhalxk>G-dDEGyu3%cVP`wdXR2e<&Nc|`L{tYGOGyOKkGx%8a zz>M}zmQtmqPv^C~j5S;aGjH<2yo>GoPb#<*o!%hGE{QH(!^bZ?)Yi*26CG~~Uxg3i z@n=zb=m&4g{7n{ib7dhWUaH4QmRGowUZtd*6cQFb%pz;%^QBSfTB@DP2c_i>)dHXO z2Zj~y=<`j)=9j19*YD+)etxP)qmA=z&)8S^ZEtCJJ64dSKYaZ7U>Js2!AaP3rFE3w zt(xh}P4uA@CPv0OlwS)wDtEGGz14A|*VvKO7$Hx++gIPft}NnMy`JH+1$P*(3*4ij zrWR!4hJ)ToO>KxAp^-hpmWIk)8oN#j-Zt}`H)A8&ODu)1MC8HniX>ft)yk*pfO zW4_dR{O;t($U7~8JN1DyKd<-kjTjP*6L&qN~I&n@jC2`qf`KVLRL!f?3<-7ud*IrpE5G=}}(# z0xQ`51h-y8tqPH~hii)#v;Bpc3%||IL@;HFHk-g;3kt>kc+0KL^#`<-zLq^oi#tcW zye%)n3$ZF*m5mH5?iU8zjYaT|>>6c09|WSBGnHvJ3%1{M-2aZ8{w_a(Q;fa#$8}gL1yYa7yEY#QwL2vMH|q>X5G^G|$?id)smF&$J9ou3n0XM~9!y5+%U?9ND~VhH9=|J9oqZZx0&5F6 zy}hv9eba*hqetpR8#ii>+b?u?3N97A#JY=|&%cG_GFTWa$+aJ@G~5E4Mc()R{ZuW2 zWOHwI@f+CI*C?$#+;io%I`)sm{zBlMhmMHSfV-AIE#(TEaTaUkqd9Zlo&6~N+zuu3)^I19J`x}K28j-^DEww4!>qxqoTqXL}ik5#c z0=T)a;IVzUHfhIOx)aKBq5NL`AN!IYp(;e6?W)21_d(&Q3Lpr%E`Ml)IyhiBxVc+o zYSuMJzM$bCEsEfED7`2mP!xK=0bCn~o%eUU$pO3E$km!{TJlyq@Xhv&#pxc!w@SpT zmJjXhd%-6DOE6ykOvT+}_AKpkk}yl@&Mvq4-u13#qZch#Pm(9cySf^*~*rfJYMFc__^FX4W&Qa-@b zuQC}EY~k-R(1l;Y(^a^r=wYg^WDGI$s5Xdg=@Ffs>t3HuT!=%Rri7?{n*~4z3EcK> zgBC(znKu*3m4s5~)QZy9b}SZ~Y$v9yTmx0?@9+N_zu=>O+-LD(*?5?O5!&isU66mU zey|0i#XyGD-F}YNvUjHj)^64Wj)BHD;Y8`y|FPqWV)?zcIJq_rkE*JC&)e{}TP$1y zlqauKQc^mmxE|R#_7~acSc~=RXvqoOadQ~$xMJuP7<DU2EaPfMz0X|%=*d54pCbr$W zgjI(h2Uvn*kvh6V2o;X?OC5l*EA!2k5;Sp=Tvo*Az4ZoC2?ICaEdVd0AiXD%m; z$uPhS!_ewJE^9C$AWGh*>+~u-L~&uLOh+WLFw)%1!uSnF$&gp1wTQ{9#BoGSdIS?M z>|Ok_&Y#?@Ka`;NmDL>iBVd=ufv&jsl*Q>@_v(5p_6E zvX;xqZQ35|dA<*0I=|cyUxOpPhJztUq6e(}ue0ng->L5?Z{e|VOu@a`)Po=(Ub9*7 zFffixy{kOZG`Y0Mm4tE){LKs7GgV1>jS(W_R8$Ne^)^Iz9{Q;7Sp0+Hfv zimN7qnkx%_+unlBb~|0XFMtTu<|ge;u@|JdsHv$zVlNVYjsf3;gX?twV&cCRb)021 zVkz~%%~D`wYaW}33rLNOjMO^!sUoCx);9Gbx2VzSh03L{{l_oJzJ7{FHxY*C%2#@g z<6l?3ali+ZjK2?!=<2#{b=rPmxGFwrKvRY=LGB`3$*7^zuWfzQuRf%Yn4Fw+hDXhX zRtm+#(=v^_aG8P$4=?#ryA$O@M1_Q2dM-^pVe%CX&5IZ2t+KypAG<0YeXlpi@D95M zX_GSOsIb$A3 zO^pF^BvM#k-e1?4^C)31p#Oo)sJulzV|H$CRDz=S$9GQ-6Ex$dtr9%XaM;r*B{iaT zk8(oaK))lBQ~c*n!@?` zieb{sowxTHKU(zPbKI$TAGfxfy6V8*Mxb$!mXQ%e^n9-M-!(ZAanpUk6@I=lJ4@TA(FKa~2XUr-BPgqo1W~{7Bfo2@M$a)zE_$(Y8wT800~>knxV*+dMiyZPp)toY4YR zl8WyBj9gQ*TGqElPCZXsvuAgY*1NSGqs=)ikQWHOU986Wu4T%=k*6b(kRq?8saCBd z=hhghTj7TXPWW?!kRCrVG0}`Mt#~&TVp`&0YVF8^G16Y&qrB#i-)j=d?Bq*z^YIwF5vVOB9bWX{%C;EI*&i{tJ%iiuI^VLvjz3wK#CqaEO5=&CcJ+>MY| zmp|{mFie2PLS%Ury^6f8O%FVSKWytBoc0}SdS(cSY(rITRpP6C98DU}t$otTCeHiC??qU_yL)&DJ8ex0R zl7)+byZf^<6Kp42LbmnNCEKpibQ`lVp@|Jp9QGNvIB>behQOB*6u&Mu04;~o2j8>P zE#fspZJ1K82bnEo0T7|>ZhV)Gw)7@zRI%KaaRow zYDXdi#DaX0PNF$BZM_gEvh;*^1JamQ%q%2D%!9~FF@EVv*B}6$X63{y4UJ32BQWBbViD_RjikEhT1vw}J@?FPh|;`-9zLmXRC=_MnM3J;9v2e?4(^zOP;P z*5;5)dzqX+Cxwc%3Ci8Idww4d%!@#X0H>Ml+5XFsaRP3(%xv@+i4>$&CVe<=2kI2$ zfqR2TQv^J<%C!b+Ag`b_6CTZmz2YGBPoN=vUGfe#alB3cv%s}1*1CH_Fy zd`hkfT^>>QvNj5-&v0Md_zdKwKRuJLut&90+qu76y;T7RJNG~Pc02wOVk)CX?;Uq& z{oGdZ=U}QAJbA-eFemJn&idOQUaNuUT<{Pl_v2XNpDy8ler$fc!{6@8Z~gmz<^TWt zmH%DKpRM<2OZvaXh*TP%6NBPG-$aiYWYcvCUUNbyld=Nfs+%FYSuY}KX*%h`=X}E z8nBtwwm;b){XqRWa(qC;?d<4_6*wl^HSzKEGwg zSHspypc7UdDBy<0i~r)RFBBQ}3&kn+1tjnv5OkVJ4v7gq4j8*%n)vuuJ)Qj7@3AWo z^JYHJ;ZTE)zDuz)-e&yTF${DJfJ5mImb=YgU&^!LL!G9!c$_1()CKC@UtE40;-igj6bxrrBl%zyb`QdIE$D)*VPoLX}P zy;b>B875nzO0?qT`$194BoY<;8=D=>cRd|GQcaNbu^|m$Q&IN)1&s;bWI2>>_N#dJ z0h`XrI_?_z)U2@E|j8jh`!2Ky*@%ka{6S^z7rG+slzYGN2zZ?<09gL~VzmOTfH z;S^9YHD2Sl)OUh z??!VII@`s4*T(k5O4__qfW?0o0O<3K1c1{IoEU!peHdknPe zQwj#=fz7<}naBaD8>L~%3yvT(0|?^a@b(LS#q)or)P4(6f8_>y`Sa|U_L_L0mDSag zuI^+N&Z%7ije|V@U3=a$$q)GRX&KD#jt#y_1NcAZdL+czAEiVGAEw%wa1JtLCRzzm zu3(m^gt!rI-dzpR%lVDFR4d^^|1ot7om{gj6DVfH0c=&V=g@~ve%QxfP%cqC^Q--2;eLW*v$c~ECFEBNI~YqE7RV~#Up zIX}IZ4l3S?3-q7QF)SSV3My@b^g08TSOVUzJTs-d)b5*@U*{$t#_YxCIdL$eFa|Ro zz{E1-sTn8R*`~bhBNLLV>@MG)JuDofVK6-t%V4o>rb;}+Tj~oONSg;pj2-kJ;Aq)N zn*}XmOBLbXV%b{|VxLdZTvSX=TRCinrh6{uM5P<6k1$bTrf;8;9c|C?hqX*pBTQMG z8{Dcb&W6u#GoRP!0>%5tPy!%({i3j&E)LKOb?WFr|JRJVxB=ik^aZl=vVr$tD%LMe z|ELp$+;h}P#lM}|`@Gk(HFq&m{w6NBHC9H3={oaS*uya<@9|I>6VBw3Ovqszhdo%B zBwJ=)#G~21TiR)JgL-Hq&b=v{)A{W&fxUYSEc{WIu3<+_uspZd$3pm|nOvA}hAUDG z^beMT^0>}S)+6#0!33uk-MZN94BH`43oh5z*_qeY9pdyP?Bz9eCTG&o)2G_MmQ&|Y@l|2z z7O-cw(XKsivJeUT#eITt=7Nbn1rml0;mpY^ zX6(?bg5ASDOPbvGZI6#Hor0G0Tr$|eDau-R@OOV*neS^NAy02q3_4Vljp~o(2e?2J zKN_g+vwLVGMH@|$ZQXvD46E@K(~XQLpGVZR%S|6upw6U@S93SY9UnaT3$xwJ0q{6> zEtt5|{}8wKC~{QI1q*TAUwpY?-=4lF2sACrR%;A7B^L@mChwX@@E9Qkp^#^nTSGFG zF5@0B-9Qq1E@U%P@9Yw+!Q>K`H?A+|?9kwRH8)Z+;%jU!MKXrw%!NQS5Zz7~+b6+B zxT9$1?Vc#CT_3geDNUqi^k~5c@;RL_x49l?)lU%DP&l(R%~_J&x?GgtEkGDwC;14t zq}UIZK{ery8-fnv)ndp0-u}}(Jwy#t1Y_s zb)3qB^eX}$K9uJ>7_RNjD$r8>3USh%%tT(paRKBpB?PsOxxRONmuxHd`fO%mFhvFD zZEMu0?*OUw-lnY*US#@~!k`n`C!sWY9I?5o+ZvBd_U4R1QlZc%NaBrRn^JRDcn&{~ zPkoSTj?>??jYb|_(dMh4vcSp5$mnur%_TDAn;W3oyWz|ix@`o;&h8?xBfX%w{Npj~ z`kMX^|GaS<1?Z&1K+y+N9oB5#-n%eh&J4I-qg+WU%GQRU4*Eqds|h($j0G{ddp#Vx z)=~jJBP*mPKUoRf)p{();@t`YVp}>V$<}n{moDqb0e+{}9VaVPk|Y^9Bp^;uH59uE z?LY%hmtUFrm39p&fd7l*LVGG_n?YB8MTxu<(A_)1kX4 zW113{4_Z#O2*Nr-DYjcTps%S*ebg-zj_cf9S7%+AFh(^t-5Fcj6%%q1VKIZc$)9?U3*UD=MaT))@gW8U^t&okZptM*d-1;VycPJuBd>RFFlG6dd&?d#<-W4BBHA{a_QgV_8Th`hX^ao@9`Pm&lDrRxVRlefp8izo|o9`)Z-j&y+b z&s8ztK`~Q2x?A|cF(`KKcTi6TU^Hgq_^c;r&1CQy?mr^&4rb*M}h{gV%A3*}y4Zlk>^e&rO(r0l5TVMf~k)js%D{?r21H z%(>qN=3JoM5RP7Xt6WQ5M`lX;|AG zu5+6PbpxtEgcYWI4kB~IeX*3MO|Dzh<>b6Gh!UmAulT%)zsJfrCREWVgYNH-Sly*M z5!wG%R`~PY`8ECHZB%1;3&9IUUt=C6R_H<~c--DUKY~H(ChO;| zkNHEZkja5kQTOwh^)99aZ{xH}kR3XBWkr|}TAv9=uvlCoDzk5PfdPd7jqt2r_XXdJ(!;vbY4&C7#lKWQyR2_Fu z_uhVdD$J>+Az-SM)!hm-Y&Lj=_UMqcNwz~-zjF1%+KCK6M~He)I?_$0-jv0B!Edw^WybS(!(s!4h1% zu2H}R_9@Ypb!61<7T#~Q-=L5%5a?KHFhg%%diC|+OD%)4kmqz+*aUM{p(s6UhGuMr zq92MfHh3cB=;r_tR$*d0!H>(Q_lsmW5hOZR;TOI>j@2l(Xb2XY(7`4_90p4q7p5Bb zJM@*gSn1>;m#RSbMsv6P0^s$?!kEf(t0+cJ5zni|FsW^ZbtMcn^SL#{L4)%8ReeJ# z%)rmPIUAR+K1E*SY!io757CRlcEgor$9xv+&a9@ykcDY)Rr-8qI+DpT$O2ve>CN>e zdZs|8A{pe1BQN{85!sH(mtLQzcResjBmb)4LwZtc0KO0-_067;u3uk}vR}(@IzI24 zlf-w#2jpkuinL@jr-WUzJyVTu+ufQaz>GM<^B(!tbV=}kS?-&UnESd4r>^e3dzs&0 z@`z9TTpO>H?cF{TmrxeCj6L3*C&QrOJ@OJL)Vota1wh)u4Vh~TmCe51kDpRC2!dBj zoO6%AJG@Xl=#cSLO)4n4ZtRg|3Ftc|nSzc9`62TJ$7#EVdZclXzZ8SS1|L*hN0RLM z!l`dE7ObcT&8k;`9<*)i063K!wNN*H+RM~L9V(AZWR8-u&uueQm9sN2jgM+mJPZ(q zngxxC+hp{TD$^8lKNM?Mpt;mV0R`BgCZw+3+pMv4&g*kAwuyA3^rrM%8HXQN911_+ z>Nu;u$F4UgzpzcdCG5i2<~&SV<&7mQ8>psm=(R_mZ+ahgZ2poJ)N3BEZ|0c}1$k4g z@5-?r57iSDHJQvgwcqLSKRGi0L!4*1k7O)HIiJ;7)+QeHCm!lR=Y}BVX{t+R$V=K| z!G7=9MxsrvUX~48hh2}an396Nh!NFPO@}Z-v2cmVmvbeU_~1NTS=MLi=!{zEZszi? zXcy^d%hwa~%qA<^0{2t+C3Ko@PMdXlXx8~+ZE;<5BSzhRTm#L^GyH{kj~Ib%kJ*>mpP`A!DENHFMxs^&`| zfQnR}b=~J*Ahrmaje~$jHxoQ-H&R`-LMBw?L^%C9mf;^E=ZkdUoDID!X1Eyc872V$ z;LvtG2o12WSPMs-!Y?XCbXR}343wtd!1%!|D?^SM;5rO1z}x;_O8>sf544kf*uYDT zezgwYm&Nde%4iH{l)u(LUhxlcMn#Mnl*v9rQ`^7)=YKwW!AZYO=OZ)!kpMrD0`5!9 zOo|HN_dkEvw+s01W&U?HzuCgyE#<$q`Tyn?(*4w^)osOiUB{fdJe%$*8}_}~koSxU zqK~P3=3P7Xt)ci=XyuP$1eNS`l-i$fApHv*es`dM9`U2-pG3A?v?{oj1Pasrcv0%N zx6SV5*S^F6h`vI}iiO613mVPpJ0T`ZUyu*9{%)@S?(DQ7bjV)+>Ehqc{u76npAST@ z|9<8F7AgL_mj5-Pziq|;+1~%%J^!bBBFNPEHRpf4$moOkV#^TGk)k?j@K(4AeT=P? zFtqJcSU<}T&cO2|K(d0|ue$%iolBg^J9!ABWgy$6WFXs84f_&-9;p1_e)*FA2qZGs z98SryIyNs|cn)1P-1_}`3!vVvBAR>^A-x6vQnT%{_=?(Hn^{KV4w`mUO<58 zUn|v=;1lW3YunnI^`=aAsWIvCb>%Dg+wD9!{2i9xjRj!2*z_PZP=$>p#~{C+-n94F zZ58Jnj6)mC*tOpWeRE2OD!U;L2_?PK5X(2hN~}I3<|xiyAmc$#5kB9G)~oSF2*Z?W zG6bj1TE}^#bp8^G6kIj;NlRIwh%4nq#!6@O2nXf1-`swGr8VJxpwY3Jk88GEf4{=C+^dGP z@8(#Ph(j4E_L~+Q|7#!^+8R+$mkktgd*(}Q##23Vh{ zineH?x(!*lZvl4>b?;@;N~cg_g~fFJ)NbRN`;o1o7nF=7`^Zmp6_yFPk*4_K2;7N> ztmAh7Gcf~!)<;4g%Odv8D+y&89h41Q=G;4B|O*!C9lvdtdZcTZtpd&B9u z=;O^tZ6)3{)Mg%B);&`m;yibwqB5;PpR(wYIMCa?ow0(xz0T}@twNPFIH^IbT0g&e zC*cQF+U(`O88ag`UpC9n(8!H1vWWof&o)w)W~?+>?zdX5?Y;M`*f$nx{Ir76Tg-}p z|A2|vpmCE`0;)E*LWbT-HZ_xF1%Ec0qD9nR-po43XJne`nF{#lH z+&X*`mlHVbTW1!#f|z;XR_C^2cIn z9YwvzDY@jALidok$6~#H4TR-cgKnp~e0b{{P4|^QWQhKbXE^s7ucEQBicUQ{6wqqk zsJQV{kj8}b3*T?_JJrvM;jo}q5g>3F0ImoLXhYnf2#2Sb|?zwIgoXlu6@y;XdH1o+LpMkNj;rBzjkph-0Qbr>=nw3lljr(J>8+oJpC~;C2{Yj$Rcoc z75eH&o&S)s?x-Coadd?F(XiPcv1-p2w=FIJI=eSujpP6x5d|nO1d=CH!wC}$zYkh9 z`G9jY+_POD(~AItB_dcSH_lM`>M0|5Z%#D5j&4+Jf24dJG|{a9JEIWLQU^f~iaZrh z`}|D&#?r7JQujlG&(~`u@yOGBK&1j^vG{EjvYcDF-}sc%eGpz!Hu+)m3nQ1?zX?(~9Z z4D*mYC}$R?Fu)snO9npB1K2qC=yF03pis5catvM0VLFOR&T*@GSA0`x{atG^64q>I z0AnQ_9SmmWy|0t0g{9MsY%=4yHk@a?O^vbO*TKHWO&+#N_2FL$Xyn{!e7Bv8k?p%S zf&xX#vJE)U$T?sP2&sZ`P62K+9VhUS47oZ4vCb-moGz;2%0yLdnyOn=WYzU!;c^UXhi zmliRcx_?6`FTcL4(D;~vxgo?+cXq&K;lA{J5F&Q_TDD0lqJN+H=rnR#WifJ(e3g_az0 z+!j!g3SXX5FE`hjHa2LEvaVs_7AvA_ncIvUys~PLX}x(>)w9RD%Vw8=^jBEY2?6@& zsbNOBF4JwkOEZP_YxIUIdF*a%fF9I!US9YQabkkr$nw>mt}3l^*mCNwc>O$^HUmZ7 zAWZExhzjh!M20!nVhz_^YCQM!#!0_;^_4lCW>aT4`|_@xBfYt>g|=C+Ns5IrrS+{* z^U4~NhAzchwC>esoW;~}Ay-^=!W@FxrQD0-FJBCZ#k~&w_6wgj@@w@FJS9a`e+z#W zpSKgSI;R?T?%CBhi+U3q20ec$=Y6recW((V8|fZ0Ed2+;%ZquC%$NBx&H6kGUY~;yXBp^4%evI_kVxK}#`URJrkTE*Y zdC=LKrXo)`amustDGfmxA(FsNqFAm3DrncH&S?hOAaCdfP43)tbTmLJs3xXCC-Ut; z4U*a>Kc6!?)!FA*`6XB(Y^s{rnHqxH&9)oW$!TduESpYn2eODp5!xhr6R`CiVii0v zHX}R((s(n#HsY0c%`#52OCHs{0{Hgsk%35UJ!o1R3DBfi9AduC(_1TNZYB`hmckUs zPOJU_g?D3vGxUNm$n$nRSr&8_4C<|(Kpv78Du>E5I}z8G4H#^lrYIz|sTXmuH=tq7 z7qm5!2Z8Q~g{XU{kmlJc2 z0!;FOUrpAW6pk|Uy1kp{ifpH|WMv*D+jj2{J9v%(CTe^)mSG8{cUHf0PH!Yox}pzT z!#6xAy@!HcHwn~Kj#12XQ?JM))#;s>+EY}w@-Xy!^+rXE&K&K+rR3f-Q?Upec&UE; z2v!?6Rkw%F9;u@9HfpvOw+G2Q>7!FSxl6xBgklKI1A97G%3-r5FOerkcWi*(ZK^K@ zZPRy5n48M9A{Jw;A1i4P^b=<=QlHRmremKsUNV22PV^gw4hfwOg(Imt2Hrpz^xju@ z#yco9i0Pqx24Ep+(FHFyO3)Dwe!AG2Oaf#t>%cwi6uz=r{knVxBc^C(Q>kTpAeKy- zPot&)qF;uE3&5$iGOiegsuQZgr>kPYGZf<~9`@U&VZwbanI0o!pph966zA)C+3MK@ zZy>}@X_zHfZ;-c6$%y2WxuL0IMn%n_P1-$UwH3r}>*mK8XtM2@Vg+59Q_|-w4A#*z zXw?`;jrXRc%61?(l!Hn-cOO7291K1G5t&`Ugbhn`{nW5seOQzW3~J==|$b>Jp= z25?7HtFsEc0kRh>V%H0>Gq7PDLGxWan-o=5t)E?#coK(By?;~VUPM|iPO05-@WUKb zb4z{qHK2z0hROXU_!miE1(@0jbgHWC7kIENA{wi$FTJINT)QbRKk6x3{}{|8R5tOc z>#pu`EDWBflggx^Cy-nUj3~d{4mYs%44r#*7e|^;+}3%hsO_+x z6#DRfW12j(tT>nk!M$cH3xh&}rI=#DBlE?p+lcF^WkT$5d!UH-yQ_Fo^dcW2RkU2~ zgP_bOX_eVF9#hk-oWXS3b(PLXT<^a&9?H|zVkjB(m{>IdHpgzd-=xT=Tg&aOU$?foLsP1OHz)*m9B7~Oky3;sny^+I?6sZU61R)XBV?`w_bCLNb3{-fDk0? z)4TjF@;}fvZ;OFlId^-N7ncCte0*mxM_Yp3#hVANo=v*0$eN6rLKzZb z6SuW@q<28)&%PBE$=UCq|0NPHUp_h^XG%>=RyxrCMP~dY-vzGNjBQvJJG*MI)P2G7hCfbUem{ z6mFm_Y(O@w5)slsnRTPDS;lZrpewkNvWJL=$Q50h+`W$+`i-cuEY4EfZDtGT7i7k$ zo+_IiekN~p0R8$MAK)g+1hsl)4d^T(wE!`fH5ctWBX8Yo(fWbTU7tBlE6enbm(0zl zl->PsNG7MqS0!nwr|fJ}uTQCkD1lT@NxxU;J>tiA2>q`cs=z=B4@+&wYwAkHSu2Pp z);LU?R0W|U$W|k0gF6k?+e7fJmUte#@yw;dV=uR#!M|vnoM$3$<5w(4G7Av+@;Ruz zhU?mz)ZsWC{8KXj7ruAmo$E~$>*JQ3o&hs|Z5v5b9xyTW4y|2(&bwrjk>tI7^h$s-Y$2L$eMjC}43gQbuf-kg!$o-y41dNPuvqp%GN z8-oSG6O%T^`o!cEx-q&3 z)dITep<``O|J(Lz$<#FF8&W~0%upY-7~@iwt*e>kJ^Jl72Hh!Bk5?M{k=ON-;qpxy zZ`52;wPK}PV=f1G(g+K_+~v_*J2iI3#bEr8t6>v;so7c3S6e3jF~LS4qEwicu7fnt zaC?h(*kJ+9nG_0`K4V^W>~}U$>(?hSqqkM3AQQcLEd!ak_R#eFdU--2Ge$}sQ{yL< zi5|8}nN64-uBz}pYmZp&R438J0;|C{Tv>4v&hcS#Q@_c?6@?{x-sK#f`vS0I#kwVQ z9hLmnt%lLKe2{7Npbsh6BBNSd>B8RQrw->v!SQm8E@vp572&v8>Ha(+g*~DKe`SG!$kL}+=wly(=^7Pd_5^>+Ep3DJ z+FQ^(Fy5mW&}81{-1_Rcu{=ADRG_1JdRV^UZ=Es~(g@8%fGqQj5xVvPtJN|40{zLX z`g_nadH~+sL@PPru(t#NJKK`_=rj9`jOc3fX>A9z;G&xrZNBpsN2pkt?jk(a2Y7m8QYkO2S87g@km<4 zX~o6;%z&B27{=b$K|ctM%&-TeDeB2OIXOwum=0}YQ_yNAJa@DH&9*b+aeqyvgdwt>wqhwo$V7O8xT5J zYy?LgDv4wI0ebKQ9hAS_1Ff8(TCv00+E}-FJsA&tzf~eBSVFTWnl4yj!te~}H55}j zG+J=dm#0p3JE4#}p2K-|7w4@X3!E1=fY>&Vj8Z>T>+PM44Je?GL#Yv6%o(?Pdk>38 zwlD~DjfXOvZyiKh#yh`1;t)2J;-0zX2Vk|Bwg~c4Nfsh~qYR=iu_tJWRn_9=`OWEN9dD)Jt6O&!Uo^=war(H-Y1>6Jt(4URw?sGy>gshkCIbzBM3_N zRq+Z>woelmzu2v#Rh9M`F6&HeC(iECjhQ!Tr@jm~ixSr#uIhE$oII#lRr~Bk{1qiu zW1ivdJgJ5f_6nhf61EYgWg|iSMSQshDmXr(hGFOFRSBPsy!0_zI3aO31kpb9^+lv= z`0G)|`d(J4ea5$F%yPc?F2<0XvkS;P)u6IJR)mOgLtB^h*bF%aZo>I|&Axa)h7~N? z*B9T!_r=F@tex*)63@GpP@R2b-9PO@z!Fu=q~!gaKI&zr)hC-Dl2h%kAUPFq{B-cZ z**A|MQ#~9B)KSS!HU-z2Q3xmJa@I%O9!$(gw+vHsjD|#U)z^>0VlP5X$s_tGz1AAn zGE^C#OHd^^TD5S7qH@$ivjbQQ<=}wXra`)ULcR44HV2{sZckgXsiPK+Sn%<1jC?zj2ZE z7=t;~0wwfX6AKtsZLG7EKvT#I1oX2AeE6Os7&Lf(6Q|2+ocdmT`=M?eFvS>{*Q|iY zLUxSoZxiK#YFmp9Qo>hPRvpU+*Ac;rRxPUnIgWLpo-17(&eh5)_7Oj?V_Z~nIJUSI zzlA>t>OiARQ}zR6z6VlkT2}V%&Si$Jbohn*!6fU;cY#j4>W3Uy=lz7#&$&BaY#-+C zTt}61Pm+3GJl04PpZaufujvH;ycmVfazVbel z*D6+;6c?KbDBGQ5o*`_<=BCzl)lf0W9nj=8gS3<4(l=a$H#gPK6&(ZO6Hqx8U2}eK z1_MnK%&W_)O}4To&^hEsUCk3Hh_o9h9(k=4fbv&)U-YKx&IwT9v0yHetg$KB2BMf- zh}+&kq(%beu-}6MZIQR%L_=;WZ>?E!YrD^OH6rv5`O)Wrv9az7Y$~5gc{ZfXZ?`su z%B>ybU`1Ot6(-mJHZ>&MRnT*bE=d}Ht?Pr*bea}Rbs|@KNRG- zmI6uAV?T7k_N^6DbRBGJUKOeg17v$?4|3ZJarcL$&nB4w=9ZONLpxDBKy|DiqfAxp zGul~Ptziq4SxFn}UR7Ei3UFhCmf!^q3tG1oftO^(d6Ls2+F>A*qWQhzcGc8898$BH zq-QMtoDuUqhXL{WDh$w6mr3|TK=iVRLo>&O$$oyE7S>m2byMFz^ZIq@)43|3+HwaP zvWiD5j(!`lECWbAv~3Kx4yj8++^uc^47pPcPhHpLfxoT>E7|nilv|*Ll~+CtQY5z*a56v z1)pS=GIK9ZcOAKbFL5nd8Wi*z#*IW>rZJ1<>SN1SKyRf=+HN{rJs^>D8cWGW{6H1H z&23%fZ5mtR4s}&!6}s{LK>;@DGLr=C!7E=F{?JawJB*Sdc`^0K(HB|2qc|U;4z#no z%9+`A|IwNT%Bi2EJ$u!!b&gJ%_tkobz$xWv`8`*wPv26U8jPPc*l5yq3{J{`v zF0vOirp~(>Opp3Xd@*XE(TAf2k*~Xy41;E4FCdP0=XElVB7ja{nnk>_!=Z*ondvCC zP+(zWKdKOy2ZJHLsFFZotM^!o-r&?nP=h~3cD;D#>zbyni z=xsL`Ib(Ecd}%`-AK3fR-a4EmKm3@JCA{|y-__&~vqSPo>lLr?> znPop9el8lZgAE9>eg~h5{uH-4ZoJdSr-{s!|1N(9K1b}(S>jdr;od9!%8ah_^U1ZJ zlsVp>eY}6SJ-zo7ewZyTh~XrZ0a^ch=h3(RI8_)VCo(cIRl+rWzo-eAsfhXnv;_#l z(S#!d@ND80EuH~-Hj3$jLhJg6xI_#_r<9>;_wCK!hSJP{GAg^hJn`NjzzF&lsHc6p zM&*6i8urd_^-v@RK`ZB#ynXqgK;e=-t@?(6WD{n?`Z-*D%Fq3E_@>iXMq86XN%K%1 zeZwZD{eSFzX&{yP8+I8ckx;fQNu~uMl_h%=MV8`_osfOWn&ps+iqKS4cFA^*ec#s* zWq0hm?EB8Kz4y~hYUV%9r}xwQ&bLD+&-47A-*VsAeO=d0c){Cad&k@T>|?WQ*V1(e zDcVs4N~$15FJ86rDBl^H>uuFfK1mc9y?AHRZ~FJ0#H~+()V#CH+*U80?VFACrxP!V zU2bD)O3jBV&`Eq4?GK?CRM;g+jJl{J#fV=$xR06h)?f;6s?f;mdTK_&`_e01rP*g`bji&glDe%gr4WS zTfauQ`#$%0bW`bG9q2BwT%!N_OOKGl0=a5Js-Z!3b7h@U0g0XazQ6s5HG)%oW*WMu zFwR@n^W6lWZlV{b$aSuit5~?)dx+kzp>)Ln{Vh+~;}Jpy%CG8AQn7!;tRLm}qGCmH z8&s2h?|o6HRhQhojF}R#7IEg#qFer3V0%o6$j_>~27@{yFkIa*E1E9%d%S*=$zp3# zmZ}k22h_qFne206e<_+_k)qjTz;MAIS;NPh9)c)r7c=>U#90X3FMc_l z&wevh@YK!diLNEor{j^6SciM%=&3PuP}jCgOS&`8G>46aCRxXfv^628Y(-*Vezh>5^u zTL@)!eeksHF6ZW8j=$A&G~SdmL5t={%$r;d(!+!2cmINiD|nbn__+$Z)a~E>Yu{!$ z#pxjeAnHs=v?&E;XM1~o?oq$h-YIx)b1qTKFY~;{QN>E$i$Bc3wA13AW@-f!A?JS# zj{X=F3W_-G)E8ST_v`o~Oc-1?H@K(Duh^PzwQ_p!mg!`57y4;6jOcn%930hS+x_3- zM<`Ecvo_Uy%(V$3rlJ7VL=_lwM)`vbrV}<}b5Kk+N)J_j7E;>dw>w3}!$={htO5%l zDztK(VkyEX8D>T4Y~SEImk@Il*@BMg5M^E7&IW(P+H5usw=_eBwyp(VhU?`AX0@WS zrZsH&yJGKHtg6rcNRN4C4{Xp+c&3u|e_-VE5Cj|-J2&2>tF!uK{YmzZbAp1kgfWTd zSiujV!tMb7FrnagFQ|`M%c*$(i{sIs-}j({`A$dC`%?k%F5{>g2>&NJDx813p&tkx zKh!~xt`@fUn+qDf~;=c^IEwVd@e)iR4Qh*iw`sgo%@z2*zgPC0|llq;& z^8LR4`iX*7yr2G;vj3&({&gVX4S$1ees*)auiy#gF>Bww1Dphg*S?1C9}X+Dg9%CS zf(fmWhIbGrZ(QqNYV(AlFwYya#!Ep zKiBiI*sSKr?!NPv!51$OuUNZs=F%PybDCR4uDJl$?$```fpVb{r$*NG{CprzWz>u9 zbn}6*3POAt6S0a82cSanf!7`|tyDbp!8QQrCyF-~nuv=^xEU=&B>HKD9|F8A&@JZl z=Rv&M(Tz)(?1IC6RALpez5sE~OZ%-T$%@1M`8R~cvZQt&|Hpyz=%$D$7K@_Gt9GdF$KOyO!TVxWQuE8D=^x(9xtjrgA>g}gwF zIKT?SK*V|JW2Y#B4mp&Q@wcbwm8WI-M>nQ|3FC*0pTk7*FC2WmT6KD&sK#?vs#oVX z`Q5%HKi(6hRGJXiA38O%huA=+A0V4lo8cNYAUI4zwvq;33mQNcIPdcOP-hny^i4;< z*0ymGo5>kU0C-9z-@#(l4TOI&b0YvcWr1T#&aynbyF(M#?l^Wu%hEQp26ur$g$0zI zv!K*zK6B^ks@y2|KBoq6Zp9XK0BN7^AVss&i+&h z^IvAjU#Gm{NuaND9)A7ytS#NzA(aQ+VNU`u+#=Q@o!)HgFdu;1PEIm+9wt@j?ag-y|F+ba2mJOl2l(vk-6)?47j2lYi&Ts*ZMx$ts}lBL!%3hifsP)Pt5 zYz@t4r^BiCoDUVW_txT#U!BOVyB6>%kEZi=-KFxgw78p@vKhs|Bzc<@kAKGp>e#kZ zg`(3L&D|oYZd=X_kX+{@KJE6u+BA?e*@0EYY!WU?ZZ$H=cLv-7Ce^2lcR;}!&Az0| zQO7Gcx{XU20*Nm_S!jZHFYsT~Ai3+_{Ft|Mh?i_K(FL{YJ947c@kU#Q1 z9eW41qkOq=(H^2}dZnRdF9FDJDgvu@<5N_xPQOR#9-+xvr}jxt?312K$75qCVh}}d zZ)>}~@_5kc1A(Pru{ZVLH;Y(%YN={n5WKg7f%hu$j8c~{!e>Znv8koT>b(J1l<|=g zg!wa+)u>qOFSeb7twdR$G$TqT=@VV+{{_KfC#SaVQkj~>84?m@D;6 zbcR1r^(-cl;5APx8`M=QiQO`>>;hRj4yxcIUca~IPTqst#K->1Pl`?)GSw+! zd$Kr-fD8Rc8wzq4Q2ispcgo zMvK7{i}-_gZ;fYPTMde_-I;J})XWrQ<^_f14*S(Md*PkU#h$|9jgfF%6*#Gu0ikDx zX59r<__MwAvGkCN?6O1IOqmgfREte&^x+^{{*8 z1uxj-wCw@HbH^gArEzXxzG1yL!Xe&Ul1LSkCN%O!f6(t;ihLK_S!IFPvx=pUB%VSw zzYfJ%X|c5UV9-3+IGn^Akvh^A^+0_;CPk^7l;g5|jPFsAP9ibPZ_2251hk$yB;32k zGrYaPFQMq^0pals5DX#_p7AscVv>!DNBRRri)IL-jH9sx*ErkU_8p+pea!5ZLrRA_ z62ERlEn00k*I(MG|C@8O+RmcC93CE(&z`bgV_xTXWutjGN0 zbCwxftsU5h8tmjruAn-)f4hWA?t9J7g*dl6)>4;Me_j=7)hg;tCP4LY15M7RP3lrN zf(H_eLZPyit6)x|ctau_bpxY&GZ6C;bu5YEdSD(oRUq4e17;POK0Tu-Rjpxy+^>S? ziA97SjlfDcjB@-LF3daEzii8d6OAAnV(&^tvj$ymSKe>r=HjNvA z6Xgo_BDJUqnoJeb077FubLy;`4KS@l_cQojuIak_;r%9#sstos9{!jK{P=FgO@Ja1=yk42JmSsQiWtt8D^VTGI{ZEDyT-O?EkBRguC%A+P!zOY@9cWv#~Id`GWDAUM{V?oMrC~>61xTw}9^VtLG4&<)NE^#E-Dx zj{&)iWdCcPL$X80jKAz9Y&xV!mxkVOP&FL+g|3*D=sAW)DFBOUcU{zzd@11-f_sjk z_Y=sXMwWtSp{imui8L8$g7;0by9p&$jqk1`okQxgcHtW&+SBFxE@RY5C(~PRL`Md- z;u>O2NeqEytxrFQqK>3Lo&yeEmQS>a%u?kBuPe4TG&u;}dm&VMUNiaFB!7IjX+AbK+wYXPr?x=UqWAd4;ywvc0eOPZB z-~-QW9!3#PZc_PG{Mz+4g>>Zvu5ChTYW0jcGs&_+SV(2FL4i?%``OX2Y|%%WX0N^KQgQ}QzUDfkd$X8_*CZdTYF+KE6zQp zM5f%=^rNz;T#%%a+{W^vH-3-OC)_Er>`fph=TY24%D|7yI!^vRmj@kSEQ$3KHEu0# z;pWoyN|X9j!a1yQc&KhH`}EjOF=B~CKhFglB;^*r-pr+LB`TJ`F`Des&{yu}UTvxI zCbUoWnlQ)N7VGLDaNQ}5&-i1JP(gu16ia9!GU&Au{5(v70% zW}U2EtnPbl`|Bs~L&vN+WuDYiwpS343~jplfH%lFk+L9(V<>ApiyT@p9+P!huIo|e zpgBWUvBB&3yqk-)+gr2lj<{eFUEbf)f-skG7k*3C8KHT!IRGw6(il^m zeUSgnOUuCH*Nl$W(J5{Aq}3i9$!lQ@QrBT=1yrI(vQ2zZkEXRi@3?+(VzFo{E^&LY z$yq+8xG34Jrwl*R#x}88E~?<5(HGv7p)@=JS(7FzYvx*QES4n@T(`8o>%}N6P;w6aQ}+t4h&kCK={MMbUS+k+t==G5Gr9f&!%H zJ4tLtuZ#$af)*i>$OOm#$6=uo8&WtXyL(g9$%*3MEM z)SeW>nKUXO30)Djlk?3W_Lb~Nkhk9LxmGH8a?I^g#{l920ptg2-n5G;AI z-H~iS<0j|Z4b|0{8ID?N7dZP*;HXht*fb4E@nrSPnx%&iUzm5eqGcBfI{0@Xr@tg$ zUy{YwH$`~s4tR9aDq0VYa^M=?0nd*ZZ3lD=B5|dd>vspj>NE$Q1!a*3Pb%rP!I}D{ z_32iWKv(6=r{ZLAW5p&ROwTEZz*c;Q!cZ(@l2|yTh48svi>P2>Cz~=oOEZa?|*q?mg# z7@#n0q`D**b8Lficpft&p(4-UNc-vfG zz-dLTERniB)3~wBQHB| zGDe76nPXES=Bo|T3Sxsa$rwUH6wfs*HYK_^5X=XlfLgj&PXV}q; zHU`!=QgvdTcktV6U)n@wg3G#q)akyzcoAd))?%HI@{@O;?Q#r5Muh42y(MllZOEa#@nOJLCmW(p-+FIbNlKEgFJ5+JSuQY}<HVhRr;h2K!$t{PBTs2$Navm)ySBP^rjn^ zCJ`!&gh=fr8**^k{=i%PjH*$GbmA5ds^1Jsq+2PZs3kgjtc?3L|G z9CcZ#8w<14y;{!W(J^|m)DoDWn=GlxRLXmr;+0Mb0hp#qF_FDkPjV+YcZA+CjAZ#Y!*^RD=K~XmsGcXb;a$Zk0l9**DSmj$2Nw;TfIFd7H=yr>sW8z>uNW9F0w-Y~ZcbZkZEhe?c)a^;ku*lWZ`N?C$4b$ZUb zLpPHt=#6E!T7v+Z2TyUJM39m;8#y}RtWwntRAikNIf|R3yV>3iOqdUa-MrS$rmHfR zFz}4}_+(_iP)7+WR0NUBJV|E1iB4Wpv`%I|JC+|5UxKQVS>8rvu0Z`>YdHh+mimlp z{LKog3*k;9Z)aR$x4beDh1OP2#5OiaZ510d(kBA$o079QgBfg!zKPm3&A!W3O*XX; z6J_p+9L}OSSz+||Q0$Lf;W%gc(M@7;}`Xn1ndC$)+_ zD6buv8xN|J!)ehU%98LTVGEVHnomLL-k4hYgz90EwQ!*j# zu*b}0o#d0jQx59MzfIX`;avbuk~Aq5x@~X7 zV{VDOFac~!Z-f2mB!dIvmR1zATLT0V9`6X3hJM@1_H-XB4qaM(>}EX3jL+xA73=s2 za)tj-sYKiou^<|;k7_$YaoWto?AMPVv;K3?0O};x{Pe+aB0c8CX`;os3U#30@MYdNY`L|!oetWDxSHT4-ASCE7P5u4%fBwfm@9YXG zu_gz8CI8+JGvw<%|K&#LS&vy;JPSjAyXxN`*Y z8`HUee7^s=A~okR>%_6H*};FkqVY30?|7V7PW;Ql7ms*HM3_X4-p~^M*DLx`QsnSS z)ffHaqkY?1lr!Lh@2rY_PW|f@d0^kF9P4=fmofa?GkSQ_P~@mAO*_v2>lNWG_IJ{W zZ2aryrq~D<^e)=s3j5b9RuU6yGDI2a{OhY`SBLGiF}ttg@VAHl%j^5|0u6NVuK$}{ z|4puMbIIfXk;x^VOMvv7#kXb`1pt6iWaF6n)4f@7FM$?&KfTs*4+l|5RIUx}ouO0tI8b=5 z2b-r|Q|rop>cGIb({nafIQiRjg}jDIbU_?21kupC@rx8$tUTHFhaHg z3j|pJgk?Z>O_LQkcI#&wKmf8iPi@Rjbp0;=noFz6NNl6y#ZjOQY?y$z#yB)NQh@HG zHqKz{(+oBh({`mqwC|y?SZvU>l1G6nM7*IVz!d!9FKwHhj@@^wE1*Bu44LL+w`Hsyba`pbvxqKA1$Ux0(>2J_4eo%ikvtTfEoszg$+^4X zC-aX3GMTnLKiizeYY9%WBy?1$6HLqNg84by(Z-Wn`Sm^cbVvKUEk&_m zq}y61Yw^Z2`2VaQB%pgGI&-K2?jXhDSTZ#c`%u8OApdz(&>&Bp0-? zaSwc*43M@;WiFtSk;sEq;5S!idYXY=5LV02u-XqFu4v6Q}+N0b_;G}VeQ8V@Sl_GZ1JFFpv@CKToYX961Jc3$a zt(0xd-(FuBW*gx{FI1nBZB+;t6{#2kdxGoxnCuh<0i2QPt*4!E=_MA%hI4q~eWf$N zfBeg1%Y{*5Th?2?lkAqMT=)yd4H1JlHJ#gN!c4twkaF^qrY-sost?{mR)XNbqr*)= zUJoxGe*4oW*aJ^+(E6|zfrq9p@X6LcWej*R&}diri0!P`k3%uOx^=o>u})1~(BR|q zCGf;BM5O}kYNS%w2`)2B0m-h>27OTN7b9iJx1S8G^$@h|&dGqbm$4vS;elGVmf9_( zUCtfq5NNZgQ(Z)MaTb7?^mXGQapV%s&yJjL0)#eT`C@A#jM{w58L&8U>bMJqZPnx< z=_hEUkwB!`0Xaro0<_kU0g0bx-UJ4lwoI#iPmg3H&KdW&0AzPQdib#%v!13~ZA4Lg z95FAP$(ua)l=!C4FKuzeTVRXxyl^$uAAJTrE~~@-#3H5iR}+w6vPskdvqqRyOaDoK z!He@=r-}fZOrJ(>H5U4j=A>91D9s12muMJ-Q=~MAM*IC>NoM4z?|@Tw`)!{o;dw!I z(8`idrcu|<`4cBBme{Y&4J-?mrx|`q(-kNKF{}&iimzTMPzwW!fVUD;;X@lsoQ1R% zE8EcirOFjn!ZseLR#D?XF?4nY-1+=-AOoID%xqOB3ZZM__saLZ zsOk^jD8moZQW8jAWe5lYG9P*%kyuXuRyP#Y1EC=<+ZM<)uT!qL?QHaMPtkJI+xEWr zC9_0Aa|qf11%$G(J3)V1o!NAx>oC`Tjm2NgGjS>%!nvu8xIFsZ5&qkUhP$xh9YS2j zWdw7?l@%))u{aIo2%79DKS6c|x9odbpT+1cU>Yb;o@{Lqbesvvf^~K#!}p@rVk!wApv3T+v{aBdbHGuP@=iU^PA11w#MVH z>Ns3U8D7udhJi@7$G%}$fli&DysVS#S*?CPmhupL&RD)ZsG26eY@OMD8#!Oz==)Vm zG!HJ%I|D7V14B$x54C~`E80L%{rXNVL!FOwa_|b{DsA!F74MRTS4#5LUd+%2jj0&~ zbWO001%n1kEe&1N(7rfQWr7(69|yLIs4SYrHn)YB;n#WI+eoS_Q?#{$@k~HrCh#3Q z`BHxx*BU>Dh3Rmw*)I1SQJ%wekQ=n$3)FN~E<{d`4(n2$HWTGI6)VanDMfltjF1n9 zFxD!VyFN@r$o;K|LWlrQV(~V991bZ9mFOdvOoeZc4G^%3IdNaP4e=X5V&rX4FoL|P|leC z>@?ovk#!O>R5QoR?!*_wb)n=c3#^8_Sw_llz~LqC%W34e@Mdw-@5KdM73F>@bkzf2 z#_^?Q1%)bRch@{f*cWl*;JG8y2a#V>^{McXX`OpfV^{i$(CN{{x=_g1x);kcT1$S& zwpj}5YoiOOu%D-<7D&=|$I{b}!Z=6#0Lvy+3`K=XV4b{7${h)M@euI_n1H@-LJ|9o~aI0O}O2I1*e5C zWvN4SJnoZ*DBF)xU3Y>lZazwKGW+bbsBfOpDAn-^*tZvZ;AkF)YkcZkxc<{%$=H5{ zOy$KlFMz$aIazqlhP?!GtY^W=B?Dg0oqz~rQ^dnA7y{ePErB&y*A*9lFS!KmDq@f` zKnq$XcWm$wT8nC0DVMrUo9W0>z8bN3NXB=yipfz^5Zb&qy<$^pf@U1Sh^ggm^rLjj zb}65Ab%c&Ml20AR;M}{p2mJItk32<8wVL5sL!k|QHx-Muu-VUFc`J?LKxe08$@=~a zktIA;j4zoiI?@b1G0mHEJX5n!MH{jM@pmj}!p~}KAxE;F8DS#OxUU+8+N*fqPj?mq z3TQLA+uTDW{+vog=5?HaZwhZ&+Z#!~vIbYd|zAu|b^t zZ4mu@y?g{E0S`ucv*Wb8-AwmI`|+j|8}q80d(Ir4f0%jC_-jCkpP-<~Y2Ew9;&0hT#O0FbWhWSEeik_VaSMt?fQh(rX#6WeAs%rVV1+V0kDu-n zUr+C0K%+ior=9rQfw>zi|M5WvHnIP1YcIk7)zK1vy}+OOzXLBGy+6TqXX}F1_+W~HoxG1vMI&92agh(qoG2M z@>+Rz*ML*aF5IeamPkd8BsfghbO#m;$6t&x%eED-xT>q6)YRpD=9Z&^&3_j?@0{O~ z-PJifmDb5;i+zC85!n!W5pZs>^V-2?u zK#gd+&l1qe>6O-Tfo}_34SrEuGucl_oN>cr1Iw=NzVZP*J{>Jf-%=iiDnG!S*}>Nl zB`PMJYq%gg9umte?}I7p#b?AhZw=IK#8_Z3=DgqEL?S0>Fk6d$srw(0*7%BtP)yMa zx21M8uS({MR=!JTg4NCi-O!`)i|V0GEuORQ*--wjIei6PvnZk%TG0(-ly1I2Xv*@M z>oR?Kcql)|R{i1C*CG7ux2jY;j~wVfT;o0cYo7Mq%F`>v|bJ@FMpYKRM1eVCD$nA)W|%iwb`vdu7Ikle=HQH#7i|#j>T`M?`KXZ$~F8x zew^$OXWXzn^~apCkk)m;=_vMy+1fad)v}r3T}Yd{D}2)Gma!OZI?d(R28a0=gB%zx zoFNT4gRbjZqIf6jckJD-wbP>#PCe_nh<1IM*m^IFr4awVxpEpsU1J%% zJsBy~^b8}WFf!d8dlZ(%iu_@|b^)EtPTS8N>IL;N=#6Nf6+r>}ctLl$L=Bu~YL#yX zn?*yEk>E!4W0GLu&5;(n)upzk-iQ2b35(z3G;vwdH|3ep6`{$s#L8uiNg$t*2hD;# zm}8i7g+@UuCLu@5^V@<=&IAY*dxe%ge0wRjS^Y|}a6uhze0+F?xHRYSC~Qw>Q)N_;%U!eZAo5 zdaG3Q#Ho9UzSYhIgo1DGU(^(8C$qmuNZi6c7y8&rfn24wCn$Su=i%&3iV?oQl64Vf zC{nMPahA!w&(}o0@p&;%)kOHJn6Uk90p4mWDsQe=>d3}Fr)O}$cB-r8=Z=&wDVptY)?CAc-3{PwmV zF1Ys|Pp@|3mTl{jL_58eA4AR!H9a$PhKCGQ5F%0xt-;9!@-COqV2^~12kfp zhYuY~Iq3l%pkjdl6hr*-I58HBBpc(?*?sZ|HppO}aw!XRH&$WLJ3Rn;4!-mvXVz|G zDNu;GMx>2i#vw6lH1OgxuK9Oq?lbe-&dQwa&rB8xmUmk7%P?L~b3R`wnrg);`F*$D zA!sXHajm{``4&FDHj7P7HQbZ3uuawl#n8HHrKF9Sr{D>_ak^<*nO{s8T$4t|tTgZkrR+^VM`vOv-6^RzDtY*(8il6S zd5f`9--fM0l!!)U>&;A(Nphgw_CrbOXphOIGis`Rp5;=0*Bq~-qf@##WZ>SLhJ8gZq}t4vMm zT~)Nr8#%q3olIZvkI%J=iRMtHa%QrP;{y(kSi=a)HpR_-6y2QmPQQwZ8rOBHoL^zy z*f?10f~q;AemRE4S3gegJD?|Swx3v2L$=px|0|Y;c+;z~FfBy4hM0FgVl>T2HN#yO zsxu&cqbh&B0{EWw7wE1YE4DrF9}hIC@x$S3m-W!|K5z8Tjg*D(S$xHQ>A_aN(=vZr zh2g;(l6N7Pa3?5Knm_)|>O=lJbPcYx14~fDQPHu8hcdlBo{+a)WSCjI|I5Lvld$$o zXGb}p!)*wHa2xnMW^%X%8`qL*!+a%3vYL6@G+*A{ZbZzf6G2Y3KEt-+4xLDEe)c)C z*qa0?ze$uYpA5*_lIIJ6SLGN4tu4X5tuSqxWFNkm7D2D^qhdR6wX8H9dyhg-b*l1u zNczG$coiTEM*!IlUbj)9zG{B#eC|a?a4qSvgUlti`sFDj>S)lr)p-SMm+TXLex#-S z_g@pvtfn6dj|Q_1{z=)8lOt3`&{aA8e5H{c-1q5?sd@c}bAHT>A4L4?d-=M|U;au) zuRO{Vge|_?oihqnCDlcaTN|qiVC`Y(%`B9FnpRyNcHM{7xvFWToLO~t;I7}=_CZF0 zv(tH#NtxSY@9;br?wytODuxTste1zreBvpvW?aG%W`%>%7HI>^q=R9*`r&fQvV~{UnHLt?w$7OaGPG+B%LM$Hm{U1`wD04)COg|3f zOl{7Fr%}V@`>V1lIK8eS26oNJXsY+q&uY1EEvqTgZd}e`xKs}vZ(oGYK4jk1^_ITt zqYv4NVP?s)&JJGHA&fY91=e8#JAa>5M;ay)gDGn#R`3TG8&`YZdde`VdqR*Yohk9| z&vy2a=_S7O_`s2yhd|5g4DR7~B8{dFqo4NkN??h1MAxeo?p(5&pGO)lQ27&Qvc5^| zJ)TjUoGW0B28cCn8Pvk^z?4R{j=J`pO*oo2JUd*!&V$|8Mt1jE#451(+9qrE}-Mb;_!(~6Cuofc7)y)9g$_cqT!UU z+=n@Is>zExZEctN%eLS6^WmvEi|gl|d}oaa%XuC-c0Vjg92a_HrL@V|6%J^fS_Jc? zKG$eYc5?ByGlB=DMOI+lxqViX$Csxt6RjF2+k_oeUs^#lS`0YteU-CAiZNtc36*&*HM=u(^ zM=`!E0o-7>L{+N!C>8;^RVW1j+M$ZnC$v-5yn7{!i~U|O<_fPRG?z?MJWtS{Qz!fg zJIyFJPIsyM#B0qLL^e>5bLj-RT@(0pohv5Zc^9;@TD*f61d(ide^QnxF0-g8JRojm z6C8?y-bo0Q^{<&DxOI*EVN}a-26R_28o2W)1R9Q8&}>(&9%I)AaH0+=PqpBkOp~@N zomkC%*%uI;n2cFec%$xe#UwoYD>VOL6%hawXGRa1b)UqP4hhkS?Gf0VD{ro3unKu6 z!-r`Y+D9~B*nQiFa{@K)yz{v_K1Q$GbV^)ArIKf;otYu^ipWYD+wObNpm?(|105gf zTGAb>Z8WrV)_rN4A;PB06L_!MmoXU;6x+vU{^eVee}9k19bgOaolhx0Y)s-2r|Bzx z%Iiqt(VWUWVnNnd-jULuOyEi6^Pql`hG`!16G}QeW&TL-2AU2RNBO1VB4`>W&s=^M zd4I8=pPfd(z0;WInbm<+=$-rK43+mBn?!xVm8*=L67Ou(rx*gV?}iXl`8=lfo8u%H zaE%+@yqDc=BTJJdC9wIn-u0wT=<(~@AEiZKkOjB`!t;JIDW3~boO!M?Y#hh0WG15% z-#29?>GMVFcRwaqCSza>D4h?BP$1EQUL1~j8^d@ZJ*8}YC>L?&0E?kT%c>)-f%lsMLB^f~7$o!oFcMC;~HI)dsL zB*m(n7ILK+=yUj%(r+q-Po#4t8zfDKRl1g}8x^nR)OPf(J!@+{KILD+Tg2^a;&hb> zm2`tmv-`MR?ZdXgW&6Ug?cN7@d?s@n%@}r4w~bAGvfe(wKcgCttmAX*n1-aA1Z{>` zl^8>m*d0#G>BzF>Lh4V=COZWjobf?ktX3Q3OaUuL(ykSaeJ{a@W09D{xA*D(SKJf< z_B_8?5&GR&KZ1MTczpAjlMKL;Th6Gnb#Kp~>Jl6Ac_y9|Lt`r~RKh_5&iF927JeB0CR2%~?`9=U;K8}ZG>#ScYJDe8<|-0B&pD_HT0 z&B6((I-eQnaY>EE#2>uNJMR@oauU>gWe`gQck&z^tgoFhIS{X*M7j}|<~PY{$=TQ!ciO+c5o+D(_1d?pC_Xk07FK4gQC@a6 zx@|nTR(k0(6C-MR9_{Uo@yf{cq2)E;-`Fk3*eQBAz79~yt~9jFsdIO0=%nFxxq`E! zi4}I0cGfQ~-sxsScjq|vEoE9bTKM$fPVG)W5-Ok;^~*U{Pb(dhs3g{m!f=yo>I)1Q z^Sn1fs}o*nJPK#@RB8-b|7c4=g=WYNkJqY+m3ZR&QO@VQM0~vq;y(CN@DaR2=m-on zS=|$@o5FWP;_Nt&st9-;_FF$6_3lFPcDrbCAaQgX)zyj(%ACp-R;gzn6>#kJuwUD{ zcsV`lu5GmG!@H@_H^1HtvF~Xnp2zM>S}&??>?6+9j~jZ!!0&dwfsqruT++^snEI9o zW9~#%tg>JW);&WywQ04fQFI}I*J!%KN(bqYIBhrUIV}0SP$HLS|uKL%obe6^9WzcQqr%rB`#yw+08f)CEtc z5Pcv4RAcg@YWMG@4?kT6&ja35mm`^cU( zDcrDQ(O?yN)TA+g_Eo-9Vb)|a4MgwQY%m8^)ga|Pt|03Nd(7!cg5b!)Ui_XwS zi3R#HV`=>B&Mg)?Hka6MZ|$g9)DE;Mh=t4qt(Zn?P}1!fL&^|?Zsq<9kYI)c6&nWy z#5~Rsy?by$0t%3e;p6eKVKrXsz5_~+Ax})6J0Z`nTXKIYVP32Q!Y{7$eLKBp%9@Fl z^=}On1f|?ds=gmJVk$R4CwkX{XKDdqqud!c)feR;n^x>@&f&kSU>0o4 z?^Ry+c%D;K0b(*t6dd!jpRb(?eMRFnk?t(i{_w z*yb@o^lun$XP+5(Av=#)En_iV_-@kNEV;b-gDe{bVs*5x~98u{9rHMA9>^ygb{Z zRE0ifA*LHuCdj=T)e&b9dAP@tSwx<~1BEn{V7)t<=asc2R%7V5a;!wBG3D)6z6%o& zX9tq$F-EH1{q%UBpPr}wSpOT@^c)ht2OsFR`MvUdNeYQIhPY2pcD=iOe#Fh!nxFlM zzI+?8>|)Vql~3{5GevfFJ%Pr#|*ClzFN`ttjkkIyD5@mUa=2A4dGPb|bOvqHgNFU>hB2UNgoa1$Vp>Ux@Wl0oA^p zh=&JjR1o$?2gQeqS?MeN@bPt`VE_GJ(lDeyz+Sbu&vGv+>T ztxMUBbcg%oa zHxgHdm`CH}w$YdHG4uhp?!eBTW*ymL*R-X5nL6z@nu7N(kMFo=MT<_7?gpubq%Fl$ z32B9zA|5K#PfY8GnOG@&Ynmbc<_k_vX9-0Lv`stPvpX^1%wuSK*%IoMCeRs44Q2Ys zpXZVG0gWJ4Hkxo&iI%vt&s2m%tj{>k_KF~N^U}raN}dI1J)U#sqqm;tqFH?(hnwGG zg>c$xx2;0n+MrK*t^t3yb@`buKBlE{IZWs8T<7DyGw%i&y8>lG3dXhIkUF3<`<=reP0k0Qu(20*Ja z7YU;in(+L^>vAe6CJ*$16O6ci=Jk)#O-Kwnp%vd|bAX`;TuKbZRGu&&L3}DY9NE0G z{GMO*`s~-wAAUZ!`yu&QFDuho^K`o*2JTn+vT9uwkRj}r?8P?@(=}V^Ru{z8*N6Aq z;TjB2j{!(Ok3SKEZ`A7*6>;ubdW%7}mp|WAL?X!rbhWHT;mxh%4VMVLvBEw&ZL14_ zA-s|oUH@_>L#yE4U2i>a{r2`a=N?mRViWkV-ZHZ{)yB~e7%11MSUC|h=xJylxrGk4 z2?V>S;CHuq)E`Awl<$QJ4#~ZI6{GESha%!H$FKSgs14D9WocD2ZPA=3ZbZ!|(oaEP z;E{RzP#lTx92bVz1xOo3OVQlCm|1WcX|~a4ifZD)9~rPY(8bWkD0#6eCGW1*-D$Z- zdc4}xlx^Ga4NV$)Dcz$1kvFE*Eq$C!K(<$MM%Yhgm`+N_>$RWaxfv72^q5x7t*w?= z(E#Wi=RYM)Jm2BX%v1nwT;m^E{jWng-bhX>el_n+@-mVujHvmo|1t}u?=yCOGP44! zs>OI*OO*7MWZhS+xiM3ta6_r<;N1j)nB8FnOs_IQM^LWvm1Cd$YVEzKYg~7rxYe|P zVO|{Z-}w+@&%B+B>0fP;o=NC*G}IeX@aq&rr(*I@yKv^QhCrfL41G+BsQZe=r?z)i zgcB!_!tZ62(e@K3?kI_~Wxks?`UZq1aZmX&?tZ>;r0wWpkks=|l}?b3zVeK?VWA;! zXs{$Sqjf-!q3sZL_HYKVX8AG9Ifiqi<`+ke>nx62`${X{Zl$@*hg)Y@P2BHboxSE-bo|XMG`mttO>zh!em%60LXSrBDgR25=-kLFyP9&x zSIQ&_4o&A&>@XyG?gDPNJ2Q`rdT~ZE@Ug&AlTPx%Uwg1#a-B6s_K6tt2mhxF(wi>1 zsXLaItv=S)5N5WpSbt%1muaTi-l*?LH92tJwNaZnQ9qftSj46Jo!y!Rs=0MjN4GP2 zqA$2@#{Duz)W}>;+G(q2ef-gerOYgshWfn?{b2LAw|iB7Kp8b?p`zb9`+S?yn8m|w z3vWmrYQbjiJ8(bh_IZg!I`6D*nl=iQ->_HW-EO)%-W3ynJ+mdTvf?;9i>JkF7H}Nl zsRQ1UP3sUQlI_R=0q`s|#yp3l(ZU&!ozhQ4qTG$s2ng&#j_VeEq* zqAP3lBI)%1b44{c5Q=798+VQ4E)qEzPH(c!ln=LDUfx_eE#jmHXmq1m}(FK6_OaB6uJB7rLZOP9iYme&kD> zammBqDh;I)+WCCIQ$IY;+*kj5v3^>oUs94^cG8ZGsb}oP=uuf&tdyO})!;1aOL+sn zv@#ANy6wfWPuSGdEcCXUDo}cpeN7=1pkeK>8v1?w%d`XcnI8zU5s46=b>W$s#0aQQ zTZ2zoEH){R9he0gCZFH%m;iQ}C{FbHdV~|aibn9`N1<8?652x9nmp|o{X+1@z)0bk5T-D13daMKHniSt6% z44g7t_SYrnd%cI%49(^nD&f#Rj&|%0iys(D`yw*;otY9bO!#@A)26kqr4sp2X?gXA zBf@Gmud5-}fMyX&OMb5ji7!Npe@?Xrcx5~iv#u3eoPDfTtKhVdYq7oa`%;mO_xn-q zm$JGd^i0H8kIFfzR~?7h983#VyTQd*1h3u~KTP5}y{*xtpKkPu@vcFi+qh8IY#1Ll zsLfu^Vt8XVRw%YGsLlmHu(Z;2!c%TY+NH10sShJ2dyq2$yM0>?C!Bnv1OFw2pVVqv zec7mfp$3&auaX2C}cLV_8a>oB)@0 z6mK+^SqolbB-+?eC`<*XL~|%V;|oZFO*(C$4qhTCl1_QE7ZYS{H~TW%*tAhAlT5!Jkm0$Ww!6QH zNAMEnWmH}ZefjO&_1Q$h`o zV=yUpa?>2Ba;julk?7eZjCbPEtV+CeZxD?Fndzk6%yDar=OLlH(QA-I#7uQp(BK)r z|K(~ooFr1@9vP_X4PW1oieJ(r{_vg}TeyU#;>;J4>SZllNFwBqvH`>Ho+M{o!61%w3mWxcS z0y<`)`+oe34qUni+Z^0}u`eDV7_qj<2^IOajG5HHxRhyqCXbJRu!i~xd&{--*x1q0 zdU>Au$$}F;N(ash=NN@&+)XYrxtc86F?p+X_sNNs^T4!GW`{7x?OR6v?HR;*J(5t8 zqzdi2LsK`VIeos@eu$M1$DwcgnKG#Vw#y0l#}6JiVOGUIKJoWI{nz*U3Ml%V!8J&V z@+|=ThYzQz!M@4)7OaxL{_nqhRlEacZCbqf)qnfap8sy^kD>l=wEmnX|3Azv53XpR zKw^qGt~t<<7Wd<2hv+Y|nA=~1)7R(IPn zlhh)v1S+BodDyMpmE0Lw0({C&y=42{>-{)#i2 z>mfMC0t*(u9sIl3|M5e^3_@4hrpep$ultd@EW||W3w8glMa`#$D{g3v5&U?C|Jj@1 zA%P!ME%fgK(rInD;*3=!>A!4$fP-ZMmGHj-Lngw11GYO;{+nUn_9pTFPnKj}#s-J= zUP5+dT@WyufWNj$e~CxDQY`O|!)<73G!E{ab?*;Cx4M>M_ZKe3-^+}`;@QuJJ+zqQa$@hNCTE?>*OyKcgRK8bW1IO zE0fr^&1acY0z%91qfiB%+JneI5s;4F?X1gBc5#n8kgV{rCP^MPX7>Q$>-j79=q{Np z)1Zm(IIuN^Qh_afscSozL7{OfU-!3&$YMm{TEG9u_J-wtVE?wQDAhe!lN zSNhy{5b<6H@NW$#5jMOXBC`dGQEaok5a-q)ZShqE|Hx!Tt=v||ww|)~t!WiDPc+YM z&Bd=hlOCfFAA;7z8S{ttWa8P!y`wv8&H1VJEDl_sE~(nWgjNJo%f1f&RrUP2e7 zNhmg&GzCRKs`MgAN2-E!1VRbY2_f`y=6d$KpYPkx*7Ke7_lz?JKQb6-lC|cV^S-b9 zD)ImMzJFJ^uYmTA>&(~dgho17LYlx(QDV92_w` zo$|`J8UjdKITW1qq1<=GXrdGt1@ZttV^QP#;;)>rg7N#Jw}P|c=`%He`bPo)nxm3? z^`jv{e}DG>dXYz*<5Fkt(hVmbht9J2~wR~%gK!$ES`1I0l^H{&?)1~2=1J>^}FqB!ti(-+$T_Gmkf z2N1Fz0N78t*b%<<6-d?sx$$}c5A}iybvh_ot9Phf0HRraM3iPz^NFuc9dB2901o6k z9)C26Ct0O`7gy!Gov9$H7)CKc;7%<>pI5z)WrH>R?=n+_H((b$%*LAOGPO@+X+IKo zo9kGrP2_C&ogUWa@{T3YR9_p%kf7n*Xlf@gPS^K^m`K1iKe-283rG<*rvr|wiKl*< z*D(*)yGmu6XB@5AmZEcUvqM`ZQ+`bCcKMqA_1sm{A^Boc0HD_a^h~{FBmY?EDs=b? zKZBQR4Brng{{$)QQ_Y9RA6K`6I4rAvL4&~2dI0pOf$RZwh$o2&09>}$8k-VZIUtvG& z9YDxPR|uHRRn&suEQblm6xA>T=**utU6E}BGo%W;@0pxA0g#4`m_7AbPi;zr{-Hkz z@w90~lsqCF#lrf|kO^O51U{>VR}AXR{h1(t<}zHb*awIEtmKb@ zgoE#ZkhTQr=?mWblM>+(yhibj$!7_`(YYymTs7RvRd0^IEaw(+7rRh}6f637oBxly zBV7WtEC$UEfEDtfcC|tkPN6_|>8)9)x3Oc1!V|yC_mi~;FU#n5A6<@r0$(%rnU6PY zeW+`+2E=+dWjkkR1|OF=mx29SoP;gwlYnfVuvs1R{ctFpcmQOsjYEV^$MIhdb+M0QDNKv0&a^K8w6lR1 zuMKq`TFZF)b%uCIKYy<f4Ct{-snC|j*TuRZ+M30^fpACDu~+2 zGV%l#<%SZ7zBifBeulKQsT-wp}Xb54(7XC@oZvjiDN*+SvwPs_GEK zO0W75(8c&kPGBDqpz;B^f0CDdVH$fL5dB1~H-}Gi8LHxHAAuaRSZ-8mvyM_ir z|AdA#5rr#st5(bh28|pER(9iby~3E)m@h)I!;pAifDD-UzriNoNT2dP+{GH6#X

Ho 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