How to DLRS

      60 Comments on How to DLRS

Salesforce is great for making object creation and data collection super easy.  One thing it doesn’t make so easy is jumping tables as you MUST use a Master Lookup if you want to use Rollup Summary fields and those are even limited in the functions they can do.   You just want to move a field off of a child record onto the parent, or maybe just grab the user name of the last completed activity and write it to the opportunity record that task was related to.  Before it would take some fancy apex or other developer style work to accomplish, UNTIL Andrew Fawcett created this amazing tool called Declarative Lookup Rollup Summaries.  A bit of a mouthful so I always refer to it as DLRS.

This blog is going to be a super broken down step by step of how to DLRS, the most common issues you might run into with it and a few ways I use it.  Pro-Tip don’t try and install this from the app exchange you will find a very out-dated version that no longer installs. So, to install the package head over to the github ( and click either Sandbox or Production for the latest version.  I’d recommend giving it a spin in your sandbox first.

Now wait for an Email from SFDC telling you the install has finished.  You should now see a handful of new tabs and a new app called Declarative Lookup Rollup Summaries.Start off by either loading up the app via the app menu or clicking on the welcome tab.  You should see a welcome screen with an error message.  Don’t worry it is just the tool noticing it can’t talk to the SFDC API that does a lot of the heavy lifting for the tool.  To fix this just click on the “Create Remote Site Setting” button.The tool will automatically create what it needs and the screen should reload and look like below.Now there are two ways to use this tool, both work, pick one, stick with it.  If you were to ask Andy he would most likely say to use his cool metadata method because it is slick, smooth, works with change-sets and he also spent a shitload of time making it =).  But in the end either way will work.  The new cool custom metadata way you’ll want to use the Manage Lookup Rollup Summaries tab.  For the old non fancy way you would just use the Lookup Rollup Summaries tab.  If you are brand new to this and don’t have any historic DLRS records best bet is to stick with the new custom metadata way.Loading that up you should see a screen like below.  We will go over what each of the fields means, and what you should enter into them.If you are using the old way it is very similar you’ll just get a record list and will have to select your DLRS record or click on new.

Now using either the Custom Meta Data way or the old record based way the numbers match to the same fields.

  1. Lookup Rollup Summary Name – This is more or less like a field Label.  This is the name of the record for easy people reading.
  2. Lookup Rollup Summary Unique Name – This is like an API name when creating a field.  You will want this to be Unique and use _ in place of spaces.
  3. Parent Object – This is where you will put the API name of the Parent Object.  If using a custom object don’t forget about the __c.  Think of the Parent Object where you want the data to be written to.
  4. Child Object – This is where you will put the API name of the Child Object.  If using a custom object don’t forget about the __c.  Think of the Child Object as the object you want to get the data from.
  5. Relationship Field  – This is the field that holds the ID or PK from the Child to the Parent.  Double check your API names as many times the UI will show say Account but double check in the SOAP API Document. Lots of times it might really be AccountId.  The magic here is that this can just be a text field, a normal lookup field or a master lookup it can work off any of those.  Again if this is a custom field don’t forget the __c =)
  6. Relationship Criteria –  This is where you will write out the WHERE clause of a SOQL query.  We use this to make sure the tool only selects the records we want.  Example say I want to count all of opportunities that have Closed – Won on an account.  There are a few ways to do so but I could go isWon = true or I could say Stage = ‘Closed – Won’.  You can use AND statements here if you have multiple criteria and also use OR statements.  When using an OR statement make sure to wrap the OR statement inside parentheses.
  7. Relationship Criteria Fields – This is where we will want to list each field  that we used in the above Relationship Criteria on a separate line.  We don’t need to copy the logic just need to copy the API Field Names.
  8. Field to Aggregate – This is the API name of the field on the CHILD object that we want to roll-up.
  9. Field to Order By – This field only matters if you are using the Concatenate, Concatenate Distinct, Last and First selection for #10 Aggregate Operation.  By default if you leave this blank it will just use the Field to Aggregate by.  This is a helpful field if you want to select the most recently created record you would put in CreatedDate here so that way the results would be sorted by the CreatedDate field.
  10. Aggregate Operation – We have a few options here.
    • Sum – This will only work on numeric based fields. It takes the sum of your field to aggregate from all of the child records that it finds.
    • Max – This will only work on numeric based fields.  This will select only the highest value of the field to aggregate from all of the child records it finds.
    • Min – This will only work on numeric based fields.  This will select the lowest value of the field to aggregate from all of the child records it finds.
    • Avg – This will only work on numeric based fields. This will take the MEAN of the field to aggregate from all of the child records it finds.
    • Count – This will just do a count of the rows/amount of records returned.  When using Count it is normally best to use the ID field in your Field To Aggregate.
    • Count Distinct – This will do a DISTINCT count of the values in your field to aggregate.  Example is if the returned values are (A, A, A, B, C) in a count it would be 5 but in a count distinct it would only return 3 as there are only 3 distinct values.
    • Concatenate – This will only work on text fields and it will grab the values in your field to aggregate and place them value after value into the field you want.  You’ll want to use #17 to set how you want the tool to break these values apart either with a comma or a dash etc…
    • Concatenate Distinct – This works the same as above but again just like a Distinct Count it will only grab the distinct values.  So if we had (Dan, Dan, Dan, Not Dan) with just Concatenate we would return in a text field “DanDanDanNotDan” but with Concatenate Distinct we would only return “DanNotDan”.
    • First –  This will work with any type of field.  This will grab the FIRST record based on how the results are sorted then take that field to aggregate from that record.
    • Last –  This will work with any type of field and does the same as above expect it grabs the LAST record then will take the field to aggregate from that record.
  11. Aggregate Result Field – This is the field on the PARENT object where you want the results to be written.
  12. Aggregate All Rows –  This will include records that might be in the recycle bin or are archived by the system.  If this box is not checked then records that have been archived or are in the recycle bin will not be counted.
  13. Row Limit – This only works with the Last and Concatenate Operations but it will let you define a set row count.  Say you only wanted to grab the last 5 records you would use the Last Operation and set this to 5.
  14. Active –  This is what activates the DLRS record or not.  If this box is not checked DLRS will not apply this rollup function.
  15. Calculation Mode
    • Realtime – Happens in real-time.  When someone makes a change that would trigger DLRS to run, it will calculate the roll-up and change the result on the parent if the result is different than what is already there.  You must deploy the child apex trigger for this mode to work.
    • Scheduled – This mode will start to collect records at the bottom of each roll-up under the “Lookup Rollup Summary Schedule Items”.  You will have to schedule apex to run on whatever cadence you would like by having the system run the Apex Class RollupJob.  When this Apex Class runs it will collect all of your Lookup Rollup Summary Schedule Items and process them, then calculating the rollups and updating the parent records. You must deploy the child apex trigger for this mode to work.
    • Developer –  This mode allows you to call DLRS from your own Triggers/Classes.
    • Process Builder – This mode allows you to call a DLRS record from inside Process Builder.  When using this mode you DO NOT need to deploy the child apex trigger.
  16. Calculation Sharing Mode
    • User – The user that triggers the DLRS to be run, the lookup will respect system sharing rules and only calculate the rollup based on what that user has access to.
    • System – This acts like Apex or Workflow Rules by running in system and has visibility into all records.  Rollups will be calculated based on all child records regardless if the user who triggered the DLRS has the permissions to see all records.
  17. Concatenate Delimiter – This is how you set how you want your concatenated operation to be split.  You can use a , or a | or a line break BR().
  18. Description – This is where you can leave notes for yourself on the purpose of the DLRS record, what it should be doing and why so that way the next admin who comes across this won’t be totally lost.
  19. Test Code –  If you have custom validation rules or apex in your org that has the manage child trigger running into issues deploying the trigger, you can type in custom test code here.

Now after you save your new DLRS record you will see some new buttons.Now I am going you assume you understand the Delete and Save buttons (You’ll see Edit if you are using the old method).

  • Manage Child Trigger is how you can deploy and remove the apex code that this tool needs to run.  You only need to deploy this one time per child object that you have DLRS running on.  Example if you have 3 DLRS records all running on Opportunity as the child object you need only deploy the trigger one time.
    It might take a bit of time to deploy, just wait young grasshopper, soon you shall be rolling up fields like a pro. Once it is done you should see this
    at the top of the page.
  • Calculate this button will do an entire org recalculation of the dlrs record.  This is great for back filling parent records after you create a new DLRS record.

    This text box allows us to apply some PARENT object filters.  Say we are running a recalculate on a DLRS and the Account object was the parent object.  But we only want this back-calculation to be done on Customer Accounts.  We could put a WHERE clause here like Type = ‘Customer’ then when it does a system recalculate it will only do so for parent records that meet that criteria.  Calculate Jobs are run as Apex Jobs and you can find the status of them in the Apex Jobs section of Setup.
  • Schedule Calculate this one is a tricky one.  It more or less will automate going into the DLRS record and pressing that Calculate button for you on a set schedule.  In those cases where you have time or date values as part of the relationship criteria you will normally want to force a system recalculation every now and then.
    Here you can also enter in a Parent Object where clause, and then pick the frequency and time you would like this to run.  Once you press Schedule Recurring Calculate Job you can find the job under Scheduled Apex.

Now lets take a look at a sample request someone might have and a real world solution on how to use DLRS.  We will not only look at the request, how to build the DLRS we will also try some SOQL queries out to understand how the DLRS tool works.

If you live in the SaaS world then you love to know when your customers might be at risk of churn.  One of the signs that a customer account might be at risk is you have no data on customer contacts at the company.  Not only do we want to know if we have contacts we want those contacts to have contact roles so we know that if we do have contacts on an account we have a few critical ones that are important when we need to reach out.

In this case we can create a DLRS that will look at all the contacts on an account and see if they are the type of contacts we want then roll a count of how many of those contacts we have onto the Account.  We can then do all the fun Salesforce stuff like build a workflow email off that field where if the value is too low it can alert the account owner or a CSM.  Below is an example of how we would build this.One thing you might notice is the Aggregate Result Field I have the start of the field name DLRS_.  I would HIGHLY recommend naming all the fields you plan to roll values into with DLRS somewhere in the field so other admins or later in life you know that there is apex that relies on that field and it should not be deleted or manually modified.

We set our Parent Object to Account and our Child to Contact.  We know that the field on the Contact that holds the Account relationship is called AccountId.  How did we know that? We double checked here. Then we know we want to make sure that we are only looking at customer accounts, but DLRS is limited to relationship criteria on the child record only.  So I created a formula field that brings down the Account.Type onto the contact record.  Pro-Tip changes to Formula fields don’t cause a record edit so if this Account became a non-customer that would not cause the DLRS to re-fire and re-calculate the field on the parent.

Next we want to make sure the contact record isn’t old and they are still with their company.  Then we have a list of contact roles that are important to use.  So we build up the WHERE statement of
(No_Longer_With_Comapny__c != TRUE AND Contact_Role__c INCLUDES ('Operations Contact', 'External Community Manager', 'Internal Community Manager', 'Primary Contact') AND Account_Type__c = 'Customer')
Thats a big statement, first if you are not familiar with != it is the same thing as NOT EQUALS or <>.  Includes is there because Contact_Role__c is a multi-select picklist so we need to just see if that text is anywhere in the field.  Then Account_Type__c = ‘Customer’ is because we don’t need this DLRS to run unless they are a customer.  Now lets see how this works from a SOQL point of view.

If you have never opened the Developer Console click on your name in the top right and you should be able to select Developer Console. A small popup window should appear, in the bottom area you’ll want to select Query Editor.  Then lets create our SOQL query.  We already have our WHERE in our Relationship Criteria.  Now for the start of it lets put

SELECT [Field we want to rollup cept without the brackets] FROM [Child Object] WHERE [Relationship Criteria] AND [Relationship Field] = '[Id of a parent record to use for testing]'
In our case it looks like this
SELECT No_Longer_With_Company__c, Contact_Role__c, Account_Type__c FROM CONTACT WHERE (No_Longer_With_Company__c != TRUE AND Contact_Role__c INCLUDES ('Operations Contact', 'External Community Manager', 'Internal Community Manager', 'Primary Contact') AND Account_Type__c = 'Customer') and AccountId = '0015000000os367'

This is what we get when we press the execute button in the bottom left.Now in this case we are just using a count so it will just count the total rows.  In this case we can see the results have a total rows of 2, so in theory our DLRS results field should show 2.  This is a great way of checking if the issue is with DLRS as a tool, your data, or your SOQL query.

In this case I then built a formula field that returns a checkbox and if the DLRS Result field of IF(DLRS_At_Risk_Contact_Count__c > 1, False, True).  This way if we have more than 1 result it wont mark the account at risk for low contact count and if it is below 2 then it will mark the checkbox that fires off some workflow rules.

With that you should be more than ready to start building your own DLRS records!  If you have any issues come to the DLRS community and plenty of people will be more than willing to help you troubleshoot any issues and problem solve on creative solutions to issues you might be having with the tool.

60 thoughts on “How to DLRS

  1. kathy

    Love these details! I need to roll up from Oppty Product Lines to Opportunity. I set Parent object to “Opportunity”, child object to “OpportunityLineItem” and Relationship Field to “Opportunity”. Also tried OpportunityID.

    Roll up is not working for me: I just wondered if I have fields correct, such as “OpportunityLineItem”. Thanks!

    1. Naama

      Hi Kathy,
      Did you solve it?
      I’m trying to create the same rule but getting the following error in the apex job:
      “First error: Lookup Rollup Summary ‘All Related Variants’ is invalid, your org configuration may have changed.”

  2. MegK

    Thanks for this guide! I installed the app in our Sandbox. When I clicked on the Manage Child Trigger button and then chose Deploy I got the following error messages:

    classes/dlrs_AccountTest.cls (Line: null: Column:null) : Not available for deploy for this organization
    classes/dlrs_OpportunityTest.cls (Line: null: Column:null) : Not available for deploy for this organization
    classes/dlrs_OpportunityTest.cls-meta.xml (Line: null: Column:null) : Not available for deploy for this organization
    classes/dlrs_AccountTest.cls-meta.xml (Line: null: Column:null) : Not available for deploy for this organization
    triggers/dlrs_OpportunityTrigger.trigger-meta.xml (Line: null: Column:null) : Not available for deploy for this organization
    triggers/dlrs_AccountTrigger.trigger (Line: null: Column:null) : Not available for deploy for this organization
    triggers/dlrs_OpportunityTrigger.trigger (Line: null: Column:null) : Not available for deploy for this organization
    triggers/dlrs_AccountTrigger.trigger-meta.xml (Line: null: Column:null) : Not available for deploy for this organization.

    Because of that I can’t save any changes in the Lookup Rollup Summary or calculate it.

    I am using the DLRS to show in the account object a summation of opportunties where a custom field isn’t blank.

    Do you know of a solution for the errors?

  3. Bob Bailey

    Great Article. Really helped me use DLRS successfully. If there are other debugging tools I would love to know about them. (Or, should I say “de-glitching” tools? 🙂 )
    Thanks… Bob

    1. Dan Post author

      Glad it helped! When it comes to debugging I mostly use the SFDC Dev Console. What issues are you running into?

  4. Shmuel Shuchat

    hi looks like a great tool, but im running into some issues
    when trying to save a child record im getting a error

    dlrs_GW_Volunteers_Volunteer_Ha1VTrigger: execution of AfterUpdate caused by: System.SObjectException: Illegal assignment from Integer to String Class.dlrs.LREngine.rollUp: line 263, column 1 Class.dlrs.LREngine.rollUp: line 117, column 1 Class.dlrs.RollupService.updateMasterRollupsTrigger: line 1035, column 1 Class.dlrs.RollupService.handleRollups: line 892, column 1 Class.dlrs.RollupService.triggerHandler: line 311, column 1 Trigger.dlrs_GW_Volunteers_Volunteer_Ha1VTrigger: line 7, column 1

    1. Dan Post author

      I’d recommend going to the Community Page for quicker help but I can also help here. Do you have a screenshot of your DLRS record? What version of DLRS are you on?

  5. Raegan Hill

    Outstanding instructions! I have the rollup set up and saved but haven’t run yet. I’m looking for a visual example of how to call this rollup from a Process Builder? Could you show me? #Grateful

  6. Kristin Lucas

    I am not able to get my DLRS to calculate. Going forward, I am using the Calculation Mode of “Process Builder”, which will be invoked when an Opportunity is Closed Won. I want to do a force calculation to backfill data for all existing Customers. I don’t get any errors, but also don’t get any data.

    Ideas on what could be wrong?

    1. Dan Post author

      Hey, I’d recommend going to the success community to troubleshoot but can also help here. Can you post a screenshot of your dlrs record?

      1. Kristin Lucas

        Thanks Dan…I finally got it to work. I think it was because there was an earlier job stuck. Who knows.

        The issue now is the rollup worked for all Accounts, except for 39 out of 234. I can’t find a pattern as to why some would not give a value. There were no failed records.

        How can I post a screenshot?

  7. Kristin Lucas

    I am all set. I was using the Aggregate Function of “Last”, with a row limit of 1. The goal was to only roll-up the most recent Opp. Seems I was rolling up the first. Not what I expected, but by removing the row limit, it now rolls up the data.

    Thanks for listening

    1. Dan Post author

      Glad you got it working! Row Limit of one in SOQL means that the query will only return the first role, then the Last function selects the Last item in the list of returned items. So by removing that limit you are now saying return all results and select the last item in the list.

      Next time you have issues I’d recommend posting here lots more people to offer help!

  8. MegK

    I set up DLRS for our instance and assigned it to specific profiles. I have left the company and my replacement cannot see the rollups when in Manage Lookup Rollup Summaries. Does the ownership of those rollups need to be transferred and if so how is that done?

    1. Dan Post author

      I think the Object default is set to Public Read/Write so as long as they have the correct C.R.E.D they should be able to see any of the records

  9. Stephan van Reisen

    I love DLRS, we can not miss this tool..

    Is there a way to schedule to run a summary at the end of each month, or better, the day before the end of the month? I am creating snapshots at the end of each month using outcome from these summaries, it would be great if these could be refreshed just before I run the snapshot at the end of the month.

    1. Dan Post author

      Yeah, look into the button on each DLRS record called Schedule Calculate. You can trigger entire parent recalculation on a schedule per DLRS record, so if you had 3 DLRS records that updated those fields you could set them to recalculate every parent before your other process runs.

      1. Stephan van Reisen

        Hi Dan, thank you for your reply. However, I do not see such a button on the DLRS record. If I look at the buttons and links in setup of the DLRS object, I see Accept, Edit, Calculate, Clone, List, ManageChildTrigger, New, Tab, Delete and View. But I am not sure if I was clear in my question, I’d like to run a few DLRS records just before I run Salesforce snapshots (so not other DLRS records). These snapshots run every last day of the month, starting at 00:00. So the DLRS needs to have ran before these snapshots kick off.

        1. Dan Post author

          Try updating to the newest version of DLRS. They added a feature where you can schedule full calculates of the parent records on a CRON job. So in this case if your snapshops run last day of the month at 00:00 you could tell DLRS to recalculate a rollup for all the parent records on the last day of the month at whatever time you need. These full recalcs are set per DLRS record so you could have just 3 of them do full recalculates on a schedule.

  10. Shawna Leader

    Hi Dan, my colleagues and I are having difficulty with a DLRS issue: We have an inventory report in SF that shows us the quantity sold for each product. For one of the products, the report says the quantity sold is 13. However, our pipeline report says we’ve actually sold 16 (and this is the correct number).

    The DLRS process we’re using (“Update Sold Products”) takes the quantity listed in each opportunity product on the opportunity and displays the sum in the product field called quantity sold. Each product has its own sum of the sold quantity. The quantity sold field is what’s listed in the inventory report. For the DLRS to work, the opportunity has to be set to one of the options of the closed/won type (contract signed, for example). I’ve checked and all the opportunities are set to the correct options.

    I have spent a couple hours looking over all these details, and I haven’t yet found what’s causing the numbers to add up incorrectly on the inventory report. If you have any insight/advice, please let me know!

  11. Lee Broderick

    I installed this in a sandbox and just want to rollup the number of records for a custom object to contact. However after completing the fields and hitting save I get this error:
    Active: Apex Trigger dlrs_SlotTrigger has not been deployed. Click Manage Child Trigger and try again.
    but the problem is since it won’t save there is no button for Manage Child Trigger so I don’t know what to do next. Hit save multiple times

  12. Megk

    I also posted this on Andy in the Cloud’s blog:

    I set up the DLRS for a client in their Sandbox, and it does not automatically calculate even though the calculation mode is set to realtime. This instance is using the Households installed package, and I’m rolling up the household members’ opportunities by record type. This managed package does not let you create custom rollup fields because, “this object is not the master in a master-detail relationship.” So that’s why I’m using DLRS. But I don’t know if the lack of a master relationship is why the automatic calculation does not work for DLRS. Is there a setting I need to turn on that I may have overlooked? I have 6 DLRS rollups so I don’t want to do it manually, and I wonder if scheduling calculations every hour would slow down SF.

  13. Shannon Marshall

    Receiving this error:

    Active: Apex Trigger dlrs_OpportunityTrigger has not been deployed. Click Manage Child Trigger and try again.

    But I have no option to click Manage Child Trigger. What am I missing?

    1. Dan Post author

      Check out the post on Troubleshooting DLRS. You have to uncheck active. Save it. Deploy the trigger. Make it active.

  14. Kim

    Just wanted to say – thank you for posting these incredibly helpful and detailed instructions. I come back to them again and again when I think of a new use for the DLRS tool.

  15. Jeremy Watso

    This guide has been my reference for using DLRS, and I’m always using it as a training tool for spreading the joys of DLRS. Thanks!

  16. Lance G.

    Hi Dan – thanks for this guide! Quick question:

    When I’ve made changes to one of my rollup summaries in DLRS, I always (1) deactivate it first, (2) remove the child triggers, (3) make the changes, (4) save the changes and deploy child triggers once again, (5) reactivate the summary and then calculate.

    Is this necessary? Can I make edits to the summary without deactivating it and re-deploying child triggers?


    1. Dan Post author

      Hey Lance,

      Sorry for the late reply. You don’t need to deactivate the child triggers or even mark the DLRS as inactive.

  17. Robert Timm

    We use DLRS extensively but have developed the habit of just setting them up in production. Is there a nimble way to migrate a tested dlrs in change sets from sandbox? Haven’t discovered that option yet. Is it mapped as meta data?

    1. Dan Post author

      Depends on if you are using the CustomMetadata ones or Record DLRS. If CMDT then in the changeset you’ll find it under Declarative Lookup Rollup Summaries. If using the record based DLRS then dataloader?

      1. Stephanie B

        Just discovered this tool and it’s great. I installed in sandbox and used CMDT, but there is no option for Declarative Lookup Rollup Summaries in the change set. Am I missing something?

  18. Praveen

    Hey Dan, these are really useful stuff, thanks a ton! I am working on a use case where I need the sum of a numerical field from both the Parent and Child record type against its Parent’s Record. Having a Relationship Field as the ParentId sums up only the child’s record(which is expected). Is there a way to having multiple Relationship Fields like ParentId OR Id which will solve this issue? Or is there any other approach?

    1. Dan Post author

      1 DLRS into a field called Child_Sum__c then 1 DLRS into a field called Parent_Sum__c then a formula that is Child_Sum__c + Parent_Sum__c?

  19. Mark Keckeis

    Hey Dan – thanks for the great content.

    I have created DLRS fields in a scratch org and would like to pull them so that they can deploy with my code to the prod org. Is this possible? Do they need to be created as a post deploy step?

    Many thanks

  20. Sandhya Joshi

    Hi Dan,
    I have some DLRS that the previous admin had deployed. It is a scheduled Calculation. Users are reporting the timing of calculation not correct since fields on one object are aggregated at different times.
    1. Is there a way I can check what frequency these calculate jobs are scheduled to?
    2. Can I edit the schedule once it is set? If so, how?
    Thanks for your answer.

  21. Alicia

    Is there any way to use an existing field on the parent (contains data that was previously manual entry) for the rollup field.
    I want to rollup-up child entries now, but do not want to over-write the values that are in the field prior to adding the DLRS.


  22. Abiud (AJ) Amaro Diaz

    Not sure what I’m doing wrong. The program is running without errors but I’m getting no results.

    I’m trying to get information from PMM Cohort (First and Last) to Account so users can see what the organization has done through the years. I think that there may not be a connection that I think I have between the two objects.

  23. Emily

    Hi there, in the “Field to Order By” section you say “By default if you leave this blank it will just use the Field to Aggregate by.” but I found that when I am creating a DLRS with an Aggregate Operation of LAST on a date field, that I have to repeat that Date field in the Field to Aggregate by and the Field to Order by for the DLRS to work properly. I found this post on the trailblazer community which discusses this:

  24. Jovani

    is possible to sort values in alphabetically order? For example: at the moment the values that are being pulled in by DLRS: Walmart;Target but for reporting purpose the other way around would be beneficial.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.