Tuesday, May 15, 2018

JSON Parsing with gron

While jq is powerful, its major shortcoming is that it requires one to know the JSON structure being parsed.  gron is less restrictive and can be combined easily with Linux tools, such as grep, sed, and awk to build very powerful parsing pipelines, without having to know exactly where to expect a particular structure or value.

Using the Right Tools

As a polyglot programmer I strive to employ the simplest approach, the best tool for the job.  I have parsed JSON in Java, Python, and Go, but I think too many times we ignore the UNIX/Linux tools (sed, awk, cut, etc.).  Too many programmers ignore these tools, and write hulking data parsers that are just overkill.  With gron, I find it easier to utilize these strong text editing, manipulation, and filtering tools.

Installing gron

Instructions can be found here for installing gron.  I used brew install gron.  And then, for reasons that will be apparent later, I added the following alias:
alias norg="gron --ungron".

Make JSON greppable

Obviously, being text-based, JSON is already "greppable".  However, the strength of gron comes from it's ability to split JSON into lines of what is referred to as "discrete assignments".  Given the JSON snippet below (from an aws ec2 CLI call):

  1.  {  
  2.     "Reservations": [  
  3.         {  
  4.             "OwnerId""<OWNER_ID>",   
  5.             "ReservationId""<RES_ID>",   
  6.             "Groups": [],   
  7.             "Instances": [  
  8.                 {  
  9.                     "Monitoring": {  
  10.                         "State""disabled"  
  11.                     },   
  12.                     "PublicDnsName""",   
  13.                     "State": {  
  14.                         "Code"16,   
  15.                         "Name""running"  
  16.                     },   
  17.                     "EbsOptimized"false,   
  18.                     "LaunchTime""2016-08-31T22:39:37.000Z",   
  19.                     "PublicIpAddress""<PUBLIC_IP>",   
  20.                     "PrivateIpAddress""<PRIVATE_IP>",   
  21.                     "ProductCodes": [],   
  22.                     "VpcId""<VPC_ID>",   
  23.                     "StateTransitionReason""",   
  24.                     "InstanceId""<ID>",   
  25.                     "ImageId""<AMI_ID>",   
  26.                     "PrivateDnsName""<PRIVATE_DNS_NAME>",   
  27.                     "KeyName""<KEY_NAME>",   
  28.                     "SecurityGroups": [...  


gron will parse (cat ~/ec2.json | gron) and convert the JSON to lines of discrete assignments:
  1. json = {};  
  2. json.Reservations = [];  
  3. json.Reservations[0] = {};  
  4. json.Reservations[0].Groups = [];  
  5. json.Reservations[0].Instances = [];  
  6. json.Reservations[0].Instances[0] = {};  
  7. json.Reservations[0].Instances[0].AmiLaunchIndex = 0;  
  8. json.Reservations[0].Instances[0].Architecture = "x86_64";  
  9. json.Reservations[0].Instances[0].BlockDeviceMappings = [];  
  10. json.Reservations[0].Instances[0].BlockDeviceMappings[0] = {};  
  11. json.Reservations[0].Instances[0].BlockDeviceMappings[0].DeviceName = "/dev/xvda";  
  12. json.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs = {};  
  13. json.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.AttachTime = "2016-08-21T22:00:41.000Z";  
  14. json.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.DeleteOnTermination = true;  
  15. json.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.Status = "attached";  
  16. json.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId = "<VOL_ID>";  
  17. json.Reservations[0].Instances[0].ClientToken = "<CLIENT_TOKEN>";  
  18. json.Reservations[0].Instances[0].EbsOptimized = false;  
  19. json.Reservations[0].Instances[0].Hypervisor = "xen";  
  20. json.Reservations[0].Instances[0].ImageId = "<AMI_ID>";  
  21. json.Reservations[0].Instances[0].InstanceId = "<ID>";  
  22. json.Reservations[0].Instances[0].InstanceType = "t2.small";  
  23. json.Reservations[0].Instances[0].KeyName = "<KEY_NAME>";  
  24. json.Reservations[0].Instances[0].LaunchTime = "2016-08-31T22:39:37.000Z";  
  25. json.Reservations[0].Instances[0].Monitoring = {};  
  26. json.Reservations[0].Instances[0].Monitoring.State = "disabled";  
  27. json.Reservations[0].Instances[0].NetworkInterfaces = [];  
  28. json.Reservations[0].Instances[0].NetworkInterfaces[0] = {};  
  29. json.Reservations[0].Instances[0].NetworkInterfaces[0].Association = {};  
  30. json.Reservations[0].Instances[0].NetworkInterfaces[0].Association.IpOwnerId = "<OWNER_ID>";  
  31. json.Reservations[0].Instances[0].NetworkInterfaces[0].Association.PublicDnsName = "";  
  32. json.Reservations[0].Instances[0].NetworkInterfaces[0].Association.PublicIp = "<PUBLIC_IP>";  
  33. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment = {};  
  34. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment.AttachTime = "2016-08-21T22:00:40.000Z";  
  35. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment.AttachmentId = "<ENI_ID>";  
  36. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment.DeleteOnTermination = true;  
  37. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment.DeviceIndex = 0;  
  38. json.Reservations[0].Instances[0].NetworkInterfaces[0].Attachment.Status = "attached";  
  39. json.Reservations[0].Instances[0].NetworkInterfaces[0].Description = "Primary network interface";  
  40. json.Reservations[0].Instances[0].NetworkInterfaces[0].Groups = [];  
  41. json.Reservations[0].Instances[0].NetworkInterfaces[0].Groups[0] = {};  
  42. json.Reservations[0].Instances[0].NetworkInterfaces[0].Groups[0].GroupId = "<SG_ID>";  
  43. json.Reservations[0].Instances[0].NetworkInterfaces[0].Groups[0].GroupName = "Bastion";  
  44. json.Reservations[0].Instances[0].NetworkInterfaces[0].MacAddress = "<MAC_ADDRESS>";  
  45. json.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId = "<ENI_ID>";  
  46. json.Reservations[0].Instances[0].NetworkInterfaces[0].OwnerId = "<OWNER_ID>";  
  47. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddress = "<PRIVATE_IP>";  
  48. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses = [];  
  49. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0] = {};  
  50. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association = {};  
  51. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association.IpOwnerId = "<OWNER_ID>";  
  52. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association.PublicDnsName = "";  
  53. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association.PublicIp = "<PUBLIC_IP>";  
  54. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Primary = true;  
  55. json.Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].PrivateIpAddress = "<PRIVATE_IP>";  
  56. json.Reservations[0].Instances[0].NetworkInterfaces[0].SourceDestCheck = true;  
  57. json.Reservations[0].Instances[0].NetworkInterfaces[0].Status = "in-use";  
  58. json.Reservations[0].Instances[0].NetworkInterfaces[0].SubnetId = "<SUBNET_ID>";  
  59. json.Reservations[0].Instances[0].NetworkInterfaces[0].VpcId = "<VPC_ID>";  
  60. json.Reservations[0].Instances[0].Placement = {};  
  61. json.Reservations[0].Instances[0].Placement.AvailabilityZone = "us-east-1a";  
  62. json.Reservations[0].Instances[0].Placement.GroupName = "";  
  63. json.Reservations[0].Instances[0].Placement.Tenancy = "default";  
  64. json.Reservations[0].Instances[0].PrivateDnsName = "<DNS_NAME>";  
  65. json.Reservations[0].Instances[0].PrivateIpAddress = "<PRIVATE_IP>";  
  66. json.Reservations[0].Instances[0].ProductCodes = [];  
  67. json.Reservations[0].Instances[0].PublicDnsName = "";  
  68. json.Reservations[0].Instances[0].PublicIpAddress = "<PUBLIC_IP>";  
  69. json.Reservations[0].Instances[0].RootDeviceName = "/dev/xvda";  
  70. json.Reservations[0].Instances[0].RootDeviceType = "ebs";  
  71. json.Reservations[0].Instances[0].SecurityGroups = [];...  


Munging gron Output Through Command Line Pipelining

JSON is more compact than the gron output, and suited for data structuring for transport and integration.  While more verbose, the gron output is a more usable format for text searching, filtering, and manipulation via Linux's text manipulation and filtering tools, or even sed and awk.  For example, consider the following commands:


$ cat ~/ec2.json | gron | grep AvailabilityZone
json.Reservations[0].Instances[0].Placement.AvailabilityZone = "us-east-1a";
The above command "pipeline" searches the gronned JSON for the text "AvailabilityZone" value, and returns the discrete assignment line.

$ cat ~/ec2.json | gron | grep AvailabilityZone|cut -d\" -f2
us-east-1a
The above pipeline extracts the AvailabilityZone value via the Linux cut command.

$ cat ~/ec2s.json | gron | grep InstanceId | cut -d\" -f2
...
<ID_1>
<ID_2>
<ID_3>
...
The above pipeline pulls all the EC2 instance IDs from the aws ec2 cli output, and creates a list of IDs.

Transforming JSON with gron and ungron (a.k.a. norg)

Earlier, I referenced the norg alias, that pointed to the ungron command.  With this command, gron will transform gron discrete assignments back into JSON.  Consider the commands below:
Note:  cat was removed and gron was called directly.

$ gron ~/ec2s.json | grep InstanceId | norg
...
{
      "Instances": [
        {
          "InstanceId": "<ID>"
        }
      ]
    },
    {
      "Instances": [
        {
          "InstanceId": "<ID>"
        }
      ]
    },
...
The above pipeline grons the JSON, greps for the InstanceId field, and then converts the lines of discrete assignments (json.Reservations[999].Instances[0].InstanceId = "<ID>";) from the grepped gron output back into usable and simplified JSON.

$ gron ~/ec2s.json | egrep InstanceId\|ImageId | norg
...
    {
      "Instances": [
        {
          "ImageId": "<AMI_ID>",
          "InstanceId": "<ID>"
        }
      ]
    },
    {
      "Instances": [
        {
          "ImageId": "<AMI_ID>",
          "InstanceId": "<ID>"
        }
      ]
    },
...
The above pipeline adds ImageId to the transformed JSON using egrep (Yes, I know GNU has deprecated egrep in lieu of grep -E.) .

sed

sed is a powerful stream editor, and is handy for executing find/replace algorithms on text files.
$ gron ~/ec2s.json | egrep InstanceId\|ImageId\|InstanceType | sed -e 's/Instances/node/g;s/ImageId/ami/g;s/InstanceType/type/g;s/InstanceId/id/g' | norg
...
{
      "node": [
        {
          "ami": "<AMI_ID>",
          "id": "<ID>",
          "type": "t2.small"
        }
      ]
    },
    {
      "node": [
        {
          "ami": "<AMI_ID>",
          "id": "<ID>",
          "type": "t2.micro"
        }
      ]
    },
...
The above pipeline adds stream editing with sed to perform multiple inline string replacements.

$ gron ~/ec2s.json | egrep InstanceId\|ImageId\|InstanceType | sed -e 's/Instances/node/g;s/ImageId/ami/g;s/InstanceType/type/g;s/InstanceId/id/g' | norg | tr -d '\n' | sed "s/ //g"
...
{"node":[{"ami":"<AMI_ID>","id":"<ID>","type":"t2.small"}]},{"node":[{"ami":"<AMI_ID>","id":"<ID>","type":"t2.micro"}]},
...
The above pipeline adds the translate command, tr, to remove newline characters and then another sed command to remove remaining whitespace.  This is handy for minimizing JSON files.

Summary

gron converts structured JSON into lines of discrete assignments.  This makes it easier to pipeline text to native tools like grep and sed to perform powerful text manipulation.  Once manipulated, the discrete assignments can be transformed back into JSON via the gron -u|--ungron command.  This makes gron a complement to existing tools like grep and sed, for munging (a.k.a. manipulating) JSON data.

44 comments:

  1. 우리카지노 에 오신 것을 환영합니다. 국내 최고의 카지노사이트 에 가입하여 바카라사이트 에서 다양한 게임을 즐기시면서 대박의 기회를 놓치지마세요! 우리 카지노는 한국의 바카라 산업을 지배하는 카지노 사이트입니다. 우리 카지노는 한국 바카라 시장 점유율의 50 % 이상을 차지하는 10 년 이상 온라인 바카라 시장을 지배 해 왔기 때문에 우리 카지노를 모르는 사람은 거의 없습니다.

    ARTICLE: 우리카지노는 대한민국의 바카라 업계를 장악하고 있는 카지노사이트 입니다. 우리카지노가 대한 민국에서 장악한 바카라 시장점유율이 50%가 넘고 10년 넘게 온라인 바카라 시장을 장악해왔기 때문에 대한민국에서는 우리카지노를 모르는 사람은 드뭅니다. 이런 바카라 업계의 독보적인 입지 때문에 늘 유명하거나 최고만을 찾는 사람들이 카지노사이트를 찾을때는 늘 우리카지노를 찾습니다.바카라를 처음 시작하시는 초보자분들에게도 우리카지노에서 카지노사이트를 시작하시기 좋은 환경입니다. 우리카지노사이트에서는 신규가입시 3만쿠폰을 지급 해주기 때문입니다. 사람들이 늘 1등만을 찾는 이유는 분명 있습니다. 다른 카지노사이트와는 달리 우리카지노를 이용하실시 에이전트를 끼고 게임을 하신다면 본사 이외에 활동쿠폰 및 오링쿠폰을 별도로 제공해주고 있기 때문입니다. 이러한 이유들 때문에 카지노사이트 업계에서 바카라를 즐기신다면 다들 우리카지노를 선호 하십니다. 카지노사이트에서 바카라를 이기기 물론 어렵습니다. 하지만 우리카지노의 에이전트를 끼고 바카라를 즐기신다면 승산이 있다고 봅니다. 우리카지노 에이전트의 연락처는 홈페이지로 연락하시면 언제든지 부담없이 소통가능 합니다. 카지노사이트를 선정할때는 바카라를 다른곳보다 유리하게 즐길 수 있는 카지노를 선택해야한다고 생각합니다. 그것이 바로 우리카지노 입니다. 이상으로 우리카지노와 바카라 카지노사이트 사이의 상관관계를 알아보았습니다바카라사이트.

    ReplyDelete
  2. Very nice this blog . this blog is very informative.such a great blogging website.

    "woman wine expert in usa
    "

    ReplyDelete
  3. Tongkat Ali ist eine Pflanze beheimatet in Südostasien. Sie gehört zur Gattung der Bittereschengewächse und Ihr botanischer Name lautet “Eurycoma longifolia”. Es gibt noch eine weitere Reihe länderspezifischer Namen
    wie z. B. “Pasak Bumi”, wie die Pflanze in Indonesien genannt wird oder “longjack”, die allgemeine Bezeichnung für Tongkat Ali Kaufen in den USA, Kanada und Australien.

    Das Ursprungsland von Tongkat Ali Kaufen ist Indonesien, daher findet man auch dort auch die größten Bestände. Weitere Vorkommen gibt es in Ländern wie Thailand, sägepalmenextrakt Malaysia, Vietnam und Laos.

    Die Einnahme von Tongkat Ali Kaufen empfiehlt sich insbesondere für Leistungssportler, die einen schnellen
    Muskelaufbau und Muskelzuwachs anstreben und nicht auf illegale und künstliche Substanzen zurückgreifen möchten um Ihren Testosteronspiegel zu erhöhen.

    Generell empfiehlt sich eine Einnahme von Tongkat Ali für alle Männer ab dem 30ten Lebensjahr, da in dieser Phase nachweislich die Produktion von körpereigenem Testosteron zurückgeht. Dies macht sich vor allem dadurch bemerkbar dass die körperliche Leistungsfähigkeit nachlässt, die Lust auf Sex spürbar abnimmt und dadurch allgemein das Selbstwertgefühl negativ beeinflusst wird.

    Mit der Einnahme von Tongkat Ali können Sie nachweislich Ihre Libido steigern, Ihr Testosteron erhöhen und Ihre gewohnte Lebensenergie aus den jungen Jahren Ihres Lebens wieder herbeiführen. Hier können Sie übrigens weitere Informationen bekommen zum Thema ‘Libido steigern‘ ganz natürlich. Sollten Sie daran interessiert sein lohnt es sich auch unseren Artikel über Butea Superba zu lesen.

    Tongkat Ali wächst als Strauch und kann Höhen von bis zu 12 Metern erreichen. Typischerweise dauert es 10-15 Jahre bis solche Ausmaße erreicht werden. Der Strauch trägt anfangs grüne Blüten die sich im Laufe der Zeit, bis zur Reife, rot färben.

    Allerdings sind die Blüten im Hinblick auf die Wirkung der Pflanze weniger interessant. Der wertvolle Teil verbirgt sich unter der Erde.
    Im Laufe der Jahre wachsen die Wurzeln teilweise senkrecht und bis zu mehrere Meter tief in den Boden, was die Ernte zu einer schweren und mühsamen Arbeit werden lässt. Je älter die Wurzeln sind, desto höher ist auch die Anzahl der Wirkstoffe Butea Superba.
    Von daher gilt es einige Dinge zu beachten sollten Sie Tongkat Ali kaufen wollen.

    ReplyDelete
  4. ChemLab Store Store provide you with top quaility research chemicals like: A-pvp, Methylone Crystals, Methylone Powder, Pentedrone Crystals, Pentedrone Powder, MDPV Powder, Buphedrone Powder, 4-FMC Powder, 4-MemABP Powder, NEB Powder, AMT Powder, 6-APB Pellets, Butylone Powder, MDAI Powder, 4-FA Powder, 4-FA Crystals, MPA Powder, Methoxetamine, JWH-122 Powder, JWH-122 Herbal Buds, Ketamine, AM-2201, Herbal Buds, We have a wide range of products including JWH-018, JWH-073, JWH-200, buy 4 meo pcp online JWH-250, 4-MEC, 5-IAI, Phenazepam, 2c-i, Actavis Promethazine, Naphyrone, U-47700. Methedrone, crystal meth and other chemicals in all different amounts ranging from 5gm to 1kg retail and also large amounts at wholesale prices, When you buy Research Chemicals or bath salts from us you are guaranteed of the highest quality available on the market, high purity products, secure payment, fast and discreet international delivery.

    Disclaimer: None of the Products on ChemLab Research Chem Store are intended for human consumption and Neither ChemLab Research Chem Store,

    nor any of the staff INCLUDING the owner of ChemLab Online Chem Store resume ANY responsibility for ANY injuries to ANY individual who does not correspond with this warning and will not be held accountable for any loss or damages due to an individual burning, inhaling, or consuming into the body of any human being, animal or living specimen. This statement applies to all of the products sold on this site.

    By purchasing ANY PRODUCT ON THIS SITE, You Agree to be held 100% liable for any personal injury or damages due to you (Customer) using any of the products in any way other than that manufacturer’s instructions of use printed on the package!

    ReplyDelete
  5. magnificentincense.com
    24K Monkey Classic Incense 10g
    AK-47 – X10 / PREMIUM
    Bizarro Incense
    Buy Black Mamba Incense Online
    Buy WTF Herbal Incense
    Cloud9 Mad Hatter Incense
    Crazy Monkey Incense
    k2 spray on paper
    k2 paper sheets
    Klimax Potpourri 15xxx Coconut(10g)
    Crazy Monkey Incense
    Cloud9 Mad Hatter Incense
    Buy Purple Diesel Incense Online
    Buy Pure Fire Herbal Incense Online
    Buy Kisha Cole Incense (11g) online
    Buy KUSH HERBAL INCENSE online
    Buy Mind Trip Incense Online
    Buy Platinum XXX Herbal Incense online
    buy Orange Platinum Caution 10G
    Buy OMG HERBAL POTPOURRI 10G online

    ReplyDelete
  6. Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. Edelstahlpool

    ReplyDelete
  7. Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. Achtformbecken

    ReplyDelete
  8. Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. Stahlwandpool

    ReplyDelete
  9. Descubre los mejores diseños de alfombras vinilicas y azulejos adhesivos para decoración e interiorismo. Alfombras infantiles Envío gratis

    ReplyDelete
  10. https://k2incenseonlineheadshop.com/
    info@k2incenseonlineheadshop.com
    Buy liquid incense cheap
    Buy liquid incense cheap For Sale At The Best Incense Online Shop
    K2 Spice Spray | Liquid K2 | Liquid Spice | K2 Spray for sale

    ReplyDelete
  11. https://syntheticworldwide.com/
    sales@syntheticworldwide.com

    Buy cheap liquid herbal incense at your best online shop

    ReplyDelete
  12. I am glad to discover this post extremely valuable for me, as it contains part of data. I generally like to peruse the
    quality substance and this thing I found in you post. A debt of gratitude is in order for sharing. 유에프씨카지노



    ReplyDelete
  13. There is noticeably a bundle to find out about this. I assume you made sure nice factors in options also. 바카라커뮤니티


    ReplyDelete
  14. Health Experts have proven that regular exercise coupled with a good diet allow you to live longer and healthier. In this busy day and age, not everyone has the time to go to the gym - resulting to a lot of overweight people that desperately need to exercise. A healthy alternative is for you to Buy Home Gym Equipments that you can store in your own home or even at your office. Here are some tips when buying home gym equipment.

    First, know your fitness goals and keep these goals in mind when you are buying home gym equipment. One of the biggest mistakes that people make is buying the biggest or trendiest fitness machine simply because they like how it looks. More often than not, these end up gathering dust in your storage rooms or garage because you never end up using them. It is important to take note of what particular type of physical activity you want or enjoy doing before you buy your exercise machine. If you are looking to loose a few pounds and you enjoy walking or hiking, a treadmill is the best option for you. If you are looking to tone your lower body while burning calories a stationary bike is your obvious choice. Similarly, Special Equipments for Core Strength Exercises, Strength Training Weight Vests, Core Strength & Abdominal Trainers, Home Cardio Training, Strength Training Power Cages, Strength Training Racks & More.

    Second, set aside a budget before Buying Home Gym Equipments. Quality exercise machines do not come cheap. They are constantly exposed to wear and tear when they are used properly. So, pick machines that are built to last and have passed quality certifications to get the most out of your money. If you are operating on a tight budget, think about investing in several weights, We can Provide you High Quality Home Gym Equipment at Very Low Prices for your Complete Uses: Core Strength Exercises, Strength Training Weight Vests, Core Strength & Abdominal Trainers, Home Cardio Training, Strength Training Power Cages, Strength Training Racks & More.

    Its the Right Time to Buy Home Gym Equipment for you at Very Low Prices.

    ReplyDelete
  15. 국내 최고 스포츠 토토, 바카라, 우리카지노, 바이너리 옵션 등 검증완료된 메이져 온라인게임 사이트 추천해 드립니다. 공식인증업체, 먹튀 검증 완료된 오라인 사이트만 한 곳에 모아 추천해 드립니다 - 카지노 사이트 - 바카라 사이트 - 안전 놀이터 - 사설 토토 - 카지노 솔루션.

    온라인 카지노, 바카라, 스포츠 토토, 바이너리 옵션 등 온라인 게임의 최신 정보를 제공해 드립니다.

    탑 카지노 게임즈에서는 이용자 분들의 안전한 이용을 약속드리며 100% 신뢰할 수 있고 엄선된 바카라, 스포츠 토토, 온라인 카지노, 바이너리 옵션 게임 사이트 만을 추천해 드립니다.

    ReplyDelete
  16. Lsd tabs, is a psychedelic medication that fleetingly yet effectively adjusts human observation, conduct etc, you can buy lsd gel tabs with unfastened mail delivery. One on-line brand of acid tabs is sold each day and you can contact us to buy lsd online. In case you save online, you may purchase high-quality satisfactory of sheet of acid and on line expenses will increase the fee. We offer our customers high quality acid sheet for sale without any license to order.

    We offer acid gel tabs from Wyoming. You can't begin a new lifestyles due to the fact you did not get rick and morty acid tabs in your ultimate order. you could use buying acid tabs online even as asleep or in the dark. there is extra approximately Lysergic Acid Diethylamide and other tablets. Lsd tabs has been found to show excessive withdrawal signs and symptoms which includes insomnia, headache, dizziness, dizzy and nausea, vomiting, rapid heartbeats or even dying. Lsd acid tabs is used to alleviate depression and tension in those who experience foremost despair disease (MDD). Order reasonably-priced acid gel tabs secure shipping and less expensive.

    There also are no recognised risks while taking a few psychoactive materials. it's also commonplace to mistake some of these psychoactive substances for stimulants. some human beings enjoy a exchange in an acid tabs location in the same way a person feels when seeing or hearing a number of their very own bodily sensations in a few manner. these adjustments are every so often described as "darkness, lack of urge for food or melancholy" Gel Tabs Acid and are not usually linked to the withdrawal impact. some people can also experience lack of their sense of nicely-being while their interest or consciousness modifications. a few human beings may revel in modifications of their temper or temper-changing residences once they end up depressed, anxious or irritable - buy lsd online.

    ReplyDelete
  17. My neighbor and I have been simply debating this specific topic, he’s usually seeking to prove me incorrect. Your view on that is nice and precisely how I really feel. I simply now mailed him this website to indicate him your personal view. After looking over your website I e book marked and can be coming back to learn your new posts!buy cocaine online

    ReplyDelete
  18. I read a lot of stuff and i found that the way of writing to clearifing that exactly want to say was very good so i am impressed and ilike to come again in future..life care primary medical

    ReplyDelete
  19. Het gebruik van lachgas op evenementen, horeca en feesten groeit enorm. De meeste uitgaanders kunnen wel genieten van een lachgas ballon. Onze lachgas teams staan regelmatig op de populairste evenementen en in de grootste clubs met de bar voorzien van vulsystemen, ballonnen en natuurlijk lachgas. Hiernaast leveren wij ook aan particulieren met spoed, die dringend een tank nodig hebben om het feest echt te laten beginnen. Ook zijn de lachgas producten bij ons via de post te kopen. Daarnaast leveren we ook nog aan Horeca en andere handelaren. Voor ieders wil; om lachgas te kopen moet je bij Spacegas zijn! lachgas pistool

    Alles wat wij aanbieden op onze website is van professionele kwaliteit. Al onze producten zijn afkomstig van zeer betrouwbare producenten met vele jaren ervaring in de branche. Het lachgas dat wij gebruiken is 99.9% zuiver gas en word ingekocht van top instanties. Het gas is van food-grade kwaliteit, dus bedoeld voor menselijk consumptie. De lab resultaten van ons lachgas kunt u bij ons zelfs opvragen voor meer informatie. De lachgas tanks zijn allen verzegeld en geseald, hierdoor weet je zeker dat het lachgas en de kwaliteit van de fles gecontroleerd is door verschillende instanties. Kortom, bij Spacegas ben je op het juiste adres als u op zoek bent om de beste kwaliteit lachgas te kopen, en natuurlijk veiligheid omtrent lachgas gebruik.

    ReplyDelete
  20. They can manage most driving conditions and permit the screen to be handily eliminated on the off chance that you don't need it in plain view. Security Cameras

    ReplyDelete
  21. Oferecemos os melhores serviços para seguidores, curtidas, comentários e visualizações no Instagram. Os serviços são entregues de forma rápida, segura e por um preço honesto e barato.
    Todos os serviços são iniciados de forma automática e você pode fazer um teste grátis de seguidores, curtidas e visualizações no Instagram.

    O Go Followers surgiu em 2015 e durante alguns anos foi o melhor e maior site para comprar seguidores, curtidas e comentários no instagram. Com o passar dos anos evoluímos e em 2021 lançamos um novo site simples e intuitivo para aumentar a experiência dos mais de 150.000 clientes atendidos.

    Nossa ferramenta envia seguidores brasileiros reais e ativos em sua grande maioria para qualquer perfil do Instagram. Escolha o melhor pacote para comprar seguidores instagram de alta qualidade. Você poderá escolher alguns pacotes como seguidores com curtidas, seguidores masculinos, seguidores femininos e seguidores automáticos.
    Todos os pedidos são feitos de forma automática e iniciam em poucos minutos após a compra, tá esperando o que?

    ReplyDelete
  22. Garuda999 adalah sebuah agen casino online yang merupakan mitra salah satu bandar judi online24jam internasional terbesar di Asia, SBobet, yang berpusat di Filipina. Sebagai salah satu mitra penyedia layanan judi online terbesar, tentunya kami juga berkomitmen untuk memberikan layanan terbaik bagi pengguna kami, yaitu penggemar judi online Indonesia. judi slot game, slot online nexus, slot online casino, slot online 88, slot online idn, bandar togel idn, judi bola pulsa, casino online terbesar di dunia, bandar togel pasaran terbaik, judi bola 777, situs judi bola yang ada promo bonus 100, judi bola 828, casino online game, judi bola depo pulsa, situs judi bola freebet, situs judi online poker yang banyak bonus, judi online live, judi poker deposit pakai pulsa 5000 Dengan adanya aturan yang berlaku di Indonesia, kami menyadari jika banyak penggemar judi online di Indonesia, yang kesulitan untuk mendapatkan layanan yang berkualitas. Sehingga untuk itulah kami, Garuda 999 hadir sebagai agen casino yang terpercaya, untuk melayani penggemar judi online di Indonesia, tanpa bertentangan dengan aturan yang berlaku. Karena sebagai mitra yang mematuhi aturan, kami beroperasi dari Manila, Filipina, sebagaimana mitra induk kami. Dengan demkian penggemar judi online di Indonesia, dapat dengan mudah mengakses layanan judi online, yang kami sediakan dan merasakan kesenangan bermain judi online dengan aman dan nyaman, selayaknya bermain pada casino online bertaraf internasional. judi bola aman, Judi Slot terlengkap, master judi bola 99, qq slot online freebet,judi online poker sampoerna, slot online indonesia terpercaya, slot online game, situs judi bola eropa, bandar togel kamboja, judi bola 168, slot online judi, peraturan judi bola 90 menit, 9 poker, casino online paypal, judi bola deposit pulsa, judi bola adalah casino online di indonesia, bandar togel tertua dan aman, casino online malaysia, judi bola mix parlay, bandar, togel onlen, casino online terbaru. Sebagai agen casino online mitra dari SBobet, yang merupakan salah satu agen bola Euro2021 terbesar di Asia, tentunya Garuda 999 juga membuka peluang bagi penggemar taruhan olah raga khususnya sepak bola, di tanah air, untuk ikut meramaikan even sepak bola dunia tersebut. Dengan didukung oleh sistem sports book handal yang disediakan oleh SBobet, penggemar taruhan sepak bola di Indonesia - Judi Online, tidak perlu khawatir untuk ketinggalan bertaruh pada even besar tersebut. Karena sistem sports book yang kami adopsi dari mitra induk kami, merupakan salah satu yang terbaik di dunia, yang dapat melayani taruhan sesuai jadwal pertandingan pada Euro 2021 secara real time - Judi Slot.

    ReplyDelete
  23. We are tied directly into the sate’s renewal database which allows us to process your request almost instantly. vape attic olathe

    ReplyDelete
  24. I surely acquiring more difficulties from each surprisingly more little bit of it tt listesi

    ReplyDelete
  25. Ob Schmutz, hartnäckiger Belag, Schimmel, Vogelkot, Bakterien, Dreck, Staub oder unangenehme Gerüche, bei unserer Gebäudereinigung Hannover erwartet Sie ein glänzendes Ergebnis. Die Firma Immoclean reinigt Gebäude unterschiedlichster Art wie Schulen, Kindergarten, Arztpraxis, Altersheim, Museum, Disko, Hallen, Krankenhaus, Hotel, Baustelle, Restaurant, Kaufhaus, Supermarkt - Unterhaltungsreinigung Hannover.

    Vertrauen Sie dabei unserer Erfahrung, den vielen Referenzen und einer Kundenzufriedenheitsgarantie. Zuverlässigkeit und Qualität sowie eine absolut hygienische Reinigung können wir Dank unseren geschulten und mit modernstem Reinigungsequipment ausgestatteten Mitarbeitern gewährleisten - Broreinigung Hannover. In einer umfassenden und persönlichen Beratung erstellen wir sowohl für Klein- als auch Großkunden einen persönlichen Reinigungsplan ganz nach Ihren Wünschen. Bei Immoclean aus Hannover, der Nummer 1 unter den Reinigungsdiensten, Gebudereinigung hannover ist Ihre Firma oder Unternehmen in guten Händen. Vereinbaren Sie noch heute einen Termin mit unserem Reinigungsunternehmen, wir freuen sich auf Sie - Praxisreinigung Hannover!

    ReplyDelete
  26. This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post.
    Thanks for the valuable information and insights you have so provided here...Serie

    ReplyDelete
  27. You're the best to share us about this redesign. Trust you won't get tired on making posts as enlightening as this.colombian gold strain

    ReplyDelete
  28. Check out today’s coronavirus live update, the availability of the nearest hospital ICU bed, and the ambulance contact number in Covid Surokkha. Visit: ambulance service dhaka

    ReplyDelete
  29. Bright Achievements has been proven to be effective in successfully treating children with ABA Therapy NJ for Children with Autism. ABA Therapy in New Jersey Combined with the expert care and guidance of our trained BCBA/LBAs and therapists, your child can achieve more than you thought possible.

    Because of its methods of behavior identification and modification, ABA therapy in New Jersey has been proven to be effective in successfully treating children with ASD. Combined with the expert care and guidance of our trained BCBA/LBAs and therapists, your child can achieve more than you thought possible.

    We are Top in-home Autism Therapy Provider in New Jersey, providing ABA therapy to children with autism & their families in New Jersey. Autism Therapy NJ

    ReplyDelete
  30. Jokerslot สมัคร เล่นเกมสล็อต มือถือ สุดฮิต เกมสล็อตที่คนเล่นเยอะที่สุดแห่งปี ฝากถอนไม่มีขั้นต่ำ มีแจกเครดิตฟรีเล่นสล็อต ไม่ต้องฝากไม่ต้องแชร์ สมัครสมาชิก สล็อตเว็บตรง

    ReplyDelete
  31. The scientific/botanical term for wild lettuce is “Lactusa Virosa.” It is a part of the Asteraceae plant family which has 23,600 species of herbs, shrubs, and trees throughout the world, making it a member of one the largest plant families worldwide. Two related plants to the Lactuca Virosa, are the Serriola Lactuca (also called the compass plant) and the Lactuca Canadensis (AKA Canada wild lettuce).

    Wild lettuce grows in many regions of the world. In these regions, its presence is quite pervasive during the summer and early fall months. It can be found in backyards, along hiking trails, roadsides, growing up through the cracks in sidewalks, and almost anywhere else you can imagine. wild lettuce extract

    ReplyDelete
  32. Katex Entertainment is dedicated to providing the best entertainment with outstanding service packages to customers. Their newly launched product, iCinema, promises to deliver a wide selection of high-quality movies, shows, and music for you to enjoy online.
    visit: Katex Entertainment

    ReplyDelete
  33. A good rank checker should be able to pull your data quickly and whenever you need to check. serp checker tools

    ReplyDelete
  34. Unintentional ASMR Relaxing 안전토토사이트 Casino with Unintelligible Croupiers (1,5h Compilation)

    ReplyDelete
  35. Im Immo Cashflow Booster erfahren Sie, wie Sie durch smarte Immobilienanlagestrategien passiven Cashflow generieren. Sie müssen keine Bankgeschäfte tätigen, Geld leihen oder etwas kaufen.

    Eric erklärte 6 verschiedene Strategien, die verwendet werden können, um durch Leasing und Leasing einen Cashflow zu generieren. Diese Methode ist völlig neu und eigentlich eine interne Strategie.

    Anfangs war ich dieser Strategie etwas skeptisch gegenüber, denn wenn man die vermietete Wohnung wieder untervermieten möchte, wie überzeugt man dann den Vermieter.

    Aber ich habe eine bessere Ausbildung und Eric hat klare Anweisungen, wie man den Vermieter leicht überreden kann. Der Immo Cashflow Booster bietet dir Top aktuelle Strategien, welche auch jahrelang funktionieren. Und in diesem Erfahrungsbericht, werde ich dir meine persönlichen Immo Cashflow Booster Erfahrungen mitteilen.

    ReplyDelete
  36. Avantajlý ve kaliteli bir dünyaya superbetin ile giriþ yapýn. Süperbetin global ölçekte bahis ve casino hizmet veren bir þirkettir. Kullanýcýlar kaliteli bir hizmet sunmakta. Bahsedeceklerimizden ziyade sizlerde Superbetin giriþ yaparak hizmetleri görebilirsiniz. Makalemizde sizlere Superbetin güvenilir mi? Süperbetin giriþ bilgileri gibi konularda bahsedeceðiz. Ayrýca Superbetin kayýt ol sayesinde özel bonuslara ulaþýn. Sizlerde süperbetin sayesinde avantajlý bir bahis ve casino hizmeti ulaþýn.
    Süperbetin sunduðu hizmetler hakkýnda detaylý bilgiler vereceðiz. Lakin öncelikle sitenin güvenilirliðinden bahsedelim. Ýlk olarak güvenilir olmayan bir site sektörde uzun yýllar hizmet veremez. Dolandýrýcý siteler zaten en fazla 3 ay hizmet verebilmiþtir. Superbetin ise sektörde 10 yýlý aþkýn zamandýr hizmet vermekte. Lisansýný bahis ve casino sektörünün en göze lisans kurumu olan çuraçao hükümetinden almýþtýr. Superbetin oyunlarý bahis ve casino oyunlarýndan saðladýklarý kazançlarýný sorun yaþamadan çekebilmekte.
    Superbetin
    Süperbetin giriþ yaparak sizlerde avantajlý bir bahis ve casino hizmetine ulaþabilirsiniz. Türkiye’deki kullanýcýlar güncel giriþ adresine sayfamýzda her zaman ulaþabilmekte. Avantajlý bir bahis ve casino hizmetine doðru siteyi tercih ederek ulaþýn. Hesabý olmayan kullanýcýlar Süperbetin kayýt iþlemini kolay bir þekilde yapabilmekte. Hiçbir ek belge göndermeden ve ayrýca kimlik bilgisi vermeden kolay bir þekilde hesabýnýzý oluþturun. Ayrýca yeni üyelere özel bonuslar bulunmakta. Deneme bonusu ve hoþgeldin bonusu yeni üyelere özeldir.
    Süperbetin bahis bölümünde geniþ bir bahis bülteni canlý olarak iddaa oynayabilirsiniz. Ayrýca tek maç üzerinden canlý bahisler oynanabilmekte. Binlere farklý müsabakaya yüksek oranlardan canlý bahis oynayabileceðiniz bir hizmet sizleri beklemekte. Sadece spor bahisleri de deðil. E-sports bahisleri, sanal bahisleri gibi farklý bahis seçenekleri de bulunmakta.
    Superbetin sayesinde gerçek bir casino hizmetine de ulaþabilirsiniz. Gerçek casino salonlarýndan canlý kurpiyerlerin sunumlarýyla 4K görüntü kalitesi üzerinden hizmet alýn. Canlý casino oyunlarý ve binlerce farklý slot oyunlarý sizleri beklemekte.
    Süperbetin bahis ve casino oyunlarýndan saðladýðýnýz kazançlarýnýzý sorun yaþamadan çekebilirsiniz. Sonuç olarak istediðiniz finansal yöntem üzerinden para yatýrma ve çekme iþlemlerinizi kolay bir þekilde yapýn.
    Sizlerde Süperbetin giriþ yaparak avantajlý bahis ve casino dünyasýna giriþ yapabilirsiniz.
    Süperbetin kullanýcýlarý para yatýrma ve çekme iþlemlerinizi yapabilirsiniz. Sonuç olarak BTC, usdt gibi coinler üzerinden finansal iþlem sunan sitelerden birisidir.
    Geniþ bir iddaa bülteni üzerinden binlerce farklý müsabakaya ayrýca yüksek oranlardan canlý iddaa oynayýn.
    Gerçek casino salonlarýndan özel olarak bir hizmete ulaþýn. Canlý casino oyunlarý ve slot oyunlarý superbetin dünyasýnda sizleri beklemekte.

    ReplyDelete
  37. Ýnternet üzerinden gerçek bir casino hizmetine ulaþabilirsiniz. Gerçek casino salonlarýndan canlý casino hizmeti veren özel siteleri bulunmakta. Canlý casino siteleri gerçek casino salonlarýndan kullanýcýlarýna gerçek paralar üzerinden casino oyunlarý sunmakta canlı casino. Oyuncular internete baðlý olduklarý her yerden casino oyunlarý oynayabilmekte. Lakin bahsettiðimiz ve bahsedeceðimiz hizmetleri almak için doðru casino siteleri seçmeniz gerekmekte. Doðru siteleri yani güvenilir casino siteleri tercih ederek hem gerçek bir hizmet alýn hem de kazançlarýnýzý sorunsuz bir þekilde çekin.
    Sektörün en gözde casino þirketleri sayfamýzda paylaþýlmakta. Casino siteleri giriþ butonlarý üzerinden sitelere ulaþabilirsiniz. Sizlere sitelerin hizmetleri hakkýnda bilgiler vereceðiz. Sitelerin sunduklarý hizmetleri, bonuslarý ve finansal araçlarý hakkýnda bilgileri sizlere sunacaðýnýz. En iyi canlı casino sayfamýzdan ulaþabilirsiniz.
    Canlý casino
    Paylaþtýðýmýz siteler oyuncularýna gerçek casino salonlarýndan hizmet sunmakta. Oyuncular BlackJack, rulet, poker gibi casino masa oyunlarýný 4K görüntü kalitesi üzerinden gerçek casino salonlarýndan oynamakta. Ayrýca masa oyunlarý yanýnda özel oyunlarda bulunmakta. Canlý olarak sunulan oyunlar 4K görüntü kalitesi üzerinden oyunculara aktarýlmakta. Oyunlarýn sunumlarý canlý kurpiyerlerin sunumlarýyla yapýlmakta. Canlý casino oyunlarý kurpiyerlerin sunumlarýyla oynanmakta. Ayrýca masalarda bulunan herkes sizler gibi gerçek oyuncudur. Asla sitelerde bot hesaplarý bulunmaz. Herkes gerçek oyuncudur. Ayrýca odalarda sohbet bölümleri bulunmakta. Canlý casino
    oyunlarý oynanýrken ayný zamanda diðer oyuncular ile sohbet edebilirsiniz.
    Sitelerde poker, blackjack, rulet gibi onlarca farklý casino masa oyunlarý. Özel olarak hazýrlanan crayz time gibi canlý casino oyunlarý. Aviator, zeplin gibi popüler oyunlar ve binlerce farklý slot oyunlarý bulunmakta. Oyuncular istedikleri oyunlarý istedikleri bet üzerinden oynayabilmekte. Casino siteleri gerçek kumarhanelerdeki oyunlarý ve hatta daha fazlasýný kullanýcýlarýna sunmakta canlı casino.
    Lakin unutmayýn bahsettiðimiz hizmetleri en iyi casino siteleri için geçerli. Her canlý casino sitesi ayný hizmeti vermemekte. Bundan dolayý önünüze gelen her casino sitesi giriþ yapmayýn. Güvenilir casino siteleri giriþ yaparak gerçek bir hizmete ulaþýn.
    Oyuncular casino oyunlarýndan saðladýklarý kazançlarýný sorun yaþamadan çekebilmekte. Ayrýca istedikleri finansal yöntemi kullanarak seçebilmekte. Siteler oyuncular onlarca farklý finansal araç sunmakta. Kullanýcýlar istedikleri yöntemleri kullanarak para yatýrma ve çekme iþlemlerini kolay bir þekilde canlı casino yapabilmekte.
    Casino siteleri onlarca farklý bonus da vermekte. Yeni kayýt olan kullanýcýlar deneme bonusu ve free spin alarak bedava casino oyunlarý oynama fýrsatý yakalamakta. Ýlk yatýrýmlarýna özel casino hoþgeldin bonusu. Her yatýrýmlarýna özel casino yatýrým bonusu. Þansýz günlerinde ise casino kayýp bonusu alabilmekte. Ayrýca bahsettiðimiz bonuslar dýþýnda farklý casino bonuslarý da bulunmakta canlı casino.
    Deneme bonusu veren casino siteleri sayesinde kayýt olarak yatýrým yapamadan bedava casino oyunlarý oynayabilirsiniz. Siteler yeni üyelerine özel olarak bedava bonus vermekte.
    Bonusu alan kullanýcýlar bedava bir þekilde casino oyunlarý oynayarak ayrýca kazançlarýnýzý çekebilirsiniz.
    Güvenilir canlý casino siteleri sayesinde avantajlý bir hizmete ulaþýn.

    ReplyDelete