From 5e584f3ac22e31eba4fa3e55b65b32fe26545647 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Thu, 23 May 2019 19:50:50 +0500 Subject: [PATCH 1/7] :busts_in_silhouette: Added patrons list See https://www.patreon.com/bePatron?c=243288 --- SUPPORT.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 SUPPORT.md diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..0b757ba --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,6 @@ +# [Support me on Patreon!](https://www.patreon.com/bePatron?c=243288) I develop this project in my spare time, and I do it and I will do it free of charge. However, you can make a donation or become a sponsor to make sure that I have enough coffee and pizza for night coding. + +**These people sponsored current version of the project:** +- Aurielb +- @YamiOdymel +- MoD21k From bdbc12dc207e6dadd4968096a7baea54b83cae37 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Thu, 23 May 2019 19:51:26 +0500 Subject: [PATCH 2/7] :bento: Added actual providers.json asset --- assets/providers.json | 2929 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2929 insertions(+) create mode 100644 assets/providers.json diff --git a/assets/providers.json b/assets/providers.json new file mode 100644 index 0000000..bc61a64 --- /dev/null +++ b/assets/providers.json @@ -0,0 +1,2929 @@ +[ + { + "provider_name": "23HQ", + "provider_url": "http:\/\/www.23hq.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.23hq.com\/*\/photo\/*" + ], + "url": "http:\/\/www.23hq.com\/23\/oembed" + } + ] + }, + { + "provider_name": "Adways", + "provider_url": "http:\/\/www.adways.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/play.adpaths.com\/experience\/*" + ], + "url": "http:\/\/play.adpaths.com\/oembed\/*" + } + ] + }, + { + "provider_name": "Alpha App Net", + "provider_url": "https:\/\/alpha.app.net\/browse\/posts\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/alpha.app.net\/*\/post\/*", + "https:\/\/photos.app.net\/*\/*" + ], + "url": "https:\/\/alpha-api.app.net\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Altru", + "provider_url": "https:\/\/www.altrulabs.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.altrulabs.com\/*\/*?answer_id=*" + ], + "url": "https:\/\/api.altrulabs.com\/social\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "amCharts Live Editor", + "provider_url": "https:\/\/live.amcharts.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/live.amcharts.com\/*", + "https:\/\/live.amcharts.com\/*" + ], + "url": "https:\/\/live.amcharts.com\/oembed" + } + ] + }, + { + "provider_name": "Animatron", + "provider_url": "https:\/\/www.animatron.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.animatron.com\/project\/*", + "https:\/\/animatron.com\/project\/*" + ], + "url": "https:\/\/animatron.com\/oembed\/json", + "discovery": true + } + ] + }, + { + "provider_name": "Animoto", + "provider_url": "http:\/\/animoto.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/animoto.com\/play\/*" + ], + "url": "http:\/\/animoto.com\/oembeds\/create" + } + ] + }, + { + "provider_name": "Apester", + "provider_url": "https:\/\/www.apester.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/renderer.apester.com\/v2\/*?preview=true&iframe_preview=true" + ], + "url": "https:\/\/display.apester.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Archivos", + "provider_url": "https:\/\/app.archivos.digital", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.archivos.digital\/app\/view\/*" + ], + "url": "https:\/\/app.archivos.digital\/oembed\/" + } + ] + }, + { + "provider_name": "AudioClip", + "provider_url": "https:\/\/audioclip.naver.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/audioclip.naver.com\/channels\/*\/clips\/*", + "https:\/\/audioclip.naver.com\/audiobooks\/*" + ], + "url": "https:\/\/audioclip.naver.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Audiomack", + "provider_url": "https:\/\/www.audiomack.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.audiomack.com\/song\/*", + "https:\/\/www.audiomack.com\/album\/*", + "https:\/\/www.audiomack.com\/playlist\/*" + ], + "url": "https:\/\/www.audiomack.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "AudioSnaps", + "provider_url": "http:\/\/audiosnaps.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/audiosnaps.com\/k\/*" + ], + "url": "http:\/\/audiosnaps.com\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Backtracks", + "provider_url": "https:\/\/backtracks.fm", + "endpoints": [ + { + "schemes": [ + "https:\/\/backtracks.fm\/*\/*\/e\/*", + "https:\/\/backtracks.fm\/*", + "http:\/\/backtracks.fm\/*" + ], + "url": "https:\/\/backtracks.fm\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Beautiful.AI", + "provider_url": "https:\/\/www.beautiful.ai\/", + "endpoints": [ + { + "url": "https:\/\/www.beautiful.ai\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Blackfire.io", + "provider_url": "https:\/\/blackfire.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/blackfire.io\/profiles\/*\/graph", + "https:\/\/blackfire.io\/profiles\/compare\/*\/graph" + ], + "url": "https:\/\/blackfire.io\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Box Office Buz", + "provider_url": "http:\/\/boxofficebuz.com", + "endpoints": [ + { + "url": "http:\/\/boxofficebuz.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "BrioVR", + "provider_url": "https:\/\/view.briovr.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/*" + ], + "url": "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/" + } + ] + }, + { + "provider_name": "Buttondown", + "provider_url": "https:\/\/buttondown.email\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/buttondown.email\/*" + ], + "url": "https:\/\/buttondown.email\/embed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Byzart Project", + "provider_url": "https:\/\/cmc.byzart.eu", + "endpoints": [ + { + "schemes": [ + "https:\/\/cmc.byzart.eu\/files\/*" + ], + "url": "https:\/\/cmc.byzart.eu\/oembed\/", + "discovery": false + } + ] + }, + { + "provider_name": "Cacoo", + "provider_url": "https:\/\/cacoo.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/cacoo.com\/diagrams\/*" + ], + "url": "http:\/\/cacoo.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Carbon Health", + "provider_url": "https:\/\/carbonhealth.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/carbonhealth.com\/practice\/*" + ], + "url": "http:\/\/carbonhealth.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "CatBoat", + "provider_url": "http:\/\/img.catbo.at\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/img.catbo.at\/*" + ], + "url": "http:\/\/img.catbo.at\/oembed.json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Ceros", + "provider_url": "http:\/\/www.ceros.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/view.ceros.com\/*" + ], + "url": "http:\/\/view.ceros.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ChartBlocks", + "provider_url": "http:\/\/www.chartblocks.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/public.chartblocks.com\/c\/*" + ], + "url": "http:\/\/embed.chartblocks.com\/1.0\/oembed" + } + ] + }, + { + "provider_name": "chirbit.com", + "provider_url": "http:\/\/www.chirbit.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/chirb.it\/*" + ], + "url": "http:\/\/chirb.it\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "CircuitLab", + "provider_url": "https:\/\/www.circuitlab.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.circuitlab.com\/circuit\/*" + ], + "url": "https:\/\/www.circuitlab.com\/circuit\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Clipland", + "provider_url": "http:\/\/www.clipland.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.clipland.com\/v\/*", + "https:\/\/www.clipland.com\/v\/*" + ], + "url": "https:\/\/www.clipland.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Clyp", + "provider_url": "http:\/\/clyp.it\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/clyp.it\/*", + "http:\/\/clyp.it\/playlist\/*" + ], + "url": "http:\/\/api.clyp.it\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "CodeHS", + "provider_url": "http:\/\/www.codehs.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/codehs.com\/editor\/share_abacus\/*" + ], + "url": "https:\/\/codehs.com\/api\/sharedprogram\/*\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Codepen", + "provider_url": "https:\/\/codepen.io", + "endpoints": [ + { + "schemes": [ + "http:\/\/codepen.io\/*", + "https:\/\/codepen.io\/*" + ], + "url": "http:\/\/codepen.io\/api\/oembed" + } + ] + }, + { + "provider_name": "Codepoints", + "provider_url": "https:\/\/codepoints.net", + "endpoints": [ + { + "schemes": [ + "http:\/\/codepoints.net\/*", + "https:\/\/codepoints.net\/*", + "http:\/\/www.codepoints.net\/*", + "https:\/\/www.codepoints.net\/*" + ], + "url": "https:\/\/codepoints.net\/api\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "CodeSandbox", + "provider_url": "https:\/\/codesandbox.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/codesandbox.io\/s\/*", + "https:\/\/codesandbox.io\/embed\/*" + ], + "url": "https:\/\/codesandbox.io\/oembed" + } + ] + }, + { + "provider_name": "CollegeHumor", + "provider_url": "http:\/\/www.collegehumor.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.collegehumor.com\/video\/*" + ], + "url": "http:\/\/www.collegehumor.com\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Commaful", + "provider_url": "https:\/\/commaful.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/commaful.com\/play\/*" + ], + "url": "https:\/\/commaful.com\/api\/oembed\/" + } + ] + }, + { + "provider_name": "Coub", + "provider_url": "http:\/\/coub.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/coub.com\/view\/*", + "http:\/\/coub.com\/embed\/*" + ], + "url": "http:\/\/coub.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "Crowd Ranking", + "provider_url": "http:\/\/crowdranking.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/crowdranking.com\/*\/*" + ], + "url": "http:\/\/crowdranking.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "Cyrano Systems", + "provider_url": "http:\/\/www.cyranosystems.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/staging.cyranosystems.com\/msg\/*", + "https:\/\/app.cyranosystems.com\/msg\/*" + ], + "url": "https:\/\/staging.cyranosystems.com\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Daily Mile", + "provider_url": "http:\/\/www.dailymile.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.dailymile.com\/people\/*\/entries\/*" + ], + "url": "http:\/\/api.dailymile.com\/oembed?format=json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Dailymotion", + "provider_url": "https:\/\/www.dailymotion.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.dailymotion.com\/video\/*" + ], + "url": "https:\/\/www.dailymotion.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Deseretnews.com", + "provider_url": "https:\/\/www.deseretnews.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.deseretnews.com\/*" + ], + "url": "https:\/\/embed.deseretnews.com\/" + } + ] + }, + { + "provider_name": "Deviantart.com", + "provider_url": "http:\/\/www.deviantart.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.deviantart.com\/art\/*", + "http:\/\/*.deviantart.com\/*#\/d*", + "http:\/\/fav.me\/*", + "http:\/\/sta.sh\/*" + ], + "url": "http:\/\/backend.deviantart.com\/oembed" + } + ] + }, + { + "provider_name": "Didacte", + "provider_url": "https:\/\/www.didacte.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.didacte.com\/a\/course\/*" + ], + "url": "https:\/\/*.didacte.com\/cards\/oembed'", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Digiteka", + "provider_url": "https:\/\/www.ultimedia.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.ultimedia.com\/central\/video\/edit\/id\/*\/topic_id\/*\/", + "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*\/showtitle\/1\/viewnc\/1", + "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*" + ], + "url": "https:\/\/www.ultimedia.com\/api\/search\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Dipity", + "provider_url": "http:\/\/www.dipity.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.dipity.com\/*\/*\/" + ], + "url": "http:\/\/www.dipity.com\/oembed\/timeline\/" + } + ] + }, + { + "provider_name": "DocDroid", + "provider_url": "https:\/\/www.docdroid.net\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.docdroid.net\/*", + "http:\/\/*.docdroid.net\/*", + "https:\/\/docdro.id\/*", + "http:\/\/docdro.id\/*" + ], + "url": "https:\/\/www.docdroid.net\/api\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Dotsub", + "provider_url": "http:\/\/dotsub.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/dotsub.com\/view\/*" + ], + "url": "http:\/\/dotsub.com\/services\/oembed" + } + ] + }, + { + "provider_name": "DTube", + "provider_url": "https:\/\/d.tube\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/d.tube\/v\/*" + ], + "url": "https:\/\/api.d.tube\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "edocr", + "provider_url": "http:\/\/www.edocr.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/edocr.com\/docs\/*" + ], + "url": "http:\/\/edocr.com\/api\/oembed" + } + ] + }, + { + "provider_name": "eduMedia", + "provider_url": "https:\/\/www.edumedia-sciences.com\/", + "endpoints": [ + { + "url": "https:\/\/www.edumedia-sciences.com\/oembed.json", + "discovery": true + }, + { + "url": "https:\/\/www.edumedia-sciences.com\/oembed.xml", + "discovery": true + } + ] + }, + { + "provider_name": "EgliseInfo", + "provider_url": "http:\/\/egliseinfo.catholique.fr\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/egliseinfo.catholique.fr\/*" + ], + "url": "http:\/\/egliseinfo.catholique.fr\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Embed Articles", + "provider_url": "http:\/\/embedarticles.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/embedarticles.com\/*" + ], + "url": "http:\/\/embedarticles.com\/oembed\/" + } + ] + }, + { + "provider_name": "Embedly", + "provider_url": "http:\/\/api.embed.ly\/", + "endpoints": [ + { + "url": "http:\/\/api.embed.ly\/1\/oembed" + } + ] + }, + { + "provider_name": "Ethfiddle", + "provider_url": "https:\/\/www.ethfiddle.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/ethfiddle.com\/*" + ], + "url": "https:\/\/ethfiddle.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Eyrie", + "provider_url": "https:\/\/eyrie.io\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/eyrie.io\/board\/*", + "https:\/\/eyrie.io\/sparkfun\/*" + ], + "url": "https:\/\/eyrie.io\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Post)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/posts\/*", + "https:\/\/www.facebook.com\/photos\/*", + "https:\/\/www.facebook.com\/photo.php", + "https:\/\/www.facebook.com\/*\/activity\/*", + "https:\/\/www.facebook.com\/permalink.php", + "https:\/\/www.facebook.com\/media\/set?set=*", + "https:\/\/www.facebook.com\/questions\/*", + "https:\/\/www.facebook.com\/notes\/*\/*\/*" + ], + "url": "https:\/\/www.facebook.com\/plugins\/post\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Video)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/videos\/*", + "https:\/\/www.facebook.com\/video.php" + ], + "url": "https:\/\/www.facebook.com\/plugins\/video\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Fader", + "provider_url": "https:\/\/app.getfader.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.getfader.com\/projects\/*\/publish" + ], + "url": "https:\/\/app.getfader.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Faithlife TV", + "provider_url": "https:\/\/faithlifetv.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/faithlifetv.com\/items\/*", + "https:\/\/faithlifetv.com\/items\/resource\/*\/*", + "https:\/\/faithlifetv.com\/media\/*", + "https:\/\/faithlifetv.com\/media\/assets\/*", + "https:\/\/faithlifetv.com\/media\/resource\/*\/*" + ], + "url": "https:\/\/faithlifetv.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "FITE", + "provider_url": "https:\/\/www.fite.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.fite.tv\/watch\/*" + ], + "url": "https:\/\/www.fite.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Flat", + "provider_url": "https:\/\/flat.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/flat.io\/score\/*", + "https:\/\/*.flat.io\/score\/*" + ], + "url": "https:\/\/flat.io\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Flickr", + "provider_url": "https:\/\/www.flickr.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.flickr.com\/photos\/*", + "http:\/\/flic.kr\/p\/*", + "https:\/\/*.flickr.com\/photos\/*", + "https:\/\/flic.kr\/p\/*" + ], + "url": "https:\/\/www.flickr.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Flourish", + "provider_url": "https:\/\/flourish.studio\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/public.flourish.studio\/visualisation\/*", + "https:\/\/public.flourish.studio\/story\/*" + ], + "url": "https:\/\/app.flourish.studio\/api\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Fontself", + "provider_url": "https:\/\/www.fontself.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/catapult.fontself.com\/*" + ], + "url": "https:\/\/oembed.fontself.com\/" + } + ] + }, + { + "provider_name": "FOX SPORTS Australia", + "provider_url": "http:\/\/www.foxsports.com.au", + "endpoints": [ + { + "schemes": [ + "http:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*", + "https:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*" + ], + "url": "https:\/\/fiso.foxsports.com.au\/oembed" + } + ] + }, + { + "provider_name": "FrameBuzz", + "provider_url": "https:\/\/framebuzz.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/framebuzz.com\/v\/*", + "https:\/\/framebuzz.com\/v\/*" + ], + "url": "https:\/\/framebuzz.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "FunnyOrDie", + "provider_url": "http:\/\/www.funnyordie.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.funnyordie.com\/videos\/*" + ], + "url": "http:\/\/www.funnyordie.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Geograph Britain and Ireland", + "provider_url": "https:\/\/www.geograph.org.uk\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.geograph.org.uk\/*", + "http:\/\/*.geograph.co.uk\/*", + "http:\/\/*.geograph.ie\/*", + "http:\/\/*.wikimedia.org\/*_geograph.org.uk_*" + ], + "url": "http:\/\/api.geograph.org.uk\/api\/oembed" + } + ] + }, + { + "provider_name": "Geograph Channel Islands", + "provider_url": "http:\/\/channel-islands.geograph.org\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.geograph.org.gg\/*", + "http:\/\/*.geograph.org.je\/*", + "http:\/\/channel-islands.geograph.org\/*", + "http:\/\/channel-islands.geographs.org\/*", + "http:\/\/*.channel.geographs.org\/*" + ], + "url": "http:\/\/www.geograph.org.gg\/api\/oembed" + } + ] + }, + { + "provider_name": "Geograph Germany", + "provider_url": "http:\/\/geo-en.hlipp.de\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/geo-en.hlipp.de\/*", + "http:\/\/geo.hlipp.de\/*", + "http:\/\/germany.geograph.org\/*" + ], + "url": "http:\/\/geo.hlipp.de\/restapi.php\/api\/oembed" + } + ] + }, + { + "provider_name": "Getty Images", + "provider_url": "http:\/\/www.gettyimages.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/gty.im\/*" + ], + "url": "http:\/\/embed.gettyimages.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Gfycat", + "provider_url": "https:\/\/gfycat.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/gfycat.com\/*", + "http:\/\/www.gfycat.com\/*", + "https:\/\/gfycat.com\/*", + "https:\/\/www.gfycat.com\/*" + ], + "url": "https:\/\/api.gfycat.com\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Gifnote", + "provider_url": "https:\/\/www.gifnote.com\/", + "endpoints": [ + { + "url": "https:\/\/www.gifnote.com\/services\/oembed", + "schemes": [ + "https:\/\/www.gifnote.com\/play\/*" + ], + "discovery": true + } + ] + }, + { + "provider_name": "GIPHY", + "provider_url": "https:\/\/giphy.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/giphy.com\/gifs\/*", + "http:\/\/gph.is\/*", + "https:\/\/media.giphy.com\/media\/*\/giphy.gif" + ], + "url": "https:\/\/giphy.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "GloriaTV", + "provider_url": "https:\/\/gloria.tv\/", + "endpoints": [ + { + "url": "https:\/\/gloria.tv\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "GT Channel", + "provider_url": "https:\/\/gtchannel.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/gtchannel.com\/watch\/*" + ], + "url": "https:\/\/api.luminery.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Gyazo", + "provider_url": "https:\/\/gyazo.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/gyazo.com\/*" + ], + "url": "https:\/\/api.gyazo.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "hearthis.at", + "provider_url": "https:\/\/hearthis.at\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/hearthis.at\/*\/*\/" + ], + "url": "https:\/\/hearthis.at\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "HuffDuffer", + "provider_url": "http:\/\/huffduffer.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/huffduffer.com\/*\/*" + ], + "url": "http:\/\/huffduffer.com\/oembed" + } + ] + }, + { + "provider_name": "Hulu", + "provider_url": "http:\/\/www.hulu.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.hulu.com\/watch\/*" + ], + "url": "http:\/\/www.hulu.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "iFixit", + "provider_url": "http:\/\/www.iFixit.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.ifixit.com\/Guide\/View\/*" + ], + "url": "http:\/\/www.ifixit.com\/Embed" + } + ] + }, + { + "provider_name": "IFTTT", + "provider_url": "http:\/\/www.ifttt.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/ifttt.com\/recipes\/*" + ], + "url": "http:\/\/www.ifttt.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Indaco", + "provider_url": "https:\/\/player.indacolive.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/player.indacolive.com\/player\/jwp\/clients\/*" + ], + "url": "https:\/\/player.indacolive.com\/services\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Infogram", + "provider_url": "https:\/\/infogr.am\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/infogr.am\/*" + ], + "url": "https:\/\/infogr.am\/oembed" + } + ] + }, + { + "provider_name": "Infoveave", + "provider_url": "https:\/\/infoveave.net\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.infoveave.net\/E\/*", + "https:\/\/*.infoveave.net\/P\/*" + ], + "url": "https:\/\/infoveave.net\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Injurymap", + "provider_url": "https:\/\/www.injurymap.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.injurymap.com\/exercises\/*" + ], + "url": "https:\/\/www.injurymap.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Inoreader", + "provider_url": "https:\/\/www.inoreader.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.inoreader.com\/oembed\/" + ], + "url": "https:\/\/www.inoreader.com\/oembed\/api\/", + "discovery": true + } + ] + }, + { + "provider_name": "inphood", + "provider_url": "http:\/\/inphood.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.inphood.com\/*" + ], + "url": "http:\/\/api.inphood.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Instagram", + "provider_url": "https:\/\/instagram.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/instagram.com\/p\/*", + "http:\/\/instagr.am\/p\/*", + "http:\/\/www.instagram.com\/p\/*", + "http:\/\/www.instagr.am\/p\/*", + "https:\/\/instagram.com\/p\/*", + "https:\/\/instagr.am\/p\/*", + "https:\/\/www.instagram.com\/p\/*", + "https:\/\/www.instagr.am\/p\/*" + ], + "url": "https:\/\/api.instagram.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "iSnare Articles", + "provider_url": "https:\/\/www.isnare.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.isnare.com\/*" + ], + "url": "https:\/\/www.isnare.com\/oembed\/" + } + ] + }, + { + "provider_name": "Issuu", + "provider_url": "https:\/\/issuu.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/issuu.com\/*\/docs\/*" + ], + "url": "https:\/\/issuu.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ivlismusic", + "provider_url": "https:\/\/music.ivlis.kr\/", + "endpoints": [ + { + "url": "https:\/\/music.ivlis.kr\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "KakaoTv", + "provider_url": "https:\/\/tv.kakao.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/tv.kakao.com\/channel\/*\/cliplink\/*", + "https:\/\/tv.kakao.com\/channel\/v\/*", + "https:\/\/tv.kakao.com\/channel\/*\/livelink\/*", + "https:\/\/tv.kakao.com\/channel\/l\/*" + ], + "url": "https:\/\/tv.kakao.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Kickstarter", + "provider_url": "http:\/\/www.kickstarter.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.kickstarter.com\/projects\/*" + ], + "url": "http:\/\/www.kickstarter.com\/services\/oembed" + } + ] + }, + { + "provider_name": "Kidoju", + "provider_url": "https:\/\/www.kidoju.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.kidoju.com\/en\/x\/*\/*", + "https:\/\/www.kidoju.com\/fr\/x\/*\/*" + ], + "url": "https:\/\/www.kidoju.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Kit", + "provider_url": "https:\/\/kit.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/kit.com\/*\/*", + "https:\/\/kit.com\/*\/*" + ], + "url": "https:\/\/embed.kit.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Kitchenbowl", + "provider_url": "http:\/\/www.kitchenbowl.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.kitchenbowl.com\/recipe\/*" + ], + "url": "http:\/\/www.kitchenbowl.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Knacki", + "provider_url": "http:\/\/jdr.knacki.info", + "endpoints": [ + { + "schemes": [ + "http:\/\/jdr.knacki.info\/meuh\/*", + "https:\/\/jdr.knacki.info\/meuh\/*" + ], + "url": "https:\/\/jdr.knacki.info\/oembed" + } + ] + }, + { + "provider_name": "LearningApps.org", + "provider_url": "http:\/\/learningapps.org\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/learningapps.org\/*" + ], + "url": "http:\/\/learningapps.org\/oembed.php", + "discovery": true + } + ] + }, + { + "provider_name": "Lille.Pod", + "provider_url": "https:\/\/pod.univ-lille.fr\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/pod.univ-lille.fr\/video\/*" + ], + "url": "https:\/\/pod.univ-lille.fr\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Livestream", + "provider_url": "https:\/\/livestream.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/livestream.com\/accounts\/*\/events\/*", + "https:\/\/livestream.com\/accounts\/*\/events\/*\/videos\/*", + "https:\/\/livestream.com\/*\/events\/*", + "https:\/\/livestream.com\/*\/events\/*\/videos\/*", + "https:\/\/livestream.com\/*\/*", + "https:\/\/livestream.com\/*\/*\/videos\/*" + ], + "url": "https:\/\/livestream.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Ludus", + "provider_url": "https:\/\/ludus.one", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.ludus.one\/*" + ], + "url": "https:\/\/app.ludus.one\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "MathEmbed", + "provider_url": "http:\/\/mathembed.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/mathembed.com\/latex?inputText=*", + "http:\/\/mathembed.com\/latex?inputText=*" + ], + "url": "http:\/\/mathembed.com\/oembed" + } + ] + }, + { + "provider_name": "Matterport", + "provider_url": "https:\/\/matterport.com\/", + "endpoints": [ + { + "url": "https:\/\/my.matterport.com\/api\/v1\/models\/oembed\/", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "me.me", + "provider_url": "https:\/\/me.me\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/me.me\/i\/*" + ], + "url": "https:\/\/me.me\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Medienarchiv der K\u00fcnste - Z\u00fcrcher Hochschule der K\u00fcnste", + "provider_url": "https:\/\/medienarchiv.zhdk.ch\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/medienarchiv.zhdk.ch\/entries\/*" + ], + "url": "https:\/\/medienarchiv.zhdk.ch\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Meetup", + "provider_url": "http:\/\/www.meetup.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/meetup.com\/*", + "https:\/\/www.meetup.com\/*", + "https:\/\/meetup.com\/*", + "http:\/\/meetu.ps\/*" + ], + "url": "https:\/\/api.meetup.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "MixCloud", + "provider_url": "https:\/\/mixcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.mixcloud.com\/*\/*\/", + "https:\/\/www.mixcloud.com\/*\/*\/" + ], + "url": "https:\/\/www.mixcloud.com\/oembed\/" + } + ] + }, + { + "provider_name": "Moby Picture", + "provider_url": "http:\/\/www.mobypicture.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.mobypicture.com\/user\/*\/view\/*", + "http:\/\/moby.to\/*" + ], + "url": "http:\/\/api.mobypicture.com\/oEmbed" + } + ] + }, + { + "provider_name": "Modelo", + "provider_url": "http:\/\/modelo.io\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/beta.modelo.io\/embedded\/*" + ], + "url": "https:\/\/portal.modelo.io\/oembed", + "discovery": false + } + ] + }, + { + "provider_name": "MorphCast", + "provider_url": "https:\/\/www.morphcast.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/m-roll.morphcast.com\/mroll\/*" + ], + "url": "https:\/\/m-roll.morphcast.com\/service\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Music Box Maniacs", + "provider_url": "https:\/\/musicboxmaniacs.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/musicboxmaniacs.com\/explore\/melody\/*" + ], + "url": "https:\/\/musicboxmaniacs.com\/embed\/", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "myBeweeg", + "provider_url": "https:\/\/mybeweeg.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/mybeweeg.com\/w\/*" + ], + "url": "https:\/\/mybeweeg.com\/services\/oembed" + } + ] + }, + { + "provider_name": "nanoo.tv", + "provider_url": "https:\/\/www.nanoo.tv\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.nanoo.tv\/link\/*", + "http:\/\/nanoo.tv\/link\/*", + "http:\/\/*.nanoo.pro\/link\/*", + "http:\/\/nanoo.pro\/link\/*", + "https:\/\/*.nanoo.tv\/link\/*", + "https:\/\/nanoo.tv\/link\/*", + "https:\/\/*.nanoo.pro\/link\/*", + "https:\/\/nanoo.pro\/link\/*", + "http:\/\/media.zhdk.ch\/signatur\/*", + "http:\/\/new.media.zhdk.ch\/signatur\/*", + "https:\/\/media.zhdk.ch\/signatur\/*", + "https:\/\/new.media.zhdk.ch\/signatur\/*" + ], + "url": "https:\/\/www.nanoo.tv\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Nasjonalbiblioteket", + "provider_url": "https:\/\/www.nb.no\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.nb.no\/items\/*" + ], + "url": "https:\/\/api.nb.no\/catalog\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "nfb.ca", + "provider_url": "http:\/\/www.nfb.ca\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.nfb.ca\/film\/*" + ], + "url": "http:\/\/www.nfb.ca\/remote\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Odds.com.au", + "provider_url": "https:\/\/www.odds.com.au", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.odds.com.au\/*", + "https:\/\/odds.com.au\/*" + ], + "url": "https:\/\/www.odds.com.au\/api\/oembed\/" + } + ] + }, + { + "provider_name": "Official FM", + "provider_url": "http:\/\/official.fm", + "endpoints": [ + { + "schemes": [ + "http:\/\/official.fm\/tracks\/*", + "http:\/\/official.fm\/playlists\/*" + ], + "url": "http:\/\/official.fm\/services\/oembed.{format}" + } + ] + }, + { + "provider_name": "Omniscope", + "provider_url": "https:\/\/omniscope.me\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/omniscope.me\/*" + ], + "url": "https:\/\/omniscope.me\/_global_\/oembed\/json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "On Aol", + "provider_url": "http:\/\/on.aol.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/on.aol.com\/video\/*" + ], + "url": "http:\/\/on.aol.com\/api" + } + ] + }, + { + "provider_name": "Ora TV", + "provider_url": "http:\/\/www.ora.tv\/", + "endpoints": [ + { + "discovery": true, + "url": "https:\/\/www.ora.tv\/oembed\/*?format={format}" + } + ] + }, + { + "provider_name": "Orbitvu", + "provider_url": "https:\/\/orbitvu.co", + "endpoints": [ + { + "schemes": [ + "https:\/\/orbitvu.co\/001\/*\/ov3601\/view", + "https:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3601\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view" + ], + "url": "http:\/\/orbitvu.co\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Oumy", + "provider_url": "https:\/\/www.oumy.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.oumy.com\/v\/*" + ], + "url": "https:\/\/www.oumy.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Outplayed.tv", + "provider_url": "https:\/\/outplayed.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/outplayed.tv\/media\/*" + ], + "url": "https:\/\/outplayed.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Overflow", + "provider_url": "https:\/\/overflow.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/overflow.io\/s\/*", + "https:\/\/overflow.io\/embed\/*" + ], + "url": "https:\/\/overflow.io\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Pastery", + "provider_url": "https:\/\/www.pastery.net", + "endpoints": [ + { + "schemes": [ + "http:\/\/pastery.net\/*", + "https:\/\/pastery.net\/*", + "http:\/\/www.pastery.net\/*", + "https:\/\/www.pastery.net\/*" + ], + "url": "https:\/\/www.pastery.net\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "PingVP", + "provider_url": "https:\/\/www.pingvp.com\/", + "endpoints": [ + { + "url": "https:\/\/beta.pingvp.com.kpnis.nl\/p\/oembed.php", + "discovery": true + } + ] + }, + { + "provider_name": "Pixdor", + "provider_url": "http:\/\/www.pixdor.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/store.pixdor.com\/place-marker-widget\/*\/show", + "https:\/\/store.pixdor.com\/map\/*\/show" + ], + "url": "https:\/\/store.pixdor.com\/oembed", + "formats": [ + "json", + "xml" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Podbean", + "provider_url": "http:\/\/podbean.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.podbean.com\/e\/*", + "http:\/\/*.podbean.com\/e\/*" + ], + "url": "https:\/\/api.podbean.com\/v1\/oembed" + } + ] + }, + { + "provider_name": "Poll Daddy", + "provider_url": "http:\/\/polldaddy.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.polldaddy.com\/s\/*", + "http:\/\/*.polldaddy.com\/poll\/*", + "http:\/\/*.polldaddy.com\/ratings\/*" + ], + "url": "http:\/\/polldaddy.com\/oembed\/" + } + ] + }, + { + "provider_name": "Port", + "provider_url": "http:\/\/www.sellwithport.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.sellwithport.com\/#\/buyer\/*" + ], + "url": "https:\/\/api.sellwithport.com\/v1.0\/buyer\/oembed" + } + ] + }, + { + "provider_name": "Portfolium", + "provider_url": "https:\/\/portfolium.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/portfolium.com\/entry\/*" + ], + "url": "https:\/\/api.portfolium.com\/oembed" + } + ] + }, + { + "provider_name": "Quiz.biz", + "provider_url": "http:\/\/www.quiz.biz\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.quiz.biz\/quizz-*.html" + ], + "url": "http:\/\/www.quiz.biz\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Quizz.biz", + "provider_url": "http:\/\/www.quizz.biz\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.quizz.biz\/quizz-*.html" + ], + "url": "http:\/\/www.quizz.biz\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RapidEngage", + "provider_url": "https:\/\/rapidengage.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/rapidengage.com\/s\/*" + ], + "url": "https:\/\/rapidengage.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Reddit", + "provider_url": "https:\/\/reddit.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/reddit.com\/r\/*\/comments\/*\/*", + "https:\/\/www.reddit.com\/r\/*\/comments\/*\/*" + ], + "url": "https:\/\/www.reddit.com\/oembed" + } + ] + }, + { + "provider_name": "ReleaseWire", + "provider_url": "http:\/\/www.releasewire.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/rwire.com\/*" + ], + "url": "http:\/\/publisher.releasewire.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Replit", + "provider_url": "https:\/\/repl.it\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/repl.it\/@*\/*" + ], + "url": "https:\/\/repl.it\/data\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RepubHub", + "provider_url": "http:\/\/repubhub.icopyright.net\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/repubhub.icopyright.net\/freePost.act?*" + ], + "url": "http:\/\/repubhub.icopyright.net\/oembed.act", + "discovery": true + } + ] + }, + { + "provider_name": "ReverbNation", + "provider_url": "https:\/\/www.reverbnation.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.reverbnation.com\/*", + "https:\/\/www.reverbnation.com\/*\/songs\/*" + ], + "url": "https:\/\/www.reverbnation.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RiffReporter", + "provider_url": "https:\/\/www.riffreporter.de\/", + "endpoints": [ + { + "url": "https:\/\/www.riffreporter.de\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Roomshare", + "provider_url": "http:\/\/roomshare.jp", + "endpoints": [ + { + "schemes": [ + "http:\/\/roomshare.jp\/post\/*", + "http:\/\/roomshare.jp\/en\/post\/*" + ], + "url": "http:\/\/roomshare.jp\/en\/oembed.{format}" + } + ] + }, + { + "provider_name": "RoosterTeeth", + "provider_url": "https:\/\/roosterteeth.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/roosterteeth.com\/*" + ], + "url": "https:\/\/roosterteeth.com\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Rumble", + "provider_url": "https:\/\/rumble.com\/", + "endpoints": [ + { + "url": "https:\/\/rumble.com\/api\/Media\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Sapo Videos", + "provider_url": "http:\/\/videos.sapo.pt", + "endpoints": [ + { + "schemes": [ + "http:\/\/videos.sapo.pt\/*" + ], + "url": "http:\/\/videos.sapo.pt\/oembed" + } + ] + }, + { + "provider_name": "Screen9", + "provider_url": "http:\/\/www.screen9.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/console.screen9.com\/*", + "https:\/\/*.screen9.tv\/*" + ], + "url": "https:\/\/api.screen9.com\/oembed" + } + ] + }, + { + "provider_name": "Screencast.com", + "provider_url": "http:\/\/www.screencast.com\/", + "endpoints": [ + { + "url": "https:\/\/api.screencast.com\/external\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Screenr", + "provider_url": "http:\/\/www.screenr.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.screenr.com\/*\/" + ], + "url": "http:\/\/www.screenr.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "ScribbleMaps", + "provider_url": "https:\/\/scribblemaps.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.scribblemaps.com\/maps\/view\/*", + "https:\/\/www.scribblemaps.com\/maps\/view\/*", + "http:\/\/scribblemaps.com\/maps\/view\/*", + "https:\/\/scribblemaps.com\/maps\/view\/*" + ], + "url": "https:\/\/scribblemaps.com\/api\/services\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Scribd", + "provider_url": "http:\/\/www.scribd.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.scribd.com\/doc\/*" + ], + "url": "http:\/\/www.scribd.com\/services\/oembed\/" + } + ] + }, + { + "provider_name": "SendtoNews", + "provider_url": "http:\/\/www.sendtonews.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/embed.sendtonews.com\/oembed\/*" + ], + "url": "https:\/\/embed.sendtonews.com\/services\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "ShortNote", + "provider_url": "https:\/\/www.shortnote.jp\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.shortnote.jp\/view\/notes\/*" + ], + "url": "https:\/\/www.shortnote.jp\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Shoudio", + "provider_url": "http:\/\/shoudio.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/shoudio.com\/*", + "http:\/\/shoud.io\/*" + ], + "url": "http:\/\/shoudio.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Show the Way, actionable location info", + "provider_url": "https:\/\/showtheway.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/showtheway.io\/to\/*" + ], + "url": "https:\/\/showtheway.io\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Simplecast", + "provider_url": "https:\/\/simplecast.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/simplecast.com\/s\/*" + ], + "url": "https:\/\/simplecast.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Sizzle", + "provider_url": "https:\/\/onsizzle.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/onsizzle.com\/i\/*" + ], + "url": "https:\/\/onsizzle.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Sketchfab", + "provider_url": "http:\/\/sketchfab.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/sketchfab.com\/models\/*", + "https:\/\/sketchfab.com\/models\/*", + "https:\/\/sketchfab.com\/*\/folders\/*" + ], + "url": "http:\/\/sketchfab.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "SlideShare", + "provider_url": "http:\/\/www.slideshare.net\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.slideshare.net\/*\/*", + "http:\/\/fr.slideshare.net\/*\/*", + "http:\/\/de.slideshare.net\/*\/*", + "http:\/\/es.slideshare.net\/*\/*", + "http:\/\/pt.slideshare.net\/*\/*" + ], + "url": "http:\/\/www.slideshare.net\/api\/oembed\/2", + "discovery": true + } + ] + }, + { + "provider_name": "SmugMug", + "provider_url": "http:\/\/www.smugmug.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.smugmug.com\/*" + ], + "url": "http:\/\/api.smugmug.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "SocialExplorer", + "provider_url": "https:\/\/www.socialexplorer.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.socialexplorer.com\/*\/explore", + "https:\/\/www.socialexplorer.com\/*\/view", + "https:\/\/www.socialexplorer.com\/*\/edit", + "https:\/\/www.socialexplorer.com\/*\/embed" + ], + "url": "https:\/\/www.socialexplorer.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Songlink", + "provider_url": "https:\/\/song.link", + "endpoints": [ + { + "schemes": [ + "https:\/\/song.link\/*" + ], + "url": "https:\/\/song.link\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "SoundCloud", + "provider_url": "http:\/\/soundcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/soundcloud.com\/*", + "https:\/\/soundcloud.com\/*" + ], + "url": "https:\/\/soundcloud.com\/oembed" + } + ] + }, + { + "provider_name": "Soundsgood", + "provider_url": "https:\/\/soundsgood.co", + "endpoints": [ + { + "schemes": [ + "https:\/\/play.soundsgood.co\/playlist\/*", + "https:\/\/soundsgood.co\/playlist\/*" + ], + "url": "https:\/\/play.soundsgood.co\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "SpeakerDeck", + "provider_url": "https:\/\/speakerdeck.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/speakerdeck.com\/*\/*", + "https:\/\/speakerdeck.com\/*\/*" + ], + "url": "https:\/\/speakerdeck.com\/oembed.json", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Spotful", + "provider_url": "https:\/\/bespotful.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/play.bespotful.com\/*" + ], + "url": "https:\/\/api.bespotful.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Spotify", + "provider_url": "https:\/\/spotify.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.spotify.com\/*", + "spotify:*" + ], + "url": "https:\/\/embed.spotify.com\/oembed\/" + } + ] + }, + { + "provider_name": "Spreaker", + "provider_url": "https:\/\/www.spreaker.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.spreaker.com\/*", + "https:\/\/*.spreaker.com\/*" + ], + "url": "https:\/\/api.spreaker.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Stanford Digital Repository", + "provider_url": "https:\/\/purl.stanford.edu\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/purl.stanford.edu\/*" + ], + "url": "https:\/\/purl.stanford.edu\/embed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Streamable", + "provider_url": "https:\/\/streamable.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/streamable.com\/*", + "https:\/\/streamable.com\/*" + ], + "url": "https:\/\/api.streamable.com\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "StreamOneCloud", + "provider_url": "https:\/\/www.streamone.nl", + "endpoints": [ + { + "schemes": [ + "https:\/\/content.streamonecloud.net\/embed\/*" + ], + "url": "https:\/\/content.streamonecloud.net\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Sutori", + "provider_url": "https:\/\/www.sutori.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.sutori.com\/story\/*" + ], + "url": "https:\/\/www.sutori.com\/api\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Sway", + "provider_url": "https:\/\/www.sway.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/sway.com\/*", + "https:\/\/www.sway.com\/*" + ], + "url": "https:\/\/sway.com\/api\/v1.0\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Ted", + "provider_url": "http:\/\/ted.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/ted.com\/talks\/*" + ], + "url": "http:\/\/www.ted.com\/talks\/oembed.{format}" + } + ] + }, + { + "provider_name": "The New York Times", + "provider_url": "https:\/\/www.nytimes.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.nytimes.com\/svc\/oembed", + "https:\/\/nytimes.com\/*", + "https:\/\/*.nytimes.com\/*" + ], + "url": "https:\/\/www.nytimes.com\/svc\/oembed\/json\/", + "discovery": true + } + ] + }, + { + "provider_name": "They Said So", + "provider_url": "https:\/\/theysaidso.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/theysaidso.com\/image\/*" + ], + "url": "https:\/\/theysaidso.com\/extensions\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "TickCounter", + "provider_url": "https:\/\/www.tickcounter.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.tickcounter.com\/countdown\/*", + "http:\/\/www.tickcounter.com\/countup\/*", + "http:\/\/www.tickcounter.com\/ticker\/*", + "http:\/\/www.tickcounter.com\/worldclock\/*", + "https:\/\/www.tickcounter.com\/countdown\/*", + "https:\/\/www.tickcounter.com\/countup\/*", + "https:\/\/www.tickcounter.com\/ticker\/*", + "https:\/\/www.tickcounter.com\/worldclock\/*" + ], + "url": "https:\/\/www.tickcounter.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Toornament", + "provider_url": "https:\/\/www.toornament.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.toornament.com\/tournaments\/*\/information", + "https:\/\/www.toornament.com\/tournaments\/*\/registration\/", + "https:\/\/www.toornament.com\/tournaments\/*\/matches\/schedule", + "https:\/\/www.toornament.com\/tournaments\/*\/stages\/*\/" + ], + "url": "https:\/\/widget.toornament.com\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "Topy", + "provider_url": "http:\/\/www.topy.se\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.topy.se\/image\/*" + ], + "url": "http:\/\/www.topy.se\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Tuxx", + "provider_url": "https:\/\/www.tuxx.be\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.tuxx.be\/*" + ], + "url": "https:\/\/www.tuxx.be\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "tvcf", + "provider_url": "http:\/\/tvcf.co.kr", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.tvcf.co.kr\/v\/*" + ], + "url": "http:\/\/www.tvcf.co.kr\/services\/oembed" + } + ] + }, + { + "provider_name": "Twitch", + "provider_url": "https:\/\/www.twitch.tv", + "endpoints": [ + { + "schemes": [ + "http:\/\/clips.twitch.tv\/*", + "https:\/\/clips.twitch.tv\/*", + "http:\/\/www.twitch.tv\/*", + "https:\/\/www.twitch.tv\/*", + "http:\/\/twitch.tv\/*", + "https:\/\/twitch.tv\/*" + ], + "url": "https:\/\/api.twitch.tv\/v4\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Twitter", + "provider_url": "http:\/\/www.twitter.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/twitter.com\/*\/status\/*", + "https:\/\/*.twitter.com\/*\/status\/*" + ], + "url": "https:\/\/publish.twitter.com\/oembed" + } + ] + }, + { + "provider_name": "Ubideo", + "provider_url": "https:\/\/player.ubideo.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/player.ubideo.com\/*" + ], + "url": "https:\/\/player.ubideo.com\/api\/oembed.json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "University of Cambridge Map", + "provider_url": "https:\/\/map.cam.ac.uk", + "endpoints": [ + { + "schemes": [ + "https:\/\/map.cam.ac.uk\/*" + ], + "url": "https:\/\/map.cam.ac.uk\/oembed\/" + } + ] + }, + { + "provider_name": "UOL", + "provider_url": "https:\/\/mais.uol.com.br\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.uol.com.br\/view\/*", + "https:\/\/*.uol.com.br\/video\/*" + ], + "url": "https:\/\/mais.uol.com.br\/apiuol\/v3\/oembed\/view", + "discovery": true + } + ] + }, + { + "provider_name": "Ustream", + "provider_url": "http:\/\/www.ustream.tv", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.ustream.tv\/*", + "http:\/\/*.ustream.com\/*" + ], + "url": "http:\/\/www.ustream.tv\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Utposts", + "provider_url": "https:\/\/www.utposts.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.utposts.com\/products\/*", + "http:\/\/www.utposts.com\/products\/*", + "https:\/\/utposts.com\/products\/*", + "http:\/\/utposts.com\/products\/*" + ], + "url": "https:\/\/www.utposts.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Uttles", + "provider_url": "http:\/\/uttles.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/uttles.com\/uttle\/*" + ], + "url": "http:\/\/uttles.com\/api\/reply\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "VeeR VR", + "provider_url": "http:\/\/veer.tv\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/veer.tv\/videos\/*" + ], + "url": "https:\/\/api.veer.tv\/oembed", + "discovery": true + }, + { + "schemes": [ + "http:\/\/veervr.tv\/videos\/*" + ], + "url": "https:\/\/api.veervr.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Verse", + "provider_url": "http:\/\/verse.com\/", + "endpoints": [ + { + "url": "http:\/\/verse.com\/services\/oembed\/" + } + ] + }, + { + "provider_name": "VEVO", + "provider_url": "http:\/\/www.vevo.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.vevo.com\/*", + "https:\/\/www.vevo.com\/*" + ], + "url": "https:\/\/www.vevo.com\/oembed", + "discovery": false + } + ] + }, + { + "provider_name": "VideoJug", + "provider_url": "http:\/\/www.videojug.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.videojug.com\/film\/*", + "http:\/\/www.videojug.com\/interview\/*" + ], + "url": "http:\/\/www.videojug.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Vidlit", + "provider_url": "https:\/\/vidl.it\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vidl.it\/*" + ], + "url": "https:\/\/api.vidl.it\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vidmizer", + "provider_url": "https:\/\/www.vidmizer.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/players.vidmizer.com\/*" + ], + "url": "https:\/\/app-v2.vidmizer.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vidyard", + "provider_url": "http:\/\/www.vidyard.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/embed.vidyard.com\/*", + "http:\/\/play.vidyard.com\/*", + "http:\/\/share.vidyard.com\/*", + "http:\/\/*.hubs.vidyard.com\/*" + ], + "url": "https:\/\/api.vidyard.com\/dashboard\/v1.1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vimeo", + "provider_url": "https:\/\/vimeo.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vimeo.com\/*", + "https:\/\/vimeo.com\/album\/*\/video\/*", + "https:\/\/vimeo.com\/channels\/*\/*", + "https:\/\/vimeo.com\/groups\/*\/videos\/*", + "https:\/\/vimeo.com\/ondemand\/*\/*", + "https:\/\/player.vimeo.com\/video\/*" + ], + "url": "https:\/\/vimeo.com\/api\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Viziosphere", + "provider_url": "http:\/\/www.viziosphere.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/viziosphere.com\/3dphoto*" + ], + "url": "http:\/\/viziosphere.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Vlipsy", + "provider_url": "https:\/\/vlipsy.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vlipsy.com\/*" + ], + "url": "https:\/\/vlipsy.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "VLIVE", + "provider_url": "https:\/\/www.vlive.tv", + "endpoints": [ + { + "url": "https:\/\/www.vlive.tv\/oembed", + "schemes": [ + "https:\/\/www.vlive.tv\/video\/*" + ], + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Vlurb", + "provider_url": "https:\/\/www.vlurb.co\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/vlurb.co\/video\/*", + "https:\/\/vlurb.co\/video\/*" + ], + "url": "https:\/\/vlurb.co\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "VoxSnap", + "provider_url": "https:\/\/voxsnap.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/article.voxsnap.com\/*\/*" + ], + "url": "https:\/\/data.voxsnap.com\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "wecandeo", + "provider_url": "http:\/\/www.wecandeo.com\/", + "endpoints": [ + { + "url": "http:\/\/play.wecandeo.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Wiredrive", + "provider_url": "https:\/\/www.wiredrive.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.wiredrive.com\/*" + ], + "url": "http:\/\/*.wiredrive.com\/present-oembed\/", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Wistia, Inc.", + "provider_url": "https:\/\/wistia.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/fast.wistia.com\/embed\/iframe\/*", + "https:\/\/fast.wistia.com\/embed\/playlists\/*", + "https:\/\/*.wistia.com\/medias\/*" + ], + "url": "https:\/\/fast.wistia.com\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "wizer.me", + "provider_url": "http:\/\/www.wizer.me\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.wizer.me\/learn\/*", + "https:\/\/*.wizer.me\/learn\/*", + "http:\/\/*.wizer.me\/preview\/*", + "https:\/\/*.wizer.me\/preview\/*" + ], + "url": "http:\/\/app.wizer.me\/api\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Wootled", + "provider_url": "http:\/\/www.wootled.com\/", + "endpoints": [ + { + "url": "http:\/\/www.wootled.com\/oembed" + } + ] + }, + { + "provider_name": "WordPress.com", + "provider_url": "http:\/\/wordpress.com\/", + "endpoints": [ + { + "url": "http:\/\/public-api.wordpress.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Yes, I Know IT!", + "provider_url": "http:\/\/yesik.it", + "endpoints": [ + { + "schemes": [ + "http:\/\/yesik.it\/*", + "http:\/\/www.yesik.it\/*" + ], + "url": "http:\/\/yesik.it\/s\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "YFrog", + "provider_url": "http:\/\/yfrog.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.yfrog.com\/*", + "http:\/\/yfrog.us\/*" + ], + "url": "http:\/\/www.yfrog.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "YouTube", + "provider_url": "https:\/\/www.youtube.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.youtube.com\/watch*", + "https:\/\/*.youtube.com\/v\/*\"", + "https:\/\/youtu.be\/*" + ], + "url": "https:\/\/www.youtube.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ZnipeTV", + "provider_url": "https:\/\/www.znipe.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.znipe.tv\/*" + ], + "url": "https:\/\/api.znipe.tv\/v3\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "ZProvider", + "provider_url": "https:\/\/reports.zoho.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/reports.zoho.com\/ZDBDataSheetView.cc?OBJID=1432535000000003002&STANDALONE=true&INTERVAL=120&DATATYPESYMBOL=false&REMTOOLBAR=false&SEARCHBOX=true&INCLUDETITLE=true&INCLUDEDESC=true&SHOWHIDEOPT=true" + ], + "url": "http:\/\/api.provider.com\/oembed.json", + "discovery": true + } + ] + } +] \ No newline at end of file From 22aed182576a1ee21e046d786d982ea9af2ee2a4 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Thu, 23 May 2019 19:52:58 +0500 Subject: [PATCH 3/7] :construction: Created worked version of the package Need documenting source code, checks by linters, add CI config --- fetch_embed.go | 53 + fetch_embed_test.go | 58 + find_provider.go | 74 ++ find_provider_test.go | 44 + is_valid_url.go | 8 + is_valid_url_test.go | 17 + oembed.go | 24 + oembed_test.go | 46 + sync.go | 49 + types.go | 106 ++ types_ffjson.go | 2497 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 2976 insertions(+) create mode 100644 fetch_embed.go create mode 100644 fetch_embed_test.go create mode 100644 find_provider.go create mode 100644 find_provider_test.go create mode 100644 is_valid_url.go create mode 100644 is_valid_url_test.go create mode 100644 oembed.go create mode 100644 oembed_test.go create mode 100644 sync.go create mode 100644 types.go create mode 100644 types_ffjson.go diff --git a/fetch_embed.go b/fetch_embed.go new file mode 100644 index 0000000..c4a6e88 --- /dev/null +++ b/fetch_embed.go @@ -0,0 +1,53 @@ +package oembed + +import ( + "strconv" + + json "github.com/pquerna/ffjson/ffjson" + http "github.com/valyala/fasthttp" + template "github.com/valyala/fasttemplate" +) + +type Params struct { + MaxWidth int + MaxHeight int +} + +func fetchEmbed(url string, provider providerCandidate, params *Params) (*Response, error) { + resourceUrl := provider.URL + resourceUrl = template.ExecuteString(resourceUrl, "{", "}", map[string]interface{}{"format": "json"}) + + link := http.AcquireURI() + defer http.ReleaseURI(link) + link.Update(resourceUrl) + qa := link.QueryArgs() + qa.Add("format", "json") + qa.Add("url", url) + + if params != nil && params.MaxWidth != 0 { + qa.Add("maxwidth", strconv.Itoa(params.MaxWidth)) + } + if params != nil && params.MaxHeight != 0 { + qa.Add("maxheight", strconv.Itoa(params.MaxHeight)) + } + link.SetQueryStringBytes(qa.QueryString()) + + req := http.AcquireRequest() + defer http.ReleaseRequest(req) + req.SetRequestURIBytes(link.FullURI()) + + resp := http.AcquireResponse() + defer http.ReleaseResponse(resp) + + if err := http.Do(req, resp); err != nil { + return nil, err + } + + var response Response + if err := json.Unmarshal(resp.Body(), &response); err != nil { + return nil, err + } + response.ProviderName = provider.ProviderName + response.ProviderURL = provider.ProviderURL + return &response, nil +} diff --git a/fetch_embed_test.go b/fetch_embed_test.go new file mode 100644 index 0000000..7d51a8a --- /dev/null +++ b/fetch_embed_test.go @@ -0,0 +1,58 @@ +package oembed + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFetchEmbed(t *testing.T) { + assert := assert.New(t) + t.Run("valid", func(t *testing.T) { + resp, err := fetchEmbed( + "https://www.youtube.com/watch?v=8jPQjjsBbIc", + makeCandidate(Provider{ + Name: "YouTube", + URL: "https://www.youtube.com/", + Endpoints: []Endpoint{Endpoint{ + Schemes: []string{ + "https://*.youtube.com/watch*", + "https://*.youtube.com/v/*\"", + "https://youtu.be/*", + }, + URL: "https://www.youtube.com/oembed", + Discovery: true, + }}, + }), + &Params{ + MaxWidth: 250, + MaxHeight: 250, + }, + ) + assert.NoError(err) + assert.NotNil(resp) + }) + t.Run("invalid", func(t *testing.T) { + for _, url := range []string{ + "", + "htt:/abc.com/failed-none-sense", + "https://abc.com/failed-none-sense", + "http://badcom/146753785", + "https://674458092126388225", + "http://www.ted.com/talks/something-does-not-exist", + "https://soundcloud^(*%%$%^$$%$$*&(&)())", + "https://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/bees/23416sa/", + } { + url := url + t.Run(url, func(t *testing.T) { + c := findProvider(url) + if c == nil { + c = new(providerCandidate) + } + + _, err := fetchEmbed(url, *c, nil) + assert.Error(err) + }) + } + }) +} diff --git a/find_provider.go b/find_provider.go new file mode 100644 index 0000000..fdec3c4 --- /dev/null +++ b/find_provider.go @@ -0,0 +1,74 @@ +package oembed + +import ( + "regexp" + "strings" + + http "github.com/valyala/fasthttp" +) + +type providerCandidate struct { + Domain string + ProviderName string + ProviderURL string + Schemes []string + URL string +} + +func getHostname(url string) string { + u := http.AcquireURI() + defer http.ReleaseURI(u) + u.Update(url) + if u.Host() != nil { + return strings.TrimPrefix(string(u.Host()), "www.") + } + return "" +} + +func makeCandidate(p Provider) providerCandidate { + endpoint := p.Endpoints[0] + domain := getHostname(endpoint.URL) + if domain != "" { + domain = strings.TrimPrefix(domain, "www.") + } else { + domain = "" + } + + return providerCandidate{ + ProviderName: p.Name, + ProviderURL: p.URL, + Schemes: endpoint.Schemes, + URL: endpoint.URL, + Domain: domain, + } + +} + +func findProvider(url string) *providerCandidate { + var candidates []providerCandidate + for _, provider := range providersList { + provider := provider + candidate := makeCandidate(provider) + if len(candidate.Schemes) == 0 { + if !strings.Contains(url, candidate.Domain) { + continue + } + candidates = append(candidates, candidate) + continue + } + for _, scheme := range candidate.Schemes { + scheme := scheme + reg := regexp.MustCompile(strings.Replace(scheme, "*", "(.*)", -1)) + if !reg.MatchString(url) { + continue + } + + candidates = append(candidates, candidate) + break + } + } + if len(candidates) == 0 { + return nil + } + return &candidates[0] +} diff --git a/find_provider_test.go b/find_provider_test.go new file mode 100644 index 0000000..691c273 --- /dev/null +++ b/find_provider_test.go @@ -0,0 +1,44 @@ +package oembed + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetHostname(t *testing.T) { + assert := assert.New(t) + for k, v := range map[string]string{ + "https://mais.uol.com.br/": "mais.uol.com.br", + "http://www.wootled.com/": "wootled.com", + "http://yfrog.com": "yfrog.com", + "https://www.youtube.com": "youtube.com", + "https://www.znipe.tv": "znipe.tv", + "http://": "", + "": "", + } { + t.Run(k, func(t *testing.T) { assert.Equal(v, getHostname(k)) }) + } +} + +func TestMakeCandidate(t *testing.T) { + assert.NotNil(t, makeCandidate(Provider{ + Name: "YouTube", + URL: "https://www.youtube.com/", + Endpoints: []Endpoint{ + Endpoint{ + Schemes: []string{ + "https://*.youtube.com/watch*", + "https://*.youtube.com/v/*\"", + "https://youtu.be/*", + }, + URL: "https://www.youtube.com/oembed", + Discovery: true, + }, + }, + })) +} + +func TestFindProvider(t *testing.T) { + assert.NotNil(t, findProvider("https://www.beautiful.ai/")) +} diff --git a/is_valid_url.go b/is_valid_url.go new file mode 100644 index 0000000..902ea47 --- /dev/null +++ b/is_valid_url.go @@ -0,0 +1,8 @@ +package oembed + +import "net/url" + +func isValidURL(src string) bool { + _, err := url.ParseRequestURI(src) + return err == nil +} diff --git a/is_valid_url_test.go b/is_valid_url_test.go new file mode 100644 index 0000000..d6e456a --- /dev/null +++ b/is_valid_url_test.go @@ -0,0 +1,17 @@ +package oembed + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_IsValidURL(t *testing.T) { + assert := assert.New(t) + t.Run("invalid", func(t *testing.T) { + assert.False(isValidURL("str")) + }) + t.Run("valid", func(t *testing.T) { + assert.True(isValidURL("http://www.kickstarter.com")) + }) +} diff --git a/oembed.go b/oembed.go new file mode 100644 index 0000000..f8dd3c5 --- /dev/null +++ b/oembed.go @@ -0,0 +1,24 @@ +package oembed + +import ( + "golang.org/x/xerrors" +) + +var ( + ErrInvalidInputURL = xerrors.New("invalid input url") + ErrNoProviderFound = xerrors.New("no provider found with given url") +) + +func Extract(url string, params *Params) (*Response, error) { + if !isValidURL(url) { + return nil, ErrInvalidInputURL + } + if c := findProvider(url); c != nil { + return fetchEmbed(url, *c, params) + } + return nil, ErrNoProviderFound +} + +func HasProvider(url string) bool { + return findProvider(url) != nil +} diff --git a/oembed_test.go b/oembed_test.go new file mode 100644 index 0000000..6172d2d --- /dev/null +++ b/oembed_test.go @@ -0,0 +1,46 @@ +package oembed + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtract(t *testing.T) { + assert := assert.New(t) + t.Run("valid", func(t *testing.T) { + resp, err := Extract("https://www.youtube.com/watch?v=8jPQjjsBbIc", &Params{ + MaxWidth: 250, + MaxHeight: 250, + }) + assert.NoError(err) + assert.NotNil(resp) + }) + t.Run("invalid", func(t *testing.T) { + for _, url := range []string{ + "", + "htt:/abc.com/failed-none-sense", + "https://abc.com/failed-none-sense", + "http://badcom/146753785", + "https://674458092126388225", + "http://www.ted.com/talks/something-does-not-exist", + "https://soundcloud^(*%%$%^$$%$$*&(&)())", + "https://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/bees/23416sa/", + } { + url := url + t.Run(url, func(t *testing.T) { + _, err := Extract(url, nil) + assert.Error(err) + }) + } + }) +} + +func TestHasProvider(t *testing.T) { + t.Run("true", func(t *testing.T) { + assert.True(t, HasProvider("https://www.youtube.com/watch?v=8jPQjjsBbIc")) + }) + t.Run("false", func(t *testing.T) { + assert.False(t, HasProvider("https://blog.toby3d.me/")) + }) +} diff --git a/sync.go b/sync.go new file mode 100644 index 0000000..7d0ba2d --- /dev/null +++ b/sync.go @@ -0,0 +1,49 @@ +package oembed + +import ( + "io/ioutil" + "log" + "os" + "path/filepath" + + json "github.com/pquerna/ffjson/ffjson" + http "github.com/valyala/fasthttp" +) + +const source string = "https://oembed.com/providers.json" + +var ( + providersList []Provider + + target = filepath.Join( + os.Getenv("GOPATH"), "src", "gitlab.com", "toby3d", "oembed", "assets", "providers.json", + ) +) + +func init() { + if err := fetch(source, target); err != nil { + panic(err) + } +} + +func fetch(url, target string) error { + status, src, err := http.Get(nil, url) + if err != nil || status != http.StatusOK { + if src, err = ioutil.ReadFile(target); err != nil { + return err + } + } + + if err := json.Unmarshal(src, &providersList); err != nil { + return err + } + + if status == http.StatusOK { + if err = ioutil.WriteFile(target, src, os.ModePerm); err != nil { + return err + } + } + + log.Println("providers.json has been updated") + return nil +} diff --git a/types.go b/types.go new file mode 100644 index 0000000..0c7841d --- /dev/null +++ b/types.go @@ -0,0 +1,106 @@ +//go:generate ffjson $GOFILE +package oembed + +type ( + Provider struct { + Name string `json:"provider_name"` + URL string `json:"provider_url"` + Endpoints []Endpoint `json:"endpoints"` + } + + Endpoint struct { + Schemes []string `json:"schemes,omitempty"` + URL string `json:"url"` + Discovery bool `json:"discovery,omitempty"` + Formats []string `json:"formats,omitempty"` + } + + // Response can specify a resource type, such as photo or video. + // Each type has specific parameters associated with it. + Response struct { + // The resource type. + Type string `json:"type"` // required + + // The oEmbed version number. + Version string `json:"version"` // required + + // A text title, describing the resource. + Title string `json:"title,omitempty"` + + // The name of the author/owner of the resource. + AuthorName string `json:"author_name,omitempty"` + + // A URL for the author/owner of the resource. + AuthorURL string `json:"author_url,omitempty"` + + // The name of the resource provider. + ProviderName string `json:"provider_name,omitempty"` + + // The url of the resource provider. + ProviderURL string `json:"provider_url,omitempty"` + + // The suggested cache lifetime for this resource, in seconds. + // Consumers may choose to use this value or not. + CacheAge int `json:"cache_age,omitempty"` + + // A URL to a thumbnail image representing the resource. + // The thumbnail must respect any maxwidth and maxheight parameters. + // If this parameter is present, thumbnail_width and thumbnail_height must also be present. + ThumbnailURL string `json:"thumbnail_url,omitempty"` + + // The width of the optional thumbnail. + // If this parameter is present, thumbnail_url and thumbnail_height must also be present. + ThumbnailWidth int `json:"thumbnail_width,omitempty"` + + // The height of the optional thumbnail. + // If this parameter is present, thumbnail_url and thumbnail_width must also be present. + ThumbnailHeight int `json:"thumbnail_height,omitempty"` + + URL string `json:"url,omitempty"` + } + + // Photo is used for representing static photos. + Photo struct { + // The source URL of the image. Consumers should be able to insert this URL into an element. + // Only HTTP and HTTPS URLs are valid. + URL string `json:"url"` // required + + // The width in pixels of the image specified in the url parameter. + Width int `json:"width"` // required + + // The height in pixels of the image specified in the url parameter. + Height int `json:"height"` // required + } + + // Video is used for representing playable videos. + Video struct { + // The HTML required to embed a video player. The HTML should have no padding or margins. + // Consumers may wish to load the HTML in an off-domain iframe to avoid XSS vulnerabilities. + HTML string `json:"html"` // required + + // The width in pixels required to display the HTML. + Width int `json:"width"` // required + + // The height in pixels required to display the HTML. + Height int `json:"height"` // required + } + + // Link type allow a provider to return any generic embed data (such as title and author_name), without + // providing either the url or html parameters. The consumer may then link to the resource, using the URL + // specified in the original request. + Link string + + // Rich is used for rich HTML content that does not fall under one of the other categories. + Rich struct { + // The HTML required to display the resource. The HTML should have no padding or margins. + // Consumers may wish to load the HTML in an off-domain iframe to avoid XSS vulnerabilities. + // The markup should be valid XHTML 1.0 Basic. + HTML string `json:"html"` // required + + // The width in pixels required to display the HTML. + Width int `json:"width"` // required + + // The height in pixels required to display the HTML. + Height int `json:"height"` // required + } +) diff --git a/types_ffjson.go b/types_ffjson.go new file mode 100644 index 0000000..d24413d --- /dev/null +++ b/types_ffjson.go @@ -0,0 +1,2497 @@ +// Code generated by ffjson . DO NOT EDIT. +// source: types.go + +package oembed + +import ( + "bytes" + "errors" + "fmt" + fflib "github.com/pquerna/ffjson/fflib/v1" +) + +// MarshalJSON marshal bytes to json - template +func (j *Endpoint) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Endpoint) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(j.Schemes) != 0 { + buf.WriteString(`"schemes":`) + if j.Schemes != nil { + buf.WriteString(`[`) + for i, v := range j.Schemes { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.WriteString(`"url":`) + fflib.WriteJsonString(buf, string(j.URL)) + buf.WriteByte(',') + if j.Discovery != false { + if j.Discovery { + buf.WriteString(`"discovery":true`) + } else { + buf.WriteString(`"discovery":false`) + } + buf.WriteByte(',') + } + if len(j.Formats) != 0 { + buf.WriteString(`"formats":`) + if j.Formats != nil { + buf.WriteString(`[`) + for i, v := range j.Formats { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffjtEndpointbase = iota + ffjtEndpointnosuchkey + + ffjtEndpointSchemes + + ffjtEndpointURL + + ffjtEndpointDiscovery + + ffjtEndpointFormats +) + +var ffjKeyEndpointSchemes = []byte("schemes") + +var ffjKeyEndpointURL = []byte("url") + +var ffjKeyEndpointDiscovery = []byte("discovery") + +var ffjKeyEndpointFormats = []byte("formats") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Endpoint) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Endpoint) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtEndpointbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtEndpointnosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffjKeyEndpointDiscovery, kn) { + currentKey = ffjtEndpointDiscovery + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffjKeyEndpointFormats, kn) { + currentKey = ffjtEndpointFormats + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffjKeyEndpointSchemes, kn) { + currentKey = ffjtEndpointSchemes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffjKeyEndpointURL, kn) { + currentKey = ffjtEndpointURL + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffjKeyEndpointFormats, kn) { + currentKey = ffjtEndpointFormats + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffjKeyEndpointDiscovery, kn) { + currentKey = ffjtEndpointDiscovery + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyEndpointURL, kn) { + currentKey = ffjtEndpointURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffjKeyEndpointSchemes, kn) { + currentKey = ffjtEndpointSchemes + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtEndpointnosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtEndpointSchemes: + goto handle_Schemes + + case ffjtEndpointURL: + goto handle_URL + + case ffjtEndpointDiscovery: + goto handle_Discovery + + case ffjtEndpointFormats: + goto handle_Formats + + case ffjtEndpointnosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Schemes: + + /* handler: j.Schemes type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + j.Schemes = nil + } else { + + j.Schemes = []string{} + + wantVal := true + + for { + + var tmpJSchemes string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmpJSchemes type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmpJSchemes = string(string(outBuf)) + + } + } + + j.Schemes = append(j.Schemes, tmpJSchemes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: j.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Discovery: + + /* handler: j.Discovery type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + j.Discovery = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + j.Discovery = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Formats: + + /* handler: j.Formats type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + j.Formats = nil + } else { + + j.Formats = []string{} + + wantVal := true + + for { + + var tmpJFormats string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmpJFormats type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmpJFormats = string(string(outBuf)) + + } + } + + j.Formats = append(j.Formats, tmpJFormats) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +// MarshalJSON marshal bytes to json - template +func (j *Photo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Photo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"url":`) + fflib.WriteJsonString(buf, string(j.URL)) + buf.WriteString(`,"width":`) + fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0) + buf.WriteString(`,"height":`) + fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffjtPhotobase = iota + ffjtPhotonosuchkey + + ffjtPhotoURL + + ffjtPhotoWidth + + ffjtPhotoHeight +) + +var ffjKeyPhotoURL = []byte("url") + +var ffjKeyPhotoWidth = []byte("width") + +var ffjKeyPhotoHeight = []byte("height") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Photo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Photo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtPhotobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtPhotonosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffjKeyPhotoHeight, kn) { + currentKey = ffjtPhotoHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffjKeyPhotoURL, kn) { + currentKey = ffjtPhotoURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffjKeyPhotoWidth, kn) { + currentKey = ffjtPhotoWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffjKeyPhotoHeight, kn) { + currentKey = ffjtPhotoHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyPhotoWidth, kn) { + currentKey = ffjtPhotoWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyPhotoURL, kn) { + currentKey = ffjtPhotoURL + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtPhotonosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtPhotoURL: + goto handle_URL + + case ffjtPhotoWidth: + goto handle_Width + + case ffjtPhotoHeight: + goto handle_Height + + case ffjtPhotonosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_URL: + + /* handler: j.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Width: + + /* handler: j.Width type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Width = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Height: + + /* handler: j.Height type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Height = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +// MarshalJSON marshal bytes to json - template +func (j *Provider) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Provider) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"provider_name":`) + fflib.WriteJsonString(buf, string(j.Name)) + buf.WriteString(`,"provider_url":`) + fflib.WriteJsonString(buf, string(j.URL)) + buf.WriteString(`,"endpoints":`) + if j.Endpoints != nil { + buf.WriteString(`[`) + for i, v := range j.Endpoints { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffjtProviderbase = iota + ffjtProvidernosuchkey + + ffjtProviderName + + ffjtProviderURL + + ffjtProviderEndpoints +) + +var ffjKeyProviderName = []byte("provider_name") + +var ffjKeyProviderURL = []byte("provider_url") + +var ffjKeyProviderEndpoints = []byte("endpoints") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Provider) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Provider) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtProviderbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtProvidernosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffjKeyProviderEndpoints, kn) { + currentKey = ffjtProviderEndpoints + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffjKeyProviderName, kn) { + currentKey = ffjtProviderName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyProviderURL, kn) { + currentKey = ffjtProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffjKeyProviderEndpoints, kn) { + currentKey = ffjtProviderEndpoints + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyProviderURL, kn) { + currentKey = ffjtProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyProviderName, kn) { + currentKey = ffjtProviderName + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtProvidernosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtProviderName: + goto handle_Name + + case ffjtProviderURL: + goto handle_URL + + case ffjtProviderEndpoints: + goto handle_Endpoints + + case ffjtProvidernosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: j.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: j.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Endpoints: + + /* handler: j.Endpoints type=[]oembed.Endpoint kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + j.Endpoints = nil + } else { + + j.Endpoints = []Endpoint{} + + wantVal := true + + for { + + var tmpJEndpoints Endpoint + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmpJEndpoints type=oembed.Endpoint kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + } else { + + err = tmpJEndpoints.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + } + state = fflib.FFParse_after_value + } + + j.Endpoints = append(j.Endpoints, tmpJEndpoints) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +// MarshalJSON marshal bytes to json - template +func (j *Response) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Response) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + fflib.WriteJsonString(buf, string(j.Type)) + buf.WriteString(`,"version":`) + fflib.WriteJsonString(buf, string(j.Version)) + buf.WriteByte(',') + if len(j.Title) != 0 { + buf.WriteString(`"title":`) + fflib.WriteJsonString(buf, string(j.Title)) + buf.WriteByte(',') + } + if len(j.AuthorName) != 0 { + buf.WriteString(`"author_name":`) + fflib.WriteJsonString(buf, string(j.AuthorName)) + buf.WriteByte(',') + } + if len(j.AuthorURL) != 0 { + buf.WriteString(`"author_url":`) + fflib.WriteJsonString(buf, string(j.AuthorURL)) + buf.WriteByte(',') + } + if len(j.ProviderName) != 0 { + buf.WriteString(`"provider_name":`) + fflib.WriteJsonString(buf, string(j.ProviderName)) + buf.WriteByte(',') + } + if len(j.ProviderURL) != 0 { + buf.WriteString(`"provider_url":`) + fflib.WriteJsonString(buf, string(j.ProviderURL)) + buf.WriteByte(',') + } + if j.CacheAge != 0 { + buf.WriteString(`"cache_age":`) + fflib.FormatBits2(buf, uint64(j.CacheAge), 10, j.CacheAge < 0) + buf.WriteByte(',') + } + if len(j.ThumbnailURL) != 0 { + buf.WriteString(`"thumbnail_url":`) + fflib.WriteJsonString(buf, string(j.ThumbnailURL)) + buf.WriteByte(',') + } + if j.ThumbnailWidth != 0 { + buf.WriteString(`"thumbnail_width":`) + fflib.FormatBits2(buf, uint64(j.ThumbnailWidth), 10, j.ThumbnailWidth < 0) + buf.WriteByte(',') + } + if j.ThumbnailHeight != 0 { + buf.WriteString(`"thumbnail_height":`) + fflib.FormatBits2(buf, uint64(j.ThumbnailHeight), 10, j.ThumbnailHeight < 0) + buf.WriteByte(',') + } + if len(j.URL) != 0 { + buf.WriteString(`"url":`) + fflib.WriteJsonString(buf, string(j.URL)) + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffjtResponsebase = iota + ffjtResponsenosuchkey + + ffjtResponseType + + ffjtResponseVersion + + ffjtResponseTitle + + ffjtResponseAuthorName + + ffjtResponseAuthorURL + + ffjtResponseProviderName + + ffjtResponseProviderURL + + ffjtResponseCacheAge + + ffjtResponseThumbnailURL + + ffjtResponseThumbnailWidth + + ffjtResponseThumbnailHeight + + ffjtResponseURL +) + +var ffjKeyResponseType = []byte("type") + +var ffjKeyResponseVersion = []byte("version") + +var ffjKeyResponseTitle = []byte("title") + +var ffjKeyResponseAuthorName = []byte("author_name") + +var ffjKeyResponseAuthorURL = []byte("author_url") + +var ffjKeyResponseProviderName = []byte("provider_name") + +var ffjKeyResponseProviderURL = []byte("provider_url") + +var ffjKeyResponseCacheAge = []byte("cache_age") + +var ffjKeyResponseThumbnailURL = []byte("thumbnail_url") + +var ffjKeyResponseThumbnailWidth = []byte("thumbnail_width") + +var ffjKeyResponseThumbnailHeight = []byte("thumbnail_height") + +var ffjKeyResponseURL = []byte("url") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Response) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Response) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtResponsebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtResponsenosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffjKeyResponseAuthorName, kn) { + currentKey = ffjtResponseAuthorName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseAuthorURL, kn) { + currentKey = ffjtResponseAuthorURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffjKeyResponseCacheAge, kn) { + currentKey = ffjtResponseCacheAge + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffjKeyResponseProviderName, kn) { + currentKey = ffjtResponseProviderName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseProviderURL, kn) { + currentKey = ffjtResponseProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffjKeyResponseType, kn) { + currentKey = ffjtResponseType + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseTitle, kn) { + currentKey = ffjtResponseTitle + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseThumbnailURL, kn) { + currentKey = ffjtResponseThumbnailURL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseThumbnailWidth, kn) { + currentKey = ffjtResponseThumbnailWidth + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyResponseThumbnailHeight, kn) { + currentKey = ffjtResponseThumbnailHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffjKeyResponseURL, kn) { + currentKey = ffjtResponseURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffjKeyResponseVersion, kn) { + currentKey = ffjtResponseVersion + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffjKeyResponseURL, kn) { + currentKey = ffjtResponseURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseThumbnailHeight, kn) { + currentKey = ffjtResponseThumbnailHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseThumbnailWidth, kn) { + currentKey = ffjtResponseThumbnailWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseThumbnailURL, kn) { + currentKey = ffjtResponseThumbnailURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseCacheAge, kn) { + currentKey = ffjtResponseCacheAge + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseProviderURL, kn) { + currentKey = ffjtResponseProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseProviderName, kn) { + currentKey = ffjtResponseProviderName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseAuthorURL, kn) { + currentKey = ffjtResponseAuthorURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyResponseAuthorName, kn) { + currentKey = ffjtResponseAuthorName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyResponseTitle, kn) { + currentKey = ffjtResponseTitle + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffjKeyResponseVersion, kn) { + currentKey = ffjtResponseVersion + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyResponseType, kn) { + currentKey = ffjtResponseType + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtResponsenosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtResponseType: + goto handle_Type + + case ffjtResponseVersion: + goto handle_Version + + case ffjtResponseTitle: + goto handle_Title + + case ffjtResponseAuthorName: + goto handle_AuthorName + + case ffjtResponseAuthorURL: + goto handle_AuthorURL + + case ffjtResponseProviderName: + goto handle_ProviderName + + case ffjtResponseProviderURL: + goto handle_ProviderURL + + case ffjtResponseCacheAge: + goto handle_CacheAge + + case ffjtResponseThumbnailURL: + goto handle_ThumbnailURL + + case ffjtResponseThumbnailWidth: + goto handle_ThumbnailWidth + + case ffjtResponseThumbnailHeight: + goto handle_ThumbnailHeight + + case ffjtResponseURL: + goto handle_URL + + case ffjtResponsenosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: j.Type type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Type = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Version: + + /* handler: j.Version type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Version = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Title: + + /* handler: j.Title type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Title = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AuthorName: + + /* handler: j.AuthorName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.AuthorName = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AuthorURL: + + /* handler: j.AuthorURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.AuthorURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProviderName: + + /* handler: j.ProviderName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ProviderName = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProviderURL: + + /* handler: j.ProviderURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ProviderURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CacheAge: + + /* handler: j.CacheAge type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.CacheAge = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailURL: + + /* handler: j.ThumbnailURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ThumbnailURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailWidth: + + /* handler: j.ThumbnailWidth type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.ThumbnailWidth = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailHeight: + + /* handler: j.ThumbnailHeight type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.ThumbnailHeight = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: j.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +// MarshalJSON marshal bytes to json - template +func (j *Rich) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Rich) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"html":`) + fflib.WriteJsonString(buf, string(j.HTML)) + buf.WriteString(`,"width":`) + fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0) + buf.WriteString(`,"height":`) + fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffjtRichbase = iota + ffjtRichnosuchkey + + ffjtRichHTML + + ffjtRichWidth + + ffjtRichHeight +) + +var ffjKeyRichHTML = []byte("html") + +var ffjKeyRichWidth = []byte("width") + +var ffjKeyRichHeight = []byte("height") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Rich) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Rich) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtRichbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtRichnosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffjKeyRichHTML, kn) { + currentKey = ffjtRichHTML + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyRichHeight, kn) { + currentKey = ffjtRichHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffjKeyRichWidth, kn) { + currentKey = ffjtRichWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffjKeyRichHeight, kn) { + currentKey = ffjtRichHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyRichWidth, kn) { + currentKey = ffjtRichWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyRichHTML, kn) { + currentKey = ffjtRichHTML + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtRichnosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtRichHTML: + goto handle_HTML + + case ffjtRichWidth: + goto handle_Width + + case ffjtRichHeight: + goto handle_Height + + case ffjtRichnosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_HTML: + + /* handler: j.HTML type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.HTML = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Width: + + /* handler: j.Width type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Width = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Height: + + /* handler: j.Height type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Height = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +// MarshalJSON marshal bytes to json - template +func (j *Video) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *Video) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"html":`) + fflib.WriteJsonString(buf, string(j.HTML)) + buf.WriteString(`,"width":`) + fflib.FormatBits2(buf, uint64(j.Width), 10, j.Width < 0) + buf.WriteString(`,"height":`) + fflib.FormatBits2(buf, uint64(j.Height), 10, j.Height < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffjtVideobase = iota + ffjtVideonosuchkey + + ffjtVideoHTML + + ffjtVideoWidth + + ffjtVideoHeight +) + +var ffjKeyVideoHTML = []byte("html") + +var ffjKeyVideoWidth = []byte("width") + +var ffjKeyVideoHeight = []byte("height") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *Video) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *Video) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtVideobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtVideonosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffjKeyVideoHTML, kn) { + currentKey = ffjtVideoHTML + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyVideoHeight, kn) { + currentKey = ffjtVideoHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffjKeyVideoWidth, kn) { + currentKey = ffjtVideoWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffjKeyVideoHeight, kn) { + currentKey = ffjtVideoHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyVideoWidth, kn) { + currentKey = ffjtVideoWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyVideoHTML, kn) { + currentKey = ffjtVideoHTML + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtVideonosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtVideoHTML: + goto handle_HTML + + case ffjtVideoWidth: + goto handle_Width + + case ffjtVideoHeight: + goto handle_Height + + case ffjtVideonosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_HTML: + + /* handler: j.HTML type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.HTML = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Width: + + /* handler: j.Width type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Width = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Height: + + /* handler: j.Height type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.Height = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} From 6b9a7b7bf50b844dd29edb0b856bb13a8028d4e5 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Fri, 24 May 2019 14:29:36 +0500 Subject: [PATCH 4/7] :recycle: Refactored source code, packed providers.json --- a_oembed-packr.go | 11 + errors.go | 33 + fetch_embed.go | 29 +- fetch_embed_test.go | 15 +- find_provider.go | 26 +- find_provider_test.go | 3 +- oembed.go | 37 +- sync.go | 44 +- sync_test.go | 24 + types.go | 6 +- types_ffjson.go | 1518 ++++++++++++++++++++--------------------- 11 files changed, 919 insertions(+), 827 deletions(-) create mode 100644 a_oembed-packr.go create mode 100644 errors.go create mode 100644 sync_test.go diff --git a/a_oembed-packr.go b/a_oembed-packr.go new file mode 100644 index 0000000..7b70ad6 --- /dev/null +++ b/a_oembed-packr.go @@ -0,0 +1,11 @@ +// Code generated by github.com/gobuffalo/packr. DO NOT EDIT. + +package oembed + +import "github.com/gobuffalo/packr" + +// You can use the "packr clean" command to clean up this, +// and any other packr generated files. +func init() { + packr.PackJSONBytes("./assets", "providers.json", "\"WwogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIjIzSFEiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LjIzaHEuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LjIzaHEuY29tXC8qXC9waG90b1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy4yM2hxLmNvbVwvMjNcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWR3YXlzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5hZHdheXMuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS5hZHBhdGhzLmNvbVwvZXhwZXJpZW5jZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3BsYXkuYWRwYXRocy5jb21cL29lbWJlZFwvKiIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWxwaGEgQXBwIE5ldCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYWxwaGEuYXBwLm5ldFwvYnJvd3NlXC9wb3N0c1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FscGhhLmFwcC5uZXRcLypcL3Bvc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcGhvdG9zLmFwcC5uZXRcLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYWxwaGEtYXBpLmFwcC5uZXRcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQWx0cnUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5hbHRydWxhYnMuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FwcC5hbHRydWxhYnMuY29tXC8qXC8qP2Fuc3dlcl9pZD0qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5hbHRydWxhYnMuY29tXC9zb2NpYWxcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiYW1DaGFydHMgTGl2ZSBFZGl0b3IiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2xpdmUuYW1jaGFydHMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9saXZlLmFtY2hhcnRzLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBbmltYXRyb24iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5hbmltYXRyb24uY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmFuaW1hdHJvbi5jb21cL3Byb2plY3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYW5pbWF0cm9uLmNvbVwvcHJvamVjdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hbmltYXRyb24uY29tXC9vZW1iZWRcL2pzb24iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQW5pbW90byIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hbmltb3RvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvYW5pbW90by5jb21cL3BsYXlcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hbmltb3RvLmNvbVwvb2VtYmVkc1wvY3JlYXRlIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBcGVzdGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuYXBlc3Rlci5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcmVuZGVyZXIuYXBlc3Rlci5jb21cL3YyXC8qP3ByZXZpZXc9dHJ1ZSZpZnJhbWVfcHJldmlldz10cnVlIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2Rpc3BsYXkuYXBlc3Rlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJBcmNoaXZvcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXBwLmFyY2hpdm9zLmRpZ2l0YWwiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXBwLmFyY2hpdm9zLmRpZ2l0YWxcL2FwcFwvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuYXJjaGl2b3MuZGlnaXRhbFwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkF1ZGlvQ2xpcCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXVkaW9jbGlwLm5hdmVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hdWRpb2NsaXAubmF2ZXIuY29tXC9jaGFubmVsc1wvKlwvY2xpcHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXVkaW9jbGlwLm5hdmVyLmNvbVwvYXVkaW9ib29rc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hdWRpb2NsaXAubmF2ZXIuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQXVkaW9tYWNrIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbVwvc29uZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuYXVkaW9tYWNrLmNvbVwvYWxidW1cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmF1ZGlvbWFjay5jb21cL3BsYXlsaXN0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5hdWRpb21hY2suY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQXVkaW9TbmFwcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hdWRpb3NuYXBzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2F1ZGlvc25hcHMuY29tXC9rXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXVkaW9zbmFwcy5jb21cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCYWNrdHJhY2tzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9iYWNrdHJhY2tzLmZtIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2JhY2t0cmFja3MuZm1cLypcLypcL2VcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYmFja3RyYWNrcy5mbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2JhY2t0cmFja3MuZm1cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYmFja3RyYWNrcy5mbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkJlYXV0aWZ1bC5BSSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmJlYXV0aWZ1bC5haVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuYmVhdXRpZnVsLmFpXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCbGFja2ZpcmUuaW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2JsYWNrZmlyZS5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL3Byb2ZpbGVzXC8qXC9ncmFwaCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL3Byb2ZpbGVzXC9jb21wYXJlXC8qXC9ncmFwaCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9ibGFja2ZpcmUuaW9cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCb3ggT2ZmaWNlIEJ1eiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9ib3hvZmZpY2VidXouY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2JveG9mZmljZWJ1ei5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCcmlvVlIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpZXcuYnJpb3ZyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpZXcuYnJpb3ZyLmNvbVwvYXBpXC92MVwvd29ybGRzXC9vZW1iZWRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvdmlldy5icmlvdnIuY29tXC9hcGlcL3YxXC93b3JsZHNcL29lbWJlZFwvIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCdXR0b25kb3duIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9idXR0b25kb3duLmVtYWlsXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYnV0dG9uZG93bi5lbWFpbFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9idXR0b25kb3duLmVtYWlsXC9lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJCeXphcnQgUHJvamVjdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY21jLmJ5emFydC5ldSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jbWMuYnl6YXJ0LmV1XC9maWxlc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jbWMuYnl6YXJ0LmV1XC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2Fjb28iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NhY29vLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jYWNvby5jb21cL2RpYWdyYW1zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY2Fjb28uY29tXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNhcmJvbiBIZWFsdGgiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NhcmJvbmhlYWx0aC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2FyYm9uaGVhbHRoLmNvbVwvcHJhY3RpY2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9jYXJib25oZWFsdGguY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2F0Qm9hdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9pbWcuY2F0Ym8uYXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2ltZy5jYXRiby5hdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2ltZy5jYXRiby5hdFwvb2VtYmVkLmpzb24iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNlcm9zIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5jZXJvcy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZpZXcuY2Vyb3MuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdmlldy5jZXJvcy5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDaGFydEJsb2NrcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY2hhcnRibG9ja3MuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9wdWJsaWMuY2hhcnRibG9ja3MuY29tXC9jXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZW1iZWQuY2hhcnRibG9ja3MuY29tXC8xLjBcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiY2hpcmJpdC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmNoaXJiaXQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jaGlyYi5pdFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2NoaXJiLml0XC9vZW1iZWQue2Zvcm1hdH0iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2lyY3VpdExhYiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmNpcmN1aXRsYWIuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmNpcmN1aXRsYWIuY29tXC9jaXJjdWl0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5jaXJjdWl0bGFiLmNvbVwvY2lyY3VpdFwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ2xpcGxhbmQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmNsaXBsYW5kLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmNsaXBsYW5kLmNvbVwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuY2xpcGxhbmQuY29tXC92XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5jbGlwbGFuZC5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNseXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvY2x5cC5pdFwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY2x5cC5pdFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NseXAuaXRcL3BsYXlsaXN0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLmNseXAuaXRcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvZGVIUyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY29kZWhzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb2RlaHMuY29tXC9lZGl0b3JcL3NoYXJlX2FiYWN1c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb2RlaHMuY29tXC9hcGlcL3NoYXJlZHByb2dyYW1cLypcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvZGVwZW4iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2NvZGVwZW4uaW8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jb2RlcGVuLmlvXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvZGVwZW4uaW9cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9jb2RlcGVuLmlvXC9hcGlcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiQ29kZXBvaW50cyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29kZXBvaW50cy5uZXQiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5jb2RlcG9pbnRzLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuY29kZXBvaW50cy5uZXRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvY29kZXBvaW50cy5uZXRcL2FwaVwvdjFcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDb2RlU2FuZGJveCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29kZXNhbmRib3guaW8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY29kZXNhbmRib3guaW9cL3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY29kZXNhbmRib3guaW9cL2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2NvZGVzYW5kYm94LmlvXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvbGxlZ2VIdW1vciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuY29sbGVnZWh1bW9yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmNvbGxlZ2VodW1vci5jb21cL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmNvbGxlZ2VodW1vci5jb21cL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDb21tYWZ1bCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvY29tbWFmdWwuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvbW1hZnVsLmNvbVwvcGxheVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb21tYWZ1bC5jb21cL2FwaVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkNvdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvY291Yi5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NvdWIuY29tXC92aWV3XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY291Yi5jb21cL2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY291Yi5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJDcm93ZCBSYW5raW5nIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2Nyb3dkcmFua2luZy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jcm93ZHJhbmtpbmcuY29tXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvY3Jvd2RyYW5raW5nLmNvbVwvYXBpXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkN5cmFubyBTeXN0ZW1zIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5jeXJhbm9zeXN0ZW1zLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3N0YWdpbmcuY3lyYW5vc3lzdGVtcy5jb21cL21zZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuY3lyYW5vc3lzdGVtcy5jb21cL21zZ1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zdGFnaW5nLmN5cmFub3N5c3RlbXMuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGFpbHkgTWlsZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuZGFpbHltaWxlLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5kYWlseW1pbGUuY29tXC9wZW9wbGVcLypcL2VudHJpZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuZGFpbHltaWxlLmNvbVwvb2VtYmVkP2Zvcm1hdD1qc29uIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEYWlseW1vdGlvbiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmRhaWx5bW90aW9uLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZGFpbHltb3Rpb24uY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZGFpbHltb3Rpb24uY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkRlc2VyZXRuZXdzLmNvbSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmRlc2VyZXRuZXdzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRlc2VyZXRuZXdzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9lbWJlZC5kZXNlcmV0bmV3cy5jb21cLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGV2aWFudGFydC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmRldmlhbnRhcnQuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5kZXZpYW50YXJ0LmNvbVwvYXJ0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5kZXZpYW50YXJ0LmNvbVwvKiNcL2QqIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZmF2Lm1lXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvc3RhLnNoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYmFja2VuZC5kZXZpYW50YXJ0LmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEaWRhY3RlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZGlkYWN0ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRpZGFjdGUuY29tXC9hXC9jb3Vyc2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvKi5kaWRhY3RlLmNvbVwvY2FyZHNcL29lbWJlZCciLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRGlnaXRla2EiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy51bHRpbWVkaWEuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnVsdGltZWRpYS5jb21cL2NlbnRyYWxcL3ZpZGVvXC9lZGl0XC9pZFwvKlwvdG9waWNfaWRcLypcLyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudWx0aW1lZGlhLmNvbVwvZGVmYXVsdFwvaW5kZXhcL3ZpZGVvZ2VuZXJpY1wvaWRcLypcL3Nob3d0aXRsZVwvMVwvdmlld25jXC8xIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy51bHRpbWVkaWEuY29tXC9kZWZhdWx0XC9pbmRleFwvdmlkZW9nZW5lcmljXC9pZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudWx0aW1lZGlhLmNvbVwvYXBpXC9zZWFyY2hcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEaXBpdHkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmRpcGl0eS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuZGlwaXR5LmNvbVwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmRpcGl0eS5jb21cL29lbWJlZFwvdGltZWxpbmVcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRG9jRHJvaWQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5kb2Nkcm9pZC5uZXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmRvY2Ryb2lkLm5ldFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZG9jZHJvaWQubmV0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2RvY2Ryby5pZFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2RvY2Ryby5pZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZG9jZHJvaWQubmV0XC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJEb3RzdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvZG90c3ViLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZG90c3ViLmNvbVwvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2RvdHN1Yi5jb21cL3NlcnZpY2VzXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkRUdWJlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9kLnR1YmVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9kLnR1YmVcL3ZcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLmQudHViZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImVkb2NyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5lZG9jci5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lZG9jci5jb21cL2RvY3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lZG9jci5jb21cL2FwaVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJlZHVNZWRpYSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmVkdW1lZGlhLXNjaWVuY2VzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZWR1bWVkaWEtc2NpZW5jZXMuY29tXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuZWR1bWVkaWEtc2NpZW5jZXMuY29tXC9vZW1iZWQueG1sIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkVnbGlzZUluZm8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvZWdsaXNlaW5mby5jYXRob2xpcXVlLmZyXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lZ2xpc2VpbmZvLmNhdGhvbGlxdWUuZnJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lZ2xpc2VpbmZvLmNhdGhvbGlxdWUuZnJcL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkVtYmVkIEFydGljbGVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2VtYmVkYXJ0aWNsZXMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9lbWJlZGFydGljbGVzLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2VtYmVkYXJ0aWNsZXMuY29tXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRW1iZWRseSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9hcGkuZW1iZWQubHlcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuZW1iZWQubHlcLzFcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRXRoZmlkZGxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZXRoZmlkZGxlLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2V0aGZpZGRsZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZXRoZmlkZGxlLmNvbVwvc2VydmljZXNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkV5cmllIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9leXJpZS5pb1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2V5cmllLmlvXC9ib2FyZFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9leXJpZS5pb1wvc3BhcmtmdW5cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZXlyaWUuaW9cL3YxXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmFjZWJvb2sgKFBvc3QpIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvKlwvcG9zdHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvcGhvdG9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3Bob3RvLnBocCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8qXC9hY3Rpdml0eVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC9wZXJtYWxpbmsucGhwIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL21lZGlhXC9zZXQ/c2V0PSoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvcXVlc3Rpb25zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL25vdGVzXC8qXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3BsdWdpbnNcL3Bvc3RcL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZhY2Vib29rIChWaWRlbykiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvdmlkZW8ucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3BsdWdpbnNcL3ZpZGVvXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJGYWRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvYXBwLmdldGZhZGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuZ2V0ZmFkZXIuY29tXC9wcm9qZWN0c1wvKlwvcHVibGlzaCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuZ2V0ZmFkZXIuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmFpdGhsaWZlIFRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZmFpdGhsaWZldHYuY29tXC9pdGVtc1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL2l0ZW1zXC9yZXNvdXJjZVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL21lZGlhXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2ZhaXRobGlmZXR2LmNvbVwvbWVkaWFcL2Fzc2V0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL21lZGlhXC9yZXNvdXJjZVwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9mYWl0aGxpZmV0di5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZJVEUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5maXRlLnR2XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmZpdGUudHZcL3dhdGNoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5maXRlLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmxhdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZmxhdC5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mbGF0LmlvXC9zY29yZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLmZsYXQuaW9cL3Njb3JlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2ZsYXQuaW9cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRmxpY2tyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZmxpY2tyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5mbGlja3IuY29tXC9waG90b3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9mbGljLmtyXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouZmxpY2tyLmNvbVwvcGhvdG9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2ZsaWMua3JcL3BcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmZsaWNrci5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJGbG91cmlzaCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZmxvdXJpc2guc3R1ZGlvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcHVibGljLmZsb3VyaXNoLnN0dWRpb1wvdmlzdWFsaXNhdGlvblwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wdWJsaWMuZmxvdXJpc2guc3R1ZGlvXC9zdG9yeVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAuZmxvdXJpc2guc3R1ZGlvXC9hcGlcL3YxXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRm9udHNlbGYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5mb250c2VsZi5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2F0YXB1bHQuZm9udHNlbGYuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL29lbWJlZC5mb250c2VsZi5jb21cLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiRk9YIFNQT1JUUyBBdXN0cmFsaWEiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmZveHNwb3J0cy5jb20uYXUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9maXNvLmZveHNwb3J0cy5jb20uYXVcL2lzb21vcnBoaWMtd2lkZ2V0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2Zpc28uZm94c3BvcnRzLmNvbS5hdVwvaXNvbW9ycGhpYy13aWRnZXRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZmlzby5mb3hzcG9ydHMuY29tLmF1XC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZyYW1lQnV6eiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvZnJhbWVidXp6LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZnJhbWVidXp6LmNvbVwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9mcmFtZWJ1enouY29tXC92XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2ZyYW1lYnV6ei5jb21cL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkZ1bm55T3JEaWUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmZ1bm55b3JkaWUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuZnVubnlvcmRpZS5jb21cL3ZpZGVvc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5mdW5ueW9yZGllLmNvbVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJHZW9ncmFwaCBCcml0YWluIGFuZCBJcmVsYW5kIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZ2VvZ3JhcGgub3JnLnVrXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLm9yZy51a1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZ2VvZ3JhcGguY28udWtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLmllXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi53aWtpbWVkaWEub3JnXC8qX2dlb2dyYXBoLm9yZy51a18qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLmdlb2dyYXBoLm9yZy51a1wvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdlb2dyYXBoIENoYW5uZWwgSXNsYW5kcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9jaGFubmVsLWlzbGFuZHMuZ2VvZ3JhcGgub3JnXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLmdlb2dyYXBoLm9yZy5nZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouZ2VvZ3JhcGgub3JnLmplXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvY2hhbm5lbC1pc2xhbmRzLmdlb2dyYXBoLm9yZ1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2NoYW5uZWwtaXNsYW5kcy5nZW9ncmFwaHMub3JnXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5jaGFubmVsLmdlb2dyYXBocy5vcmdcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cuZ2VvZ3JhcGgub3JnLmdnXC9hcGlcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2VvZ3JhcGggR2VybWFueSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9nZW8tZW4uaGxpcHAuZGVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlby1lbi5obGlwcC5kZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlby5obGlwcC5kZVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2dlcm1hbnkuZ2VvZ3JhcGgub3JnXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZ2VvLmhsaXBwLmRlXC9yZXN0YXBpLnBocFwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdldHR5IEltYWdlcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuZ2V0dHlpbWFnZXMuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9ndHkuaW1cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9lbWJlZC5nZXR0eWltYWdlcy5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2Z5Y2F0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9nZnljYXQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9nZnljYXQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmdmeWNhdC5jb21cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ2Z5Y2F0LmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuZ2Z5Y2F0LmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuZ2Z5Y2F0LmNvbVwvdjFcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJHaWZub3RlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuZ2lmbm90ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmdpZm5vdGUuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmdpZm5vdGUuY29tXC9wbGF5XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdJUEhZIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9naXBoeS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ2lwaHkuY29tXC9naWZzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZ3BoLmlzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL21lZGlhLmdpcGh5LmNvbVwvbWVkaWFcLypcL2dpcGh5LmdpZiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9naXBoeS5jb21cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiR2xvcmlhVFYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2dsb3JpYS50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9nbG9yaWEudHZcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkdUIENoYW5uZWwiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2d0Y2hhbm5lbC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ3RjaGFubmVsLmNvbVwvd2F0Y2hcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLmx1bWluZXJ5LmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkd5YXpvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9neWF6by5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZ3lhem8uY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5neWF6by5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJoZWFydGhpcy5hdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvaGVhcnRoaXMuYXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9oZWFydGhpcy5hdFwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2hlYXJ0aGlzLmF0XC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJIdWZmRHVmZmVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2h1ZmZkdWZmZXIuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaHVmZmR1ZmZlci5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9odWZmZHVmZmVyLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJIdWx1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5odWx1LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lmh1bHUuY29tXC93YXRjaFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5odWx1LmNvbVwvYXBpXC9vZW1iZWQue2Zvcm1hdH0iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImlGaXhpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuaUZpeGl0LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5pZml4aXQuY29tXC9HdWlkZVwvVmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5pZml4aXQuY29tXC9FbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSUZUVFQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LmlmdHR0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaWZ0dHQuY29tXC9yZWNpcGVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmlmdHR0LmNvbVwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5kYWNvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9wbGF5ZXIuaW5kYWNvbGl2ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXIuaW5kYWNvbGl2ZS5jb21cL3BsYXllclwvandwXC9jbGllbnRzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BsYXllci5pbmRhY29saXZlLmNvbVwvc2VydmljZXNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5mb2dyYW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2luZm9nci5hbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2luZm9nci5hbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9pbmZvZ3IuYW1cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5mb3ZlYXZlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9pbmZvdmVhdmUubmV0XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi5pbmZvdmVhdmUubmV0XC9FXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouaW5mb3ZlYXZlLm5ldFwvUFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9pbmZvdmVhdmUubmV0XC9zZXJ2aWNlc1wvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5qdXJ5bWFwIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuaW5qdXJ5bWFwLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbmp1cnltYXAuY29tXC9leGVyY2lzZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LmluanVyeW1hcC5jb21cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiSW5vcmVhZGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuaW5vcmVhZGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuaW5vcmVhZGVyLmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lmlub3JlYWRlci5jb21cL29lbWJlZFwvYXBpXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiaW5waG9vZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9pbnBob29kLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5pbnBob29kLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL2FwaS5pbnBob29kLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJJbnN0YWdyYW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL2luc3RhZ3JhbS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvaW5zdGFnci5hbVwvcFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lmluc3RhZ3IuYW1cL3BcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvaW5zdGFncmFtLmNvbVwvcFwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9pbnN0YWdyLmFtXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbnN0YWdyYW0uY29tXC9wXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5pbnN0YWdyLmFtXC9wXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5pbnN0YWdyYW0uY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogImlTbmFyZSBBcnRpY2xlcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LmlzbmFyZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuaXNuYXJlLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cuaXNuYXJlLmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIklzc3V1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9pc3N1dS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9pc3N1dS5jb21cLypcL2RvY3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvaXNzdXUuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiaXZsaXNtdXNpYyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbXVzaWMuaXZsaXMua3JcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbXVzaWMuaXZsaXMua3JcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLYWthb1R2IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC90di5rYWthby5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC90di5rYWthby5jb21cL2NoYW5uZWxcLypcL2NsaXBsaW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R2Lmtha2FvLmNvbVwvY2hhbm5lbFwvdlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC90di5rYWthby5jb21cL2NoYW5uZWxcLypcL2xpdmVsaW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R2Lmtha2FvLmNvbVwvY2hhbm5lbFwvbFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC90di5rYWthby5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaWNrc3RhcnRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cua2lja3N0YXJ0ZXIuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmtpY2tzdGFydGVyLmNvbVwvcHJvamVjdHNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cua2lja3N0YXJ0ZXIuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaWRvanUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5raWRvanUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LmtpZG9qdS5jb21cL2VuXC94XC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5raWRvanUuY29tXC9mclwveFwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cua2lkb2p1LmNvbVwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIktpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wva2l0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wva2l0LmNvbVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9raXQuY29tXC8qXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLmtpdC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJLaXRjaGVuYm93bCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cua2l0Y2hlbmJvd2wuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LmtpdGNoZW5ib3dsLmNvbVwvcmVjaXBlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LmtpdGNoZW5ib3dsLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIktuYWNraSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9qZHIua25hY2tpLmluZm8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9qZHIua25hY2tpLmluZm9cL21ldWhcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvamRyLmtuYWNraS5pbmZvXC9tZXVoXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2pkci5rbmFja2kuaW5mb1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJMZWFybmluZ0FwcHMub3JnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL2xlYXJuaW5nYXBwcy5vcmdcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2xlYXJuaW5nYXBwcy5vcmdcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9sZWFybmluZ2FwcHMub3JnXC9vZW1iZWQucGhwIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkxpbGxlLlBvZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcG9kLnVuaXYtbGlsbGUuZnJcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wb2QudW5pdi1saWxsZS5mclwvdmlkZW9cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcG9kLnVuaXYtbGlsbGUuZnJcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJMaXZlc3RyZWFtIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2xpdmVzdHJlYW0uY29tXC9hY2NvdW50c1wvKlwvZXZlbnRzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2xpdmVzdHJlYW0uY29tXC9hY2NvdW50c1wvKlwvZXZlbnRzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcL2V2ZW50c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvKlwvZXZlbnRzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbGl2ZXN0cmVhbS5jb21cLypcLypcL3ZpZGVvc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9saXZlc3RyZWFtLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIkx1ZHVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9sdWR1cy5vbmUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYXBwLmx1ZHVzLm9uZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAubHVkdXMub25lXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiTWF0aEVtYmVkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL21hdGhlbWJlZC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tYXRoZW1iZWQuY29tXC9sYXRleD9pbnB1dFRleHQ9KiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL21hdGhlbWJlZC5jb21cL2xhdGV4P2lucHV0VGV4dD0qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvbWF0aGVtYmVkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNYXR0ZXJwb3J0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9tYXR0ZXJwb3J0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9teS5tYXR0ZXJwb3J0LmNvbVwvYXBpXC92MVwvbW9kZWxzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJtZS5tZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbWUubWVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tZS5tZVwvaVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tZS5tZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk1lZGllbmFyY2hpdiBkZXIgS1x1MDBmY25zdGUgLSBaXHUwMGZjcmNoZXIgSG9jaHNjaHVsZSBkZXIgS1x1MDBmY25zdGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL21lZGllbmFyY2hpdi56aGRrLmNoXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbWVkaWVuYXJjaGl2LnpoZGsuY2hcL2VudHJpZXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbWVkaWVuYXJjaGl2LnpoZGsuY2hcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNZWV0dXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3Lm1lZXR1cC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWV0dXAuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5tZWV0dXAuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL21lZXR1cC5jb21cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWV0dS5wc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkubWVldHVwLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNaXhDbG91ZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbWl4Y2xvdWQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cubWl4Y2xvdWQuY29tXC8qXC8qXC8iLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm1peGNsb3VkLmNvbVwvKlwvKlwvIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5taXhjbG91ZC5jb21cL29lbWJlZFwvIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNb2J5IFBpY3R1cmUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3Lm1vYnlwaWN0dXJlLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5tb2J5cGljdHVyZS5jb21cL3VzZXJcLypcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tb2J5LnRvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLm1vYnlwaWN0dXJlLmNvbVwvb0VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNb2RlbG8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvbW9kZWxvLmlvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvYmV0YS5tb2RlbG8uaW9cL2VtYmVkZGVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BvcnRhbC5tb2RlbG8uaW9cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiTW9ycGhDYXN0IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cubW9ycGhjYXN0LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tLXJvbGwubW9ycGhjYXN0LmNvbVwvbXJvbGxcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvbS1yb2xsLm1vcnBoY2FzdC5jb21cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJNdXNpYyBCb3ggTWFuaWFjcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvbXVzaWNib3htYW5pYWNzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL211c2ljYm94bWFuaWFjcy5jb21cL2V4cGxvcmVcL21lbG9keVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tdXNpY2JveG1hbmlhY3MuY29tXC9lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIm15QmV3ZWVnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9teWJld2VlZy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbXliZXdlZWcuY29tXC93XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL215YmV3ZWVnLmNvbVwvc2VydmljZXNcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAibmFub28udHYiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5uYW5vby50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL25hbm9vLnR2XC9saW5rXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi5uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uYW5vby50dlwvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLm5hbm9vLnByb1wvbGlua1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uYW5vby5wcm9cL2xpbmtcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL25ldy5tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9tZWRpYS56aGRrLmNoXC9zaWduYXR1clwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9uZXcubWVkaWEuemhkay5jaFwvc2lnbmF0dXJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lm5hbm9vLnR2XC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk5hc2pvbmFsYmlibGlvdGVrZXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5uYi5ub1wvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5uYi5ub1wvaXRlbXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLm5iLm5vXC9jYXRhbG9nXC92MVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIm5mYi5jYSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cubmZiLmNhXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLm5mYi5jYVwvZmlsbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5uZmIuY2FcL3JlbW90ZVwvc2VydmljZXNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk9kZHMuY29tLmF1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cub2Rkcy5jb20uYXUiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm9kZHMuY29tLmF1XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29kZHMuY29tLmF1XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5vZGRzLmNvbS5hdVwvYXBpXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT2ZmaWNpYWwgRk0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvb2ZmaWNpYWwuZm0iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vZmZpY2lhbC5mbVwvdHJhY2tzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb2ZmaWNpYWwuZm1cL3BsYXlsaXN0c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29mZmljaWFsLmZtXC9zZXJ2aWNlc1wvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPbW5pc2NvcGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL29tbmlzY29wZS5tZVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29tbmlzY29wZS5tZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9vbW5pc2NvcGUubWVcL19nbG9iYWxfXC9vZW1iZWRcL2pzb24iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk9uIEFvbCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9vbi5hb2wuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vbi5hb2wuY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29uLmFvbC5jb21cL2FwaSIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT3JhIFRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5vcmEudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cub3JhLnR2XC9vZW1iZWRcLyo/Zm9ybWF0PXtmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPcmJpdHZ1IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vcmJpdHZ1LmNvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAxXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAxXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvMlwvb3JiaXR0b3VyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvMVwvMlwvb3JiaXR0b3VyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb3JiaXR2dS5jb1wvMDAxXC8qXC9vdjM2MDFcL3ZpZXciLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vcmJpdHZ1LmNvXC8wMDFcLypcL292MzYwMVwvKlwvdmlldyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL29yYml0dnUuY29cLzAwMVwvKlwvb3YzNjAyXC8qXC92aWV3IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvb3JiaXR2dS5jb1wvMDAxXC8qXC8yXC9vcmJpdHRvdXJcLypcL3ZpZXciLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9vcmJpdHZ1LmNvXC8wMDFcLypcLzFcLzJcL29yYml0dG91clwvKlwvdmlldyIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL29yYml0dnUuY29cL3NlcnZpY2VcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJPdW15IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cub3VteS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cub3VteS5jb21cL3ZcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3Lm91bXkuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiT3V0cGxheWVkLnR2IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vdXRwbGF5ZWQudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdXRwbGF5ZWQudHZcL21lZGlhXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL291dHBsYXllZC50dlwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIk92ZXJmbG93IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vdmVyZmxvdy5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdmVyZmxvdy5pb1wvc1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vdmVyZmxvdy5pb1wvZW1iZWRcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvb3ZlcmZsb3cuaW9cL3NlcnZpY2VzXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUGFzdGVyeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnBhc3RlcnkubmV0IiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cucGFzdGVyeS5uZXRcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnBhc3RlcnkubmV0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5wYXN0ZXJ5Lm5ldFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBpbmdWUCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnBpbmd2cC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYmV0YS5waW5ndnAuY29tLmtwbmlzLm5sXC9wXC9vZW1iZWQucGhwIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBpeGRvciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cucGl4ZG9yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3N0b3JlLnBpeGRvci5jb21cL3BsYWNlLW1hcmtlci13aWRnZXRcLypcL3Nob3ciLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc3RvcmUucGl4ZG9yLmNvbVwvbWFwXC8qXC9zaG93IgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3N0b3JlLnBpeGRvci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgInhtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJQb2RiZWFuIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3BvZGJlYW4uY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoucG9kYmVhbi5jb21cL2VcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC8qLnBvZGJlYW4uY29tXC9lXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5wb2RiZWFuLmNvbVwvdjFcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUG9sbCBEYWRkeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9wb2xsZGFkZHkuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9zXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9wb2xsXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5wb2xsZGFkZHkuY29tXC9yYXRpbmdzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvcG9sbGRhZGR5LmNvbVwvb2VtYmVkXC8iCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBvcnQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNlbGx3aXRocG9ydC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9hcHAuc2VsbHdpdGhwb3J0LmNvbVwvI1wvYnV5ZXJcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvYXBpLnNlbGx3aXRocG9ydC5jb21cL3YxLjBcL2J1eWVyXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlBvcnRmb2xpdW0iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3BvcnRmb2xpdW0uY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BvcnRmb2xpdW0uY29tXC9lbnRyeVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkucG9ydGZvbGl1bS5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUXVpei5iaXoiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnF1aXouYml6XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cucXVpei5iaXpcL3F1aXp6LSouaHRtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5xdWl6LmJpelwvYXBpXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUXVpenouYml6IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcL3F1aXp6LSouaHRtbCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5xdWl6ei5iaXpcL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJhcGlkRW5nYWdlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9yYXBpZGVuZ2FnZS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcmFwaWRlbmdhZ2UuY29tXC9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3JhcGlkZW5nYWdlLmNvbVwvYXBpXC9vZW1iZWQiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJlZGRpdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcmVkZGl0LmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3JlZGRpdC5jb21cL3JcLypcL2NvbW1lbnRzXC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5yZWRkaXQuY29tXC9yXC8qXC9jb21tZW50c1wvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cucmVkZGl0LmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSZWxlYXNlV2lyZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cucmVsZWFzZXdpcmUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yd2lyZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wdWJsaXNoZXIucmVsZWFzZXdpcmUuY29tXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSZXBsaXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3JlcGwuaXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9yZXBsLml0XC9AKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9yZXBsLml0XC9kYXRhXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUmVwdWJIdWIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvcmVwdWJodWIuaWNvcHlyaWdodC5uZXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3JlcHViaHViLmljb3B5cmlnaHQubmV0XC9mcmVlUG9zdC5hY3Q/KiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3JlcHViaHViLmljb3B5cmlnaHQubmV0XC9vZW1iZWQuYWN0IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJldmVyYk5hdGlvbiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnJldmVyYm5hdGlvbi5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cucmV2ZXJibmF0aW9uLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cucmV2ZXJibmF0aW9uLmNvbVwvKlwvc29uZ3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnJldmVyYm5hdGlvbi5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSaWZmUmVwb3J0ZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5yaWZmcmVwb3J0ZXIuZGVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnJpZmZyZXBvcnRlci5kZVwvc2VydmljZVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlJvb21zaGFyZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC9yb29tc2hhcmUuanAiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yb29tc2hhcmUuanBcL3Bvc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9yb29tc2hhcmUuanBcL2VuXC9wb3N0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvcm9vbXNoYXJlLmpwXC9lblwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJSb29zdGVyVGVldGgiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3Jvb3N0ZXJ0ZWV0aC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcm9vc3RlcnRlZXRoLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9yb29zdGVydGVldGguY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiUnVtYmxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9ydW1ibGUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3J1bWJsZS5jb21cL2FwaVwvTWVkaWFcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTYXBvIFZpZGVvcyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC92aWRlb3Muc2Fwby5wdCIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZpZGVvcy5zYXBvLnB0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdmlkZW9zLnNhcG8ucHRcL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyZWVuOSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc2NyZWVuOS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9jb25zb2xlLnNjcmVlbjkuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouc2NyZWVuOS50dlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuc2NyZWVuOS5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyZWVuY2FzdC5jb20iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNjcmVlbmNhc3QuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5zY3JlZW5jYXN0LmNvbVwvZXh0ZXJuYWxcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTY3JlZW5yIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5zY3JlZW5yLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnNjcmVlbnIuY29tXC8qXC8iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cuc2NyZWVuci5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTY3JpYmJsZU1hcHMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3NjcmliYmxlbWFwcy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NjcmliYmxlbWFwcy5jb21cL21hcHNcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2NyaWJibGVtYXBzLmNvbVwvbWFwc1wvdmlld1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zY3JpYmJsZW1hcHMuY29tXC9hcGlcL3NlcnZpY2VzXC9vZW1iZWQue2Zvcm1hdH0iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2NyaWJkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy5zY3JpYmQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2NyaWJkLmNvbVwvZG9jXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LnNjcmliZC5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2VuZHRvTmV3cyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc2VuZHRvbmV3cy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9lbWJlZC5zZW5kdG9uZXdzLmNvbVwvb2VtYmVkXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLnNlbmR0b25ld3MuY29tXC9zZXJ2aWNlc1wvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iLAogICAgICAgICAgICAgICAgICAgICJ4bWwiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNob3J0Tm90ZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnNob3J0bm90ZS5qcFwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zaG9ydG5vdGUuanBcL3ZpZXdcL25vdGVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5zaG9ydG5vdGUuanBcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNob3VkaW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvc2hvdWRpby5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zaG91ZGlvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3Nob3VkLmlvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvc2hvdWRpby5jb21cL2FwaVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTaG93IHRoZSBXYXksIGFjdGlvbmFibGUgbG9jYXRpb24gaW5mbyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc2hvd3RoZXdheS5pbyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zaG93dGhld2F5LmlvXC90b1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zaG93dGhld2F5LmlvXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2ltcGxlY2FzdCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb21cL3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc2ltcGxlY2FzdC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2l6emxlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9vbnNpenpsZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9vbnNpenpsZS5jb21cL2lcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvb25zaXp6bGUuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU2tldGNoZmFiIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3NrZXRjaGZhYi5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9za2V0Y2hmYWIuY29tXC9tb2RlbHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc2tldGNoZmFiLmNvbVwvbW9kZWxzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3NrZXRjaGZhYi5jb21cLypcL2ZvbGRlcnNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9za2V0Y2hmYWIuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlNsaWRlU2hhcmUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvd3d3LnNsaWRlc2hhcmUubmV0XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cuc2xpZGVzaGFyZS5uZXRcLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9mci5zbGlkZXNoYXJlLm5ldFwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2RlLnNsaWRlc2hhcmUubmV0XC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvZXMuc2xpZGVzaGFyZS5uZXRcLypcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9wdC5zbGlkZXNoYXJlLm5ldFwvKlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy5zbGlkZXNoYXJlLm5ldFwvYXBpXC9vZW1iZWRcLzIiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU211Z011ZyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cuc211Z211Zy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouc211Z211Zy5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9hcGkuc211Z211Zy5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb2NpYWxFeHBsb3JlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnNvY2lhbGV4cGxvcmVyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cLypcL2V4cGxvcmUiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3LnNvY2lhbGV4cGxvcmVyLmNvbVwvKlwvdmlldyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc29jaWFsZXhwbG9yZXIuY29tXC8qXC9lZGl0IiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cLypcL2VtYmVkIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5zb2NpYWxleHBsb3Jlci5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb25nbGluayIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc29uZy5saW5rIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3NvbmcubGlua1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zb25nLmxpbmtcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb3VuZENsb3VkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3NvdW5kY2xvdWQuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zb3VuZGNsb3VkLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zb3VuZGNsb3VkLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9zb3VuZGNsb3VkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTb3VuZHNnb29kIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9zb3VuZHNnb29kLmNvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BsYXkuc291bmRzZ29vZC5jb1wvcGxheWxpc3RcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvc291bmRzZ29vZC5jb1wvcGxheWxpc3RcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcGxheS5zb3VuZHNnb29kLmNvXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgInhtbCIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3BlYWtlckRlY2siLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3NwZWFrZXJkZWNrLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NwZWFrZXJkZWNrLmNvbVwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zcGVha2VyZGVjay5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc3BlYWtlcmRlY2suY29tXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTcG90ZnVsIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9iZXNwb3RmdWwuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS5iZXNwb3RmdWwuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5iZXNwb3RmdWwuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3BvdGlmeSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvc3BvdGlmeS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnNwb3RpZnkuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAic3BvdGlmeToqIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2VtYmVkLnNwb3RpZnkuY29tXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiU3ByZWFrZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5zcHJlYWtlci5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyouc3ByZWFrZXIuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyouc3ByZWFrZXIuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS5zcHJlYWtlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJTdGFuZm9yZCBEaWdpdGFsIFJlcG9zaXRvcnkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3B1cmwuc3RhbmZvcmQuZWR1XC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvcHVybC5zdGFuZm9yZC5lZHVcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvcHVybC5zdGFuZm9yZC5lZHVcL2VtYmVkLntmb3JtYXR9IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN0cmVhbWFibGUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3N0cmVhbWFibGUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9zdHJlYW1hYmxlLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zdHJlYW1hYmxlLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkuc3RyZWFtYWJsZS5jb21cL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN0cmVhbU9uZUNsb3VkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuc3RyZWFtb25lLm5sIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2NvbnRlbnQuc3RyZWFtb25lY2xvdWQubmV0XC9lbWJlZFwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9jb250ZW50LnN0cmVhbW9uZWNsb3VkLm5ldFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN1dG9yaSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnN1dG9yaS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc3V0b3JpLmNvbVwvc3RvcnlcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnN1dG9yaS5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlN3YXkiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy5zd2F5LmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9zd2F5LmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cuc3dheS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvc3dheS5jb21cL2FwaVwvdjEuMFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlRlZCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC90ZWQuY29tIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdGVkLmNvbVwvdGFsa3NcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cudGVkLmNvbVwvdGFsa3NcL29lbWJlZC57Zm9ybWF0fSIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVGhlIE5ldyBZb3JrIFRpbWVzIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cubnl0aW1lcy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvd3d3Lm55dGltZXMuY29tXC9zdmNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9ueXRpbWVzLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLm55dGltZXMuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy5ueXRpbWVzLmNvbVwvc3ZjXC9vZW1iZWRcL2pzb25cLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUaGV5IFNhaWQgU28iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3RoZXlzYWlkc28uY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdGhleXNhaWRzby5jb21cL2ltYWdlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3RoZXlzYWlkc28uY29tXC9leHRlbnNpb25zXC9vZW1iZWRcLyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUaWNrQ291bnRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnRpY2tjb3VudGVyLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50ZG93blwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50dXBcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC90aWNrZXJcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC93b3JsZGNsb2NrXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL2NvdW50ZG93blwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC9jb3VudHVwXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL3RpY2tlclwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudGlja2NvdW50ZXIuY29tXC93b3JsZGNsb2NrXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3d3dy50aWNrY291bnRlci5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUb29ybmFtZW50IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9pbmZvcm1hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9yZWdpc3RyYXRpb25cLyIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9tYXRjaGVzXC9zY2hlZHVsZSIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudG9vcm5hbWVudC5jb21cL3RvdXJuYW1lbnRzXC8qXC9zdGFnZXNcLypcLyIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93aWRnZXQudG9vcm5hbWVudC5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIiwKICAgICAgICAgICAgICAgICAgICAieG1sIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUb3B5IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy50b3B5LnNlXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudG9weS5zZVwvaW1hZ2VcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cudG9weS5zZVwvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVHV4eCIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnR1eHguYmVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudHV4eC5iZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudHV4eC5iZVwvc2VydmljZXNcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJ0dmNmIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3R2Y2YuY28ua3IiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudHZjZi5jby5rclwvdlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy50dmNmLmNvLmtyXC9zZXJ2aWNlc1wvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUd2l0Y2giLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy50d2l0Y2gudHYiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC9jbGlwcy50d2l0Y2gudHZcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvY2xpcHMudHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnR3aXRjaC50dlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdHdpdGNoLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R3aXRjaC50dlwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcGkudHdpdGNoLnR2XC92NFwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJUd2l0dGVyIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy50d2l0dGVyLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3R3aXR0ZXIuY29tXC8qXC9zdGF0dXNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi50d2l0dGVyLmNvbVwvKlwvc3RhdHVzXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3B1Ymxpc2gudHdpdHRlci5jb21cL29lbWJlZCIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVWJpZGVvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9wbGF5ZXIudWJpZGVvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3BsYXllci51YmlkZW8uY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3BsYXllci51YmlkZW8uY29tXC9hcGlcL29lbWJlZC5qc29uIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBNYXAiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL21hcC5jYW0uYWMudWsiLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvbWFwLmNhbS5hYy51a1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tYXAuY2FtLmFjLnVrXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVU9MIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC9tYWlzLnVvbC5jb20uYnJcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnVvbC5jb20uYnJcL3ZpZXdcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi51b2wuY29tLmJyXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9tYWlzLnVvbC5jb20uYnJcL2FwaXVvbFwvdjNcL29lbWJlZFwvdmlldyIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVc3RyZWFtIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy51c3RyZWFtLnR2IiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi51c3RyZWFtLnR2XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi51c3RyZWFtLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy51c3RyZWFtLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlV0cG9zdHMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy51dHBvc3RzLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3d3dy51dHBvc3RzLmNvbVwvcHJvZHVjdHNcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudXRwb3N0cy5jb21cL3Byb2R1Y3RzXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3V0cG9zdHMuY29tXC9wcm9kdWN0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3V0cG9zdHMuY29tXC9wcm9kdWN0c1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cudXRwb3N0cy5jb21cL2FwaVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJVdHRsZXMiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvdXR0bGVzLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3V0dGxlcy5jb21cL3V0dGxlXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdXR0bGVzLmNvbVwvYXBpXC9yZXBseVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZlZVIgVlIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cDpcL1wvdmVlci50dlwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvdmVlci50dlwvdmlkZW9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52ZWVyLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3ZlZXJ2ci50dlwvdmlkZW9zXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52ZWVydnIudHZcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWZXJzZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC92ZXJzZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC92ZXJzZS5jb21cL3NlcnZpY2VzXC9vZW1iZWRcLyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVkVWTyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cudmV2by5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3d3dy52ZXZvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudmV2by5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnZldm8uY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZpZGVvSnVnIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aWRlb2p1Zy5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC93d3cudmlkZW9qdWcuY29tXC9maWxtXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3LnZpZGVvanVnLmNvbVwvaW50ZXJ2aWV3XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvd3d3LnZpZGVvanVnLmNvbVwvb2VtYmVkLntmb3JtYXR9IgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWaWRsaXQiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpZGwuaXRcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aWRsLml0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52aWRsLml0XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmlkbWl6ZXIiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy52aWRtaXplci5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXJzLnZpZG1pemVyLmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9hcHAtdjIudmlkbWl6ZXIuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWaWR5YXJkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aWR5YXJkLmNvbSIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL2VtYmVkLnZpZHlhcmQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvcGxheS52aWR5YXJkLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3NoYXJlLnZpZHlhcmQuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi5odWJzLnZpZHlhcmQuY29tXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS52aWR5YXJkLmNvbVwvZGFzaGJvYXJkXC92MS4xXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmltZW8iLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aW1lby5jb21cL2FsYnVtXC8qXC92aWRlb1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC92aW1lby5jb21cL2NoYW5uZWxzXC8qXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3ZpbWVvLmNvbVwvZ3JvdXBzXC8qXC92aWRlb3NcLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmltZW8uY29tXC9vbmRlbWFuZFwvKlwvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC9wbGF5ZXIudmltZW8uY29tXC92aWRlb1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC92aW1lby5jb21cL2FwaVwvb2VtYmVkLntmb3JtYXR9IiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlZpemlvc3BoZXJlIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy52aXppb3NwaGVyZS5jb20iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC92aXppb3NwaGVyZS5jb21cLzNkcGhvdG8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvdml6aW9zcGhlcmUuY29tXC9zZXJ2aWNlc1wvb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVmxpcHN5IiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC92bGlwc3kuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmxpcHN5LmNvbVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC92bGlwc3kuY29tXC9vZW1iZWQiLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiVkxJVkUiLAogICAgICAgICJwcm92aWRlcl91cmwiOiAiaHR0cHM6XC9cL3d3dy52bGl2ZS50diIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvd3d3LnZsaXZlLnR2XC9vZW1iZWQiLAogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC93d3cudmxpdmUudHZcL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJmb3JtYXRzIjogWwogICAgICAgICAgICAgICAgICAgICJqc29uIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWbHVyYiIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnZsdXJiLmNvXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwOlwvXC92bHVyYi5jb1wvdmlkZW9cLyoiLAogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvdmx1cmIuY29cL3ZpZGVvXC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL3ZsdXJiLmNvXC9vZW1iZWQuanNvbiIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJWb3hTbmFwIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC92b3hzbmFwLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2FydGljbGUudm94c25hcC5jb21cLypcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczpcL1wvZGF0YS52b3hzbmFwLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIndlY2FuZGVvIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy53ZWNhbmRlby5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wbGF5LndlY2FuZGVvLmNvbVwvb2VtYmVkIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIldpcmVkcml2ZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LndpcmVkcml2ZS5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpcmVkcml2ZS5jb21cLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC8qLndpcmVkcml2ZS5jb21cL3ByZXNlbnQtb2VtYmVkXC8iLAogICAgICAgICAgICAgICAgImZvcm1hdHMiOiBbCiAgICAgICAgICAgICAgICAgICAgImpzb24iCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiV2lzdGlhLCBJbmMuIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93aXN0aWEuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvZmFzdC53aXN0aWEuY29tXC9lbWJlZFwvaWZyYW1lXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL2Zhc3Qud2lzdGlhLmNvbVwvZW1iZWRcL3BsYXlsaXN0c1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpc3RpYS5jb21cL21lZGlhc1wvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC9mYXN0Lndpc3RpYS5jb21cL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJ3aXplci5tZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC93d3cud2l6ZXIubWVcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyoud2l6ZXIubWVcL2xlYXJuXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoud2l6ZXIubWVcL2xlYXJuXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvKi53aXplci5tZVwvcHJldmlld1wvKiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLndpemVyLm1lXC9wcmV2aWV3XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBwLndpemVyLm1lXC9hcGlcL29lbWJlZC57Zm9ybWF0fSIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJXb290bGVkIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3d3dy53b290bGVkLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXJsIjogImh0dHA6XC9cL3d3dy53b290bGVkLmNvbVwvb2VtYmVkIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJXb3JkUHJlc3MuY29tIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHA6XC9cL3dvcmRwcmVzcy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC9wdWJsaWMtYXBpLndvcmRwcmVzcy5jb21cL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlllcywgSSBLbm93IElUISIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC95ZXNpay5pdCIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cL3llc2lrLml0XC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wvd3d3Lnllc2lrLml0XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wveWVzaWsuaXRcL3NcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJZRnJvZyIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwOlwvXC95ZnJvZy5jb21cLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHA6XC9cLyoueWZyb2cuY29tXC8qIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cDpcL1wveWZyb2cudXNcLyoiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwOlwvXC93d3cueWZyb2cuY29tXC9hcGlcL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZm9ybWF0cyI6IFsKICAgICAgICAgICAgICAgICAgICAianNvbiIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgInByb3ZpZGVyX25hbWUiOiAiWW91VHViZSIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvd3d3LnlvdXR1YmUuY29tXC8iLAogICAgICAgICJlbmRwb2ludHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlbWVzIjogWwogICAgICAgICAgICAgICAgICAgICJodHRwczpcL1wvKi55b3V0dWJlLmNvbVwvd2F0Y2gqIiwKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cLyoueW91dHViZS5jb21cL3ZcLypcIiIsCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC95b3V0dS5iZVwvKiIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOlwvXC93d3cueW91dHViZS5jb21cL29lbWJlZCIsCiAgICAgICAgICAgICAgICAiZGlzY292ZXJ5IjogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSwKICAgIHsKICAgICAgICAicHJvdmlkZXJfbmFtZSI6ICJabmlwZVRWIiwKICAgICAgICAicHJvdmlkZXJfdXJsIjogImh0dHBzOlwvXC93d3cuem5pcGUudHZcLyIsCiAgICAgICAgImVuZHBvaW50cyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVtZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImh0dHBzOlwvXC8qLnpuaXBlLnR2XC8qIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6XC9cL2FwaS56bmlwZS50dlwvdjNcL29lbWJlZFwvIiwKICAgICAgICAgICAgICAgICJkaXNjb3ZlcnkiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9LAogICAgewogICAgICAgICJwcm92aWRlcl9uYW1lIjogIlpQcm92aWRlciIsCiAgICAgICAgInByb3ZpZGVyX3VybCI6ICJodHRwczpcL1wvcmVwb3J0cy56b2hvLmNvbVwvIiwKICAgICAgICAiZW5kcG9pbnRzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZW1lcyI6IFsKICAgICAgICAgICAgICAgICAgICAiaHR0cHM6XC9cL3JlcG9ydHMuem9oby5jb21cL1pEQkRhdGFTaGVldFZpZXcuY2M/T0JKSUQ9MTQzMjUzNTAwMDAwMDAwMzAwMiZTVEFOREFMT05FPXRydWUmSU5URVJWQUw9MTIwJkRBVEFUWVBFU1lNQk9MPWZhbHNlJlJFTVRPT0xCQVI9ZmFsc2UmU0VBUkNIQk9YPXRydWUmSU5DTFVERVRJVExFPXRydWUmSU5DTFVERURFU0M9dHJ1ZSZTSE9XSElERU9QVD10cnVlIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvYXBpLnByb3ZpZGVyLmNvbVwvb2VtYmVkLmpzb24iLAogICAgICAgICAgICAgICAgImRpc2NvdmVyeSI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH0KXQ==\"") +} diff --git a/errors.go b/errors.go new file mode 100644 index 0000000..7db7131 --- /dev/null +++ b/errors.go @@ -0,0 +1,33 @@ +package oembed + +import ( + "fmt" + + "golang.org/x/xerrors" +) + +// Error represent a complex error +type Error struct { + Message string + URL string + Details xerrors.Frame +} + +// Error returns a string formatted error +func (e Error) Error() string { + return fmt.Sprint(e) +} + +// Format implements fmt.Formatter method +func (e Error) Format(f fmt.State, c rune) { + xerrors.FormatError(e, f, c) +} + +// FormatError implements xerrors.Formatter method +func (e Error) FormatError(p xerrors.Printer) error { + p.Printf("ERROR: %d [url:%s]", e.Message, e.URL) + if p.Detail() { + e.Details.Format(p) + } + return nil +} diff --git a/fetch_embed.go b/fetch_embed.go index c4a6e88..e27c28c 100644 --- a/fetch_embed.go +++ b/fetch_embed.go @@ -8,18 +8,19 @@ import ( template "github.com/valyala/fasttemplate" ) +// Params represent a optional parameters for Extract method. type Params struct { MaxWidth int MaxHeight int } -func fetchEmbed(url string, provider providerCandidate, params *Params) (*Response, error) { - resourceUrl := provider.URL - resourceUrl = template.ExecuteString(resourceUrl, "{", "}", map[string]interface{}{"format": "json"}) +func fetchEmbed(url string, provider *Provider, params *Params) (*OEmbed, error) { + resourceURL := provider.Endpoints[0].URL + resourceURL = template.ExecuteString(resourceURL, "{", "}", map[string]interface{}{"format": "json"}) link := http.AcquireURI() defer http.ReleaseURI(link) - link.Update(resourceUrl) + link.Update(resourceURL) qa := link.QueryArgs() qa.Add("format", "json") qa.Add("url", url) @@ -40,14 +41,20 @@ func fetchEmbed(url string, provider providerCandidate, params *Params) (*Respon defer http.ReleaseResponse(resp) if err := http.Do(req, resp); err != nil { - return nil, err + return nil, Error{ + Message: err.Error(), + URL: url, + } } - var response Response - if err := json.Unmarshal(resp.Body(), &response); err != nil { - return nil, err + var oEmbed OEmbed + if err := json.UnmarshalFast(resp.Body(), &oEmbed); err != nil { + return nil, Error{ + Message: err.Error(), + URL: url, + } } - response.ProviderName = provider.ProviderName - response.ProviderURL = provider.ProviderURL - return &response, nil + oEmbed.ProviderName = provider.Name + oEmbed.ProviderURL = provider.URL + return &oEmbed, nil } diff --git a/fetch_embed_test.go b/fetch_embed_test.go index 7d51a8a..544655e 100644 --- a/fetch_embed_test.go +++ b/fetch_embed_test.go @@ -11,10 +11,10 @@ func TestFetchEmbed(t *testing.T) { t.Run("valid", func(t *testing.T) { resp, err := fetchEmbed( "https://www.youtube.com/watch?v=8jPQjjsBbIc", - makeCandidate(Provider{ + &Provider{ Name: "YouTube", URL: "https://www.youtube.com/", - Endpoints: []Endpoint{Endpoint{ + Endpoints: []Endpoint{{ Schemes: []string{ "https://*.youtube.com/watch*", "https://*.youtube.com/v/*\"", @@ -23,7 +23,7 @@ func TestFetchEmbed(t *testing.T) { URL: "https://www.youtube.com/oembed", Discovery: true, }}, - }), + }, &Params{ MaxWidth: 250, MaxHeight: 250, @@ -34,7 +34,6 @@ func TestFetchEmbed(t *testing.T) { }) t.Run("invalid", func(t *testing.T) { for _, url := range []string{ - "", "htt:/abc.com/failed-none-sense", "https://abc.com/failed-none-sense", "http://badcom/146753785", @@ -45,12 +44,12 @@ func TestFetchEmbed(t *testing.T) { } { url := url t.Run(url, func(t *testing.T) { - c := findProvider(url) - if c == nil { - c = new(providerCandidate) + provider := findProvider(url) + if provider == nil { + provider = &Provider{Endpoints: []Endpoint{Endpoint{}}} } - _, err := fetchEmbed(url, *c, nil) + _, err := fetchEmbed(url, provider, nil) assert.Error(err) }) } diff --git a/find_provider.go b/find_provider.go index fdec3c4..9a7f70c 100644 --- a/find_provider.go +++ b/find_provider.go @@ -44,26 +44,34 @@ func makeCandidate(p Provider) providerCandidate { } -func findProvider(url string) *providerCandidate { - var candidates []providerCandidate - for _, provider := range providersList { +func findProvider(url string) *Provider { + var candidates []Provider + for _, provider := range Providers { provider := provider - candidate := makeCandidate(provider) - if len(candidate.Schemes) == 0 { - if !strings.Contains(url, candidate.Domain) { + + endpoint := provider.Endpoints[0] + domain := getHostname(endpoint.URL) + if domain != "" { + domain = strings.TrimPrefix(domain, "www.") + } else { + domain = "" + } + + if len(endpoint.Schemes) == 0 { + if !strings.Contains(url, domain) { continue } - candidates = append(candidates, candidate) + candidates = append(candidates, provider) continue } - for _, scheme := range candidate.Schemes { + for _, scheme := range endpoint.Schemes { scheme := scheme reg := regexp.MustCompile(strings.Replace(scheme, "*", "(.*)", -1)) if !reg.MatchString(url) { continue } - candidates = append(candidates, candidate) + candidates = append(candidates, provider) break } } diff --git a/find_provider_test.go b/find_provider_test.go index 691c273..3565e94 100644 --- a/find_provider_test.go +++ b/find_provider_test.go @@ -17,6 +17,7 @@ func TestGetHostname(t *testing.T) { "http://": "", "": "", } { + k, v := k, v t.Run(k, func(t *testing.T) { assert.Equal(v, getHostname(k)) }) } } @@ -26,7 +27,7 @@ func TestMakeCandidate(t *testing.T) { Name: "YouTube", URL: "https://www.youtube.com/", Endpoints: []Endpoint{ - Endpoint{ + { Schemes: []string{ "https://*.youtube.com/watch*", "https://*.youtube.com/v/*\"", diff --git a/oembed.go b/oembed.go index f8dd3c5..866bbb4 100644 --- a/oembed.go +++ b/oembed.go @@ -1,24 +1,35 @@ package oembed -import ( - "golang.org/x/xerrors" -) +import "golang.org/x/xerrors" -var ( - ErrInvalidInputURL = xerrors.New("invalid input url") - ErrNoProviderFound = xerrors.New("no provider found with given url") -) - -func Extract(url string, params *Params) (*Response, error) { +// Extract try fetch oEmbed object for input url with params (if represent). +// Return OEmbed if success. +func Extract(url string, params *Params) (*OEmbed, error) { if !isValidURL(url) { - return nil, ErrInvalidInputURL + return nil, Error{ + Message: "invalid input url", + URL: url, + } } - if c := findProvider(url); c != nil { - return fetchEmbed(url, *c, params) + if provider := findProvider(url); provider != nil { + resp, err := fetchEmbed(url, provider, params) + if err != nil { + return nil, Error{ + Message: err.Error(), + URL: url, + Details: xerrors.Caller(1), + } + } + return resp, nil + } + + return nil, Error{ + Message: "no provider found with given url", + URL: url, } - return nil, ErrNoProviderFound } +// HasProvider checks what input url has oEmbed provider func HasProvider(url string) bool { return findProvider(url) != nil } diff --git a/sync.go b/sync.go index 7d0ba2d..3b19331 100644 --- a/sync.go +++ b/sync.go @@ -1,46 +1,42 @@ package oembed import ( - "io/ioutil" "log" - "os" - "path/filepath" + "time" + "github.com/gobuffalo/packr" json "github.com/pquerna/ffjson/ffjson" http "github.com/valyala/fasthttp" ) -const source string = "https://oembed.com/providers.json" +// SourceURL is a official url of supported providers list +const SourceURL string = "https://oembed.com/providers.json" -var ( - providersList []Provider +// Providers contains all default (or new synced) providers +var Providers []Provider //nolint:gochecknoglobals - target = filepath.Join( - os.Getenv("GOPATH"), "src", "gitlab.com", "toby3d", "oembed", "assets", "providers.json", - ) -) - -func init() { - if err := fetch(source, target); err != nil { +func init() { //nolint:gochecknoinits + if err := Sync(SourceURL); err != nil { panic(err) } } -func fetch(url, target string) error { - status, src, err := http.Get(nil, url) +// Sync try update Providers variable via request and parsing body of sourceURL +func Sync(sourceURL string) error { + status, src, err := http.GetTimeout(nil, sourceURL, 2*time.Second) if err != nil || status != http.StatusOK { - if src, err = ioutil.ReadFile(target); err != nil { - return err + if src, err = packr.NewBox("./assets").Find("providers.json"); err != nil { + return Error{ + Message: err.Error(), + URL: sourceURL, + } } } - if err := json.Unmarshal(src, &providersList); err != nil { - return err - } - - if status == http.StatusOK { - if err = ioutil.WriteFile(target, src, os.ModePerm); err != nil { - return err + if err = json.Unmarshal(src, &Providers); err != nil { + return Error{ + Message: err.Error(), + URL: sourceURL, } } diff --git a/sync_test.go b/sync_test.go new file mode 100644 index 0000000..35ae5ee --- /dev/null +++ b/sync_test.go @@ -0,0 +1,24 @@ +package oembed + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSync(t *testing.T) { + t.Run("invalid", func(t *testing.T) { + t.Run("source url", func(t *testing.T) { + assert.NoError(t, Sync("wtf")) + assert.NotZero(t, len(Providers)) + }) + t.Run("resource body", func(t *testing.T) { + assert.Error(t, Sync("https://ddg.gg/")) + assert.NotZero(t, len(Providers)) + }) + }) + t.Run("valid url", func(t *testing.T) { + assert.NoError(t, Sync(SourceURL)) + assert.NotZero(t, len(Providers)) + }) +} diff --git a/types.go b/types.go index 0c7841d..fc43001 100644 --- a/types.go +++ b/types.go @@ -2,12 +2,14 @@ package oembed type ( + // Provider represent a single provider info Provider struct { Name string `json:"provider_name"` URL string `json:"provider_url"` Endpoints []Endpoint `json:"endpoints"` } + // Provider represent a single endpoint of Provider Endpoint struct { Schemes []string `json:"schemes,omitempty"` URL string `json:"url"` @@ -17,7 +19,7 @@ type ( // Response can specify a resource type, such as photo or video. // Each type has specific parameters associated with it. - Response struct { + OEmbed struct { // The resource type. Type string `json:"type"` // required @@ -88,7 +90,7 @@ type ( // Link type allow a provider to return any generic embed data (such as title and author_name), without // providing either the url or html parameters. The consumer may then link to the resource, using the URL // specified in the original request. - Link string + // Link string // Rich is used for rich HTML content that does not fall under one of the other categories. Rich struct { diff --git a/types_ffjson.go b/types_ffjson.go index d24413d..906a130 100644 --- a/types_ffjson.go +++ b/types_ffjson.go @@ -493,6 +493,765 @@ done: return nil } +// MarshalJSON marshal bytes to json - template +func (j *OEmbed) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if j == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := j.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// MarshalJSONBuf marshal buff to json - template +func (j *OEmbed) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if j == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + fflib.WriteJsonString(buf, string(j.Type)) + buf.WriteString(`,"version":`) + fflib.WriteJsonString(buf, string(j.Version)) + buf.WriteByte(',') + if len(j.Title) != 0 { + buf.WriteString(`"title":`) + fflib.WriteJsonString(buf, string(j.Title)) + buf.WriteByte(',') + } + if len(j.AuthorName) != 0 { + buf.WriteString(`"author_name":`) + fflib.WriteJsonString(buf, string(j.AuthorName)) + buf.WriteByte(',') + } + if len(j.AuthorURL) != 0 { + buf.WriteString(`"author_url":`) + fflib.WriteJsonString(buf, string(j.AuthorURL)) + buf.WriteByte(',') + } + if len(j.ProviderName) != 0 { + buf.WriteString(`"provider_name":`) + fflib.WriteJsonString(buf, string(j.ProviderName)) + buf.WriteByte(',') + } + if len(j.ProviderURL) != 0 { + buf.WriteString(`"provider_url":`) + fflib.WriteJsonString(buf, string(j.ProviderURL)) + buf.WriteByte(',') + } + if j.CacheAge != 0 { + buf.WriteString(`"cache_age":`) + fflib.FormatBits2(buf, uint64(j.CacheAge), 10, j.CacheAge < 0) + buf.WriteByte(',') + } + if len(j.ThumbnailURL) != 0 { + buf.WriteString(`"thumbnail_url":`) + fflib.WriteJsonString(buf, string(j.ThumbnailURL)) + buf.WriteByte(',') + } + if j.ThumbnailWidth != 0 { + buf.WriteString(`"thumbnail_width":`) + fflib.FormatBits2(buf, uint64(j.ThumbnailWidth), 10, j.ThumbnailWidth < 0) + buf.WriteByte(',') + } + if j.ThumbnailHeight != 0 { + buf.WriteString(`"thumbnail_height":`) + fflib.FormatBits2(buf, uint64(j.ThumbnailHeight), 10, j.ThumbnailHeight < 0) + buf.WriteByte(',') + } + if len(j.URL) != 0 { + buf.WriteString(`"url":`) + fflib.WriteJsonString(buf, string(j.URL)) + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffjtOEmbedbase = iota + ffjtOEmbednosuchkey + + ffjtOEmbedType + + ffjtOEmbedVersion + + ffjtOEmbedTitle + + ffjtOEmbedAuthorName + + ffjtOEmbedAuthorURL + + ffjtOEmbedProviderName + + ffjtOEmbedProviderURL + + ffjtOEmbedCacheAge + + ffjtOEmbedThumbnailURL + + ffjtOEmbedThumbnailWidth + + ffjtOEmbedThumbnailHeight + + ffjtOEmbedURL +) + +var ffjKeyOEmbedType = []byte("type") + +var ffjKeyOEmbedVersion = []byte("version") + +var ffjKeyOEmbedTitle = []byte("title") + +var ffjKeyOEmbedAuthorName = []byte("author_name") + +var ffjKeyOEmbedAuthorURL = []byte("author_url") + +var ffjKeyOEmbedProviderName = []byte("provider_name") + +var ffjKeyOEmbedProviderURL = []byte("provider_url") + +var ffjKeyOEmbedCacheAge = []byte("cache_age") + +var ffjKeyOEmbedThumbnailURL = []byte("thumbnail_url") + +var ffjKeyOEmbedThumbnailWidth = []byte("thumbnail_width") + +var ffjKeyOEmbedThumbnailHeight = []byte("thumbnail_height") + +var ffjKeyOEmbedURL = []byte("url") + +// UnmarshalJSON umarshall json - template of ffjson +func (j *OEmbed) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +// UnmarshalJSONFFLexer fast json unmarshall - template ffjson +func (j *OEmbed) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error + currentKey := ffjtOEmbedbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffjtOEmbednosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffjKeyOEmbedAuthorName, kn) { + currentKey = ffjtOEmbedAuthorName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedAuthorURL, kn) { + currentKey = ffjtOEmbedAuthorURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffjKeyOEmbedCacheAge, kn) { + currentKey = ffjtOEmbedCacheAge + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffjKeyOEmbedProviderName, kn) { + currentKey = ffjtOEmbedProviderName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedProviderURL, kn) { + currentKey = ffjtOEmbedProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffjKeyOEmbedType, kn) { + currentKey = ffjtOEmbedType + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedTitle, kn) { + currentKey = ffjtOEmbedTitle + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedThumbnailURL, kn) { + currentKey = ffjtOEmbedThumbnailURL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedThumbnailWidth, kn) { + currentKey = ffjtOEmbedThumbnailWidth + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffjKeyOEmbedThumbnailHeight, kn) { + currentKey = ffjtOEmbedThumbnailHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffjKeyOEmbedURL, kn) { + currentKey = ffjtOEmbedURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffjKeyOEmbedVersion, kn) { + currentKey = ffjtOEmbedVersion + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffjKeyOEmbedURL, kn) { + currentKey = ffjtOEmbedURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailHeight, kn) { + currentKey = ffjtOEmbedThumbnailHeight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailWidth, kn) { + currentKey = ffjtOEmbedThumbnailWidth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedThumbnailURL, kn) { + currentKey = ffjtOEmbedThumbnailURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedCacheAge, kn) { + currentKey = ffjtOEmbedCacheAge + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedProviderURL, kn) { + currentKey = ffjtOEmbedProviderURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedProviderName, kn) { + currentKey = ffjtOEmbedProviderName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedAuthorURL, kn) { + currentKey = ffjtOEmbedAuthorURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffjKeyOEmbedAuthorName, kn) { + currentKey = ffjtOEmbedAuthorName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyOEmbedTitle, kn) { + currentKey = ffjtOEmbedTitle + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffjKeyOEmbedVersion, kn) { + currentKey = ffjtOEmbedVersion + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffjKeyOEmbedType, kn) { + currentKey = ffjtOEmbedType + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffjtOEmbednosuchkey + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffjtOEmbedType: + goto handle_Type + + case ffjtOEmbedVersion: + goto handle_Version + + case ffjtOEmbedTitle: + goto handle_Title + + case ffjtOEmbedAuthorName: + goto handle_AuthorName + + case ffjtOEmbedAuthorURL: + goto handle_AuthorURL + + case ffjtOEmbedProviderName: + goto handle_ProviderName + + case ffjtOEmbedProviderURL: + goto handle_ProviderURL + + case ffjtOEmbedCacheAge: + goto handle_CacheAge + + case ffjtOEmbedThumbnailURL: + goto handle_ThumbnailURL + + case ffjtOEmbedThumbnailWidth: + goto handle_ThumbnailWidth + + case ffjtOEmbedThumbnailHeight: + goto handle_ThumbnailHeight + + case ffjtOEmbedURL: + goto handle_URL + + case ffjtOEmbednosuchkey: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: j.Type type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Type = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Version: + + /* handler: j.Version type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Version = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Title: + + /* handler: j.Title type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.Title = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AuthorName: + + /* handler: j.AuthorName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.AuthorName = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AuthorURL: + + /* handler: j.AuthorURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.AuthorURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProviderName: + + /* handler: j.ProviderName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ProviderName = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProviderURL: + + /* handler: j.ProviderURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ProviderURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CacheAge: + + /* handler: j.CacheAge type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.CacheAge = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailURL: + + /* handler: j.ThumbnailURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.ThumbnailURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailWidth: + + /* handler: j.ThumbnailWidth type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.ThumbnailWidth = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ThumbnailHeight: + + /* handler: j.ThumbnailHeight type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + j.ThumbnailHeight = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: j.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + j.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + // MarshalJSON marshal bytes to json - template func (j *Photo) MarshalJSON() ([]byte, error) { var buf fflib.Buffer @@ -1143,765 +1902,6 @@ done: return nil } -// MarshalJSON marshal bytes to json - template -func (j *Response) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if j == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := j.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// MarshalJSONBuf marshal buff to json - template -func (j *Response) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if j == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{ "type":`) - fflib.WriteJsonString(buf, string(j.Type)) - buf.WriteString(`,"version":`) - fflib.WriteJsonString(buf, string(j.Version)) - buf.WriteByte(',') - if len(j.Title) != 0 { - buf.WriteString(`"title":`) - fflib.WriteJsonString(buf, string(j.Title)) - buf.WriteByte(',') - } - if len(j.AuthorName) != 0 { - buf.WriteString(`"author_name":`) - fflib.WriteJsonString(buf, string(j.AuthorName)) - buf.WriteByte(',') - } - if len(j.AuthorURL) != 0 { - buf.WriteString(`"author_url":`) - fflib.WriteJsonString(buf, string(j.AuthorURL)) - buf.WriteByte(',') - } - if len(j.ProviderName) != 0 { - buf.WriteString(`"provider_name":`) - fflib.WriteJsonString(buf, string(j.ProviderName)) - buf.WriteByte(',') - } - if len(j.ProviderURL) != 0 { - buf.WriteString(`"provider_url":`) - fflib.WriteJsonString(buf, string(j.ProviderURL)) - buf.WriteByte(',') - } - if j.CacheAge != 0 { - buf.WriteString(`"cache_age":`) - fflib.FormatBits2(buf, uint64(j.CacheAge), 10, j.CacheAge < 0) - buf.WriteByte(',') - } - if len(j.ThumbnailURL) != 0 { - buf.WriteString(`"thumbnail_url":`) - fflib.WriteJsonString(buf, string(j.ThumbnailURL)) - buf.WriteByte(',') - } - if j.ThumbnailWidth != 0 { - buf.WriteString(`"thumbnail_width":`) - fflib.FormatBits2(buf, uint64(j.ThumbnailWidth), 10, j.ThumbnailWidth < 0) - buf.WriteByte(',') - } - if j.ThumbnailHeight != 0 { - buf.WriteString(`"thumbnail_height":`) - fflib.FormatBits2(buf, uint64(j.ThumbnailHeight), 10, j.ThumbnailHeight < 0) - buf.WriteByte(',') - } - if len(j.URL) != 0 { - buf.WriteString(`"url":`) - fflib.WriteJsonString(buf, string(j.URL)) - buf.WriteByte(',') - } - buf.Rewind(1) - buf.WriteByte('}') - return nil -} - -const ( - ffjtResponsebase = iota - ffjtResponsenosuchkey - - ffjtResponseType - - ffjtResponseVersion - - ffjtResponseTitle - - ffjtResponseAuthorName - - ffjtResponseAuthorURL - - ffjtResponseProviderName - - ffjtResponseProviderURL - - ffjtResponseCacheAge - - ffjtResponseThumbnailURL - - ffjtResponseThumbnailWidth - - ffjtResponseThumbnailHeight - - ffjtResponseURL -) - -var ffjKeyResponseType = []byte("type") - -var ffjKeyResponseVersion = []byte("version") - -var ffjKeyResponseTitle = []byte("title") - -var ffjKeyResponseAuthorName = []byte("author_name") - -var ffjKeyResponseAuthorURL = []byte("author_url") - -var ffjKeyResponseProviderName = []byte("provider_name") - -var ffjKeyResponseProviderURL = []byte("provider_url") - -var ffjKeyResponseCacheAge = []byte("cache_age") - -var ffjKeyResponseThumbnailURL = []byte("thumbnail_url") - -var ffjKeyResponseThumbnailWidth = []byte("thumbnail_width") - -var ffjKeyResponseThumbnailHeight = []byte("thumbnail_height") - -var ffjKeyResponseURL = []byte("url") - -// UnmarshalJSON umarshall json - template of ffjson -func (j *Response) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -// UnmarshalJSONFFLexer fast json unmarshall - template ffjson -func (j *Response) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error - currentKey := ffjtResponsebase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffjtResponsenosuchkey - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'a': - - if bytes.Equal(ffjKeyResponseAuthorName, kn) { - currentKey = ffjtResponseAuthorName - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseAuthorURL, kn) { - currentKey = ffjtResponseAuthorURL - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'c': - - if bytes.Equal(ffjKeyResponseCacheAge, kn) { - currentKey = ffjtResponseCacheAge - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'p': - - if bytes.Equal(ffjKeyResponseProviderName, kn) { - currentKey = ffjtResponseProviderName - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseProviderURL, kn) { - currentKey = ffjtResponseProviderURL - state = fflib.FFParse_want_colon - goto mainparse - } - - case 't': - - if bytes.Equal(ffjKeyResponseType, kn) { - currentKey = ffjtResponseType - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseTitle, kn) { - currentKey = ffjtResponseTitle - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseThumbnailURL, kn) { - currentKey = ffjtResponseThumbnailURL - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseThumbnailWidth, kn) { - currentKey = ffjtResponseThumbnailWidth - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffjKeyResponseThumbnailHeight, kn) { - currentKey = ffjtResponseThumbnailHeight - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffjKeyResponseURL, kn) { - currentKey = ffjtResponseURL - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'v': - - if bytes.Equal(ffjKeyResponseVersion, kn) { - currentKey = ffjtResponseVersion - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffjKeyResponseURL, kn) { - currentKey = ffjtResponseURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseThumbnailHeight, kn) { - currentKey = ffjtResponseThumbnailHeight - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseThumbnailWidth, kn) { - currentKey = ffjtResponseThumbnailWidth - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseThumbnailURL, kn) { - currentKey = ffjtResponseThumbnailURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseCacheAge, kn) { - currentKey = ffjtResponseCacheAge - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseProviderURL, kn) { - currentKey = ffjtResponseProviderURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseProviderName, kn) { - currentKey = ffjtResponseProviderName - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseAuthorURL, kn) { - currentKey = ffjtResponseAuthorURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffjKeyResponseAuthorName, kn) { - currentKey = ffjtResponseAuthorName - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffjKeyResponseTitle, kn) { - currentKey = ffjtResponseTitle - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffjKeyResponseVersion, kn) { - currentKey = ffjtResponseVersion - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffjKeyResponseType, kn) { - currentKey = ffjtResponseType - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffjtResponsenosuchkey - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffjtResponseType: - goto handle_Type - - case ffjtResponseVersion: - goto handle_Version - - case ffjtResponseTitle: - goto handle_Title - - case ffjtResponseAuthorName: - goto handle_AuthorName - - case ffjtResponseAuthorURL: - goto handle_AuthorURL - - case ffjtResponseProviderName: - goto handle_ProviderName - - case ffjtResponseProviderURL: - goto handle_ProviderURL - - case ffjtResponseCacheAge: - goto handle_CacheAge - - case ffjtResponseThumbnailURL: - goto handle_ThumbnailURL - - case ffjtResponseThumbnailWidth: - goto handle_ThumbnailWidth - - case ffjtResponseThumbnailHeight: - goto handle_ThumbnailHeight - - case ffjtResponseURL: - goto handle_URL - - case ffjtResponsenosuchkey: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Type: - - /* handler: j.Type type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.Type = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Version: - - /* handler: j.Version type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.Version = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Title: - - /* handler: j.Title type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.Title = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_AuthorName: - - /* handler: j.AuthorName type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.AuthorName = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_AuthorURL: - - /* handler: j.AuthorURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.AuthorURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProviderName: - - /* handler: j.ProviderName type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.ProviderName = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProviderURL: - - /* handler: j.ProviderURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.ProviderURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_CacheAge: - - /* handler: j.CacheAge type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - j.CacheAge = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ThumbnailURL: - - /* handler: j.ThumbnailURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.ThumbnailURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ThumbnailWidth: - - /* handler: j.ThumbnailWidth type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - j.ThumbnailWidth = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ThumbnailHeight: - - /* handler: j.ThumbnailHeight type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - j.ThumbnailHeight = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_URL: - - /* handler: j.URL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - j.URL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - - return nil -} - // MarshalJSON marshal bytes to json - template func (j *Rich) MarshalJSON() ([]byte, error) { var buf fflib.Buffer From aebbd0d637c8238a5b81c8093a335271fc156a1d Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Fri, 24 May 2019 14:29:54 +0500 Subject: [PATCH 5/7] :wrench: Added Makefile --- Makefile | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..24bd0f9 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +PROJECT_NAMESPACE := $(CI_PROJECT_NAMESPACE) +PROJECT_NAME := $(CI_PROJECT_NAME) +PROJECT_PATH := "$(PROJECT_NAMESPACE)/$(PROJECT_NAME)" +PACKAGE_NAME := "gitlab.com/$(PROJECT_PATH)" +PACKAGE_PATH := "$(GOPATH)/src/$(PACKAGE_NAME)" +PACKAGE_LIST := $(shell go list $(PACKAGE_NAME)/... | grep -v /vendor/) +GO_FILES := $(shell find . -name '*.go' | grep -v /vendor/ | grep -v _test.go) + +.PHONY: all lint test rase coverage dep + +all: dep test race lint + +lint: ## Lint the files + @golangci-lint run ./... + +test: ## Run unittests + @go test -short $(PACKAGE_NAME)/... + +race: dep ## Run data race detector + @go test -race -short ${PACKAGE_LIST} + +coverage: ## Generate global code coverage report + @go test -cover -v -coverpkg=$(PACKAGE_NAME)/... ${PACKAGE_LIST} + +dep: ## Get the dependencies + @go get -v -d -t $(PACKAGE_NAME)/... + +help: ## Display this help screen + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' From 2d4f5bf99177d66fd5c1fea15deb433262a17cd6 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Fri, 24 May 2019 14:30:27 +0500 Subject: [PATCH 6/7] :construction_worker: Added GitLab CI config --- .gitlab-ci.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..7e03afd --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,31 @@ +image: golang:alpine + +stages: + - test + - review + +before_script: + - apk add --no-cache git build-base bash make + - mkdir -p /go/src/gitlab.com/$CI_PROJECT_NAMESPACE /go/src/_/builds + - cp -r $CI_PROJECT_DIR /go/src/gitlab.com/$CI_PROJECT_PATH + - ln -s /go/src/gitlab.com/$CI_PROJECT_NAMESPACE /go/src/_/builds/$CI_PROJECT_NAMESPACE + - go get github.com/golangci/golangci-lint/cmd/golangci-lint + - go install github.com/golangci/golangci-lint/cmd/golangci-lint + - make dep + +unit_tests: + stage: test + script: + - make test + +code_coverage: + stage: test + script: + - make coverage + coverage: '/^coverage:\s(\d+(?:\.\d+)?%)/' + +lint_code: + stage: review + script: + - make lint + allow_failure: true From e1c4ab53891facacd7531562e59be7359f2fe403 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Fri, 24 May 2019 14:54:46 +0500 Subject: [PATCH 7/7] :pencil: Updated README.md --- README.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eecf2ae..7aac88b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,34 @@ # oEmbed -oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the resource directly. \ No newline at end of file +oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the resource directly. + +## Start using telegraph +Download and install it: +`$ go get -u gitlab.com/toby3d/oembed` + +Import it in your code: +`import "gitlab.com/toby3d/oembed"` + +## Example +```go +package main + +import "gitlab.com/toby3d/oembed" + +var targetUrl = "https://www.youtube.com/watch?v=8jPQjjsBbIc" + +func main() { + // optional: checks what url has YouTube provider + if !oembed.HasProvider(targetUrl) { + return + } + + // extract oEmbed object of source url + data, err := oembed.Extract(targetUrl) + if err != nil { + // provider not found / source not found / bad response... + panic(err) + } + + // use data as you want +} +```