Documentum D2 Components and Architecture

August 16, 2019 Leave a comment

Over a year ago we know how EMC use to manage Documentum providing all the users and developers access to two of the most popular public forums for Documentum : Documentum Support Forum and Documentum Developer Forum, today with OpenText moving their content slowly  to OpenText community forum and restricting access only to their customers  , the Documentum forums became inaccessible now.

Some of the key foundational products of Documentum like the xCP, xDB, Info Archive and D2 are still widely used by many customers and is scaling with regular updates in features. This is going to be my first blog about D2, that I will be trying to post in with all the works I have been doing since past 3 years.

So, let me start with explaining the basics of D2, its components and how its architecture looks like:

Documentum D2 consists of two components:

  • D2 Client: It’s a web-based application for users that provides the ability to interact with content in one or more repositories. D2 Client allows users to:
    • Personalize the user interface using widgets and workspaces.
    • Perform searches across one or more repositories.
    • Create, import, edit, modify, export, and delete content.
    • Organize content manually and automatically using relationships, metadata, and so on.
    • Use content lifecycle and workflow processes as constructed by administrators.


  • D2 Configuration: It’s a web-based application, hereafter known as D2 Config, for administrators to use to configure settings such as automated content-handling processes and background settings for D2 Client. For example, administrators use D2 Config to configure automatic renaming and placement of created or imported content. Other settings include content lifecycle and workflow, workspace layouts, and available widgets.

D2 Architecture

D2 Client consists of three layers:

  • The Browser layer denoting the web browsers that are used by end users to connect to D2. D2 uses standard HTTP requests for all communication between the browser client and the D2 web application. For requests for static resources such as images, D2 uses GWT RPC calls backed by the D2FS services layer, to retrieve dynamic data
  • The web application server layer corresponds to the installation and configuration of D2.war which mainly includes most of the presentation logic, including the GWT and GXT libraries, custom interface controls, static web resources, and pass-through services to allow web browsers to invoke the D2FS services. The layer does not link to the DFC or DFS client libraries because all communication between the D2 web application and the Documentum repository passes through the D2FS interface.
  • The Documentum Content Server layer that consists of the installed DAR files. Includes most of the Documentum types necessary for storing configuration objects in the repository. Configuration objects are subtypes of d2_module_config or d2_moduledoc_config, depending on whether the configuration is stored as object metadata or as XML content.

D2 Config is comprised of three layers:

  • The Browser layer denoting the web browsers that are used by end users to connect to D2 Config.
  • The web application server layer that corresponds to the installation and configuration of D2–Config.war and the D2-Widget plug-in. This includes most of the presentation logic, including the ActiveX controls.
  • The Documentum Content Server layer.

How do you install D2?

D2 installation includes three DAR files:

  • D2–DAR.dar
  • D2–Widget-DAR.dar
  • Collaboration_Services.dar

Extending D2

D2 offers the certain methods of extending D2 by using the D2 API:

  • Building integrated solutions by using the D2FS services to interact with the D2 web application.
  • Using Open Ajax Hub (OAH) and JavaScript to create external web applications that can be manipulated as iframes (External Widgets) from within the D2 web application.
  • Using D2 Java packages to create and configure D2 plug-ins that add custom actions or override existing D2 services.

I have used Eclipse for building the code.

What is D2FS and what is the significance of D2FS? Can you give few examples?

The D2FS API is exposed from the D2 web application as a set of SOAP services. The D2 SDK package contains the sample Java classes that use the Java stub libraries to invoke and modify the D2 processes and data. We can generate Java Stub Libraries to Call D2FS Using SOAP. The D2 SDK package comes with quite a few example java classes, if I recollect there are:

  • CheckinContentExample which Demonstrates how to use getCheckinUrls() to Check out content, Request a checkin URL.
  • DestroyExample Demonstrates how to destroy content, and
  • ImportAndUploadDocumentExample – this tells how to use createproperties() to import and upload content.

To name a few.

What is OAH?

OAH or Open Ajax Hub (OAH) is a standard JavaScript library for publishing and subscribing to web applications. We can use OAH to:

  • Publish to a channel to send a message.
  • Subscribe to a channel to listen for a message.

Hope this is helpful, in the next post I will try to describe the customization that you can do with D2 and its various available plugins.

D2-Security ,Workflows & Life Cycles

August 23, 2019 Leave a comment

D2 Security Model

Inheritance models can be configured for both security and properties to automatically set and/or enforce permissions and metadata values based on a document’s context.


D2- Workflows

In D2Config, we only able to configure the already created workflow i.e from Process builder or workflow manager.


Differences between Workflows and Lifecycles


D2 Lifecycles Vs Documentum Lifecycles

Documentum lifecycles are generally linear, with promotion to the next state defined by a set of entry criteria. D2 lifecycles are more flexible, allowing different transition paths between states and a more extensive set of entry and exit conditions and actions. Either type of lifecycle can be used in D2, although mixing D2 and Documentum lifecycles for the same content is not recommended.



Will come back with some more posts on D2, hopefully D2 jobs next time.

Have a great weekend 🙂

Custom Plugins in D2 and Deployment – Contd..

August 22, 2019 Leave a comment

We can create and configure custom plug-ins using the Java classes and the resources that are packaged with the D2 API framework to:

  • Add features as custom actions.
  • Modify existing features by changing the pre-processing, post-processing, and the overriding D2 services.

Deploying D2 Plug-ins:

  1. Create the plug-in .jar file.
  2. Copy the plug-in .jar file to the <install path of D2>/WEB-INF/lib/ folder.
  3. Restart the web application server.
  4. Verify the plug-in installation by logging in to D2 Client and navigating to Help > About.

D2 Bin

The Recycle Bin feature manages the cancellation and deletions of documents by using a standard recycle bin approach.

The D2-Bin plug-in adds a recycling-bin approach to managing document removal in D2. If D2-Bin is:

  • Not installed, D2 permanently removes content when an end user deletes content.
  • Installed, D2 moves deleted content to an electronic recycling bin, which allows end users and functional administrators to view, permanently remove, and restore content.

Navigate to D2-Bin > Options from the menu bar.


Use C2 to extend PDF functionality of D2 with regards to adding:

  • Extra pages: you can add one or several pages at the beginning, end, or after a given page. These pages can contain content properties or variables.
  • PDF layers: you can add headers, footers, or images to all or part of documents.
  • Watermarks: you can add image or text watermarks to all or part of documents above or below text and as transparent images.
  • Dynamic pages: you can add dynamically-constructed pages, such as signature pages, gradually over the course of the lifecycle of the PDF document. Create dynamic pages in XML format so that tables can be managed based on their size. which are linked according to configurations when the document is viewed, printed, or exported.

You can use C2 to secure and apply controls to PDF documents when they are distributed out of the repository. The main functions are:

  • Ensuring only secure versions are provided when viewing, exporting, and printing.
  • Controlling printing using print counters and adding the ability to print with the note designating the recipient. D2 audits the controlled prints using the information provided by the end user when submitting the content for printing.

D2 automatically generates an XML containing the elements of the table of contents. Create and import an XSL for formatting the table of contents when viewing, printing, or exporting content in C2.

The XML uses parameters within an object in the root.

 The C2 plug-in creates a c2_rendition event in the dmi_queue_item queue to generate the PDF rendition. After completing the request and generating the PDF, D2 marks the item as dequeued but does not clear the dmi_queue_item events.

DELETE “dmi_queue_item” OBJECTS WHERE “dequeued_date” <DATE(’01/01/2013’) AND “delete_flag” = true


Use O2 to allow management of properties transfer between D2 and Microsoft Office documents as well as between .eml and .msg email messages.

Configuring Microsoft Office for O2 – Create a macro.


Thanks for your emails and various requests, Many of you have been requesting me to share information about the D2 Security and workflow features, I will write something based out of my experience in my next blog.

Syncplicity & Custom Plug-ins actions

August 21, 2019 Leave a comment

In the Previous post, I tried to explain the various customization and plug-ins that are available/offered with D2 in this post I will detail my experiences with the custom plug-ins , how to override a D2 Service and how we handle actions in D2. Let me start with a lighter concept with D2 before I jump onto the custom plugins and actions…


Files can be shared directly from D2 to Syncplicity, allowing content to make available to users inside and outside an organization on multiple devices.  Folders may be synced from a menu option or from a workflow task. An icon is shown on the folder/content to indicate that the content has been synced. Automatic shares can be set up by an administrator and limited to specific document types.  Shares can also be manually initiated by authorized users.

Custom Plug-ins Custom Actions





Creating and Configuring a Custom Plug-in – Creating a New Plug-in Using the Template

  1. Rename the Your Co-PluginName project.
  2. Rename com.yourdomainhere.yourplugin in Eclipse to your domain namespace and package name for each package in the plug-in template.
  3. Optionally, rename and ; If you rename the files, you must edit to reflect the name change.
  4. Edit and change project.version.file to reflect the package structure and the plug-in properties file name.
  5. Edit
  6. Add the plug-in implementation classes. For example: * and *
  1. Re-run .\build\build.xml to rebuild the plug-in.

How do you create and handle actions, custom actions in D2?

  1. Create a Java class in the <project folder>/src/com/<your namespace>/<plug-in name>/webfs/services/custom/ folder.
  2. Import the d2fs resources:

import java.util.List;

import com.emc.d2fs.dctm.plugin.IPluginAction;


import com.emc.d2fs.models.attribute.Attribute;

  1. Implement IPluginAction: public class <name of the class> implements IPluginAction
  2. The class must contain a method that has at minimum the following format:

public List<attribute> <methodName>(D2fsContext context) throws UnsupportedEncodingException, DfException, D2fsException;

  1. After building and installing the plug-in, create a menu button in D2 Config to allow end users to perform the custom action.

Throwing Exceptions

We can use Exception () and D2fsException () to report exceptions or errors encountered in Service extension or Custom Action code back to D2 and the end user. The following example shows how to use D2fsException ():

public List<Attribute> getCustomDownloadURL(D2fsContext context) throws UnsupportedEncodingException, DfException, D2fsException

Setting Up D2 Service Overrides

  1. Determine the <name of the service> : To determine the <name of the service>, replace the prefix I with D2. For example, IExportService uses the D2 service D2ExportService.
  1. Create a .java file named <name of the service> for the services class to configure the process in the <company name>-<plug-in name>/src/com/<your namespace>/<plug-in name>/webfs/services/<name of the service package>/ folder.
  2. Create and name the class <name of the service>Plugin. For example, the sample uses the service D2ExportService to name its class D2ExportServicePlugin.
  1. Extend the service class with the <name of the service> and implement the ID2fsPlugin interface. For example, the sample declares the class:

public class D2ExportServicePlugin extends D2ExportService implements ID2fsPlugin

The ID2fsPlugin interface forces the implementation of two methods:

  • getFullName: Returns the full plug-in name with its version number. The method is called by the About dialog box in D2.
  • getProductName: Returns the plug-in name to determine whether the plug-in should be executed based on the D2 configuration matrix.

D2 Plugins and Customization…

August 19, 2019 Leave a comment

Customizing D2- What is Possible?1-e1566236184837.jpg

2.jpgHow does Content Check-in Service work in D2?

The content checkin process uses IDownloadService.getCheckinUrls() service to perform the checkin operation as a single and/or atomic operation. We first cease the usage of the checkin() and getUploadUrls() services and use the getCheckinUrls() service.

D2-Specs Plugin

 Automatically design technical specifications of D2 product

  • Generate a document that compares two different configurations.
  • Using Module Description, we can describe the various elements of our configuration matrix.
  • Once modules are described, we can generate application specifications.
  • We can include dictionaries and taxonomies in the technical document.
  • All the configurations differences are listed into a PDF document
  • All the differences between the two configurations are listed into tables organized by types and modules.


BOCS sits on a separated host, nearer to customer needs. A server machine with only an OS installed, so this machine does not need Documentum or DB to be installed. The host will be used only to install BOCS and DFS. On the content server, it is required to have a DMS installed and running.


D2 is integrated with Documentum Retention Policy Services. RPS policies and markup that apply to a selected document can be displayed, and operations on documents will conform to retention policies.

If we install D2-RPS-CONNECTOR, this will add a set of PDF control capabilities to D2-Client along with a set of configuration modules and dedicated screens to D2-Config.

D2-RPS-CONNECTOR involves two components:

  1. D2-RPS-CONNECTOR docapp or dar
  2. D2-RPS-CONNECTOR-Install.jar library

The D2-RPS-CONNECTOR library has to be installed on the Content Server & the application server.

Copy D2-RPS-CONNECTOR-API.jar in the Jboss lib folder:

Copy Policy engine and services jars in the RPSA webapp lib folder.


Lockbox is a component of the RSA Common Security Toolkit (CST) which securely stores passwords for Documentum D2 in an encrypted file. The stored passwords are put as <key, value> pairs. Lockbox uses keys to store and retrieve the passwords. Documentum D2 uses Lockbox that were earlier present as clear text in the various properties files, such as,,, and

The Lockbox configuration for D2 can be done in either of the following ways:

  • Using the new D2 Configurator Utility – Configure the lockbox through the configurator: D2-Configurator-4.5.0.jar file.
  • Manual configuration of D2 Lockbox


  • Copy LB.jar and LBJNI.jar that are extracted from the D2 installer into <Documentum install path>\<Jboss version>\server\DctmServer_MethodServer\lib folder
  • set PATH=C:\Documentum\D2\Lockbox\win_vc80_x64;%PATH%
  • set CLASSPATH=<D2 install path>\C6-Common-<version>.jar;<lockbox install path>\LB.jar;<lockbox install path>\LBJNI.jar;%CLASSPATH%
  • Generate lockbox file and set D2.passphrase

java.exe –cp “C:\Program Files\EMC\D2\C6-Common-4.5.0.jar;C:\Documentum\D2\Lockbox\LB.jar;C:\Documentum\D2\Lockbox\LBJNI.jar” C:\Lockbox D2Method.passphrase #1Password

  • We can create a passphrase using java PassphraseGenerator:

java <length>


  • Copy the D2.lockbox file generated in <Documentum-root>/<JBoss-version>/server/DctmServer_MethodServer/deployments/ServerApps.ear/APP-INF/classes/
  • Create emc/d2/lockbox/main folder under <Documentum install path>/<JBoss version>/modules/ & Copy LB.jar and LBJNI.jar files that are extracted by the D2 installer to the main/ folder
  • Create module.xml for these 2 jar entries.
  • Add dependencies in jboss deployment xml file.


Need to configure the lockboxPath entry both in D2-Config and D2 client applications:

D2 Config

  • In D2-Config application, file contains lockboxPath properties entry. The file path of this properties file is located at :

<webapp root>\webapps\D2-Config\WEB-INF\classes\

  • Open the above file in a text editor and search for the string “lockboxPath”. By default, this entry would be commented. Uncomment and specify the fully qualified folder path of D2.lockbox file.

D2 Client

  • In D2 application, file contains lockboxPath properties entry. The file path of this properties file is as under:

<webapp root>\webapps\D2\WEB-INF\classes\

  • Open the above file in a text editor and search for the string “lockboxPath”. By default, this entry would be commented. Uncomment and specify the fully qualified folder path of D2.lockbox file
  • Lastly Copy lockbox librariesjar and LBJNI.jar into AS webapps.

 Restart Environment

The system hostname key is missing from the Lockbox – Regenerate the lockbox file again by running the installer through admin command line pointing to the supported java.

Deployed LB onto the JMS (D2 Lockbox on Content Server), Set the dll path:


java Dclb.library.path=C:\Documentum\D2\Lockbox\win_vc80_x64 C:\Progra~1\EMC\D2\lockbox D2Method.passphrase $Pass123

Email Notification in FileNet P8

September 13, 2016 Comments off

It’s been a while I was away from the Blog, so here it is what I have today based on few of the email requests; I am trying to familiarize all the developers out there about the Email Notification facility present in FileNet and how do we enable & configure this feature in order to send out an email to the intended users based on the reminders we have set or on initiation of any step that we might have configured.

With the help of Email Notification, the workflow can be set to send email to the intended users. The Notification can be sent on completion of any step, the reminder mails and also for deadlines.

To use this facility, system must have access to SMTP (Simple Mail Transfer Protocol) server and also Email Notification parameters needs to be configured and enabled. Also we have to create Email Notification template and user preference needs to be set. It consists of 4 steps:

  • Enabling Email Notification
  • Configuring Email Notification
  • Modifying Email Notification template
  • Setting user Preference

Enabling Email Notification

For Enabling Email notification some event logging option has to be ‘turned on’ on application engine with the help of process configuration console.

1.1)  Select isolated region icon on PCC (Process Configuration Console) and click on properties tab on it.


1.2) After clicking of properties tab on the event logging action tab turn on the checkbox for Exception and Begin operation categories.


2)  Configuring email Notification

2.1) Start the Process Task manager from the process engine in the start menu. On Application engine we have to run routercmd.bat command file that is found in the \Router subfolder where the Application Engine is installed

2.2) Configure email notification with the help of process task manager on the process engine. Select the Process Service option and click on notification tab.


SMTP Host: It specifies the complete host name for an SMTP server on the network running the SMTP service.

SMTP Port: The port on which SMTP service is running.

Character Set: The Character used in encoding the email message.

Email Logon ID: The name used for the account you want the Process Engine to use to log on to the mail server application.

Email Logon Password: The password associated with the Email logon id.

Email From ID: The name you want to enter in the From field of email Notification.

Encode From field: Indicates whether to encode the contents of the Email from ID field.

3) Modifying Email Notification

3.1) Navigate to ..\fnsw_loc\sd\mas\1 directory


3.2) Change the properties of the mail which we want to modify from read-only to read-write.

3.3) Open the file using Textpad editor and modify the html content of the file.

3.4) We can enter the fields which we want in our template.

For example, in the file below we have selected subject to get displayed in the notification. The value of that subject will be obtained from $F_Subject variable which get sets in event logs.


3.4) Save the file and restart the process engine server.

4. Setting User Preference

User preference can be set from the workplace depending on the Email notification type which user wants to receive.



And we are done, there’s a lot more information that you can find in the FileNet ECM help file.

Hope this post helps and answers your email.

Happy Blogging!!!

kVisia: Product Overview

March 18, 2015 Comments off

Howdy Users and Buddies,

Today I want to share on kVisia, a product that provides the core functionality to automate, control and deliver an organization’s engineering and enterprise business processes to the desktop or Web. It holds the business rules, executes the XML configurations, builds the business forms, and implements the lifecycles that automate an organization’s business processes.

I think the only Prerequisites that you need to know is , Basic concept of client-server applications and Documentum Architecture.

Let me put it in Content Wise for better understanding with a bit of background of what’s there , what’s missing and how this can be achieved.

  1. Abstract

Today the current era is defined by the terms like data, information, knowledge, wisdom etc. and in this electronic world the difficulty to manage data in abundance has begotten many technologies and one of them is the Documentum.

Documentum is nothing other than a Content Management Tool but its vastness and its ability to cater to almost all sorts of data types available are so rich in itself that these days it is widely used. If we undo the Documentum technically then it gives an edge over the Relational Database Management System by not storing only the Meta data but also storing the content in its native format.

kVisia blends with Documentum to bolster the level and depth of automation which can be achieved by the Documentum alone and this is what this document discusses in detail.

  1. Introduction

kVisia comes of McLaren Software Limited and users need to have a license before using it. McLaren is ISO 9001 certified and it has been accredited Independent Software Vendor for Documentum and FileNet. It has got 360+ customers worldwide and it operates from UK, USA and Switzerland.

In fact kVisia is an Enterprise Engineer product that encapsulates best practices and domain expertise. This is a user configurable application consisting of XML files managed by repository and standardized on a single ECM platform. It is also believed to be powered by Documentum.

For better understanding of the kVisia we can go through the following questions and answers that will help one to identify the need.

How does it help me?

Very quickly configure the user interface and deliver it to the Desktop and Web users.

Is it easy to change?

Very easy, configuration files are stored in the Docbase in XML format.

Configurable interface using objects and tables.

Do the configuration files allow me to control inputs?

Very complex business rules can be enforced via the XML files.

Validations at creation, promotion and check in.

  1. kVisia suite

kVisia suite consists of following three components:

  1. McLaren Studio
  2. McLaren_Core DocApp
  3. McLaren_Foundation DocApp

3.1 McLaren Studio

McLaren Studio provides a user-friendly desktop application that allows users to create and edit XML configuration files that will conform to the rules of the Document Type Definition (DTD).

An XML (eXtensible Markup Language) configuration file is a structured file consisting of many elements. Elements are ordered into a tree structure or hierarchy. Elements may have parent or child elements, and may also contain attributes. An element without a parent element is the highest in a tree structure and is called a root element. Not all of the elements will have child elements.

The structure of a valid XML file is defined in a DTD (Document Type Definition) file. The DTD contains the rules that apply to each XML configuration file; these include the definitions of parent and child elements, element attributes, and how each element can be used

The appearance and behaviour of user dialogs can be modified without the need to change programme code simply by changing settings in the appropriate XML configuration file. A definition of the appearance and behaviour of a dialog is referred to as a “configuration”. A common need, however, is to display different configurations under different circumstances. For example, members of different groups may need to fill in different properties on documents, and the document’s properties may change as it moves from state to state in a lifecycle. The definition of such a scenario is referred to as a “mapping”. When you do not want to differentiate functionality between different groups, lifecycles and states, there is a value called {default} that will apply to all circumstances.

The Actions for which dialogs can be defined using an XML configuration file are:


When the user issues the New command, a customized dialog can be displayed. Commonly deployed features include automatic document numbering, interactive project allocation and any additional attributes (optional or mandatory), which may be required to be stored for the document.


A customized Properties dialog can be displayed. Fields can be made editable or read-only as required.


When the user performs an import, a customized dialog can be displayed which may typically employ features similar to those used in the New dialog.


When the user performs a copy and paste action, a customized dialog can be displayed which may typically employ features similar to those used in the New dialog.


For each document type, a search dialog referred to as QuickFind can be defined and viewed by the user in the Docbase through the McLaren menu. The attributes that can be searched on are configurable and search options such as Between, Greater Than, Containing, etc., can be specified.

 3.2 McLaren_Core DocApp

Having installed kVisia you get two sets of Docapps in the Docbase, one is the McLaren_core and the other one is McLaren_foundation. The McLaren_core Docapp is available to the user of a Documentum repository. It is always suggested that one should have the overview of the additional functionality as a result of the deployment of the kVisia before configuring the product to suit the business need.

As the name suggests McLaren_core Docapp provides the basic functionality like New, Import, Properties, Copy, QuickSearch etc to be configured. As discussed above, we use the XML configuration tool McLaren Studio to configure it.

For each Object Type used in the repository, an XML Configuration File can be created and configured to define the appearance and behavior of the various dialogs for documents of that Object Type. The definition of the appearance and behavior of a dialog is referred to as a configuration, and different configurations can be displayed in different circumstances.

3.3 McLaren_Foundation DocApp

The McLaren_foundation installation enables you to deploy a pre-configured implementation of the Core technology which transforms it into a user application specifically adapted to the engineering environment, providing a ready-for-use engineering repository. It deals with the following configurations:

User Roles that is associated with Menu Systems and User Dialogs that are adapted to those roles.

Object Types for documents and folders.

XML Configuration Files that define the content, appearance and behavior of the New, Copy, Properties, Import and QuickFind dialogs for the supplied Object Types in accordance with the current user’s User Role and the document’s lifecycle and state, including pre-configured, automatically generated document numbering.

Check in dialogs which are specifically adapted for each supplied type of engineering document.

Automated document revision numbering that reflects common design practice. Revision numbers start at 0 and the first issued version is 1, the second 2, the third 3, etc. When a document is checked in for the first time, a numeric value is assigned and incremented each time it is checked in.

  1. Traditional – VB (Desktop) Vs kVisia(Desktop & Web)

Following Comparison lets you know how much flexibility kVisia provides and how much time and effort it saves.

Traditional – VB (Desktop) kVisia (Desktop and Web)
Ø  Obtain VB source code.

Ø  Open VBP.

Ø  Edit GUI.

Ø  Add code to populate list.

Ø  Add validation rules.

Ø  Save source code.

Ø  Compile DLL.

Ø  Create CAB file.

Ø  Open DocApp in Composer

Ø  Edit the component ACX and

replace CAB file.

Ø  Check DocApp back in.

Ø  Not available until next user login.

Ø  Check out XML.

Ø  Edit XML kVisia Studio.

Ø  Add XML tag.

Ø  Specify properties.

Ø  Save and Check back in.

Ø  Change available immediately (no logout required).

  1. Benefits
  • Easy to manage development process as applications are configured via XML using Studio
  • Fast route from innovation to user acceptance
  • Shorter time from design through to development
  • Shorter time to deploy to the business users
  • Reduces development costs
  • Future upgrades are minimised
  • Simple deployment and at a local level of control
  • Speeds up implementation process through rapid configuration

Hope you like the post, Feel free to post your comments and I will reply back to any queries that you have.

Adios , Have a great day ahead…

%d bloggers like this: