ࡱ>  ~7 .bjbjUU %@7|7|.l>>>>>>>Rwwww4wRpy:yyyyyyy$ 5~>yyyyyB>>yyBBBy,D>y>yByB\B>>ydy f_fRRuwֽl0BBRR>>>>ntsSync Concepts The ntsSync Manager program allows a developer to create one DLL that will sync PDB data on both a Palm and a Pocket PC. It will also allow the developer to create PDB files on the PC for other specific types of devices. All Application conduits will have a Unique Application Id, or AppId, that ntsSync will use to help store and handle information regarding the DLL supplied. Each DLL must implement ISyncNotify, and register the full windows ClassId with ntsSync. To register with a conduit with ntsSync, just add the AppId to the ntsSync.ini file (See .INI file), or use Tools | Edit ntsSync.ini. Once this is done, then the developer can start the ntsSync Manager and Install the conduit into HotSync and/or ActiveSync. The Developer can also create PDB files from within this ntsSync Manager.  EMBED PBrush  Right-Click on the Registered Conduit to configure or Install/Uninstall information about this Application Conduit:  EMBED PBrush  You can also control the ntsSync Manager, like Install/Uninstall, from the command line (See Command Line Switches). ntsSync Register Conduit To register a conduit, you will need to do 2 things. Add an entry into ntsSync.ini, and place your conduit code in the ntsSync Folder, under a subfolder with the same name as the AppId:  EMBED PBrush  ntsSync .INI File [ApplicaitonId] ClassId =Dll.Class CEPath = Path on the CE device that files can be found in. This is used when the database type is ActiveSync. It allows the users to not have to supply a full path to save the files in. PCPath = Path on the PC where file can be found. This is used when the database type is PC. They allows the users to not have to supply a full path name to save the files in ShowLog = 1/0 - Show a log windows during the Sync process. This will show any messages that are sent to the log by the Conduit PCInstall = The PPC Cab files to install for this Application. PalmInstall = The PRC file for the Palm install Example: [InvCount] ClassId=InvConduit.CSyncNotify CEPath=\Program Files\InventoryCount\ PPCInstall=InventoryCount_Intermec.ARM.CAB PalmInstall=InventoryCount-Install.prc ntsSync Command Line Switches -AppId {Registered Application Name} -Database {type of database the program is create data for} 0- Palm HotSync 1- Palm VFS (Saves PDB files to PC) 2- Pocket PC (Saves PDB files to PC) 3- Symbian (Saves PDB files to PC) 4- Windows PC 5- ActiveSync -Install -Uninstall ntsSync Interface Definition Interfaces This section lists the Classes exposed by ntsSync. For each class, the methods and events are listed. cConduitList This class returns information about all the conduits that are registered with the ntsSync Manager. Methods Property Get FileName() As String Full Path location for the ntsSync .INI Function FindAppId(ByVal sAppId As String) As Integer Returns the Index value that this AppId is located in. Function FindAppIdFromCreatorId(ByVal sCreatorId As String) As Integer Returns the Index value of the Application that uses this CreatorId. Property Get Count() As Integer Number of conduits registered with ntsSync Property Get AppId(ByVal Index As Integer) As String Application Id is similar to the the Palm Creator Id. It is Uniqnue Name for your conduit dll that ntsSync will use as a key to pull information from. Property Get ApplicationName(ByVal Index As Integer) As String Application Name is a description of your Conduit for the end users. Property Get Author(ByVal Index As Integer) As String Author is the company or person that created the Conduit. Property Get ClassId(ByVal Index As Integer) As String This is the full windows class name that has implemented the ISyncNotify Property Get CreatorId(ByVal Index As Integer) As String Palm CreatorId. All Conduits must have a creator id supplied in order to create pdb files correctly. Property Get Icon(ByVal Index As Integer) As String Path Name to the Icon File to display on the setup screen and the status screen. Property Get PPCInstall(ByVal Index As Integer) As String The name of the PocketPC CAB files found in the path AppId path. Property Get PalmInstall(ByVal Index As Integer) As String The name of the install PRC file found in the path AppId path. Property Get CePath(ByVal Index As Integer) As String Path on the CE device that files can be found in. This is used when syncing through ActiveSync. It allows the developers to not have to supply a full path to save the files in. Property Get PCPath(ByVal Index As Integer) As String Path on the PC where the PDB will be placed. This is only valid if the ntsSync program is created PDB Fiels to the PC. Property Get ShowLogMsg(ByVal Index As Integer) As Boolean Show a run-time log window while the conduit runs. This window will display any message sent to the UpdateLog method. Events None CDevice This Class contains information about the device and how ntsSync Manager is creating the information. Methods Property Get DeviceName() As String Read-Only. The name given to this device. Property Get DeviceType() As eDeviceType Type of syncing device we are working with. Property Get DeviceDateTime() As Date Read-Only. Returns the Current Date/Time on the device. Property Get SyncDateTime() As Date Read-Only. Returns the Date/Time that this conduit was last run for this Device. Function GetSettings(Section,Key,Default) as String Returns a value saved specifically for this device. This allows you to keep track of information on a Device by Device basis. Sub SaveSettings(Section,Key,Value) Saves a specific value for this device. This allows you to keep track of information on a Device by Device basis. Events None CConduitInfo This Class is used to access information about the conduit you are currently running. This includes settings saved at the conduit level and dates when the conduit was last run. Methods Property Get AppId as String Read-Only. This is the Application ID assigned to this Conduit. Property Get AppFolder as String Read-Only. This is the full path name for the folder that the ntsSync Application information is saved in. Property Get SyncDateTime as Date Read-Only. This is the Date/Time that the conduit was last run. This date is updated every time the conduit is run regardless of what device was used during syncing. If you want to know when the conduit was last run for this specific device, then use the information in the CDevice Class. Function GetSettings(Section,Key,Default) as String Allows you to retrieve information stored for general Application information. This information is accessible and shared across all devices. Sub SaveSettings(Section,Key,Value) Allows you to save information for general Application information. This information is accessible and shared across all devices. Events: None ISyncNotify This Class is used to Implement a common interface that the ntsSync Manager will use to process the conduit information. Methods Sub BeginSynchronize(ByVal oSync As oSyncInfo) This methods is called by the ntSync to start the Sync process. The oSync Object is the root object that is used to interact with the device and its files. Function GetConduitInfo(ByVal infoType As eConduitType) As String Returns information about this conduit. ctVersion - Returns the Version Number of for this application ctCreatorID - This is a 4 char creator id to be used to create the PDB files. ctAuthor - This is the name of the company or person that created this conduit ctApplicationName - Returns the name of this application ctAppPath - Returns the path to the application files ctIcon - Returns the Path name for the Icon to display. {path}\{Icon Name} Or the full path to the DLL or EXE that contains the icon. RES:{Path}\{Dll Name} Sub ConfigureConduit This Method is called when the ntsSync manager wants to display the configuration screen. Sub SynchronizeClose The ntsSync Manager is about to destory the object. Example Option Explicit Implements ISyncNotify ' -------------------------------------------------------------------------------- ' SyncNotify Methods ' -------------------------------------------------------------------------------- Private Sub ISyncNotify_BeginSynchronize(oSync As ntsSync.oSyncInfo) ' Begin processing the Sync information oSync.UpdateLog App.ProductName End Sub Private Sub ISyncNotify_ConfigureConduit() ' Configure information. End Sub Private Function ISyncNotify_GetConduitInfo(ByVal InfoType As ntsSync.eConduitType) As String ' Get information Select Case InfoType Case ctIcon ISyncNotify_GetConduitInfo = res: & App.Path &\& App.ExeName Case ctVersion ISyncNotify_GetConduitInfo = App.Major & "." & App.Minor & " Build " & App.Revision Case ctCreatorID ISyncNotify_GetConduitInfo = "ERGI" Case ctAuthor ISyncNotify_GetConduitInfo = App.CompanyName Case ctAppPath ISyncNotify_GetConduitInfo = App.Path Case ctApplicationName ISyncNotify_GetConduitInfo = App.Title Case Else ISyncNotify_GetConduitInfo = "" End Select End Function Private Sub ISyncNotify_SynchronizeClose() ' Do Nothing End Sub oSyncInfo Methods Property Get FileSystem() As _PDBFileSystem Returns the a FileSystem Object for the Device you are syncing with. Property Get ConduitInfo as _CconduitInfo Returns a Conduit Info object that you can use to access or store information for this conduit. Property Get Device() As _CDevice Returns an object describing the device you are syncing with. Property Get CancelSync() As Boolean This properies allows you to check to see if the user has pressed the Cancel button. Sub UpdateStatusMain(ByVal Value As String) Update the main label on the status screen. Sub UpdateStatusDetail(ByVal Value As String) Updates the second label on the status screen. Sub UpdateStatusMaxBar(ByVal Value As Long) Set the max value of the status screen's progress bar. Sub UpdateStatusIncrementBar(ByVal Value As Long) Increment the current value of the status progressbar by this value. Sub UpdateStatusBarValue(ByVal Value As Long) Update the current value of the Status Progress Bar. Sub UpdateLog(ByVal Value As String) Add information to the Log file. Events None PDBAppforgeDefinition Methods Property Get AppInfoBlock() As _PDBByteStream Returns a byte stream representing the PDB AppInfo Block. Property Get SortInfoBlock() As _PDBByteStream Set or Returns a byte stream for a PDB Sort Info block. Property Set SortInfoBlock() As _PDBByteStream Set or Returns a byte stream for a PDB Sort Info block. Function IsAppforgeData(ByVal oByteStream As _PDBByteStream) As Boolean Check to see if the PDB file is an Appforge Table. Function FieldCount() As Integer Returns the number of fields defined in this Appforge Table. Sub AddFieldName(ByVal sFieldName As String, ByVal iFieldType As eFieldTypes) Add a new field to the Appforge Database. Sub ClearFieldName Clear all the fields names defined in this Appforge Table. Property Get FieldName(ByVal Index As Integer) As String Returns the field name for this position. Property Let FieldName(ByVal Index As Integer, RHS As String) Returns the field name for this position. Property Get FieldType(ByVal Index As Integer) As eFieldTypes Returns the Field Type for this Position Property Let FieldType(ByVal Index As Integer, RHS As eFieldTypes) Returns the Field Type for this Position Property Get SortFieldCount() As Integer Returns the number for Sort Fields. Property Get SortFieldIndex(ByVal Index As Integer) As Integer Returns the Field Postion that the table is sorted on. Events None PDBAppforgeRecord Methods Property Get AppforgeDefinition() As _PDBAppforgeDefinition Set/Returns the Appforge Header information used to generate the record information. Property Set AppforgeDefinition() As _PDBAppforgeDefinition Set/Returns the Appforge Header information used to generate the record information. Property Get ByteStream() As _PDBByteStream Set/Returns the byte stream that makes up this record. Property Set ByteStream() As _PDBByteStream Set/Returns the byte stream that makes up this record. Function DataLength() As Long Returns the size of the record in bytes. Property Get ByteValue(ByVal Index As Integer) As Byte Set/Returns a byte value Property Let ByteValue(ByVal Index As Integer, RHS As Byte) Set/Returns a byte value Property Get BooleanValue(ByVal Index As Integer) As Boolean Returns a boolean value. Property Let BooleanValue(ByVal Index As Integer, RHS As Boolean) Returns a boolean value. Property Get IntegerValue(ByVal Index As Integer) As Integer Set/Returns a Integer value Property Let IntegerValue(ByVal Index As Integer, RHS As Integer) Set/Returns a Integer value Property Get LongValue(ByVal Index As Integer) As Long Set/Returns a long value Property Let LongValue(ByVal Index As Integer, RHS As Long) Set/Returns a long value Property Get DoubleValue(ByVal Index As Integer) As Double Set/Returns a Double value Property Let DoubleValue(ByVal Index As Integer, RHS As Double) Set/Returns a Double value Property Get CurrencyValue(ByVal Index As Integer) As Currency Set/Returns a currency value Property Let CurrencyValue(ByVal Index As Integer, RHS As Currency) Set/Returns a currency value Property Get SingleValue(ByVal Index As Integer) As Single Set/Returns a single value Property Let SingleValue(ByVal Index As Integer, RHS As Single) Set/Returns a single value Property Get DateValue(ByVal Index As Integer) As Date Set/Returns a VB Date value Property Let DateValue(ByVal Index As Integer, RHS As Date) Set/Returns a VB Date value Property Get StringValue(ByVal Index As Integer) As String Set/Returns a string Property Let StringValue(ByVal Index As Integer, RHS As String) Set/Returns a string Property Get/Let Value(ByVal Index As Integer) as Variant Sets/Returns a value using a Variant. Property Get/Let Signature(ByVal Index as Integer) as CSignature Set/Return a Signature Class. This allows you to save Signature BMP files. Events None PDBByteStream Methods Property Get GlobalByteSwap() As Boolean Return/Set the Byte Swap Paramater. If this is to be on a PalmVFS, this means it will need to be read from a PalmOS program running on the device. Because PalmOS was originally developed on Motorola 68000 family, numeric values have the Most Significant Property Let GlobalByteSwap(RHS As Boolean) Return/Set the Byte Swap Paramater. If this is to be on a PalmVFS, this means it will need to be read from a PalmOS program running on the device. Because PalmOS was originally developed on Motorola 68000 family, numeric values have the Most Significant Property Get UTF8Strings() As Boolean Set/Return if you want to encode strings using UTF-8 Property Let UTF8Strings(RHS As Boolean) Set/Return if you want to encode strings using UTF-8 Property Get DatabaseFor() As eDatabaseForType Specificies the format to use to convert the Value into bytes. Property Let DatabaseFor(RHS As eDatabaseForType) Specificies the format to use to convert the Value into bytes. Property Get ByteArray() As Variant Set/Return an array of bytes that represents this data. Property Let ByteArray(RHS As Variant) Set/Return an array of bytes that represents this data. Property Get Length() As Long Returns the number of bytes in this byte stream. Sub Resize(ByVal iLength As Long) Resize the byte stream. Sub Clear Clear the Byte Stream. Sub ByteToString(ByVal stString As String, ByVal iOffSet As Long) Creates a String based on a Null Termination Formula Sub StringToByte(ByVal stString As String, ByVal iOffSet As Long) Converts a String value into a byte array using a Null Terminated formula. Sub ByteToCString(ByVal stString As String, ByVal iOffSet As Long) Returns a String from the byte stream based on the CString formula. Sub CStringToByte(ByVal stString As String, ByVal iOffSet As Long) Convert a string into a CString formated byte stream. Sub ByteToFixString(ByVal stString As String, ByVal iOffSet As Long, ByVal iLength As Long) Returns a string from a fixed number of bytes. Sub FixStringToByte(ByVal stString As String, ByVal iOffSet As Long, ByVal iLength As Long) Convert a string into a fixed length byte array. Sub GetByte(ByVal stByte As Byte, ByVal iOffSet As Long) Returns a single byte of data Sub SetByte(ByVal stByte As Byte, ByVal iOffSet As Long) Set a byte. Sub ByteToInteger(ByVal stInteger As Integer, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Convert 2 bytes into an integer Sub IntegerToByte(ByVal stInteger As Integer, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts an Integer into 2 bytes. Sub ByteToInt24(ByVal stLong As Long, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Convert 3 bytes into a Int24 value. Sub Int24ToByte(ByVal stLong As Long, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts an Integer into 3 bytes. Sub ByteToLong(ByVal stLong As Long, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts 4 bytes into a Long Sub LongToByte(ByVal stLong As Long, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts a Long value to 4 bytes. Sub ByteToDouble(ByVal stDouble As Double, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Convert 8 bytes into a Double. Sub DoubleToByte(ByVal stDouble As Double, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts a double to 8 bytes. Sub ByteToCurrency(ByVal stCurrency As Currency, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts 8 bytes into a Currency value. Sub CurrencyToByte(ByVal stCurrency As Currency, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Convert a Currency value into 8 bytes. Sub ByteToSingle(ByVal stSingle As Single, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts 4 Bytes into a Single Sub SingleToByte(ByVal stSingle As Single, ByVal iOffSet As Long, ByVal SwapByte As Boolean) Converts a Single value to 4 bytes. Events None PDBDatabase Methods Property Get PDBFilePath() As String Set/Return the file path that the PDB file is actually located at. Property Let PDBFilePath(RHS As String) Set/Return the file path that the PDB file is actually located at. Property Get PDBDatabaseName() As String The name of the PDB Database. This value can not be more than 32 characters. Property Let PDBDatabaseName(RHS As String) The name of the PDB Database. This value can not be more than 32 characters. Property Get CreatorId() As String Returns/Sets the Creator Id for the PDB File. Property Let CreatorId(RHS As String) Returns/Sets the Creator Id for the PDB File. Property Get DatabaseFor() As eDatabaseForType Platform this database will be used on. This property is used to tell the class how to handle the Unquie Id. The UnquieID is handled differently depending on the where the database is going to be used. Function OpenDatabase() As Boolean Opens the Database. Sub CloseDatabase Closes and Saves changes to the database. Sub RemoveDatabase Deletes the database from the file device. Function CreateDatabase() As Boolean Creates a new database Sub ReadAppInfoBlock(ByVal oByteStream As _PDBByteStream) Read the PDB AppInfo Block. Sub WriteAppInfoBlock(ByVal oByteStream As _PDBByteStream) Writes a PDB AppInfo Block Sub ReadSortInfoBlock(ByVal oByteStream As _PDBByteStream) Returns the PDB Sort Info Block. Sub WriteSortInfoBlock(ByVal oByteStream As _PDBByteStream) Writes a PDB SortInfo Block Property Get IterationIndex() As Long Returns the record index that the database is current pointing to. Property Let IterationIndex(RHS As Long) Returns the record index that the database is current pointing to. Function BOF() As Boolean Returns True if at the Beginning of the file. Function EOF() As Boolean Returns True if reached the End of File. Function ReadNext(ByVal Index As Long, ByVal UniqueId As Long, ByVal Category As Integer, ByVal Attributes As eRecordAttribute, ByVal oByteStream As _PDBByteStream) As Boolean Read the next record from the file. Function ReadNextByIndex(ByVal Index As Long, ByVal UniqueId As Long, ByVal Category As Integer, ByVal Attributes As eRecordAttribute, ByVal aData As _PDBByteStream) As Boolean Read the record based on the Index value. Function ReadNextById(ByVal Index As Long, ByVal UniqueId As Long, ByVal Category As Integer, ByVal Attributes As eRecordAttribute, ByVal aData As _PDBByteStream) As Boolean Read a record by the PDB Unique ID. Function ReadNextModified(ByVal Index As Long, ByVal UniqueId As Long, ByVal Category As Integer, ByVal Attributes As eRecordAttribute, ByVal aData As _PDBByteStream) As Boolean Reads the next modified record in the database. Sub Remove(ByVal UniqueId As Long) Remove a record from the database. This is a perminate removal of the record. Sub RemoveAll Remove all the records from the database. Sub RemoveWithDeleteFlag Remove all records marked as Deleted. Sub ResetModifyFlags Reset all records marked as dirty to normal. Property Get RecordCount() As Long Returns the number of records in the database. Sub Update(ByVal Index As Long, ByVal UniqueId As Long, ByVal Category As Integer, ByVal Attributes As eRecordAttribute, ByVal oByteStream As _PDBByteStream) Update the record in the database with new information. Function CreateDateTime() As Date Returns the Date/Time the database was created. Function ModifyDateTime() As Date Returns the Date/Time the database as last modified Property Get SyncIndex as CSyncIndex This returns a SyncIndex Class. This class will help you keep track of what Palm Unique ID is associated with your Primary Key. Events None PDBFileSystem Methods Function OpenDatabase(ByVal FileName As String, ByVal oDatabase As _PDBDatabase) As Boolean Opens a database on the device. Function CreateDatabase(ByVal FileName As Variant, ByVal oDatabase As _PDBDatabase) As Boolean Creates a new Database on the Device. Function MoveDatabase(ByVal FromFileName As String, ByVal ToFileName As String) As Boolean Move a Database from one location to another on the device. Function DeleteDatabase(ByVal FileName As String) As Boolean Delete a database from the Device. Function DatabaseCount() As Long Returns the number of databases openned for this ApplicationId. Function Database(ByVal iIndex As Long) As _PDBDatabase Returns a Database object Events None PDBUtils Methods Function UnsignedToLong(ByVal Value As Double) As Long Convert an Unsigned Long into a Long value. Function LongToUnsigned(ByVal Value As Long) As Double Converts a Long to an Unsigned Long Value. Function UnsignedToInteger(ByVal Value As Long) As Integer Convert an Unsigned Integer into an Integer Function IntegerToUnsigned(ByVal Value As Integer) As Long Convert an Integer value into an Unsigned Integer. Function PalmLongToDate(ByVal d As Long) As Date Converts a Long Value into a VB Date. Function DateToPalmLong(ByVal d As Date) As Long Convert a VB Date to a Long Value Function PalmIDtoLong(ByVal PalmId As String) As Long Converts a 4 byte Palm ID into a Long. Function PalmLongtoId(ByVal PalmId As Long) As String Converts a Long value into a 4 byte String value. Function ToUTF8(ByVal UTF16 As Long)() As Byte Converts a UniCode byte into a byte array. Function ToUTF16(ByVal BArray() As Byte) As Long Converts a sets of bytes into a UniCode byte value. Function UTF8Length(ByVal stString As String) As Long Returns a the actual length of a UTF-8 Encoded string. Events None AppforgeSignature This class use used to create Signature BMP files. Property Get/Let Signature as String This property lets you set than Appforge Signature string to the class. If this class was created from an AppforgeRecord class, then this value will be supplied by the index supplied in the AppforgeRecord Class. Property Get/Let Stamp as String This information will be added to the Signature Image. Used to supply security embossing to the image so that the signature can not be used in correctly. Sub Clear Clears the content of the Signature Class Sub CreateBMP(FileName, Optional StampColor, Optional StampFontSize, Optional StampFontName, Optional BackColor, Optional SignatureColor, Optional ImageWidth, Optional ImageHeight) This method will create a BMP or JPG of the signature information and save to the file name supplied. CSyncIndex This class is used to keep track of sync information between your PC files and the PDB records. It will keep track of the Unique ID associated with your Primary Key. This process is not done automatically, you will have to manage it in your conduit code. Property Get/Let UniqueId(ByVal PrimaryKey as String) as Long Returns/Sets the UniqueID for the Primiary Key. Sub Add(ByVal PrimaryKey As String, ByVal UniqueID As Long) Add a new UniqueID to the Sync Index database. Sub Remove(PrimaryKey as String) Removes the reference to the Primary key in the Sync Index database. Sub Clear Clears all records from the Sync Index database. Sub CloseIndex Writes changes to disk. Example Application: Option Explicit Implements ISyncNotify ' -------------------------------------------------------------------------------- ' SyncNotify Methods ' -------------------------------------------------------------------------------- Private Sub ISyncNotify_BeginSynchronize(oSync As ntsSync.oSyncInfo) Dim oIniFile As New cFileIO Dim sTemp As String ' Ini Informatino Dim sFilePath As String Dim sErgosLocWin As String Dim sErgosLocDateTime As String Dim sErgosPartWin As String Dim sErgosPartDateTime As String Dim sErgosPartDetailWin As String Dim sErgosPartDetailDateTime As String Dim sErgosSummaryWin As String Dim sErgosPartOnHandWin As String Dim sErgosPartOrderWin As String Dim dDateTime As Variant Dim bUpdate As Boolean Dim bCreatePartSummary As Boolean Dim bForceUpdate As Boolean ' Begin processing the Sync information oSync.UpdateLog App.ProductName ' Check the Device Date time to see if it is less than the current time. If oSync.Device.DeviceDateTime < Now Then sTemp = "The Date/Time on the Device is less that the Date/Time on the computer." sTemp = sTemp & vbCrLf & "This will cause your files to load to the device everytime you sync the handheld." & vbCrLf & "Please make sure the Date/Time is current on both PC and Handheld." sTemp = sTemp & vbCrLf & "Device Date/Time: " & oSync.Device.DeviceDateTime sTemp = sTemp & vbCrLf & "PC Date/Time: " & Now sTemp = sTemp & vbCrLf & "Syncing will terminate" MsgBox sTemp, vbCritical Exit Sub End If ' REads the IniFile information oIniFile.FullFileName = App.Path & "\ErgosInvCount.ini" oIniFile.ReadINI "General", "FilePath", sFilePath, App.Path If Err.Number <> 0 Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - Error: " & Err.Number & " " & Err.Source & " " & Err.Description Exit Sub End If ' Get File names to save information to. oIniFile.ReadINI "OnHand", "FileName", sErgosPartOnHandWin, "PartOnHand-%username%.txt" sErgosPartOnHandWin = Replace(Replace(Replace(LCase(sErgosPartOnHandWin), "%username%", oSync.Device.DeviceName), "%filepath%", sFilePath), "%apppath%", App.Path) oIniFile.ReadINI "Order", "FileName", sErgosPartOrderWin, "PartOrder-%username%.txt" sErgosPartOrderWin = Replace(Replace(Replace(LCase(sErgosPartOrderWin), "%username%", oSync.Device.DeviceName), "%filepath%", sFilePath), "%apppath%", App.Path) ' Open the Part Detail File on the Palm, and save all the information to a Text File ' DownLoadFile sErgosPartOnHandWin, "ErgosPartDetail", oSync If oSync.CancelSync Then Exit Sub ' Download the Part Order Information ' DownLoadFile sErgosPartOrderWin, "ErgosPartOrder", oSync If oSync.CancelSync Then Exit Sub ' Delete the Part Order Information oSync.FileSystem.DeleteDatabase "ErgosPartOrder" ' Update Location oIniFile.ReadINI "LocationFile", "FileName", sErgosLocWin, "" sErgosLocWin = Replace(Replace(Replace(LCase(sErgosLocWin), "%username%", oSync.Device.DeviceName), "%filepath%", sFilePath), "%apppath%", App.Path) oIniFile.ReadINI "LocationFile", "ForceUpdate", sTemp, "0" oIniFile.WriteIni "LocationFile", "ForceUpdate", "0" If sTemp = "1" Then bForceUpdate = True Else bForceUpdate = False UploadData sErgosLocWin, "ErgosLoc", oSync, bForceUpdate If oSync.CancelSync Then Exit Sub ' Update Part File oIniFile.ReadINI "PartFile", "FileName", sErgosPartWin, "" sErgosPartWin = Replace(Replace(Replace(LCase(sErgosPartWin), "%username%", oSync.Device.DeviceName), "%filepath%", sFilePath), "%apppath%", App.Path) oIniFile.ReadINI "PartFile", "ForceUpdate", sTemp, "0" oIniFile.WriteIni "PartFile", "ForceUpdate", "0" If sTemp = "1" Then bForceUpdate = True Else bForceUpdate = False If UploadData(sErgosPartWin, "ErgosPart", oSync, bForceUpdate) Then ' Part file updated bCreatePartSummary = True End If If oSync.CancelSync Then Exit Sub ' Update Part Detail information oIniFile.ReadINI "PartDetailFile", "FileName", sErgosPartDetailWin, "" sErgosPartDetailWin = Replace(Replace(Replace(LCase(sErgosPartDetailWin), "%username%", oSync.Device.DeviceName), "%filepath%", sFilePath), "%apppath%", App.Path) oIniFile.ReadINI "PartDetailFile", "ForceUpdate", sTemp, "0" oIniFile.WriteIni "PartDetailFile", "ForceUpdate", "0" If sTemp = "1" Then bForceUpdate = True Else bForceUpdate = False If UploadData(sErgosPartDetailWin, "ErgosPartDetail", oSync, bForceUpdate) Then ' Creates a new Part Summary file. bCreatePartSummary = True End If If oSync.CancelSync Then Exit Sub ' Creates a Part Summary file based on the information supplied in Part and ' Part Detail files If bCreatePartSummary Then CreatePartSummaryFile sErgosPartWin, sErgosPartDetailWin, oSync End If Exit Sub ErrorHandler: ' Log Error oSync.UpdateLog App.ProductName & " - Error: " & Err.Number & " " & Err.Source & " " & Err.Description End Sub Private Sub ISyncNotify_ConfigureConduit() ' Configure Shell "notepad " & App.Path & "\ErgosInvCount.ini", vbNormalFocus End Sub Private Function ISyncNotify_GetConduitInfo(ByVal InfoType As ntsSync.eConduitType) As String ' Get information Select Case InfoType Case ctIcon ISyncNotify_GetConduitInfo = "InvCount.ico" Case ctVersion ISyncNotify_GetConduitInfo = App.Major & "." & App.Minor & " Build " & App.Revision Case ctCreatorID ISyncNotify_GetConduitInfo = "ERGI" Case ctAuthor ISyncNotify_GetConduitInfo = App.CompanyName Case ctAppPath ISyncNotify_GetConduitInfo = App.Path Case ctApplicationName ISyncNotify_GetConduitInfo = App.Title Case Else ISyncNotify_GetConduitInfo = "" End Select End Function Private Sub ISyncNotify_SynchronizeClose() ' Do Nothing End Sub ' -------------------------------------------------------------------------------- ' Private Methods and properties ' -------------------------------------------------------------------------------- Private Function UploadData(ByVal sFileName As String, ByVal sPalmFileName As String, ByRef oSync As oSyncInfo, ByVal bForceUpdate As Boolean) As Boolean Dim dDateTime As Variant Dim sErgosPartDateTime As String Dim iCnt As Long Dim bUpdate As Boolean Dim sTemp As String Dim sRecNo As String Dim sDynArray As String Dim iPos As Long Dim D As Long Dim oFile As New cFileIO Dim nIndex As Long Dim vUniqueId As Long Dim nCategory As Long Dim eAttributes As eRecordAttribute Dim oDatabase As PDBDatabase Dim oAppForgeHeader As New PDBAppforgeDefinition Dim oAppforgeRecord As PDBAppforgeRecord Dim oByteStream As PDBByteStream On Error Resume Next ' Opens the Text File iCnt = 0 dDateTime = FileDateTime(sFileName) ' Updates the status information oSync.UpdateStatusMain "Checking for changes to " & sPalmFileName & " information..." ' Get the Date this database was last created. If oSync.FileSystem.OpenDatabase(sPalmFileName, oDatabase) Then ' file exists. sErgosPartDateTime = CStr(oDatabase.CreateDateTime) Else ' File does not exist. sErgosPartDateTime = "" End If ' Check to see if we need to change the data If bForceUpdate Then ' Force the Update bUpdate = True ' Force Update oSync.UpdateLog App.ProductName & " - " & sFileName & ": Force Overwrite of the data file." ElseIf Len(sErgosPartDateTime) = 0 Then ' Nothing bUpdate = True ' Force Update oSync.UpdateLog App.ProductName & " - " & sPalmFileName & ": Palm File does not exists. Need to Create." oSync.UpdateLog "Win File Modify: " & CDate(dDateTime) ElseIf CDate(sErgosPartDateTime) >= CDate(dDateTime) Then ' No changes bUpdate = False ' Reason Not to upate oSync.UpdateLog App.ProductName & " - " & sFileName & " NOT changed" oSync.UpdateLog "Win File Modify: " & CDate(dDateTime) & " = Palm File Create:" & CDate(sErgosPartDateTime) Else ' Need to update Palm bUpdate = True ' Reason for Update oSync.UpdateLog App.ProductName & " - " & sFileName & " Changed." oSync.UpdateLog "Win File Modify: " & CDate(dDateTime) & " > Palm File Create:" & CDate(sErgosPartDateTime) End If ' Check to see if we need to update the plam with this informaiton If Not bUpdate Then ' Return not updated UploadData = False Exit Function End If ' Updates the status information oSync.UpdateStatusMain "Uploading " & sPalmFileName & " information..." oSync.UpdateStatusDetail "" ' Open file to process information oFile.FullFileName = sFileName If Not oFile.OpenFile("", "R") Then ' Can not find the file oSync.UpdateLog App.ProductName & " - Unable to Open " & sFileName ' Return not updated UploadData = False Exit Function Else ' Opens the remote database file oSync.UpdateStatusMaxBar oFile.FileSize ' FileLen(sFileName) ' Recreate the Database so there are no records in it If Len(sErgosPartDateTime) > 0 Then ' Database exists. REmove it oDatabase.RemoveDatabase End If ' Recreate database If oSync.FileSystem.CreateDatabase(sPalmFileName, oDatabase) Then ' Succesfully created the database Else ' failed to create the database oSync.UpdateLog App.ProductName & " - Unable to Create " & sPalmFileName ' Return not updated UploadData = False Exit Function End If ' Creates the Appforge header information oAppForgeHeader.AddFieldName "RecNo", eStringField oAppForgeHeader.AddFieldName "RecordType", eByteField oAppForgeHeader.AddFieldName "UpdateDate", eDateField oAppForgeHeader.AddFieldName "DynArray", eStringField oDatabase.WriteAppInfoBlock oAppForgeHeader.AppInfoBlock ' start Creating the information Do Until oFile.IsEOF ' Reads the information from the text file oFile.InputLine sTemp iPos = InStr(sTemp, vbTab) If iPos = 0 Then sRecNo = "" sDynArray = "" Else sRecNo = Mid(sTemp, 1, iPos - 1) sDynArray = Mid(sTemp, iPos + 1) End If ' Creates the PDB Record Set oAppforgeRecord = New PDBAppforgeRecord Set oAppforgeRecord.AppforgeDefinition = oAppForgeHeader oAppforgeRecord.StringValue(1) = sRecNo oAppforgeRecord.ByteValue(2) = 0 oAppforgeRecord.DateValue(3) = Now oAppforgeRecord.StringValue(4) = Replace(sDynArray, vbTab, Chr(254)) oDatabase.Update -1, 0, 0, 0, oAppforgeRecord.ByteStream ' Update status iCnt = iCnt + 1 oSync.UpdateStatusDetail iCnt & " - " & sRecNo oSync.UpdateStatusBarValue oFile.CurrentPos If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Function End If ' Doevents so informatio is display in the status window DoEvents Loop ' Close the Database to commit the changes oDatabase.CloseDatabase End If oFile.CloseFile ' Flag as updated UploadData = True End Function Private Sub CreatePartSummaryFile(ByVal sPartFileName As String, ByVal sPartDetailFileName As String, ByRef oSync As oSyncInfo) Dim sTemp As String Dim oPartList As New Collection Dim oPartDetailList As New Collection Dim i As Integer Dim D As Integer Dim iNum As Integer Dim iOffSet As Long Dim sRecNo As String Dim sDynArray As String Dim iPos As Integer Dim bFound As Boolean Dim sLoc As String Dim sPartNo As String Dim aTemp() As String Dim aPartDetail() As String Dim aPart() As String Dim aPartSummaryItem() As String Dim oPartFile As New cFileIO Dim oPartDetailFile As New cFileIO Dim sPalmFileName As String Dim oDatabase As PDBDatabase Dim oAppForgeHeader As New PDBAppforgeDefinition Dim oAppforgeRecord As PDBAppforgeRecord Dim oByteStream As PDBByteStream Dim oPartNoList() As String Dim oBinList() As String Dim oDescList() As String Dim oOnHandList() As String Dim nIndex As Long Dim vUniqueId As Long Dim nCategory As Long Dim eAttributes As eRecordAttribute On Error Resume Next ' Open the part file and get the information oPartFile.FullFileName = sPartFileName If Not oPartFile.OpenFile("", "R") Then ' failed Exit Sub End If ' Read the part detail information oPartDetailFile.FullFileName = sPartDetailFileName If Not oPartDetailFile.OpenFile("", "R") Then ' failed Exit Sub End If ' Updates the status information oSync.UpdateStatusMain "Generating Part Summary information..." oSync.UpdateStatusDetail "" ' Update the progress bar oSync.UpdateStatusMaxBar (oPartDetailFile.FileSize + oPartFile.FileSize) ' Get all the Parts so we can create the summary oPartFile.Reset Do Until oPartFile.IsEOF ' Get the infromation to split oPartFile.InputLine sTemp ' Gets the Data from the Record iPos = InStr(sTemp, vbTab) If iPos = 0 Then sRecNo = "" sDynArray = "" Else sRecNo = Mid(sTemp, 1, iPos - 1) sDynArray = Mid(sTemp, iPos + 1) End If ' Adds to part collection. If Len(sRecNo) > 0 Then oPartList.Add sDynArray, sRecNo ' Update Status oSync.UpdateStatusDetail "Part# " & sRecNo If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Sub End If ' Update Progress bar oSync.UpdateStatusBarValue oPartFile.CurrentPos Loop oPartFile.CloseFile ' Gather all the part detail information oPartDetailFile.Reset Do Until oPartDetailFile.IsEOF ' Get the infromation to split oPartDetailFile.InputLine sTemp bFound = True ' Gets the Data from the Record iPos = InStr(sTemp, vbTab) If iPos = 0 Then sRecNo = "" sDynArray = "" Else sRecNo = Mid(sTemp, 1, iPos - 1) sDynArray = Mid(sTemp, iPos + 1) End If ' Split the data aPartDetail = Split(sDynArray, vbTab) ' Gets the PartNo iPos = InStr(sRecNo, "*") If iPos = 0 Then sLoc = sRecNo sPartNo = "" Else sLoc = Mid(sRecNo, 1, iPos - 1) sPartNo = Mid(sRecNo, iPos + 1) End If ' Get Part information Err.Clear sTemp = oPartList(sPartNo) If Err.Number <> 0 Then sTemp = "" bFound = False End If aPart = Split(sTemp, vbTab) ' Gets the Part Summary list. Err.Clear sTemp = oPartDetailList("j" & sLoc) If Err.Number <> 0 Then sTemp = "" If Len(sTemp) > 0 Then aPartSummaryItem = Split(sTemp, Chr(254)) Else ReDim aPartSummaryItem(4) As String End If ' Update the pary summary record. If bFound Then If Len(aPartSummaryItem(1)) > 0 Then aPartSummaryItem(1) = aPartSummaryItem(1) & Chr(253) aPartSummaryItem(2) = aPartSummaryItem(2) & Chr(253) aPartSummaryItem(3) = aPartSummaryItem(3) & Chr(253) aPartSummaryItem(4) = aPartSummaryItem(4) & Chr(253) End If aPartSummaryItem(1) = aPartSummaryItem(1) & sPartNo aPartSummaryItem(2) = aPartSummaryItem(2) & aPartDetail(1) aPartSummaryItem(3) = aPartSummaryItem(3) & aPart(0) aPartSummaryItem(4) = aPartSummaryItem(4) & aPartDetail(2) ' Updates the Part Summary information sTemp = sLoc & Chr(254) & aPartSummaryItem(1) & Chr(254) & aPartSummaryItem(2) & Chr(254) & aPartSummaryItem(3) & Chr(254) & aPartSummaryItem(4) oPartDetailList.Remove "j" & sLoc oPartDetailList.Add sTemp, "j" & sLoc End If ' Update Status oSync.UpdateStatusDetail "Part# " & sRecNo If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Sub End If ' Update Progress bar oSync.UpdateStatusBarValue (oPartFile.FileSize + oPartDetailFile.CurrentPos) Loop oPartDetailFile.CloseFile ' Recreate the Database so there are no records in it sPalmFileName = "ErgosPartDetailSummary" If oSync.FileSystem.DeleteDatabase(sPalmFileName) Then ' Successful Else ' Failed End If If oSync.FileSystem.OpenDatabase(sPalmFileName, oDatabase) Then ' Successful Else ' failed End If ' Updates the status information oSync.UpdateStatusMain "Transfering " & sPalmFileName & " information..." oSync.UpdateStatusDetail "" ' Creates the Appforge header information oAppForgeHeader.AddFieldName "RecNo", eStringField oAppForgeHeader.AddFieldName "SortField", eStringField oAppForgeHeader.AddFieldName "PartNo", eStringField oAppForgeHeader.AddFieldName "BinLoc", eStringField oAppForgeHeader.AddFieldName "Desc", eStringField oAppForgeHeader.AddFieldName "OnHand", eStringField oDatabase.WriteAppInfoBlock oAppForgeHeader.AppInfoBlock ' Opens the remote database file oSync.UpdateStatusMaxBar CLng(oPartDetailList.Count) ' start Creating the information For i = 1 To oPartDetailList.Count sTemp = oPartDetailList.Item(i) 'Debug.Print "sTemp " & sTemp ' Gets the Data from the Record iPos = InStr(sTemp, Chr(254)) If iPos = 0 Then sRecNo = "" sDynArray = "" Else sRecNo = Mid(sTemp, 1, iPos - 1) sDynArray = Mid(sTemp, iPos + 1) End If ' Split the information aTemp = Split(sDynArray, Chr(254)) iNum = UBound(aTemp) + 1 ' oPartNoList.Text = aTemp(0) ' oBinList.Text = aTemp(1) ' oDescList.Text = aTemp(2) ' oOnHandList.Text = aTemp(3) oPartNoList = Split(aTemp(0), Chr(253)) oBinList = Split(aTemp(1), Chr(253)) oDescList = Split(aTemp(2), Chr(253)) oOnHandList = Split(aTemp(3), Chr(253)) ' Creates the First record Set oAppforgeRecord = New PDBAppforgeRecord Set oAppforgeRecord.AppforgeDefinition = oAppForgeHeader oAppforgeRecord.StringValue(1) = sRecNo oAppforgeRecord.StringValue(2) = sRecNo & "*" & 0 oAppforgeRecord.IntegerValue(3) = UBound(oPartNoList) + 1 ' oPartNoList.Count(1, 0, 0) oDatabase.Update -1, 0, 0, 0, oAppforgeRecord.ByteStream ' Create a record for each line in the list olcation iNum = UBound(oPartNoList) + 1 ' oPartNoList.Count(1, 0, 0) For D = 1 To iNum Set oAppforgeRecord = New PDBAppforgeRecord Set oAppforgeRecord.AppforgeDefinition = oAppForgeHeader oAppforgeRecord.StringValue(1) = sRecNo & "*" & oPartNoList(D - 1) oAppforgeRecord.StringValue(2) = sRecNo & "*" & D oAppforgeRecord.StringValue(3) = oPartNoList(D - 1) ' oPartNoList.StringValue(1, D, 0) oAppforgeRecord.StringValue(4) = oBinList(D - 1) 'oBinList.StringValue(1, D, 0) oAppforgeRecord.StringValue(5) = oDescList(D - 1) ' oDescList.StringValue(1, D, 0) oAppforgeRecord.StringValue(6) = oOnHandList(D - 1) ' oOnHandList.StringValue(1, D, 0) oDatabase.Update -1, 0, 0, 0, oAppforgeRecord.ByteStream ' Update status oSync.UpdateStatusDetail i & " - " & D & " " & sRecNo ' oSync.UpdateStatusIncrementBar 1 If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Sub End If DoEvents Next D ' Update status oSync.UpdateStatusDetail i & " - " & sRecNo oSync.UpdateStatusIncrementBar 1 If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Sub End If ' Doevents so informatio is display in the status window DoEvents Next i ' Close the Database go commit changes oDatabase.CloseDatabase End Sub Private Sub DownLoadFile(ByVal sFileName As String, ByVal sPalmFileName As String, ByRef oSync As oSyncInfo) Dim dDateTime As Variant Dim sErgosPartDateTime As String Dim iCnt As Long Dim bUpdate As Boolean Dim FileNum As Integer Dim sTemp As String Dim sRecNo As String Dim sDynArray As String Dim iPos As Long Dim nIndex As Long Dim vUniqueId As Long Dim nCategory As Integer Dim eAttributes As eRecordAttribute Dim oFile As New cFileIO Dim oDatabase As PDBDatabase Dim oAppForgeHeader As New PDBAppforgeDefinition Dim oAppforgeRecord As PDBAppforgeRecord Dim oByteStream As PDBByteStream On Error Resume Next ' Open the Part Detail File on the Palm, and save all the information to a Text File oFile.FullFileName = sFileName If oFile.OpenFile("", "W") Then ' Openned Else ' Failed oSync.UpdateLog App.ProductName & " - Unable to open " & sFileName & " with Write Permissions." Exit Sub End If ' Updates the status information oSync.UpdateStatusMain "Checking for changes to " & sPalmFileName & " information..." ' Opens the Palm Database on the part detail If oSync.FileSystem.OpenDatabase(sPalmFileName, oDatabase) Then ' file exists. Gets the Appforge Header information Set oByteStream = New PDBByteStream oDatabase.ReadAppInfoBlock oByteStream If Not oAppForgeHeader.IsAppforgeData(oByteStream) Then ' Appforge data oSync.UpdateLog App.ProductName & " - " & sPalmFileName & " not an Appforge Database. Unable to decode information." Exit Sub End If ' Updates the status information oSync.UpdateStatusMain "Downloading changes to " & sPalmFileName & "..." oSync.UpdateStatusDetail "" ' Gather all the information for this File oSync.UpdateStatusMaxBar oDatabase.RecordCount oDatabase.IterationIndex = 0 iCnt = 0 ' Gets the First Modified record to update Do While oDatabase.ReadNextModified(nIndex, vUniqueId, nCategory, eAttributes, oByteStream) ' extraxt the information from the record Set oAppforgeRecord = New PDBAppforgeRecord Set oAppforgeRecord.AppforgeDefinition = oAppForgeHeader Set oAppforgeRecord.ByteStream = oByteStream ' Get information to process sRecNo = oAppforgeRecord.StringValue(1) sDynArray = oAppforgeRecord.StringValue(4) ' Gets the Value from the dynamic array sTemp = sDynArray ' Writes data to file sTemp = sRecNo & vbTab & VBA.Replace(sTemp, Chr(254), vbTab) oFile.PrintLine sTemp ' Update Status iCnt = iCnt + 1 oSync.UpdateStatusDetail iCnt & " - Part# " & sRecNo oSync.UpdateStatusIncrementBar 1 If oSync.CancelSync Then ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - User Terminated" Exit Sub End If Loop ' Save the changes to the file oFile.CloseFile ' Reset all modified flags oDatabase.ResetModifyFlags ' Close the Database to commit the changes oDatabase.CloseDatabase ' Open the Text Files to update the PDB Records on the Palm oSync.UpdateLog App.ProductName & " - Updated " & oFile.FileName Else ' Can not find this file. oFile.DeleteFile End If End Sub 67FGI / 0 1 2 E r s .<*`9pH6~T ]4qfm5CJ\^JaJmH sH >*CJ^JaJmH sH CJaJmH sH CJ^JaJmH sH CJOJQJ j+Uj뾷E UV j"UjSE UVj E UV jUmH sH >6JKIJc  3 E U h $ U ^`. K r s  & K n | .<7$8$H$`*ab:;p H6 T7$8$H$!"]56qefn9q7$8$H$m9qr4<BO 'h<p#<Cs T f"|""" #!#(#)#*#4(5(@(A(H(u(((D)h))) *N*y***+;+o+++ϸ֯֯CJCJaJmH sH >*CJmH sH 5CJ\mH sH ^JaJ CJmH sH mH sH >*CJ^JaJmH sH CJ^JaJmH sH 5CJ\^JaJmH sH Dqr45<BO 'gh<p7$8$H$7$8$H$#;<Ds  T | } !Y!!!"""P"f"g" 7$8$H$`7$8$H$g"|"""" #!#)#*#:#;#R#S###$S$$$$$$$$$$\%r%%7$8$H$%%%&c&|&&&&'D'c'''''''(-(5(@(A(I(u((((E)7$8$H$E)F)h))))!*"*N*z*{****+<+=+o++++,,>,_,`,g,m,,7$8$H$+,>,_,g,m,,,,,,$-\---.@.c.../-/g/// 040t000 141W1111111152223I33334+4d4|4445)5m5555#6>6w6666"7<7~7777;8W8888 9C9^999CJaJmH sH mH sH >*CJ^JaJmH sH 5CJ\^JaJmH sH CJ^JaJmH sH Q,,,,,,%-]-^----.A.B.c....//-/h/i//// 050607$8$H$60t0000 1 141X1Y1111111115222233I333337$8$H$334,4-4d4}4~44445*5+5m555555#6?6@6w666666"77$8$H$"7=7>7~777777;8X8Y88888 9 9C9_9`99999 : :J:_:`:7$8$H$99:J:`:::;N;V;\;k;l;s;;<<==$>P>>>>(?f????$@D@t@@@@@AIAAAB_BBB7CeCCC.DKDDDDEtEEEFlFFFG[G|GGGXHuHHIfIII JhJJJJJJJJCJaJmH sH mH sH >*CJ^JaJmH sH CJ^JaJmH sH 5CJ\^JaJmH sH Q`::::;N;O;V;\;k;l;t;;<<<===%>&>P>>>>>>(?g?7$8$H$g?h?????%@&@D@u@v@@@@@@@AJAKAAAAB`BaBBBB7C7$8$H$7CfCgCCCC.DLDMDDDDDEEtEEEEFFlFFFFGG[G}G~G7$8$H$~GGGGXHvHwHHIIfIIII J JhJJJJJJJJJJKKCK7$8$H$JKCKKKK,LyLLLL!MRMN@NSNgNNNNN OHOcOOOOPUPpPPPQHQdQQQQRR]SS6TYT U*CJ^JaJmH sH ^JaJ5CJ\^JaJmH sH CJ^JaJmH sH OCKKKKKK,LzL{LLLLL"M#MRMNN@NTNUNgNNNNNNN OO7$8$H$OHOdOeOOOOOPPUPqPrPPPPQIQJQdQQQQQQRRR]SS7$8$H$SS6TZT[T U=U>UaUUUUUUV)V*V?VlVmVVVV^WWWWWW X7$8$H$ X@XAXfXXXXXYY YiYYYYZZkZZZZ[ [*[j[k[[[7$8$H$7$8$H$[[[[[[[\@\y\\\ ]H]z]]]^&^^^^^^_H_{___`%`+`>`r``maa*b4b_bc{ccddd3eceeeeff.fCf-.CJ5\mH sH mH sH 5CJ\^JaJmH sH CJaJmH sH mH sH >*CJ^JaJmH sH CJ^JaJmH sH 7[[[[[[[\A\B\y\\\\ ] ]H]{]|]]]]^'^(^^^^^^7$8$H$^^^_I_J_{____``%`+`,`>`q`r``lamaa)b*b4b^b_bczc7$8$H$zc{ccddddd3ebeceeeeefff-f.fCfSfTfkflfff'glglgggggggh:h_hhhhhi;iVi|iiiiii;jijjkklNlNlollllll0mLmmmnn nMnnPoQooOpPpppqq:qxqqqqqqqrUrrr2sksssstt1tpt uuKuuuuv/vQv\vvvvvvwwwxaxbxxxyy4y5yyyyzzzz+z;zzzzzz0{8{9{9{{{{{|)|||||!}8}j}}}}} ~~~B~S~[~\~~~#/G`|ŀʀ=BcŁ+SX}ׂ܂܂Sj΃/Hcz/AXYp!"`umnw͇7MXY~ʉ9åъ (Q݋ 3Xgp֌>܍@{{5v{Fc$%JǑ(W2mʓ]{:Z_j~=Uy͖͖7Oinޗ"Cj78Xu˙'(ArɚښUڛ>?]8Zkϝ<ix0QܟW``x}Ġ6L]١.[jsԢ)BO{ޣ3JetѤ(1PåҥۥMצaatyAȨeũԩݩ(IԪt}֫>>S\mx}֬߬!o0h֮KLqЯ=eװ>MNnñ -R[Bv!´C]ڵ)gʶ&-6R¸3zȹ׹׹ع$Mn&gxϻ׻ػEbҼ499Pjѽڽ0]<NWhпlmJyWl{|NS?@i  '@bGt,EXef(HI%-.#0P/ =!"#$%"Dd.0  # Abi"Bs(UNE"D%n="Bs(UNPNG  IHDR"XsRGB pHYsj!IDATx^=dWr{)[g71VYp @Z,#; '#mh#G"+0)Y23 aAJ yΩ:}ǫkzU: }rgΕţ "ʗ>>Wc88 孓NL}zj$8@{"ʚ)!@E)_yf/O/N=|<,ɚe}J6?^~]?H|6;8{pv\<?gGȒzsY~1jOwoͅ-_цY=o1x:OG/e(f{trS>ryVHI%]en\HƧuWS .b-i{qYw:=20^MN&c3+l'by_kD|s XK$Nꣶ&Mܓfb"nMYSΦHIz~w&>pk+xs<'r|1E=V~ӨjlŧGGOmk@y۠M!N=¼8OPg[ΜqIޛFVjՔomClC;K;gȋy 6mT9sM GQ1]ΚM:>VE\]i!i`U) ]X"Ͼ9͇w=x%K{LY,^<ߍu?}1B! I[j2>XiU>N؊T)5&[ۇNd-؃Y5r&=(ԔKѷE}cm+Q.'9cʔ-G|SX#hihΗlr#G~Kz&(g|g,}L|;zr1Vȹvʎ+h.3VΕi[N%029_LGx"e:"nX茱z2S.5g1{JZn9rK㌔'2E4KeͽL9 f|<:7gYgl4=zN2e9rY[9r{4Δ5G.2&WL ?OޟϲYգVS3K߹{}YW_)e?SaxێFWjPU9WJs<Ȫ΍Fw\iI|ܺSQ(E3ho<39c1a5Z9f#ı(,qtĦy@Z(EԴne|#;下Z{4/r'mIq8mΡxYͰ]Y-skU־:QkcctO`b+r9^-#(~3levB_{_wߎ|ɓ.0:rcovM9qX5T+t6Ԡ=Jq<3cL0֏jZՌXSW~Or56VWC>hPOj7Σ"\3cʝ͛V^iOZ,.WӢ)w|Y+ڱ24 Jc⥕X9U, |8ԪL3nrqWTF{Vqj>Ӹm[ X%Qȡ#k9^MK5##u̕UyX=ظ!FJ[NG\2}rc+V*b;Q?z桎-ڀ_%MkVG[{ c Ũڏ^~kz5"ӶxTmb-t(1=+~#&mYw+cYwd/>s(N%O[weֺ9G`෷3UՖT}On2Z,-o*ky\kW>f>q?l -Y%=Ûܐ|j+av/nhnVa͗MFTٮXU[m:UTmcodM׉-2zYFע*]x[6PҳɔFkϽTSNWDsڎWR;O7mFQ5XG =qcnoS۸x>a7sQ7jډFz8ͳj30,[\OS=aeӔXkϙzKmˊR^ϾsmyV$[anl6|b?mW9*_GYm;Jyy9rW-q/\4'e:*-)mB/Ur!Dϼk:O׈ö$79q#k<9W_V<7#ǻ/q[@ãvwc+Ss)jkhI!]Ų,zr˵[FQ7i, r[ ZޟnV"g+eiW6V|'j龋/kfލWʹѲ¦iAʼ4֭14]Oˑcakܴ-kn"SNryʑ/Gny[ΑURzdOYIN8|-ALԖ)k{YLBl)ؗhJkdMсxHZNsH+2Sּ8rv;gb *vOEs(߇sѨح)˞IezآUd*G+nǹe Qnk.e0vj!vy+[i֬-7)?)3;:1#~rɎc,]"#Onb\odwEcʆfE,F Hq7R_)|99(>Wol=V4uZiVhrJT;3LiL;'ֺSs2sY敷M9r1Z{Δ(/9&c횊9^yu}gRY[بY/9餶5YuFGjV0rlTi1Yb9SNƒ&^ڵ0eYN0#b LY\v+e:YTyn$K.SSܖ25pdMyMϩ9h4S>y YN":xЬ:J3i?< ߍ9 BM#v_72 ͎E=kMY?]9)皲-%E}25rբר)LMk*ŘKjyS!i6~\^5^kʝXiYahi SN`MYN9խ2eɋeޯ)>sMDZ/)7)[{lO_My.)!MKzb^$S.]ٱU9bj5ZĺUΔC[ ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!Root Entry F0F_f@Data EWordDocument%@ObjectPool 9_f0F_f_1169667853 F9_fp_fOle CompObjMObjInfo  FPBrushPBrushPBrush9q  FPBrushPBrushPBrush9qOle10Native Ole10ItemName_1169667923 F5_f5_fOle       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<=BM6(BABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABBABBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABBABBABքBAB1,)k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABBABBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBAB1,)k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBAB1,)k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBAB1,)1,)1,)1,)1,)1,)k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$քBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABքBABքքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABքBABk$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k(k$k(k$k(k(k(k(s(k(s(k(s,s,s,k,s,s,s,s,s0s0s0s,s0s0s0s0s0s0s0s0{4s4{4s4{4{4{4{4{8!{8{8{8{8!{8!{8!{8{?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      "#$%&'()*+,-./0123456789:;>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} @BM@6(o?քBABքքBABքBABքքBABքBABքքBABcccccccccccccքBABcքքBABcքBABcքքBABcքBABcքքBABcքBABcքքBABcքBABcccccccքքBABքBABքքBABքBABքքBABքBABքքBABƄքBABcccccccccccccքքBABcքBABcքքBABaaޖacքBABaޖaacքքBABޖcքBABR0cքքBABaޖޖkkR0cքBABa׌R0cքքBABk!׌cccccccքBABkJ׌քքBABkJ׌քBABk!׌քքBABkJ׌քBABk!׌քքBAB׌քBABkR0a׌R0քքBABaޖޖkkR0cccccccccccccքBABR0cքքBABcքBABaaޖacքքBABaޖaacքBABޖcքքBABR0cքBABaޖޖkkR0cքքBABa׌R0cքBABk!׌cccccccքքBABkJ׌քBABkJ׌քքBABk!׌քBABkJ׌քքBABk!׌քBAB׌քքBABkR0a׌R0քBABaޖޖkkR0քքBABR0cքBABcքքBABքBABcccքքBABcccքBABcΜcքքBABcքBABcքքBABքBABքքBABքBABքքBABքBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABքBABքBABքBABքBABքBABcccccccccccccքBABքBABcքBABքBABcքBABքBABcքBABքBABcքBABքBABcքBABքBABcքBABքBABcքBABքBABcքBABքBABcccccccքBABքBABքBABքBABBABքBABBABքBABքBABքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքքBABքBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABք/d4ZNx}˕x>Yr_SSNPStNS1tR6Z[2} J~Z?ys|c=)_?;2dD g)G tM]5귇AA5dQsMmBXZKKs+λ/TW"dˋw;\(\NL ¥/+@ S?Ak. p% .U؅=ƚU $(`Pq _!$(`Pq GrO&Dyc ĉN@{ 'A_j\p￟5W2pYDTSp"w`qKx%JXy,e.W(8p[cm+-ߦdަoҐ-]a;ת l^Зm>}i+cQsLyy8H6/L{ݬAv5}-"سA[lkT:!2!_sVrM$~77i0oo![buؑ(5R;`,xN⣨=Ҽ,]'mĽCq u(,Ӕֻ{9ؑ(;ݯ xݮz (S.w&?'Iq.!뚙uNu}N\s{߆u`:ocâ,EnNeSyBԹhUaFx1,z;q/.?yf":ӕdq7Sm~١t9Yav v2] 6`-jz7ݴ[a†3]iX%3=ʽnyEיҮ|v`sbR;YaDre˔M|EeR͇IS扙;\&DÕ-7bX ed:.`Xm=EY^/.xU&it+V91[]ojgɠ/!e{hzj6 XYz+l)">e͑eX92ּFPiʹU)yDGu_pf7~5).`[B.{, `mp_V㇀^}!tCytVSH}ʁy;G}]53}=$k;({#@8h;& ."؅>{jOgkS΍<<0w)у^Y$eW"ga\ihW*nxpkりt$fn|:CNRp͘ 6i'^tL!.l+Xr9Yl VΌsT%W"]B XXtA .0HE#KLT]am!ݦfYp͘zƷɖ\د}C Ґmec3' J-pɔc LI[bR@>f|_Ve1,먤Qʺ0.󣩒xe*,KGR?|aKG~7Cv(D zQ+ta e(QAc pJ\@_f:YВV0*dYN|C_C)ANpa"7P rXb*F¨ .5ҥh}H}יϿͿOhR=qyr:/xy~,.'nogOn$l"iiBK־c^ґvIQ.$G4=ZExyEI Nh<&&{V?  \]rk\jM:'XM[ ?;A;^ayr1wgkyÏv`͊ .8~`Q>5Z.ohw=UMVpiD6֛ka/j\  ]!.AVMG9Ytg6Ej &#r0f$.Ċ~`@@05#mX1 2#cPPgj(YDd/V~jIJ\Y>e ୾ՔJL ~A%` u% V\d^*<`e 5j1KAq[?%R鄶wS'Ijʃ6[ό?ť>qjs$1|0e8ɂѕvێAJ.=F+. bhpkzVb Zl- (\,o 奭Ps Pj#g+ڠHnR3$nLF$5qo a} \|uPV a} \|uPV a}]톪o 2!\ "VB#6 S I@_ ,G& ݰ+)PkX%AF ښ~ϡrS/ߥ,u%{ -4=?6T'&kG*6Zcvqf'( .?/ġ@kE+%nc)R>/ġ@PNG  IHDRosRGB pHYsodIDATx^]o>Rd) @N4\$p%KMjٍCٍt%@TVՉX.3 9ۻww;{fgg۽O: #p/{Lxog^ l]BSbh!>ty -Y%2&5;C`tӃo?BX3@W3B4z ,=÷%m ˶껵"K's 2,՜NpΩ$F0(!ZVc7޼&LV$>6nHLQn"{%w &C hf0^J!6;Ęo {ŷ!D[}qTᄾ B(} ,C`L1p%)ʨfDK'ӭ6Qr-,Y!M}\FB 9SW"J$>z> =7}dO')8I}ԡ!K$6?A8-,hK3޳Ȩ>W7vovOLge3&vGV-8fqyQ!W؃ڢ;)qoxzqO:`f)+0&2k=?xoqE `.KɤoalC%'$ Hm> `=#ܻȕ.#aH4F錄t*fY2$!Bb>iƘ6sڽpuyؐ~ou)$񅇪k7Uj[hS[HόqF=j挀kb_#^-:h\i(xG33&V;O*Z f]Nv,*U`4' C` (axX"d9,ȍx?/jVE"~Wϊ,W g, P({ ["{$ rM>F`yx\RBxMfg>?H~k-_1zL{L>٨l W19OѹP9Z,L]· ?ϥ|]ovN!\}0?x/νx%iL}_>9I{iTl-?}bL]v)B^ݾu<ϣ.6)3%_2wI\ rMkFC*T3Vh9jNX̦Squm綶;:~,jaDeϸU T(<U ! I_Hy}sQqPP$ ΈEF}p Wߍ@.q' (J]^K1OupY< cg3+H錗q%1N2WirMG,"%|475W.+Y_lȒ<5Jqq=s/=WG$D,JяƟC;!BmgNK"WեS-z=c˺ELd]f!I3Zdj~?8 E,$ %'2~z&;02.I-R.xOK%SN*6 V|U04?>OCY_jVJF`O4)LLq<~F_^yD!`OıYeCLSoMZ֚+!t3xzG[6"@OdOvVtcb}{X 20uox˲,oE"60kޚ3pi>iH(`@Mc+p(s86RƬLgdVfjlQtbY )0sK\(g%:5\z xoԥјtGD倧/#eOym`(*eH eQ4++a4r3N$_ ) C.@oX$ (MiyB̅O(m A|C T10uYcD:XHG40233 ПvGhHb`fS%KWoZ{gr:RsPZ{& Z.ˡLQA\r: @"Ms6+Ze☇ `겼*_}J_03}4$ٔ%`E7қaLc9t"`ll5#x^stzo|M$Bܣ#ĤhF"7JHHIDvŘr%⳯^yV4M]:JoԆI$at9B_t6],oz@mdcVO@B#euuuDiH}atȓUF3.C.p[ҫ#]]^ D 1wT 4Iʘ.%>Ӆ 92Zd1+74uY]vJ`IƕlJPK]Hx3w)2jiL] ^<ȯ}seٿ|csb1"TuWuOO/}`$(l'O (.J紬%~U\teag]swѺ!x~sե艹VD //V}{ۗ?ux^`8<?PEvqNJObFWsqrZ2O@Mu&_W6pq) M[q{uK=9Ƙ[UO2/ '˟y3!J>9qw2#qɳ:S*:08DpQf.a1EBlƤD0sˡ63&51}Yw_uH?c|qZ&C,!b%HɑbD"r2t)0T -u}W䴕zSY\bJkW܆/Ap BDnaEg$9:Pωyg NSљ 72)(當kol[Wm]z%(JU"L\m>+TZymU%*_U-uYۣ!Q&FMKNcx9~r{xzͻ{' h @I xh> KK"W"oz6g;1C}7k{:jLd)a`Dv:989!ɽRLu}kba#9^9 n5hƪST⟸6̟#7whF.9}t7,ˌKI=qg}O! OGnh*ONSN]egmy7)e{ nViA[%Y.i6D¤!gEe2Yĺk߼a$bUM]Y]2+~~.1G9viG6dRY+Ma5uP#t$X$,*KMu%p:X oTl~8p/BA%tq敞\$oumyV;rrMk#{bgGO l dPgTSY]JEAT )E{Rg>y.ʌ4 o㾙Ԏ`OG[-s:O o ,g2]<"/Î]v$  l*>q'Y=K`F`s`;]NA[  wK^mIU}.gyhgpz ZRًG-guJ K~;TqD+h@Ar.f4se\DG6*RbI ΦAVdBz-Xyӵ5bĆ7]r3PY19K]u{sSB&Qrub/Ihj m|aDhN܃/LɕóH >.Y$"0X=q^Kſ8pZu.v2>TEuYn8tj}y@-=V&)"h< $RyE'%rQM|e.yMby2E̫ CRH`N/U2@t#J]` u)#uY:=,<ɴR2Nu[Eu)IS _߈ej ?>,HUG( wXJITTGըJqwx|r_aX :Ms 'ƉvR$̬,RY|gQMdfT^ u^] "X .gQM K[x1w`e[x2偛 ;*CJmH sH <A@< Default Paragraph Font2B`2 Body Text CJmH sH <O< Code^`OJQJmH sH . @ 6JKIJc3EUh$U Krs & K n | . < * a b  : ; p  H 6 T!"]56qefn9qr45<BO 'gh<;<DsT|} YPfg| !)*:;RS S  \!r!!!!"c"|""""#D#c#######$-$5$@$A$I$u$E%F%h%%%%!&"&N&z&{&&&&'<'='o''''((>(_(`(g(m(((((((%)])^))))*A*B*c****++-+h+i++++ ,5,6,t,,,, - -4-X-Y---------5....//I//////0,0-0d0}0~00001*1+1m111111#2?2@2w222222"3=3>3~333333;4X4Y44444 5 5C5_5`55555 6 6J6_6`66667N7O7V7\7k7l7t77888999%:&:P::::::(;g;h;;;;;%<&<D<u<v<<<<<<<=J=K====>`>a>>>>7?f?g????.@L@M@@@@@AAtAAAABBlBBBBCC[C}C~CCCCXDvDwDDEEfEEEE F FhFFFFFFFFFFGGCGGGGGG,HzH{HHHHH"I#IRIJJ@JTJUJgJJJJJJJ KKHKdKeKKKKKLLULqLrLLLLMIMJMdMMMMMMNNN]OOO6PZP[P Q=Q>QaQQQQQQR)R*R?RlRmRRRR^SSSSSS T@TATfTTTTTUU UiUUUUVVkVVVVW W*WjWkWWWWWWWWWXAXBXyXXXX Y YHY{Y|YYYYZ'Z(Z^ZZZZZZ[I[J[{[[[[\\%\+\,\>\q\r\\l]m]])^*^4^^^_^_z_{__`````3abacaaaaabbb-b.bCbSbTbkblbbb'clcccccccd:d_ddddde;eVe|eeeeee;fiffgghNhohhhhhh0iLiiijj jMjjPkQkkOlPlllmm:mxmmmmmmnUnnn2okoooopp1ppp qqKqqqqr/rQr\rrrrrssstatbtttuu4u5uuuuvvvv+v;vvvvvv0w8w9wwwwwx)xxxxx!y8yjyyyyy zzzBzSz[z\zzz#{{{{|/|G|`||||||||||}=}B}c}}}}}~~+~S~X~}~~~Sj/Hcz/AXYp!"`umnw̓7MXY~ʅ9ăц (Q݇ 3Xgpֈ>܉@{5v{Fc$%JǍ(W2mʏ]{:Z_j~=Uy͒7Oinޓ"Cj78Xu˕'(ArɖږUڗ>?]8Zkϙ<ix0QܛW`x}Ĝ6L]ٝ.[jsԞ)BO{ޟ3JetѠ(1PáҡۡMעatyAȤeťԥݥ(IԦt}֧>S\mx}֨ߨ!o0h֪KLqЫ=e׬>MNní -R[Bv!°C]ڱ)gʲ&-6R´3zȵ׵ص$Mn&gxϷ׷طEbҸ49Pjѹڹ0]<NWhлlmJyսWl{|NS?@i '@bGt,EXef(HI%-0 0000000000000 000 00000000000000000 00000000000 0*00*000000000000000000000000000000000000000000000000000*000000000000000000000000*0000000000000*000000000000000000000000000000000000000000000000000000000000000000000*00000000000000000000000000000000*00000000000000000000000000000000000000000000*00000000000000000000000000000000000000000000000000000000000000000000000000000000(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(00000000000000000000000(000000000000000000000000000000000000000(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000m+9J[.hnty~ qg"%E),603"7`:g?7C~GCKOS X[^zclgNlqv9{܂{͖`a>׹9 .iklmopqrsuvwxz{|}.j6FH/1.:::/4;B#al%,6IJQ3:FSU\^ghn$*U^ *+JKVWqszN U . :    L Q k 2 9 H M N S  % & + s~  27/:;@ $)CMNS8?{ .BNu~-4EPQd!HXY^_dhq)*/08<H} Yj\_k{ FQ 6 7 < @ Q  !)!*!/!0!8!"G"V"b"p"{"""""""""###8#;#C#Q#b#o#######$5$>$V$`$g$t$$$$$$$`%g%%%%%&&6&7&<&&&&&&&&&A'Y'Z'_'''''''(&('(,(m(((((((()))$)k)x))))))))))*1*9*K*U***************+++,+X+`+v++++++++C,L,M,R,h,s,,,,,,,-&-f-t-u-z-----...4.E.M.......*/4/;/H///////:0C0D0I0000000001"181D1E1J1w1~111111112M2V2W2\222222233K3V3W3\333334444f4q4r4w444445"5#5(5m5v5w5|555556"6#6(6w6|66667\7i7777777 8898?888889 979=9f9l9::::::; ;;&;(;3;u;~;;;<<<<<<<<<<<== =O=[=\=a=b=j=v={=|========> > >>O>V>e>r>s>x>y>>>>>>>>>>>>>>>> ???? ?%?&?-?k?z?{?????????????@@@@ @@@@$@Q@X@Y@^@_@e@o@t@u@|@@@@@@@@@@@@@@@A%A&A+A,A5ABAGAHAOAYA^A_AgAAAAAAAAAAAAA$B)B*B0B:B?B@BGBQBVBWB_BBBBBBBBBBBBBBBCCCCCC)C.C/C6C@CECFCNCCCCCCCCCCCCCCCC D DDDD&D+D,D3D=DBDCDKD{DDDDDDDDDDDDDDEEEEE&E4E9E:EAEKEPEQEYEEEEEEEEEEEEEEEFFF!F"F*F6F;FOCOPOOOOOOOOOOOOOO P PPPPP)PdPtPuPzPPPPPPPPPPPPPPPPQIQNQOQWQQQQQQR.R>RzRRRRRRRRRRSS'S7S9S>S?SJSOS\SSSSTNTWT[TeTuT~TTUU"U#U(U)U1U=UBUCULUQU\UUUUUUUUUUUUUV%V&V+V,V8VDVIVJVTVVVVVVVWWJWQW[WhW}WWWWWWWWWWWWKXYXZX_XXXXXY'Y(Y-YYYYYYYYY1Z=Z>ZCZDZJZZZZZZZZ[)[0[[[`[a[g[[[[[[[,\=\\\]]V]d]c^l^m^u^^^^^^^^^^^^^__{__```````````aaaa a!a)a=aEanaxa bb_bjbbb3cOcPcUcYcjctc|ccccccccccccccd"d/dBdTdgdzdddddddee&e/eCeJe^epeeeeeeeBf]fqfvfffffffgg:g@gggggggggggggggh!h$h)h,h2hVh\h]hbhdhnhhhhhhhhhhhhiiii%i'i/i7iAiiiiiiiiiiiQjajcjijmjujxjjjjjjjjjjkk!k)k-k6k;kBkFkNkUkekpkxk{kkkkkkkkkkll l(l,l5l:lAlElMllllllllllm?mKmLm^mamomrmwmmmmmmmn'n)n5n9nAnDnPnYnennnnnnnnnnnnnnnno ooo$o'o,o6oGoIoUoYodorowoooooooooooooooo p5pEpGpOpSp[p^pkptppppppppppppppq qq$q&q.q2q=q@qEqOq`qbqjqnqyqqqqqqqqqqqqqqqr r7rIrcrsrrrrrrrrrrs)s.s/sBsSsjsosws{ssssssssssssssssst tt"t't3t?tLtXtitsttttttttttttu%uuuuuuuuuuvv)v?vNvOv^vpvzvvvvvvvw www"w/wJwdwewjwkwswwwwwwwwwxxxx(x5xOxRx[xdxmx|xxxxxxxxxyy y.y7yDy^yayiywyyyyyyyy#z?z4{>{?{D{E{N{Z{_{`{m{y{~{{{{{{{{{{{{{| ||#|7|<|O|U|h|q|||||||||||} }}(},}<}J}S}W}b}k}z}}}}}}}}}}}"~&~/~8~;~G~H~Q~~~~~34ACLr6Bkr̀Հ $IPx&,-23EJOPY}ÂĂӂނ',-6SXYkՃ.EJKTqvw̄Єۄ$.΅,/8DR†ˆYqr)/?WĈƈψJYZiɉӉ$,Hdfknz݊ߊ%(4=XYu+/278=?DUYsyŌ̌ь֌ڌ ZipƍӍ 4Mc~ĎҎ"&)->VW[flyď&56EBYn}ɑޑߑ#().2;EJ]fՒْ #,?CW]vzƓѓ*3;BKZbirǔϔ%)6@K`h}•ӕܕ&v">AT`xޗ":ay{#.@STYřۙ!(-26HQX]_cĚњҚۚݚ)/;Kě'ABVdwÜќ/05>D͝ӝ $(:CJOQU͞Ӟܞ"(5<[_flqu (?DV\|ǠР٠ޠ"@E\luz|/?]msȢ΢Ѣ ,<BRX[ţգۣ "28=M]csyԤ٤ܤ%(0@FIQaqĥ!'3C'ACUXrڧ )*7%;=HMZs©ީ #/4PRX[glªƪɪժڪ -.Juث٫ +-27<mqtyzȬѬ &-248v{̭ܭ߭!$)6FINcnw|ɮҮ׮ܮ߮ N]duگ )EKQR]ev  (9X\m|DZʱٱ !5PV\sֲ2MS\f{dz޳,^vwxѴCRSbǵ#,JXh¶ѶҶ08<Fowη +016:CMVj|Ƹڸ߸ '+AGXar{ɹй/8GK\ept -FMp,JW¼üмҼۼ *5<IRlmxǽϽ $,þVno!#,.79DFQah03>u{~&nsv|*+/@FSq0G 0JQ3:sz . :  k  H N  & -2T/;CN{ /,EQpv#)HYx*} YjOSU& 7 !*! $$5$>$V$a$}$$S%Z%%%%%&&7&&&&&A'Z'''('((())k)y)))K*V***;+A+v++++C,M,,,-'-f-u-....*/5/I////////:0D000001"181E1w1~1111111/202M2W22223K3W33344f4r4445#5m5w5556#6q6w666667777778888993:?:::::;;(;f;u;;;;;;;$<3<:<z<<<<O=\===e>s>>>k?{??@Q@Y@@@A&AAABBB$BBBCCCCC D{DDEEEEFFFF'G3GGGGGGG HH,HIHVH]HHHHHHHH!I0IZZZZZZZS[[[[[[[[[ ^^c^m^G`U```````gana?cPceeqfvfffggggh!hhhhiiiQjajjjUkekkklmmmmmn'nYnenno6oGoo p5pEptppq$qOq`qqq7rIrcrsrrrrsssssitttttu%u?vNvvvVwew/z@z4{?{)}+}"~&~/~8~~~4]arkrIPx-3}ÂՃ.΅,DRYq?W &JYHd݊=X+/syŌӍ 4Mc~Ď"&>Vyď&5BYn}ɑߑƓғ@L`i}vӖٖ">`xޗ":ay@Sۙ!HQ;K'AdwÜќ/>D͝ӝ :Cܞ5<[_?DV\|٠ޠ<@\l+/]m,<ţգ M]Ԥ٤q3C'Aڧ *%;s©ީ4Plڪ-umqȬѬ&v{̭ܭ!6Fcnɮگ )E UWDZ5Psֲ2M^vѴCR,JXh¶Ѷη -p,üRlþVnah0u{ns*Sq0G 03333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 Nathan RectorjC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of Document1.asd Nathan Rector C:\VB\ntsSync\ntsSync Manual.doc Nathan Rector C:\VB\ntsSync\ntsSync Manual.doc Nathan Rector C:\VB\ntsSync\ntsSync Manual.doc Nathan RectoroC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of ntsSync Manual.asd Nathan RectoroC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of ntsSync Manual.asd Nathan RectoroC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of ntsSync Manual.asd Nathan RectoroC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of ntsSync Manual.asd Nathan RectoroC:\Documents and Settings\Nathan Rector\Application Data\Microsoft\Word\AutoRecovery save of ntsSync Manual.asd Nathan Rector C:\VB\ntsSync\ntsSync Manual.doc@````.@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New"1h] fiS\!20d2ntsSync Concepts Nathan Rector Nathan Rector