# HG changeset patch # User tduigou # Date 1752747444 0 # Node ID fbb241adf6c2412bcb1d571216c86bb7798d3bb0 # Parent 074a76e84b8063d7c3c92127835202040d1d98ec planemo upload for repository https://github.com/Edinburgh-Genome-Foundry/DnaCauldron/tree/master commit af45e5e0e81535ab0423b0bcff8b5b220bb9b4d0-dirty diff -r 074a76e84b80 -r fbb241adf6c2 cloning_similation.xml --- a/cloning_similation.xml Mon May 26 13:39:57 2025 +0000 +++ b/cloning_similation.xml Thu Jul 17 10:17:24 2025 +0000 @@ -1,8 +1,8 @@ A cloning simulator for synthetic biology - 0 - 0.1.0 + 1 + 0.2.0 flametree @@ -31,36 +31,47 @@ --parts_files '$genbank_file_paths' --domesticated_seq '$domesticated_input_paths' --assembly_csv 'assembly_csv.csv' - --assembly_plan_name '$assembly_plan_name' --file_name_mapping '$file_name_mapping' --file_name_mapping_dom '$file_name_mapping_dom' - --use_file_names_as_id '$adv.use_file_names_as_ids' + --use_json_paramers '$json_use.use_json_paramers' + #if not $json_use.use_json_paramers: + --enzyme '$json_use.enzyme' + --topology '$json_use.topology' + --assembly_plan_name '$json_use.assembly_plan_name' + #else: + --json_conf '$json_use.json_conf' + #end if + --use_file_names_as_id '$use_file_names_as_ids' --outdir_simulation 'outdir_zip' --outdir_gb 'outdir_gb' - --output_simulation 'output_zip.zip' - --enzyme '$adv.enzyme' - --topology '$topology' && + --output_simulation 'output_zip.zip' && cp 'output_zip.zip' '$output_zip' ]]> - - - - - - - - - - - -
- - -
+ + + + + + + + + + + + + + + + + + + + +
@@ -88,9 +99,12 @@ - - - + + + + + + @@ -130,9 +144,12 @@ - - - + + + + + + @@ -168,9 +185,12 @@ - - - + + + + + + @@ -194,9 +214,12 @@ - - - + + + + + + @@ -220,9 +243,12 @@ - - - + + + + + + @@ -263,7 +289,12 @@ - + + + + + + @@ -273,8 +304,6 @@ - - @@ -325,9 +354,67 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -369,6 +456,7 @@ **Parameters**: --------------- +* **Use parameters from JSON**: Yes/No parameter to ask user if he wants to set parameters manually or using JSON file. * **Assemby csv**: csv file containes the construct names with their parts. (Without Header) * **GenBank files**: Upload all the parts sequences for your assembli(es). Don't forget the receptor vector(s). * **Domesticated GenBank**: Dimesticated GenBank list (Optional) diff -r 074a76e84b80 -r fbb241adf6c2 cloning_simulation.py --- a/cloning_simulation.py Mon May 26 13:39:57 2025 +0000 +++ b/cloning_simulation.py Thu Jul 17 10:17:24 2025 +0000 @@ -1,29 +1,30 @@ +import argparse import os +import json +import zipfile +import pandas import dnacauldron -from Bio import SeqIO -import pandas -import argparse -import zipfile + def cloning_simulation(files_to_assembly, domesticated_list, csv_file, assembly_type, topology, file_name_mapping, file_name_mapping_dom, use_file_names_as_id, - outdir_simulation, output_simulation,enzyme,outdir_gb): + outdir_simulation, output_simulation, enzyme, outdir_gb): files_to_assembly = files_to_assembly.split(',') repository = dnacauldron.SequenceRepository() - repository.import_records(files=files_to_assembly, - use_file_names_as_ids=use_file_names_as_id, + repository.import_records(files=files_to_assembly, + use_file_names_as_ids=use_file_names_as_id, topology=topology) if domesticated_list: domesticated_files = domesticated_list.split(',') - repository.import_records(files=domesticated_files, - use_file_names_as_ids=use_file_names_as_id, - topology=topology) + repository.import_records(files=domesticated_files, + use_file_names_as_ids=use_file_names_as_id, + topology=topology) - #refine the real record name dict + # refine the real record name dict if isinstance(file_name_mapping, str): file_name_mapping = dict( item.split(":") for item in file_name_mapping.split(",") @@ -31,11 +32,11 @@ real_names = { os.path.splitext(os.path.basename(k))[0]: v.replace(".gb", "") for k, v in file_name_mapping.items() - } + } - #refine the real record name dict_dom + # refine the real record name dict_dom if file_name_mapping_dom == "": - file_name_mapping_dom={} + file_name_mapping_dom = {} else: if isinstance(file_name_mapping_dom, str): file_name_mapping_dom = dict( @@ -44,10 +45,10 @@ dom_real_names = { os.path.splitext(os.path.basename(k))[0]: v.replace(".gb", "") for k, v in file_name_mapping_dom.items() - } + } real_names.update(dom_real_names) - - #update the records + + # update the records for key, record in list(repository.collections["parts"].items()): current_id = record.id @@ -58,9 +59,9 @@ record.description = new_id repository.collections["parts"][new_id] = repository.collections["parts"].pop(key) ######################################################## - #print (f"repo: {vars(repository)}") - #any(pandas.read_csv(csv_file, index_col=0, header=None).duplicated()) - df=pandas.read_csv(csv_file, index_col=0, header=None) + # print (f"repo: {vars(repository)}") + # any(pandas.read_csv(csv_file, index_col=0, header=None).duplicated()) + df = pandas.read_csv(csv_file, index_col=0, header=None) if df.duplicated().any(): raise ValueError("Duplicate rows found in the data!") @@ -78,7 +79,7 @@ assembly_class = dnacauldron.LigaseCyclingReactionAssembly else: raise ValueError(f"Unsupported assembly type: {assembly_type}") - + new_csvname = "assambly.csv" os.rename(csv_file, new_csvname) @@ -113,9 +114,9 @@ full_path = os.path.join(root, file) arcname = os.path.relpath(full_path, outdir_simulation) zipf.write(full_path, arcname) - #print("Files in the zip archive:") - #for info in zipf.infolist(): - #print(info.filename) + # print("Files in the zip archive:") + # for info in zipf.infolist(): + # print(info.filename) for member in zipf.namelist(): # Only extract actual files inside 'all_construct_records/' (not subfolders) if member.startswith("assambly_simulation/all_construct_records/") and not member.endswith("/"): @@ -137,40 +138,63 @@ def parse_command_line_args(): parser = argparse.ArgumentParser(description="Domestication") - parser.add_argument("--parts_files", required=True, + parser.add_argument("--parts_files", required=True, help="List of GenBank files (Comma-separated)") - parser.add_argument("--domesticated_seq", required=True, + parser.add_argument("--domesticated_seq", required=True, help="output of domestication (ganbank list)") - parser.add_argument("--assembly_csv", required=True, + parser.add_argument("--assembly_csv", required=True, help="csv assembly") - parser.add_argument('--assembly_plan_name', type=str, + parser.add_argument('--assembly_plan_name', type=str, required=False, help='type of assembly') - parser.add_argument('--topology', type=str, + parser.add_argument('--topology', type=str, required=False, help='"circular" or "linear"') - parser.add_argument('--file_name_mapping', type=str, + parser.add_argument('--file_name_mapping', type=str, help='Mapping of Galaxy filenames to original filenames') - parser.add_argument('--file_name_mapping_dom', type=str, + parser.add_argument('--file_name_mapping_dom', type=str, help='Mapping of Galaxy filenames to original domestication filenames') - parser.add_argument("--use_file_names_as_id", type=lambda x: x.lower() == 'true', default=True, + parser.add_argument("--use_file_names_as_id", type=lambda x: x.lower() == 'true', default=True, help="Use file names as IDs (True/False)") - parser.add_argument("--outdir_simulation", required=True, + parser.add_argument("--outdir_simulation", required=True, help="dir output for cloning simulation results") - parser.add_argument("--output_simulation", required=True, + parser.add_argument("--output_simulation", required=True, help="zip output for cloning simulation results") - parser.add_argument('--enzyme', type=str, + parser.add_argument('--enzyme', type=str,required=False, help='enzyme to use') - parser.add_argument("--outdir_gb", required=True, + parser.add_argument("--outdir_gb", required=True, help="dir output constructs gb files") + parser.add_argument("--use_json_paramers", required=True, + help="Use parameters from JSON: true/false") + parser.add_argument("--json_conf", required=False, + help="JSON config file with DB parameters") return parser.parse_args() + if __name__ == "__main__": args = parse_command_line_args() + #json param checking + config_params = {} + use_json = args.use_json_paramers == 'true' + if use_json: + if not args.json_conf: + raise ValueError("You must provide --json_conf when --use_json_paramers is 'true'") + with open(args.json_conf, "r") as f: + config_params = json.load(f) + else: + config_params = { + "assembly_plan_name": args.assembly_plan_name, + "topology": args.topology, + "enzyme": args.enzyme + } + assembly_plan_name = config_params["assembly_plan_name"] + topology = config_params["topology"] + enzyme = config_params["enzyme"] + cloning_simulation( args.parts_files, args.domesticated_seq, - args.assembly_csv, args.assembly_plan_name, args.topology, - args.file_name_mapping, args.file_name_mapping_dom, + args.assembly_csv, assembly_plan_name, topology, + args.file_name_mapping, args.file_name_mapping_dom, args.use_file_names_as_id, args.outdir_simulation, - args.output_simulation, args.enzyme, args.outdir_gb - ) \ No newline at end of file + args.output_simulation, enzyme, args.outdir_gb + ) diff -r 074a76e84b80 -r fbb241adf6c2 output.html --- a/output.html Mon May 26 13:39:57 2025 +0000 +++ b/output.html Thu Jul 17 10:17:24 2025 +0000 @@ -285,7 +285,7 @@ var md = window.markdownit({ html: true, }); - target.innerHTML = md.render(atob('IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iNyIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iNyIgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSI3IFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9IjciIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0iMCBTa2lwcGVkIj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLWRhbmdlciIgc3R5bGU9IndpZHRoOiAwLjAlIiBhcmlhLXZhbHVlbm93PSIwIiBhcmlhLXZhbHVlbWluPSIwIiBhcmlhLXZhbHVlbWF4PSI3IiB0aXRsZT0iMCBGYWlsZWQgb3IgRXJyb3JlZCI+CiAgPC9kaXY+CjwvZGl2PgoKfCBUZXN0IFN0YXRlIHwgQ291bnQgfAp8IC0tLS0tLS0tLS0gfCAtLS0tLSB8CnwgVG90YWwgICAgICB8IDcgfAp8IFBhc3NlZCAgICAgfCA3IHwKfCBFcnJvciAgICAgIHwgMCB8CnwgRmFpbHVyZSAgICB8IDAgfAp8IFNraXBwZWQgICAgfCAwIHwKCgo8ZGV0YWlscyA+PHN1bW1hcnk+UGFzc2VkIFRlc3RzPC9zdW1tYXJ5PgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBjbG9uaW5nX3NpbXVsYXRpb24gKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIG1rZGlyICdvdXRkaXJfemlwJyAmJiBta2RpciAnb3V0ZGlyX2diJyAmJiBjcCAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8yLzAvZC9kYXRhc2V0XzIwZDQwNjFhLTgxZTQtNDkxNS1hODQxLWFlOGFhNTk1YzdiNC5kYXQnICdhc3NlbWJseV9jc3YuY3N2JyAmJiBweXRob24gJy9ob21lL3JraGFsZWQvZ2FsYXh5dG9vbHMvdG9vbHMvY2xvbmluZ19zaW11bGF0aW9uL2Nsb25pbmdfc2ltdWxhdGlvbi5weScgLS1wYXJ0c19maWxlcyAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9kL2QvOC9kYXRhc2V0X2RkODQ0ZDYxLWZjMDUtNDFkOS04MTc5LTIxMjMzNjQ5NDA3ZC5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9jL2IvMi9kYXRhc2V0X2NiMjM2MmYzLTRiMzItNDZjYy1hMjI3LWRjMTU3NDJiZjllNy5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy82L2QvNy9kYXRhc2V0XzZkNzJkZmU0LTNlNmItNGJhZi1iN2I1LTlmYjJlODQzNDYxYS5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8zLzMvZS9kYXRhc2V0XzMzZTgwNGIyLTBmYmUtNDg0NC05YjVkLTQyMGU4YTJkYjc3Mi5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8yL2QvYi9kYXRhc2V0XzJkYjM4MjVjLTUzOGItNDgzZi1iNmZmLThkYzRlY2MwMzc4MC5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8wLzQvOC9kYXRhc2V0XzA0OGVlN2VkLTVmNGMtNDFlZi1hZWQ0LWYyY2Y5NzVhYWM5Mi5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9jLzUvMC9kYXRhc2V0X2M1MDVjMTJlLTcwODktNGExNy1hNjA1LTRmMTFkYWQ2ZjFkNy5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy80LzkvMS9kYXRhc2V0XzQ5MTJmMTJkLTA4NDItNDZiNy04YWFmLTJhOTRhNTJmMDRmOC5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzIvYi9kYXRhc2V0X2IyYjk2ZDQxLWM3YzgtNDljMS05ZDM1LWNlYWExYzdkMzAyNy5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzgvZi9kYXRhc2V0X2I4ZmQ0NjEwLTJmNmQtNDc1Yy04NDA1LThiZjhjMmJjMDMwNi5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8wLzkvZi9kYXRhc2V0XzA5ZjRiMDIwLTRlN2ItNDkzOS1iM2JhLTM0OGY5MWNiOTJiYy5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9lL2IvNy9kYXRhc2V0X2ViNzMwMjYzLTk0NDItNGRjYS1hMmRjLTM0YjFjYWU0NTBkNy5kYXQnIC0tZG9tZXN0aWNhdGVkX3NlcSAnJyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1hc3NlbWJseV9wbGFuX25hbWUgJ1R5cGUyc1Jlc3RyaWN0aW9uQXNzZW1ibHknIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZC9kLzgvZGF0YXNldF9kZDg0NGQ2MS1mYzA1LTQxZDktODE3OS0yMTIzMzY0OTQwN2QuZGF0OnBhcnRfQS5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2MvYi8yL2RhdGFzZXRfY2IyMzYyZjMtNGIzMi00NmNjLWEyMjctZGMxNTc0MmJmOWU3LmRhdDpwYXJ0X0IuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy82L2QvNy9kYXRhc2V0XzZkNzJkZmU0LTNlNmItNGJhZi1iN2I1LTlmYjJlODQzNDYxYS5kYXQ6cGFydF9DLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMy8zL2UvZGF0YXNldF8zM2U4MDRiMi0wZmJlLTQ4NDQtOWI1ZC00MjBlOGEyZGI3NzIuZGF0OnBhcnRfRC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzIvZC9iL2RhdGFzZXRfMmRiMzgyNWMtNTM4Yi00ODNmLWI2ZmYtOGRjNGVjYzAzNzgwLmRhdDpwYXJ0X0UuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8wLzQvOC9kYXRhc2V0XzA0OGVlN2VkLTVmNGMtNDFlZi1hZWQ0LWYyY2Y5NzVhYWM5Mi5kYXQ6cGFydF9GLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy81LzAvZGF0YXNldF9jNTA1YzEyZS03MDg5LTRhMTctYTYwNS00ZjExZGFkNmYxZDcuZGF0OnBhcnRfRy5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzQvOS8xL2RhdGFzZXRfNDkxMmYxMmQtMDg0Mi00NmI3LThhYWYtMmE5NGE1MmYwNGY4LmRhdDpwYXJ0X0guZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzIvYi9kYXRhc2V0X2IyYjk2ZDQxLWM3YzgtNDljMS05ZDM1LWNlYWExYzdkMzAyNy5kYXQ6cGFydF9JLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYi84L2YvZGF0YXNldF9iOGZkNDYxMC0yZjZkLTQ3NWMtODQwNS04YmY4YzJiYzAzMDYuZGF0OnBhcnRfSi5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzAvOS9mL2RhdGFzZXRfMDlmNGIwMjAtNGU3Yi00OTM5LWIzYmEtMzQ4ZjkxY2I5MmJjLmRhdDpwYXJ0X0suZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9lL2IvNy9kYXRhc2V0X2ViNzMwMjYzLTk0NDItNGRjYS1hMmRjLTM0YjFjYWU0NTBkNy5kYXQ6cGFydF9MLmdiJyAtLWZpbGVfbmFtZV9tYXBwaW5nX2RvbSAnJyAtLXVzZV9maWxlX25hbWVzX2FzX2lkICd0cnVlJyAtLW91dGRpcl9zaW11bGF0aW9uICdvdXRkaXJfemlwJyAtLW91dGRpcl9nYiAnb3V0ZGlyX2diJyAtLW91dHB1dF9zaW11bGF0aW9uICdvdXRwdXRfemlwLnppcCcgLS1lbnp5bWUgJ2F1dG8nIC0tdG9wb2xvZ3kgJ2NpcmN1bGFyJyAmJiBjcCAnb3V0cHV0X3ppcC56aXAnICcvdG1wL3RtcG0xZnlvYjN0L2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMTQvb3V0cHV0cy9kYXRhc2V0XzY0ZDFkOGFjLTMyZjAtNDA5NS1iZTMwLTIyZWVlMzFlMjRhNC5kYXQnCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvNCBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvNCBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDUwJXzilojilojilojilojiloggICAgIHwgMi80IFswMDowMDwwMDowMCwgIDIuNThpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA3NSV84paI4paI4paI4paI4paI4paI4paI4paMICB8IDMvNCBbMDA6MDE8MDA6MDAsICAyLjI2aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAxMDAlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiHwgNC80IFswMDowMjwwMDowMCwgIDEuODJpdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBTaW11bGF0aW5nIGFzc2VtYmx5IHBsYW4gYXNzYW1ibHkuLi4KICAgICAgeydjYW5jZWxsZWRfYXNzZW1ibGllcyc6IDAsICdlcnJvcmVkX2Fzc2VtYmxpZXMnOiAwLCAndmFsaWRfYXNzZW1ibGllcyc6IDR9CiAgICAgIEdlbmVyYXRpbmcgYXNzZW1ibGllcyByZXBvcnRzLi4uCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBnZW5iYW5rXF9maWxlcyB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDEsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGFzc2VtYmx5XF9wbGFuXF9uYW1lIHwgYCAiVHlwZTJzUmVzdHJpY3Rpb25Bc3NlbWJseSIgYCB8CiAgICAgICB8IHRvcG9sb2d5IHwgYCAiY2lyY3VsYXIiIGAgfAogICAgICAgfCBhZHYgfCBgIHsiZW56eW1lIjogImF1dG8iLCAidXNlX2ZpbGVfbmFtZXNfYXNfaWRzIjogdHJ1ZX0gYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbTFmeW9iM3QvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImlucHV0IiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IGNsb25pbmdfc2ltdWxhdGlvbiAoVGVzdCAjIDIpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcl96aXAnICYmIG1rZGlyICdvdXRkaXJfZ2InICYmIGNwICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzEvNi9mL2RhdGFzZXRfMTZmNmQ0NzUtYjYxNC00NDI3LTljMDYtOTVhMGQ1NmQzYzkyLmRhdCcgJ2Fzc2VtYmx5X2Nzdi5jc3YnICYmIHB5dGhvbiAnL2hvbWUvcmtoYWxlZC9nYWxheHl0b29scy90b29scy9jbG9uaW5nX3NpbXVsYXRpb24vY2xvbmluZ19zaW11bGF0aW9uLnB5JyAtLXBhcnRzX2ZpbGVzICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzkvNi9hL2RhdGFzZXRfOTZhOGY3NjktMzU0NC00NDA3LWIwNjQtMDRmMjRhNzMzODk2LmRhdCcgLS1kb21lc3RpY2F0ZWRfc2VxICcnIC0tYXNzZW1ibHlfY3N2ICdhc3NlbWJseV9jc3YuY3N2JyAtLWFzc2VtYmx5X3BsYW5fbmFtZSAnR2lic29uQXNzZW1ibHknIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS82L2EvZGF0YXNldF85NmE4Zjc2OS0zNTQ0LTQ0MDctYjA2NC0wNGYyNGE3MzM4OTYuZGF0OmdpYnNvbl9zZXF1ZW5jZXMuZmEnIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wbTFmeW9iM3Qvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNy9vdXRwdXRzL2RhdGFzZXRfNTA1ZWNiMmQtYTZjYS00MGQzLTg2NGQtZmMzZThiYzdmOWExLmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC81IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC81IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNDAlfOKWiOKWiOKWiOKWiCAgICAgIHwgMi81IFswMDowMDwwMDowMCwgIDQuMzVpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA2MCV84paI4paI4paI4paI4paI4paIICAgIHwgMy81IFswMDowMDwwMDowMCwgIDQuMzNpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA4MCV84paI4paI4paI4paI4paI4paI4paI4paIICB8IDQvNSBbMDA6MDA8MDA6MDAsICA0LjMxaXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAxMDAlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiHwgNS81IFswMDowMTwwMDowMCwgIDMuNTNpdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBTaW11bGF0aW5nIGFzc2VtYmx5IHBsYW4gYXNzYW1ibHkuLi4KICAgICAgeydjYW5jZWxsZWRfYXNzZW1ibGllcyc6IDAsICdlcnJvcmVkX2Fzc2VtYmxpZXMnOiAyLCAndmFsaWRfYXNzZW1ibGllcyc6IDN9CiAgICAgIEdlbmVyYXRpbmcgYXNzZW1ibGllcyByZXBvcnRzLi4uCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBnZW5iYW5rXF9maWxlcyB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDMsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGFzc2VtYmx5XF9wbGFuXF9uYW1lIHwgYCAiR2lic29uQXNzZW1ibHkiIGAgfAogICAgICAgfCB0b3BvbG9neSB8IGAgImNpcmN1bGFyIiBgIHwKICAgICAgIHwgYWR2IHwgYCB7ImVuenltZSI6ICJhdXRvIiwgInVzZV9maWxlX25hbWVzX2FzX2lkcyI6IHRydWV9IGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG0xZnlvYjN0L2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJpbnB1dCIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBjbG9uaW5nX3NpbXVsYXRpb24gKFRlc3QgIyAzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIG1rZGlyICdvdXRkaXJfemlwJyAmJiBta2RpciAnb3V0ZGlyX2diJyAmJiBjcCAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9mLzcvYy9kYXRhc2V0X2Y3YzlhZDc4LThlNzQtNGEzYy05NTc5LTgwYTkzYWM5MjNkZS5kYXQnICdhc3NlbWJseV9jc3YuY3N2JyAmJiBweXRob24gJy9ob21lL3JraGFsZWQvZ2FsYXh5dG9vbHMvdG9vbHMvY2xvbmluZ19zaW11bGF0aW9uL2Nsb25pbmdfc2ltdWxhdGlvbi5weScgLS1wYXJ0c19maWxlcyAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9mLzUvNi9kYXRhc2V0X2Y1NjkxM2JkLWZjOTItNDEyMi04Y2YxLWQ5YjFjNjBlODM4NS5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8zL2IvNC9kYXRhc2V0XzNiNGU3NWIzLWU2YTYtNDU5YS1hOTU5LWQ0M2NlMDBjMzcwMS5kYXQnIC0tZG9tZXN0aWNhdGVkX3NlcSAnJyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1hc3NlbWJseV9wbGFuX25hbWUgJ0xpZ2FzZUN5Y2xpbmdSZWFjdGlvbkFzc2VtYmx5JyAtLWZpbGVfbmFtZV9tYXBwaW5nICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2YvNS82L2RhdGFzZXRfZjU2OTEzYmQtZmM5Mi00MTIyLThjZjEtZDliMWM2MGU4Mzg1LmRhdDpSRlBfR0ZQX3BsYXNtaWRfQk9zLmZhLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMy9iLzQvZGF0YXNldF8zYjRlNzViMy1lNmE2LTQ1OWEtYTk1OS1kNDNjZTAwYzM3MDEuZGF0OlJGUF9HRlBfcGxhc21pZF9wYXJ0cy5mYScgLS1maWxlX25hbWVfbWFwcGluZ19kb20gJycgLS11c2VfZmlsZV9uYW1lc19hc19pZCAndHJ1ZScgLS1vdXRkaXJfc2ltdWxhdGlvbiAnb3V0ZGlyX3ppcCcgLS1vdXRkaXJfZ2IgJ291dGRpcl9nYicgLS1vdXRwdXRfc2ltdWxhdGlvbiAnb3V0cHV0X3ppcC56aXAnIC0tZW56eW1lICdhdXRvJyAtLXRvcG9sb2d5ICdjaXJjdWxhcicgJiYgY3AgJ291dHB1dF96aXAuemlwJyAnL3RtcC90bXBtMWZ5b2IzdC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzIxL291dHB1dHMvZGF0YXNldF8zZmM2MjVjOC03MjJmLTRlZmItOWMwOS0wZDY2NGRlYzJhOWQuZGF0JwogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzIgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzIgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6IDEwMCV84paI4paI4paI4paI4paI4paI4paI4paI4paI4paIfCAyLzIgWzAwOjAwPDAwOjAwLCAgMi40MGl0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIFNpbXVsYXRpbmcgYXNzZW1ibHkgcGxhbiBhc3NhbWJseS4uLgogICAgICB7J2NhbmNlbGxlZF9hc3NlbWJsaWVzJzogMCwgJ2Vycm9yZWRfYXNzZW1ibGllcyc6IDIsICd2YWxpZF9hc3NlbWJsaWVzJzogMH0KICAgICAgR2VuZXJhdGluZyBhc3NlbWJsaWVzIHJlcG9ydHMuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGdlbmJhbmtcX2ZpbGVzIHwgYCB7InZhbHVlcyI6IFt7ImlkIjogNSwgInNyYyI6ICJoZGNhIn1dfSBgIHwKICAgICAgIHwgZG9tZXN0aWNhdGVkXF9pbnB1dCB8IGAgTm9uZSBgIHwKICAgICAgIHwgYXNzZW1ibHlcX3BsYW5cX25hbWUgfCBgICJMaWdhc2VDeWNsaW5nUmVhY3Rpb25Bc3NlbWJseSIgYCB8CiAgICAgICB8IHRvcG9sb2d5IHwgYCAiY2lyY3VsYXIiIGAgfAogICAgICAgfCBhZHYgfCBgIHsiZW56eW1lIjogImF1dG8iLCAidXNlX2ZpbGVfbmFtZXNfYXNfaWRzIjogdHJ1ZX0gYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wbTFmeW9iM3QvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImlucHV0IiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IGNsb25pbmdfc2ltdWxhdGlvbiAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcl96aXAnICYmIG1rZGlyICdvdXRkaXJfZ2InICYmIGNwICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2YvYi80L2RhdGFzZXRfZmI0MjZjZWItMjYxNS00NDdkLWIwNGUtYWU0MjUzYWY2NDhkLmRhdCcgJ2Fzc2VtYmx5X2Nzdi5jc3YnICYmIHB5dGhvbiAnL2hvbWUvcmtoYWxlZC9nYWxheHl0b29scy90b29scy9jbG9uaW5nX3NpbXVsYXRpb24vY2xvbmluZ19zaW11bGF0aW9uLnB5JyAtLXBhcnRzX2ZpbGVzICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2UvYy9iL2RhdGFzZXRfZWNiMDU3YTItZGJmOC00MTA1LWI1NWUtZDcyNmVjMWU5NjkzLmRhdCwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzQvOS84L2RhdGFzZXRfNDk4ZmU3MDMtNTJjMy00MTYyLWJlMDAtOTNmNDlmMDA2ODlkLmRhdCwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2QvNC8wL2RhdGFzZXRfZDQwMmMyYWMtY2EyZC00NmI2LWI5ZDMtOTg5NzM5Njc4ZGUxLmRhdCwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzEvMS8yL2RhdGFzZXRfMTEyNGZmMzYtZjYxYi00OTMyLWFkYzYtMGI2ZGU1YTg4OGFlLmRhdCwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzgvZi9lL2RhdGFzZXRfOGZlNTEwOTEtMzljNS00YWE2LWIwZWMtZmJjMzQ3MTJlNDA1LmRhdCcgLS1kb21lc3RpY2F0ZWRfc2VxICcnIC0tYXNzZW1ibHlfY3N2ICdhc3NlbWJseV9jc3YuY3N2JyAtLWFzc2VtYmx5X3BsYW5fbmFtZSAnQkFTSUNBc3NlbWJseScgLS1maWxlX25hbWVfbWFwcGluZyAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9lL2MvYi9kYXRhc2V0X2VjYjA1N2EyLWRiZjgtNDEwNS1iNTVlLWQ3MjZlYzFlOTY5My5kYXQ6R0ZQLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNC85LzgvZGF0YXNldF80OThmZTcwMy01MmMzLTQxNjItYmUwMC05M2Y0OWYwMDY4OWQuZGF0OnAxNUFfa2FuLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZC80LzAvZGF0YXNldF9kNDAyYzJhYy1jYTJkLTQ2YjYtYjlkMy05ODk3Mzk2NzhkZTEuZGF0OnByb21vdGVyLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMS8xLzIvZGF0YXNldF8xMTI0ZmYzNi1mNjFiLTQ5MzItYWRjNi0wYjZkZTVhODg4YWUuZGF0OlJGUC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzgvZi9lL2RhdGFzZXRfOGZlNTEwOTEtMzljNS00YWE2LWIwZWMtZmJjMzQ3MTJlNDA1LmRhdDpvbGlnb3MuZmEnIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wbTFmeW9iM3Qvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8yOC9vdXRwdXRzL2RhdGFzZXRfNDVlZjdlZDUtNDhhYS00Mjg2LWFjNTEtMzM5MWI1OTNlYjdjLmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC8xMCBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzggWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA3NSV84paI4paI4paI4paI4paI4paI4paI4paMICB8IDYvOCBbMDA6MDA8MDA6MDAsIDQ4Ljk3aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgU2ltdWxhdGluZyBhc3NlbWJseSBwbGFuIGFzc2FtYmx5Li4uCiAgICAgIHsnY2FuY2VsbGVkX2Fzc2VtYmxpZXMnOiAyLCAnZXJyb3JlZF9hc3NlbWJsaWVzJzogOCwgJ3ZhbGlkX2Fzc2VtYmxpZXMnOiAwfQogICAgICBHZW5lcmF0aW5nIGFzc2VtYmxpZXMgcmVwb3J0cy4uLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZ2VuYmFua1xfZmlsZXMgfCBgIHsidmFsdWVzIjogW3siaWQiOiA3LCAic3JjIjogImhkY2EifV19IGAgfAogICAgICAgfCBkb21lc3RpY2F0ZWRcX2lucHV0IHwgYCBOb25lIGAgfAogICAgICAgfCBhc3NlbWJseVxfcGxhblxfbmFtZSB8IGAgIkJBU0lDQXNzZW1ibHkiIGAgfAogICAgICAgfCB0b3BvbG9neSB8IGAgImNpcmN1bGFyIiBgIHwKICAgICAgIHwgYWR2IHwgYCB7ImVuenltZSI6ICJhdXRvIiwgInVzZV9maWxlX25hbWVzX2FzX2lkcyI6IHRydWV9IGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcG0xZnlvYjN0L2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJpbnB1dCIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBjbG9uaW5nX3NpbXVsYXRpb24gKFRlc3QgIyA1KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIG1rZGlyICdvdXRkaXJfemlwJyAmJiBta2RpciAnb3V0ZGlyX2diJyAmJiBjcCAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy80LzkvYS9kYXRhc2V0XzQ5YWYyYzA4LTNhZDQtNDk0MC1hZTg0LWY5M2RmM2MwZGQ4YS5kYXQnICdhc3NlbWJseV9jc3YuY3N2JyAmJiBweXRob24gJy9ob21lL3JraGFsZWQvZ2FsYXh5dG9vbHMvdG9vbHMvY2xvbmluZ19zaW11bGF0aW9uL2Nsb25pbmdfc2ltdWxhdGlvbi5weScgLS1wYXJ0c19maWxlcyAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy84LzkvNC9kYXRhc2V0Xzg5NGQwYTVlLTJkODctNDg2MS04NWNiLWI1Y2FlODNiMTljYi5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8zLzEvNS9kYXRhc2V0XzMxNWYxODA4LWU5YzUtNDVmYi04Y2I4LWI3MWU4ZTFjODM2Ni5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzYvNy9kYXRhc2V0X2I2N2E2MjY0LTYyMDgtNGI0NC04ZmQ0LTQ3YmEzZjk2ZmFlZS5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9jL2UvMy9kYXRhc2V0X2NlM2EwYjVlLTAzNDQtNDQyMi1iODRhLTg0OTA0ODE4Mzk2Yi5kYXQsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzcvZC9kYXRhc2V0X2I3ZGNhY2UzLTJkYmQtNDlkYi05NGFjLTk4NDg1YmY1MjJhYS5kYXQnIC0tZG9tZXN0aWNhdGVkX3NlcSAnJyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1hc3NlbWJseV9wbGFuX25hbWUgJ0Jpb0JyaWNrU3RhbmRhcmRBc3NlbWJseScgLS1maWxlX25hbWVfbWFwcGluZyAnL3RtcC90bXBtMWZ5b2IzdC9maWxlcy84LzkvNC9kYXRhc2V0Xzg5NGQwYTVlLTJkODctNDg2MS04NWNiLWI1Y2FlODNiMTljYi5kYXQ6QkJhX0UwMDQwX0dGUC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzMvMS81L2RhdGFzZXRfMzE1ZjE4MDgtZTljNS00NWZiLThjYjgtYjcxZThlMWM4MzY2LmRhdDpCQmFfSjIzMTE5X3Byb20uZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzYvNy9kYXRhc2V0X2I2N2E2MjY0LTYyMDgtNGI0NC04ZmQ0LTQ3YmEzZjk2ZmFlZS5kYXQ6QkJhX0oyMzExOV9wcm9tX2ZsYXdlZC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2MvZS8zL2RhdGFzZXRfY2UzYTBiNWUtMDM0NC00NDIyLWI4NGEtODQ5MDQ4MTgzOTZiLmRhdDpCQmFfSjYxMDQ4X3Rlcm0uZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9iLzcvZC9kYXRhc2V0X2I3ZGNhY2UzLTJkYmQtNDlkYi05NGFjLTk4NDg1YmY1MjJhYS5kYXQ6QkJhX0s2MTEwOTRfYmFyLmdiJyAtLWZpbGVfbmFtZV9tYXBwaW5nX2RvbSAnJyAtLXVzZV9maWxlX25hbWVzX2FzX2lkICd0cnVlJyAtLW91dGRpcl9zaW11bGF0aW9uICdvdXRkaXJfemlwJyAtLW91dGRpcl9nYiAnb3V0ZGlyX2diJyAtLW91dHB1dF9zaW11bGF0aW9uICdvdXRwdXRfemlwLnppcCcgLS1lbnp5bWUgJ2F1dG8nIC0tdG9wb2xvZ3kgJ2NpcmN1bGFyJyAmJiBjcCAnb3V0cHV0X3ppcC56aXAnICcvdG1wL3RtcG0xZnlvYjN0L2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzUvb3V0cHV0cy9kYXRhc2V0XzNmNzJlYTY0LTAyZjMtNDEzZS05ZDlhLTVjNDNlYWFhZGYxNC5kYXQnCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMyBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMyBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDY3JXzilojilojilojilojilojilojilosgICB8IDIvMyBbMDA6MDA8MDA6MDAsICAyLjA0aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAxMDAlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiHwgMy8zIFswMDowMTwwMDowMCwgIDEuNjZpdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBTaW11bGF0aW5nIGFzc2VtYmx5IHBsYW4gYXNzYW1ibHkuLi4KICAgICAgeydjYW5jZWxsZWRfYXNzZW1ibGllcyc6IDAsICdlcnJvcmVkX2Fzc2VtYmxpZXMnOiAwLCAndmFsaWRfYXNzZW1ibGllcyc6IDN9CiAgICAgIEdlbmVyYXRpbmcgYXNzZW1ibGllcyByZXBvcnRzLi4uCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBnZW5iYW5rXF9maWxlcyB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDksICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGFzc2VtYmx5XF9wbGFuXF9uYW1lIHwgYCAiQmlvQnJpY2tTdGFuZGFyZEFzc2VtYmx5IiBgIHwKICAgICAgIHwgdG9wb2xvZ3kgfCBgICJjaXJjdWxhciIgYCB8CiAgICAgICB8IGFkdiB8IGAgeyJlbnp5bWUiOiAiYXV0byIsICJ1c2VfZmlsZV9uYW1lc19hc19pZHMiOiB0cnVlfSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtMWZ5b2IzdC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgY2xvbmluZ19zaW11bGF0aW9uIChUZXN0ICMgNik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBta2RpciAnb3V0ZGlyX3ppcCcgJiYgbWtkaXIgJ291dGRpcl9nYicgJiYgY3AgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZi8yLzMvZGF0YXNldF9mMjM5MGJhNi1iODkxLTRjNzUtYjViNC04ODFmYWJlMTUyMTIuZGF0JyAnYXNzZW1ibHlfY3N2LmNzdicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2Nsb25pbmdfc2ltdWxhdGlvbi9jbG9uaW5nX3NpbXVsYXRpb24ucHknIC0tcGFydHNfZmlsZXMgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZC9mL2UvZGF0YXNldF9kZmU3MWI3MS0yNjAzLTQ4Y2YtYmY1OS03NzI3MjRhYmVhMGYuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMC85LzIvZGF0YXNldF8wOTI2MDAxNy1hYzllLTQ4NjgtYjM4Ni0yN2VmMDdjYTAzYTguZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOC80L2UvZGF0YXNldF84NGU1NzAyNi00ZTg1LTRhNjMtYjY2YS04YmFlNWI3NjdmMGMuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNy9kLzIvZGF0YXNldF83ZDI2ZDM2ZC1iYjFjLTRmODMtYmU0Zi0zMzExZTRlYzI0NDEuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOC9hLzAvZGF0YXNldF84YTBmZjFlNS1hYWY3LTQ2MWUtYjY0Mi1iNjBlNWNmMTMxMzIuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZi85LzQvZGF0YXNldF9mOTRmYjdjOS03NjFiLTRkYzEtOGNhYS1hMDJlZTc4OTJjNTkuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy83L2UvZGF0YXNldF9jN2U0MDhiNS05MjdiLTQ5NjYtOGQxZi0wOGRlM2I0MWZjMzQuZGF0JyAtLWRvbWVzdGljYXRlZF9zZXEgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYi8yLzYvZGF0YXNldF9iMjYzZTExZi0xZDUyLTQ1ZDQtODY3OS04YmIyMzY2ODE1NGEuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy80L2MvZGF0YXNldF9jNGMwOGU4Zi0zZmZjLTQwZDAtOGEyNy0xYmVlOGI1ZjZmZWUuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZC9kL2MvZGF0YXNldF9kZGNiOWY5My05YjRmLTQxZTMtYTFkZi01NTM3YjYzMjZhNzguZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS85L2IvZGF0YXNldF85OWJhYzk4ZC0xY2JmLTRhYjEtYTY4MC00OWNkYjcyMWU0NDcuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNi84LzUvZGF0YXNldF82ODVjZDU3MS04MGI1LTRjMDMtYjI0Ny00ZmI1MWUxOTk2MzkuZGF0JyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1hc3NlbWJseV9wbGFuX25hbWUgJ1R5cGUyc1Jlc3RyaWN0aW9uQXNzZW1ibHknIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZC9mL2UvZGF0YXNldF9kZmU3MWI3MS0yNjAzLTQ4Y2YtYmY1OS03NzI3MjRhYmVhMGYuZGF0OnBhcnRfQS5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzAvOS8yL2RhdGFzZXRfMDkyNjAwMTctYWM5ZS00ODY4LWIzODYtMjdlZjA3Y2EwM2E4LmRhdDpwYXJ0X0IuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy84LzQvZS9kYXRhc2V0Xzg0ZTU3MDI2LTRlODUtNGE2My1iNjZhLThiYWU1Yjc2N2YwYy5kYXQ6cGFydF9DLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNy9kLzIvZGF0YXNldF83ZDI2ZDM2ZC1iYjFjLTRmODMtYmU0Zi0zMzExZTRlYzI0NDEuZGF0OnBhcnRfRC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzgvYS8wL2RhdGFzZXRfOGEwZmYxZTUtYWFmNy00NjFlLWI2NDItYjYwZTVjZjEzMTMyLmRhdDpwYXJ0X0UuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9mLzkvNC9kYXRhc2V0X2Y5NGZiN2M5LTc2MWItNGRjMS04Y2FhLWEwMmVlNzg5MmM1OS5kYXQ6cGFydF9GLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy83L2UvZGF0YXNldF9jN2U0MDhiNS05MjdiLTQ5NjYtOGQxZi0wOGRlM2I0MWZjMzQuZGF0OnBhcnRfRy5nYicgLS1maWxlX25hbWVfbWFwcGluZ19kb20gJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYi8yLzYvZGF0YXNldF9iMjYzZTExZi0xZDUyLTQ1ZDQtODY3OS04YmIyMzY2ODE1NGEuZGF0OnBhcnRfSC5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2MvNC9jL2RhdGFzZXRfYzRjMDhlOGYtM2ZmYy00MGQwLThhMjctMWJlZThiNWY2ZmVlLmRhdDpwYXJ0X0kuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy9kL2QvYy9kYXRhc2V0X2RkY2I5ZjkzLTliNGYtNDFlMy1hMWRmLTU1MzdiNjMyNmE3OC5kYXQ6cGFydF9KLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS85L2IvZGF0YXNldF85OWJhYzk4ZC0xY2JmLTRhYjEtYTY4MC00OWNkYjcyMWU0NDcuZGF0OnBhcnRfSy5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzYvOC81L2RhdGFzZXRfNjg1Y2Q1NzEtODBiNS00YzAzLWIyNDctNGZiNTFlMTk5NjM5LmRhdDpwYXJ0X0wuZ2InIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wbTFmeW9iM3Qvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC80OS9vdXRwdXRzL2RhdGFzZXRfYjVjMWQ5MTgtOWE4Ni00N2FjLTlmZDAtMGQxZWVlY2IzNTE1LmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNTAlfOKWiOKWiOKWiOKWiOKWiCAgICAgfCAyLzQgWzAwOjAwPDAwOjAwLCAgMi40MGl0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDc1JXzilojilojilojilojilojilojilojilowgIHwgMy80IFswMDowMTwwMDowMCwgIDIuMjFpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6IDEwMCV84paI4paI4paI4paI4paI4paI4paI4paI4paI4paIfCA0LzQgWzAwOjAyPDAwOjAwLCAgMS44MWl0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIFNpbXVsYXRpbmcgYXNzZW1ibHkgcGxhbiBhc3NhbWJseS4uLgogICAgICB7J2NhbmNlbGxlZF9hc3NlbWJsaWVzJzogMCwgJ2Vycm9yZWRfYXNzZW1ibGllcyc6IDAsICd2YWxpZF9hc3NlbWJsaWVzJzogNH0KICAgICAgR2VuZXJhdGluZyBhc3NlbWJsaWVzIHJlcG9ydHMuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGdlbmJhbmtcX2ZpbGVzIHwgYCB7InZhbHVlcyI6IFt7ImlkIjogMTIsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIHsidmFsdWVzIjogW3siaWQiOiAxMSwgInNyYyI6ICJoZGNhIn1dfSBgIHwKICAgICAgIHwgYXNzZW1ibHlcX3BsYW5cX25hbWUgfCBgICJUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5IiBgIHwKICAgICAgIHwgdG9wb2xvZ3kgfCBgICJjaXJjdWxhciIgYCB8CiAgICAgICB8IGFkdiB8IGAgeyJlbnp5bWUiOiAiYXV0byIsICJ1c2VfZmlsZV9uYW1lc19hc19pZHMiOiB0cnVlfSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtMWZ5b2IzdC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgY2xvbmluZ19zaW11bGF0aW9uIChUZXN0ICMgNyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBta2RpciAnb3V0ZGlyX3ppcCcgJiYgbWtkaXIgJ291dGRpcl9nYicgJiYgY3AgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMy9jLzEvZGF0YXNldF8zYzEyMjFiYy1iYTUzLTRlZGUtODk5Yy1lNGRlZmJlODM4ZWIuZGF0JyAnYXNzZW1ibHlfY3N2LmNzdicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2Nsb25pbmdfc2ltdWxhdGlvbi9jbG9uaW5nX3NpbXVsYXRpb24ucHknIC0tcGFydHNfZmlsZXMgJy90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNi84L2UvZGF0YXNldF82OGVlMmU2OS1jMmQ5LTQzY2QtODUxZS0wYjY2MDg4NGNhYzIuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNS9jLzIvZGF0YXNldF81YzI5OGFmMy05Y2RiLTQ4MzctODA1NC04OTAzYzI2ODNmODUuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS9jLzEvZGF0YXNldF85YzFmZDY1MS1kZTFlLTRiYTktYThlMS1lZTc4OTUzYjBjOGUuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvZS83LzcvZGF0YXNldF9lNzdjOTU1ZC1lOWI1LTQxNzUtYTA2MS04MWI5YTc4MWQyZmYuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMy81L2QvZGF0YXNldF8zNWRmMWNlYi00MTZiLTRjMmQtYjIwYS0zZWZlOTZiNjc3MGYuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy8wLzIvZGF0YXNldF9jMDJmYzlmYi1kYzRlLTQ5ZTEtYjk5Zi04MTk5ZmQ5N2Q3OTUuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMy8zLzkvZGF0YXNldF8zMzliNGNiZi00Y2EyLTRjNDktOWNjNC05Nzk2YzViOWJhOGEuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMi8yLzQvZGF0YXNldF8yMjQ2OTQ3YS1kYmI3LTRlZDItODU1YS01NmE0MmE4OTlhYWIuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMC9hLzkvZGF0YXNldF8wYTkzNWMwMy00OGE3LTRjOGEtODA3Ny1hZWE0MDdlNTI4NWQuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMC80L2IvZGF0YXNldF8wNGJjZjljMS1jY2M4LTRkNTItYTczOS1mYjM2MzBmOTBiMDUuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvNC8wLzIvZGF0YXNldF80MDJhYWFiZS0wZWE5LTQ1MTktOTk4Yi0xMWNmNmIwN2ExZGYuZGF0LC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS9jL2YvZGF0YXNldF85Y2Y3MTk4NS1hNjJkLTRkODktODQ1Yy0yYjk5NmQ4MDk2ZmEuZGF0JyAtLWRvbWVzdGljYXRlZF9zZXEgJycgLS1hc3NlbWJseV9jc3YgJ2Fzc2VtYmx5X2Nzdi5jc3YnIC0tYXNzZW1ibHlfcGxhbl9uYW1lICdUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5JyAtLWZpbGVfbmFtZV9tYXBwaW5nICcvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzYvOC9lL2RhdGFzZXRfNjhlZTJlNjktYzJkOS00M2NkLTg1MWUtMGI2NjA4ODRjYWMyLmRhdDpwYXJ0X0EuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy81L2MvMi9kYXRhc2V0XzVjMjk4YWYzLTljZGItNDgzNy04MDU0LTg5MDNjMjY4M2Y4NS5kYXQ6cGFydF9CLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS9jLzEvZGF0YXNldF85YzFmZDY1MS1kZTFlLTRiYTktYThlMS1lZTc4OTUzYjBjOGUuZGF0OnBhcnRfQy5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzL2UvNy83L2RhdGFzZXRfZTc3Yzk1NWQtZTliNS00MTc1LWEwNjEtODFiOWE3ODFkMmZmLmRhdDpwYXJ0X0QuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8zLzUvZC9kYXRhc2V0XzM1ZGYxY2ViLTQxNmItNGMyZC1iMjBhLTNlZmU5NmI2NzcwZi5kYXQ6cGFydF9FLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvYy8wLzIvZGF0YXNldF9jMDJmYzlmYi1kYzRlLTQ5ZTEtYjk5Zi04MTk5ZmQ5N2Q3OTUuZGF0OnBhcnRfRi5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzMvMy85L2RhdGFzZXRfMzM5YjRjYmYtNGNhMi00YzQ5LTljYzQtOTc5NmM1YjliYThhLmRhdDpwYXJ0X0cuZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy8yLzIvNC9kYXRhc2V0XzIyNDY5NDdhLWRiYjctNGVkMi04NTVhLTU2YTQyYTg5OWFhYi5kYXQ6cGFydF9ILmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvMC9hLzkvZGF0YXNldF8wYTkzNWMwMy00OGE3LTRjOGEtODA3Ny1hZWE0MDdlNTI4NWQuZGF0OnBhcnRfSS5nYiwvdG1wL3RtcG0xZnlvYjN0L2ZpbGVzLzAvNC9iL2RhdGFzZXRfMDRiY2Y5YzEtY2NjOC00ZDUyLWE3MzktZmIzNjMwZjkwYjA1LmRhdDpwYXJ0X0ouZ2IsL3RtcC90bXBtMWZ5b2IzdC9maWxlcy80LzAvMi9kYXRhc2V0XzQwMmFhYWJlLTBlYTktNDUxOS05OThiLTExY2Y2YjA3YTFkZi5kYXQ6cGFydF9LLmdiLC90bXAvdG1wbTFmeW9iM3QvZmlsZXMvOS9jL2YvZGF0YXNldF85Y2Y3MTk4NS1hNjJkLTRkODktODQ1Yy0yYjk5NmQ4MDk2ZmEuZGF0OnBhcnRfTC5nYicgLS1maWxlX25hbWVfbWFwcGluZ19kb20gJycgLS11c2VfZmlsZV9uYW1lc19hc19pZCAndHJ1ZScgLS1vdXRkaXJfc2ltdWxhdGlvbiAnb3V0ZGlyX3ppcCcgLS1vdXRkaXJfZ2IgJ291dGRpcl9nYicgLS1vdXRwdXRfc2ltdWxhdGlvbiAnb3V0cHV0X3ppcC56aXAnIC0tZW56eW1lICdhdXRvJyAtLXRvcG9sb2d5ICdjaXJjdWxhcicgJiYgY3AgJ291dHB1dF96aXAuemlwJyAnL3RtcC90bXBtMWZ5b2IzdC9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzYzL291dHB1dHMvZGF0YXNldF8wMmU3ZWE1ZS02YzhmLTQxOWQtODJkZS00NzZiY2NjNTUwZWMuZGF0JwogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA1MCV84paI4paI4paI4paI4paIICAgICB8IDIvNCBbMDA6MDA8MDA6MDAsICAyLjQzaXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNzUlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWjCAgfCAzLzQgWzAwOjAxPDAwOjAwLCAgMi4yMWl0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogMTAwJXzilojilojilojilojilojilojilojilojilojiloh8IDQvNCBbMDA6MDI8MDA6MDAsICAxLjgxaXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgU2ltdWxhdGluZyBhc3NlbWJseSBwbGFuIGFzc2FtYmx5Li4uCiAgICAgIHsnY2FuY2VsbGVkX2Fzc2VtYmxpZXMnOiAwLCAnZXJyb3JlZF9hc3NlbWJsaWVzJzogMCwgJ3ZhbGlkX2Fzc2VtYmxpZXMnOiA0fQogICAgICBHZW5lcmF0aW5nIGFzc2VtYmxpZXMgcmVwb3J0cy4uLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZ2VuYmFua1xfZmlsZXMgfCBgIE5vbmUgYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIHsidmFsdWVzIjogW3siaWQiOiAxNCwgInNyYyI6ICJoZGNhIn1dfSBgIHwKICAgICAgIHwgYXNzZW1ibHlcX3BsYW5cX25hbWUgfCBgICJUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5IiBgIHwKICAgICAgIHwgdG9wb2xvZ3kgfCBgICJjaXJjdWxhciIgYCB8CiAgICAgICB8IGFkdiB8IGAgeyJlbnp5bWUiOiAiYXV0byIsICJ1c2VfZmlsZV9uYW1lc19hc19pZHMiOiB0cnVlfSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBtMWZ5b2IzdC9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCjwvZGV0YWlscz4K')); + target.innerHTML = md.render(atob('IyMgVGVzdCBTdW1tYXJ5Cgo8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6IDEwMC4wJSIgYXJpYS12YWx1ZW5vdz0iOCIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iOCIgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSI4IFBhc3NlZCI+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci13YXJuaW5nIiBzdHlsZT0id2lkdGg6IDAuMCUiIGFyaWEtdmFsdWVub3c9IjAiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9IjgiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0iMCBTa2lwcGVkIj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLWRhbmdlciIgc3R5bGU9IndpZHRoOiAwLjAlIiBhcmlhLXZhbHVlbm93PSIwIiBhcmlhLXZhbHVlbWluPSIwIiBhcmlhLXZhbHVlbWF4PSI4IiB0aXRsZT0iMCBGYWlsZWQgb3IgRXJyb3JlZCI+CiAgPC9kaXY+CjwvZGl2PgoKfCBUZXN0IFN0YXRlIHwgQ291bnQgfAp8IC0tLS0tLS0tLS0gfCAtLS0tLSB8CnwgVG90YWwgICAgICB8IDggfAp8IFBhc3NlZCAgICAgfCA4IHwKfCBFcnJvciAgICAgIHwgMCB8CnwgRmFpbHVyZSAgICB8IDAgfAp8IFNraXBwZWQgICAgfCAwIHwKCgo8ZGV0YWlscyA+PHN1bW1hcnk+UGFzc2VkIFRlc3RzPC9zdW1tYXJ5PgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBjbG9uaW5nX3NpbXVsYXRpb24gKFRlc3QgIyAxKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIG1rZGlyICdvdXRkaXJfemlwJyAmJiBta2RpciAnb3V0ZGlyX2diJyAmJiBjcCAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy8wL2IvMS9kYXRhc2V0XzBiMWQ5YTMxLWUxMjQtNDJjZi1iOTk1LWY3YzEzNjkwMGYyOS5kYXQnICdhc3NlbWJseV9jc3YuY3N2JyAmJiBweXRob24gJy9ob21lL3JraGFsZWQvZ2FsYXh5dG9vbHMvdG9vbHMvY2xvbmluZ19zaW11bGF0aW9uL2Nsb25pbmdfc2ltdWxhdGlvbi5weScgLS1wYXJ0c19maWxlcyAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy83LzYvOS9kYXRhc2V0Xzc2OTUyYzNjLWZjMTItNDc0OC04N2NiLWI2YWYzOGRiOWQzZS5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy85L2EvNi9kYXRhc2V0XzlhNjBmNGFmLWQ3ZDQtNGJjZS1hYjc5LTM3MThkYWM0NjhlZC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9mL2UvYy9kYXRhc2V0X2ZlYzA4MjM2LTRiMWItNDE3NC1hZjljLTdjM2E4NDQ4NzQyNC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8yLzAvNi9kYXRhc2V0XzIwNmNhNDE5LTc5MjEtNGZjMS05YmUwLTEyYzM1Yzg0YmQ2NS5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8zLzEvYi9kYXRhc2V0XzMxYmIwYjI0LWU3NWMtNDkzZi1hMDE2LTM3OTZkNTRlYWExOC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy82L2YvYS9kYXRhc2V0XzZmYTk1M2M3LWE5YTctNGJhNy1hMDMwLWRhMTQ3ZWFkZWZkYy5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy83L2UvZi9kYXRhc2V0XzdlZjE0N2NiLWYzMzEtNDM1Yy05YTFlLTZmMGU1MmFiZDEwMi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy85L2IvNi9kYXRhc2V0XzliNjExYzU1LWMxOWUtNDJjZS1iNDVjLTQwYWMwNDliOTRjYi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy85L2IvZC9kYXRhc2V0XzliZDg2MjdlLTA0MTctNDc1Zi1iODU1LTM1MmJjZDg5MDYzMC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8xLzYvNC9kYXRhc2V0XzE2NDEzNWMwLTdiNTQtNGVhMC04NmQzLWU5ZTkyOGNiYzM5OC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9iL2UvOS9kYXRhc2V0X2JlOTI3YmI0LTFhMzQtNDNiYi04NjgwLTgxNTg5NDU5NzMyYi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy84L2EvNC9kYXRhc2V0XzhhNGJhYjMzLWIzZTgtNDU4Ni1iMzc1LWFlOTA0ZGMwNjc5My5kYXQnIC0tZG9tZXN0aWNhdGVkX3NlcSAnJyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1maWxlX25hbWVfbWFwcGluZyAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy83LzYvOS9kYXRhc2V0Xzc2OTUyYzNjLWZjMTItNDc0OC04N2NiLWI2YWYzOGRiOWQzZS5kYXQ6cGFydF9BLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvOS9hLzYvZGF0YXNldF85YTYwZjRhZi1kN2Q0LTRiY2UtYWI3OS0zNzE4ZGFjNDY4ZWQuZGF0OnBhcnRfQi5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2YvZS9jL2RhdGFzZXRfZmVjMDgyMzYtNGIxYi00MTc0LWFmOWMtN2MzYTg0NDg3NDI0LmRhdDpwYXJ0X0MuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8yLzAvNi9kYXRhc2V0XzIwNmNhNDE5LTc5MjEtNGZjMS05YmUwLTEyYzM1Yzg0YmQ2NS5kYXQ6cGFydF9ELmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMy8xL2IvZGF0YXNldF8zMWJiMGIyNC1lNzVjLTQ5M2YtYTAxNi0zNzk2ZDU0ZWFhMTguZGF0OnBhcnRfRS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzYvZi9hL2RhdGFzZXRfNmZhOTUzYzctYTlhNy00YmE3LWEwMzAtZGExNDdlYWRlZmRjLmRhdDpwYXJ0X0YuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy83L2UvZi9kYXRhc2V0XzdlZjE0N2NiLWYzMzEtNDM1Yy05YTFlLTZmMGU1MmFiZDEwMi5kYXQ6cGFydF9HLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvOS9iLzYvZGF0YXNldF85YjYxMWM1NS1jMTllLTQyY2UtYjQ1Yy00MGFjMDQ5Yjk0Y2IuZGF0OnBhcnRfSC5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzkvYi9kL2RhdGFzZXRfOWJkODYyN2UtMDQxNy00NzVmLWI4NTUtMzUyYmNkODkwNjMwLmRhdDpwYXJ0X0kuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8xLzYvNC9kYXRhc2V0XzE2NDEzNWMwLTdiNTQtNGVhMC04NmQzLWU5ZTkyOGNiYzM5OC5kYXQ6cGFydF9KLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYi9lLzkvZGF0YXNldF9iZTkyN2JiNC0xYTM0LTQzYmItODY4MC04MTU4OTQ1OTczMmIuZGF0OnBhcnRfSy5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzgvYS80L2RhdGFzZXRfOGE0YmFiMzMtYjNlOC00NTg2LWIzNzUtYWU5MDRkYzA2NzkzLmRhdDpwYXJ0X0wuZ2InIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2pzb25fcGFyYW1lcnMgJ2ZhbHNlJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInIC0tYXNzZW1ibHlfcGxhbl9uYW1lICdUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5JyAtLXVzZV9maWxlX25hbWVzX2FzX2lkICd0cnVlJyAtLW91dGRpcl9zaW11bGF0aW9uICdvdXRkaXJfemlwJyAtLW91dGRpcl9nYiAnb3V0ZGlyX2diJyAtLW91dHB1dF9zaW11bGF0aW9uICdvdXRwdXRfemlwLnppcCcgJiYgY3AgJ291dHB1dF96aXAuemlwJyAnL3RtcC90bXBlNnBtZzdqdy9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzE0L291dHB1dHMvZGF0YXNldF85NWUyMWViYy01YmZmLTQ1NDQtYTVkNC0wNmRiMjJlOTEwNjYuZGF0JwogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA1MCV84paI4paI4paI4paI4paIICAgICB8IDIvNCBbMDA6MDA8MDA6MDAsICAyLjQ1aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNzUlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWjCAgfCAzLzQgWzAwOjAxPDAwOjAwLCAgMi4yM2l0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogMTAwJXzilojilojilojilojilojilojilojilojilojiloh8IDQvNCBbMDA6MDI8MDA6MDAsICAxLjg0aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgU2ltdWxhdGluZyBhc3NlbWJseSBwbGFuIGFzc2FtYmx5Li4uCiAgICAgIHsnY2FuY2VsbGVkX2Fzc2VtYmxpZXMnOiAwLCAnZXJyb3JlZF9hc3NlbWJsaWVzJzogMCwgJ3ZhbGlkX2Fzc2VtYmxpZXMnOiA0fQogICAgICBHZW5lcmF0aW5nIGFzc2VtYmxpZXMgcmVwb3J0cy4uLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZ2VuYmFua1xfZmlsZXMgfCBgIHsidmFsdWVzIjogW3siaWQiOiAxLCAic3JjIjogImhkY2EifV19IGAgfAogICAgICAgfCBkb21lc3RpY2F0ZWRcX2lucHV0IHwgYCBOb25lIGAgfAogICAgICAgfCBqc29uXF91c2UgfCBgIHsiX19jdXJyZW50X2Nhc2VfXyI6IDAsICJhc3NlbWJseV9wbGFuX25hbWUiOiAiVHlwZTJzUmVzdHJpY3Rpb25Bc3NlbWJseSIsICJlbnp5bWUiOiAiYXV0byIsICJ0b3BvbG9neSI6ICJjaXJjdWxhciIsICJ1c2VfanNvbl9wYXJhbWVycyI6IGZhbHNlfSBgIHwKICAgICAgIHwgdXNlXF9maWxlXF9uYW1lc1xfYXNcX2lkcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBlNnBtZzdqdy9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgY2xvbmluZ19zaW11bGF0aW9uIChUZXN0ICMgMik8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBta2RpciAnb3V0ZGlyX3ppcCcgJiYgbWtkaXIgJ291dGRpcl9nYicgJiYgY3AgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvMi9hL2QvZGF0YXNldF8yYWQ5YWZiYi03OTUzLTRjZDktYmZmMy00ODI5OTM3OTEwMjguZGF0JyAnYXNzZW1ibHlfY3N2LmNzdicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2Nsb25pbmdfc2ltdWxhdGlvbi9jbG9uaW5nX3NpbXVsYXRpb24ucHknIC0tcGFydHNfZmlsZXMgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvNy8wLzgvZGF0YXNldF83MDhlMTkwMS1iZTY0LTQxZjktYjc2Ny1iMTc0OWE3MWI3ODUuZGF0JyAtLWRvbWVzdGljYXRlZF9zZXEgJycgLS1hc3NlbWJseV9jc3YgJ2Fzc2VtYmx5X2Nzdi5jc3YnIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvNy8wLzgvZGF0YXNldF83MDhlMTkwMS1iZTY0LTQxZjktYjc2Ny1iMTc0OWE3MWI3ODUuZGF0OmdpYnNvbl9zZXF1ZW5jZXMuZmEnIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2pzb25fcGFyYW1lcnMgJ2ZhbHNlJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInIC0tYXNzZW1ibHlfcGxhbl9uYW1lICdHaWJzb25Bc3NlbWJseScgLS11c2VfZmlsZV9uYW1lc19hc19pZCAndHJ1ZScgLS1vdXRkaXJfc2ltdWxhdGlvbiAnb3V0ZGlyX3ppcCcgLS1vdXRkaXJfZ2IgJ291dGRpcl9nYicgLS1vdXRwdXRfc2ltdWxhdGlvbiAnb3V0cHV0X3ppcC56aXAnICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wZTZwbWc3ancvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC8xNy9vdXRwdXRzL2RhdGFzZXRfOWE1OGUxNjktNDdmNC00NDE4LThhM2ItMGZlYzg2MjQyYjVjLmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC81IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC81IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNDAlfOKWiOKWiOKWiOKWiCAgICAgIHwgMi81IFswMDowMDwwMDowMCwgIDQuMzdpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA2MCV84paI4paI4paI4paI4paI4paIICAgIHwgMy81IFswMDowMDwwMDowMCwgIDQuMzhpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA4MCV84paI4paI4paI4paI4paI4paI4paI4paIICB8IDQvNSBbMDA6MDA8MDA6MDAsICA0LjM4aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAxMDAlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiHwgNS81IFswMDowMTwwMDowMCwgIDMuNjJpdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBTaW11bGF0aW5nIGFzc2VtYmx5IHBsYW4gYXNzYW1ibHkuLi4KICAgICAgeydjYW5jZWxsZWRfYXNzZW1ibGllcyc6IDAsICdlcnJvcmVkX2Fzc2VtYmxpZXMnOiAyLCAndmFsaWRfYXNzZW1ibGllcyc6IDN9CiAgICAgIEdlbmVyYXRpbmcgYXNzZW1ibGllcyByZXBvcnRzLi4uCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBnZW5iYW5rXF9maWxlcyB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDMsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGpzb25cX3VzZSB8IGAgeyJfX2N1cnJlbnRfY2FzZV9fIjogMCwgImFzc2VtYmx5X3BsYW5fbmFtZSI6ICJHaWJzb25Bc3NlbWJseSIsICJlbnp5bWUiOiAiYXV0byIsICJ0b3BvbG9neSI6ICJjaXJjdWxhciIsICJ1c2VfanNvbl9wYXJhbWVycyI6IGZhbHNlfSBgIHwKICAgICAgIHwgdXNlXF9maWxlXF9uYW1lc1xfYXNcX2lkcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBlNnBtZzdqdy9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgY2xvbmluZ19zaW11bGF0aW9uIChUZXN0ICMgMyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBta2RpciAnb3V0ZGlyX3ppcCcgJiYgbWtkaXIgJ291dGRpcl9nYicgJiYgY3AgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvZC80L2YvZGF0YXNldF9kNGY0MmNmNC04NWVkLTRlYjctYWI3OS05NDQyMzk2NzFhMGMuZGF0JyAnYXNzZW1ibHlfY3N2LmNzdicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2Nsb25pbmdfc2ltdWxhdGlvbi9jbG9uaW5nX3NpbXVsYXRpb24ucHknIC0tcGFydHNfZmlsZXMgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvYy82LzYvZGF0YXNldF9jNjY2NjJmNS01MzA3LTQwZjUtYjdkOC0xYWUzNGU5YmM1OTQuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvZS9iL2IvZGF0YXNldF9lYmI3N2Q4OS1mY2FmLTRhYWQtYWUwNy1iZDZkZjFjYmM3NWQuZGF0JyAtLWRvbWVzdGljYXRlZF9zZXEgJycgLS1hc3NlbWJseV9jc3YgJ2Fzc2VtYmx5X2Nzdi5jc3YnIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvYy82LzYvZGF0YXNldF9jNjY2NjJmNS01MzA3LTQwZjUtYjdkOC0xYWUzNGU5YmM1OTQuZGF0OlJGUF9HRlBfcGxhc21pZF9CT3MuZmEsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9lL2IvYi9kYXRhc2V0X2ViYjc3ZDg5LWZjYWYtNGFhZC1hZTA3LWJkNmRmMWNiYzc1ZC5kYXQ6UkZQX0dGUF9wbGFzbWlkX3BhcnRzLmZhJyAtLWZpbGVfbmFtZV9tYXBwaW5nX2RvbSAnJyAtLXVzZV9qc29uX3BhcmFtZXJzICdmYWxzZScgLS1lbnp5bWUgJ2F1dG8nIC0tdG9wb2xvZ3kgJ2NpcmN1bGFyJyAtLWFzc2VtYmx5X3BsYW5fbmFtZSAnTGlnYXNlQ3ljbGluZ1JlYWN0aW9uQXNzZW1ibHknIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAmJiBjcCAnb3V0cHV0X3ppcC56aXAnICcvdG1wL3RtcGU2cG1nN2p3L2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjEvb3V0cHV0cy9kYXRhc2V0X2UzN2IyZDU0LWJkNGQtNDQ1Yy05MTcxLWRkMDQ5ZjQ5ZWQzNi5kYXQnCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMiBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMiBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogMTAwJXzilojilojilojilojilojilojilojilojilojiloh8IDIvMiBbMDA6MDA8MDA6MDAsICAyLjM1aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgU2ltdWxhdGluZyBhc3NlbWJseSBwbGFuIGFzc2FtYmx5Li4uCiAgICAgIHsnY2FuY2VsbGVkX2Fzc2VtYmxpZXMnOiAwLCAnZXJyb3JlZF9hc3NlbWJsaWVzJzogMiwgJ3ZhbGlkX2Fzc2VtYmxpZXMnOiAwfQogICAgICBHZW5lcmF0aW5nIGFzc2VtYmxpZXMgcmVwb3J0cy4uLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZ2VuYmFua1xfZmlsZXMgfCBgIHsidmFsdWVzIjogW3siaWQiOiA1LCAic3JjIjogImhkY2EifV19IGAgfAogICAgICAgfCBkb21lc3RpY2F0ZWRcX2lucHV0IHwgYCBOb25lIGAgfAogICAgICAgfCBqc29uXF91c2UgfCBgIHsiX19jdXJyZW50X2Nhc2VfXyI6IDAsICJhc3NlbWJseV9wbGFuX25hbWUiOiAiTGlnYXNlQ3ljbGluZ1JlYWN0aW9uQXNzZW1ibHkiLCAiZW56eW1lIjogImF1dG8iLCAidG9wb2xvZ3kiOiAiY2lyY3VsYXIiLCAidXNlX2pzb25fcGFyYW1lcnMiOiBmYWxzZX0gYCB8CiAgICAgICB8IHVzZVxfZmlsZVxfbmFtZXNcX2FzXF9pZHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wZTZwbWc3ancvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImlucHV0IiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IGNsb25pbmdfc2ltdWxhdGlvbiAoVGVzdCAjIDQpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcl96aXAnICYmIG1rZGlyICdvdXRkaXJfZ2InICYmIGNwICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvZi8xL2RhdGFzZXRfYmYxMWJkM2QtY2EwZS00NzU2LTgxMDYtMTQyMTg0ZGM1N2U3LmRhdCcgJ2Fzc2VtYmx5X2Nzdi5jc3YnICYmIHB5dGhvbiAnL2hvbWUvcmtoYWxlZC9nYWxheHl0b29scy90b29scy9jbG9uaW5nX3NpbXVsYXRpb24vY2xvbmluZ19zaW11bGF0aW9uLnB5JyAtLXBhcnRzX2ZpbGVzICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvZi8zL2RhdGFzZXRfYWYzMmRiMTYtZTZkYy00OTNmLWI2YTctNWEzYjY3MjVhNzM2LmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvNC85L2RhdGFzZXRfYTQ5MzZlOWItZDhiZS00Y2Y5LThkNmMtMWM2MjU2NzZiYzU4LmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzAvMy9jL2RhdGFzZXRfMDNjZGExMjAtMGM0ZC00NDUyLWFmYWItOTI1ZGY0YTU3MjNhLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzMvYi8xL2RhdGFzZXRfM2IxNjRjYWQtZmJhYi00N2E5LTg5NjUtYzk1ODIwODI2ZGFmLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvYi8zL2RhdGFzZXRfYWIzNTUxMWQtMmZiZi00MDE0LWIwNzktNjViMjcwYmQ5Y2M4LmRhdCcgLS1kb21lc3RpY2F0ZWRfc2VxICcnIC0tYXNzZW1ibHlfY3N2ICdhc3NlbWJseV9jc3YuY3N2JyAtLWZpbGVfbmFtZV9tYXBwaW5nICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvZi8zL2RhdGFzZXRfYWYzMmRiMTYtZTZkYy00OTNmLWI2YTctNWEzYjY3MjVhNzM2LmRhdDpHRlAuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9hLzQvOS9kYXRhc2V0X2E0OTM2ZTliLWQ4YmUtNGNmOS04ZDZjLTFjNjI1Njc2YmM1OC5kYXQ6cDE1QV9rYW4uZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8wLzMvYy9kYXRhc2V0XzAzY2RhMTIwLTBjNGQtNDQ1Mi1hZmFiLTkyNWRmNGE1NzIzYS5kYXQ6cHJvbW90ZXIuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8zL2IvMS9kYXRhc2V0XzNiMTY0Y2FkLWZiYWItNDdhOS04OTY1LWM5NTgyMDgyNmRhZi5kYXQ6UkZQLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYS9iLzMvZGF0YXNldF9hYjM1NTExZC0yZmJmLTQwMTQtYjA3OS02NWIyNzBiZDljYzguZGF0Om9saWdvcy5mYScgLS1maWxlX25hbWVfbWFwcGluZ19kb20gJycgLS11c2VfanNvbl9wYXJhbWVycyAnZmFsc2UnIC0tZW56eW1lICdhdXRvJyAtLXRvcG9sb2d5ICdjaXJjdWxhcicgLS1hc3NlbWJseV9wbGFuX25hbWUgJ0JBU0lDQXNzZW1ibHknIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAmJiBjcCAnb3V0cHV0X3ppcC56aXAnICcvdG1wL3RtcGU2cG1nN2p3L2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMjgvb3V0cHV0cy9kYXRhc2V0X2YxMzBlODRlLTgxNDAtNDQ5Yi1iYjdlLThkZjM3MGE0MjFkMS5kYXQnCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMTAgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC84IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNzUlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWjCAgfCA2LzggWzAwOjAwPDAwOjAwLCA0OS42Nml0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIFNpbXVsYXRpbmcgYXNzZW1ibHkgcGxhbiBhc3NhbWJseS4uLgogICAgICB7J2NhbmNlbGxlZF9hc3NlbWJsaWVzJzogMiwgJ2Vycm9yZWRfYXNzZW1ibGllcyc6IDgsICd2YWxpZF9hc3NlbWJsaWVzJzogMH0KICAgICAgR2VuZXJhdGluZyBhc3NlbWJsaWVzIHJlcG9ydHMuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGdlbmJhbmtcX2ZpbGVzIHwgYCB7InZhbHVlcyI6IFt7ImlkIjogNywgInNyYyI6ICJoZGNhIn1dfSBgIHwKICAgICAgIHwgZG9tZXN0aWNhdGVkXF9pbnB1dCB8IGAgTm9uZSBgIHwKICAgICAgIHwganNvblxfdXNlIHwgYCB7Il9fY3VycmVudF9jYXNlX18iOiAwLCAiYXNzZW1ibHlfcGxhbl9uYW1lIjogIkJBU0lDQXNzZW1ibHkiLCAiZW56eW1lIjogImF1dG8iLCAidG9wb2xvZ3kiOiAiY2lyY3VsYXIiLCAidXNlX2pzb25fcGFyYW1lcnMiOiBmYWxzZX0gYCB8CiAgICAgICB8IHVzZVxfZmlsZVxfbmFtZXNcX2FzXF9pZHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wZTZwbWc3ancvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImlucHV0IiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IGNsb25pbmdfc2ltdWxhdGlvbiAoVGVzdCAjIDUpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcl96aXAnICYmIG1rZGlyICdvdXRkaXJfZ2InICYmIGNwICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzMvMC83L2RhdGFzZXRfMzA3ZmY3NzQtNzhlNS00MTBiLTkyNmItMzk2YmYwMzQ2ZjVmLmRhdCcgJ2Fzc2VtYmx5X2Nzdi5jc3YnICYmIHB5dGhvbiAnL2hvbWUvcmtoYWxlZC9nYWxheHl0b29scy90b29scy9jbG9uaW5nX3NpbXVsYXRpb24vY2xvbmluZ19zaW11bGF0aW9uLnB5JyAtLXBhcnRzX2ZpbGVzICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzgvNy85L2RhdGFzZXRfODc5ZjZjNDktMTRmNS00Zjc4LThiMzItZjA2ZDA5OGE3ZjRmLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvMy9jL2RhdGFzZXRfYTNjYjhjZWEtMTZhZC00YTMzLThlNDEtYTliMzc4YjI5NzRhLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2MvNy9iL2RhdGFzZXRfYzdiY2E3MGUtMGFlOS00MDYyLWIxODUtMWUwZTVlZDExNmE2LmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvMy9hL2RhdGFzZXRfYjNhMTFiYzktNGMyOS00NzBjLTg5ODUtZDg0NWMyZjllMTgzLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzAvOC8xL2RhdGFzZXRfMDgxMjkzNDAtMjQwYy00MzQ5LWFmNmMtMDM3OWQzMmNhZTljLmRhdCcgLS1kb21lc3RpY2F0ZWRfc2VxICcnIC0tYXNzZW1ibHlfY3N2ICdhc3NlbWJseV9jc3YuY3N2JyAtLWZpbGVfbmFtZV9tYXBwaW5nICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzgvNy85L2RhdGFzZXRfODc5ZjZjNDktMTRmNS00Zjc4LThiMzItZjA2ZDA5OGE3ZjRmLmRhdDpCQmFfRTAwNDBfR0ZQLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYS8zL2MvZGF0YXNldF9hM2NiOGNlYS0xNmFkLTRhMzMtOGU0MS1hOWIzNzhiMjk3NGEuZGF0OkJCYV9KMjMxMTlfcHJvbS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2MvNy9iL2RhdGFzZXRfYzdiY2E3MGUtMGFlOS00MDYyLWIxODUtMWUwZTVlZDExNmE2LmRhdDpCQmFfSjIzMTE5X3Byb21fZmxhd2VkLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYi8zL2EvZGF0YXNldF9iM2ExMWJjOS00YzI5LTQ3MGMtODk4NS1kODQ1YzJmOWUxODMuZGF0OkJCYV9KNjEwNDhfdGVybS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzAvOC8xL2RhdGFzZXRfMDgxMjkzNDAtMjQwYy00MzQ5LWFmNmMtMDM3OWQzMmNhZTljLmRhdDpCQmFfSzYxMTA5NF9iYXIuZ2InIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2pzb25fcGFyYW1lcnMgJ2ZhbHNlJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInIC0tYXNzZW1ibHlfcGxhbl9uYW1lICdCaW9Ccmlja1N0YW5kYXJkQXNzZW1ibHknIC0tdXNlX2ZpbGVfbmFtZXNfYXNfaWQgJ3RydWUnIC0tb3V0ZGlyX3NpbXVsYXRpb24gJ291dGRpcl96aXAnIC0tb3V0ZGlyX2diICdvdXRkaXJfZ2InIC0tb3V0cHV0X3NpbXVsYXRpb24gJ291dHB1dF96aXAuemlwJyAmJiBjcCAnb3V0cHV0X3ppcC56aXAnICcvdG1wL3RtcGU2cG1nN2p3L2pvYl93b3JraW5nX2RpcmVjdG9yeS8wMDAvMzUvb3V0cHV0cy9kYXRhc2V0X2MyZjdkNzFmLWRlMjctNDhjNi1iYzFmLWI2NTZiYzhkNTNmMS5kYXQnCiAgICAgIGBgYAogICAgKipFeGl0IENvZGU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgMAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgRXJyb3I6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMyBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgIGFzc2VtYmx5OiAgIDAlfCAgICAgICAgICB8IDAvMyBbMDA6MDA8PywgP2l0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDY3JXzilojilojilojilojilojilojilosgICB8IDIvMyBbMDA6MDE8MDA6MDAsICAxLjkzaXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAxMDAlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiHwgMy8zIFswMDowMTwwMDowMCwgIDEuNTlpdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIE91dHB1dDoqKgoKICAgICogYGBgY29uc29sZQogICAgICBTaW11bGF0aW5nIGFzc2VtYmx5IHBsYW4gYXNzYW1ibHkuLi4KICAgICAgeydjYW5jZWxsZWRfYXNzZW1ibGllcyc6IDAsICdlcnJvcmVkX2Fzc2VtYmxpZXMnOiAwLCAndmFsaWRfYXNzZW1ibGllcyc6IDN9CiAgICAgIEdlbmVyYXRpbmcgYXNzZW1ibGllcyByZXBvcnRzLi4uCgogICAgICBgYGAKICAgICoqVHJhY2ViYWNrOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBgYGAKICAgKipKb2IgUGFyYW1ldGVyczoqKgoKICAgKiAgIHwgSm9iIHBhcmFtZXRlciB8IFBhcmFtZXRlciB2YWx1ZSB8CiAgICAgICB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfAogICAgICAgfCBnZW5iYW5rXF9maWxlcyB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDksICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGpzb25cX3VzZSB8IGAgeyJfX2N1cnJlbnRfY2FzZV9fIjogMCwgImFzc2VtYmx5X3BsYW5fbmFtZSI6ICJCaW9Ccmlja1N0YW5kYXJkQXNzZW1ibHkiLCAiZW56eW1lIjogImF1dG8iLCAidG9wb2xvZ3kiOiAiY2lyY3VsYXIiLCAidXNlX2pzb25fcGFyYW1lcnMiOiBmYWxzZX0gYCB8CiAgICAgICB8IHVzZVxfZmlsZVxfbmFtZXNcX2FzXF9pZHMgfCBgIHRydWUgYCB8CiAgICAgICB8IGNocm9tSW5mbyB8IGAgIi90bXAvdG1wZTZwbWc3ancvZ2FsYXh5LWRldi90b29sLWRhdGEvc2hhcmVkL3Vjc2MvY2hyb20vPy5sZW4iIGAgfAogICAgICAgfCBkYmtleSB8IGAgIj8iIGAgfAogICAgICAgfCBcX1xfaW5wdXRcX2V4dCB8IGAgImlucHV0IiBgIHwKCgoKICAgIDwvZGl2PjwvZGV0YWlscz4KCgoqIDxkZXRhaWxzIGNsYXNzPSJyY29ybmVycyBsaWdodC1ncmVlbiI+PHN1bW1hcnkgY2xhc3M9ImxpZ2h0LWdyZWVuIj4mIzk5ODk7IGNsb25pbmdfc2ltdWxhdGlvbiAoVGVzdCAjIDYpPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InBhZGRlZCI+CgogICAgKipDb21tYW5kIExpbmU6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgbWtkaXIgJ291dGRpcl96aXAnICYmIG1rZGlyICdvdXRkaXJfZ2InICYmIGNwICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzkvYi81L2RhdGFzZXRfOWI1M2U3MzYtOWFhNC00MjhiLTg2NmItNzJkMmY1MjVmOTllLmRhdCcgJ2Fzc2VtYmx5X2Nzdi5jc3YnICYmIHB5dGhvbiAnL2hvbWUvcmtoYWxlZC9nYWxheHl0b29scy90b29scy9jbG9uaW5nX3NpbXVsYXRpb24vY2xvbmluZ19zaW11bGF0aW9uLnB5JyAtLXBhcnRzX2ZpbGVzICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2QvMS81L2RhdGFzZXRfZDE1ZmYwMjYtYmFiZi00MWQxLWI5ZTAtZTcwMWUwYTUxYjZiLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzIvOS84L2RhdGFzZXRfMjk4ZDk4M2MtM2U1Yy00YjkzLTk0NGMtYjM3MmQ0Mjk1NzQwLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzQvZS8zL2RhdGFzZXRfNGUzYzAxMDMtZGJiOC00NjVjLWFiYmYtN2Y5YjY2YTgyNjNiLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzEvNS80L2RhdGFzZXRfMTU0NTIyODQtYmMxOS00M2Q2LTgzNjctMjc1MzA1NmE5NmVjLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzAvZi8zL2RhdGFzZXRfMGYzNmIzM2QtOGMxYy00NzJiLWFiYmQtYzNmNjM0MTgxNzRhLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2EvZC9kL2RhdGFzZXRfYWRkZTk3MGYtODdhOC00NWIwLTkzMDMtYWNmMGQ3ZWQ3YzJlLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzkvNi9iL2RhdGFzZXRfOTZiZDg2ZjQtY2QwYS00YTM0LWExY2YtMzA0NGE2MmY3N2EyLmRhdCcgLS1kb21lc3RpY2F0ZWRfc2VxICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzUvNS84L2RhdGFzZXRfNTU4NzY3NmEtOGM4MS00OTU0LWJmMzMtMmM5NjViZjc2MzVkLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvZi9iL2RhdGFzZXRfYmZiODE1YTItNjdjOC00Y2I1LWFmYjgtZWEzNWNmYTM3MmViLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzIvMS82L2RhdGFzZXRfMjE2YTk5OGMtMzVkZS00OGMyLWEwMTctYzNmZWQ5Nzg3MzE5LmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzgvOS8xL2RhdGFzZXRfODkxMTJlM2YtZTkzNi00NDE5LTkzOGQtYjRiNGRhYTY4ZTQwLmRhdCwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzUvMy8yL2RhdGFzZXRfNTMyMThkNzMtMGY2MS00NTI3LWIyNzktNjJjZWQ5ODcwMWQxLmRhdCcgLS1hc3NlbWJseV9jc3YgJ2Fzc2VtYmx5X2Nzdi5jc3YnIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvZC8xLzUvZGF0YXNldF9kMTVmZjAyNi1iYWJmLTQxZDEtYjllMC1lNzAxZTBhNTFiNmIuZGF0OnBhcnRfQS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzIvOS84L2RhdGFzZXRfMjk4ZDk4M2MtM2U1Yy00YjkzLTk0NGMtYjM3MmQ0Mjk1NzQwLmRhdDpwYXJ0X0IuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy80L2UvMy9kYXRhc2V0XzRlM2MwMTAzLWRiYjgtNDY1Yy1hYmJmLTdmOWI2NmE4MjYzYi5kYXQ6cGFydF9DLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMS81LzQvZGF0YXNldF8xNTQ1MjI4NC1iYzE5LTQzZDYtODM2Ny0yNzUzMDU2YTk2ZWMuZGF0OnBhcnRfRC5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzAvZi8zL2RhdGFzZXRfMGYzNmIzM2QtOGMxYy00NzJiLWFiYmQtYzNmNjM0MTgxNzRhLmRhdDpwYXJ0X0UuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9hL2QvZC9kYXRhc2V0X2FkZGU5NzBmLTg3YTgtNDViMC05MzAzLWFjZjBkN2VkN2MyZS5kYXQ6cGFydF9GLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvOS82L2IvZGF0YXNldF85NmJkODZmNC1jZDBhLTRhMzQtYTFjZi0zMDQ0YTYyZjc3YTIuZGF0OnBhcnRfRy5nYicgLS1maWxlX25hbWVfbWFwcGluZ19kb20gJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvNS81LzgvZGF0YXNldF81NTg3Njc2YS04YzgxLTQ5NTQtYmYzMy0yYzk2NWJmNzYzNWQuZGF0OnBhcnRfSC5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvZi9iL2RhdGFzZXRfYmZiODE1YTItNjdjOC00Y2I1LWFmYjgtZWEzNWNmYTM3MmViLmRhdDpwYXJ0X0kuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8yLzEvNi9kYXRhc2V0XzIxNmE5OThjLTM1ZGUtNDhjMi1hMDE3LWMzZmVkOTc4NzMxOS5kYXQ6cGFydF9KLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvOC85LzEvZGF0YXNldF84OTExMmUzZi1lOTM2LTQ0MTktOTM4ZC1iNGI0ZGFhNjhlNDAuZGF0OnBhcnRfSy5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzUvMy8yL2RhdGFzZXRfNTMyMThkNzMtMGY2MS00NTI3LWIyNzktNjJjZWQ5ODcwMWQxLmRhdDpwYXJ0X0wuZ2InIC0tdXNlX2pzb25fcGFyYW1lcnMgJ2ZhbHNlJyAtLWVuenltZSAnYXV0bycgLS10b3BvbG9neSAnY2lyY3VsYXInIC0tYXNzZW1ibHlfcGxhbl9uYW1lICdUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5JyAtLXVzZV9maWxlX25hbWVzX2FzX2lkICd0cnVlJyAtLW91dGRpcl9zaW11bGF0aW9uICdvdXRkaXJfemlwJyAtLW91dGRpcl9nYiAnb3V0ZGlyX2diJyAtLW91dHB1dF9zaW11bGF0aW9uICdvdXRwdXRfemlwLnppcCcgJiYgY3AgJ291dHB1dF96aXAuemlwJyAnL3RtcC90bXBlNnBtZzdqdy9qb2Jfd29ya2luZ19kaXJlY3RvcnkvMDAwLzQ5L291dHB1dHMvZGF0YXNldF84NTY1N2MzOC1jOWJlLTQyMWEtOGQyZS0zYmE1NGRjZDFlZTEuZGF0JwogICAgICBgYGAKICAgICoqRXhpdCBDb2RlOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIDAKICAgICAgYGBgCiAgICAqKlN0YW5kYXJkIEVycm9yOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIAogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICBhc3NlbWJseTogICAwJXwgICAgICAgICAgfCAwLzQgWzAwOjAwPD8sID9pdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6ICA1MCV84paI4paI4paI4paI4paIICAgICB8IDIvNCBbMDA6MDA8MDA6MDAsICAyLjQzaXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNzUlfOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWjCAgfCAzLzQgWzAwOjAxPDAwOjAwLCAgMi4yMml0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogMTAwJXzilojilojilojilojilojilojilojilojilojiloh8IDQvNCBbMDA6MDI8MDA6MDAsICAxLjgyaXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBPdXRwdXQ6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgU2ltdWxhdGluZyBhc3NlbWJseSBwbGFuIGFzc2FtYmx5Li4uCiAgICAgIHsnY2FuY2VsbGVkX2Fzc2VtYmxpZXMnOiAwLCAnZXJyb3JlZF9hc3NlbWJsaWVzJzogMCwgJ3ZhbGlkX2Fzc2VtYmxpZXMnOiA0fQogICAgICBHZW5lcmF0aW5nIGFzc2VtYmxpZXMgcmVwb3J0cy4uLgoKICAgICAgYGBgCiAgICAqKlRyYWNlYmFjazoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYGBgCiAgICoqSm9iIFBhcmFtZXRlcnM6KioKCiAgICogICB8IEpvYiBwYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgdmFsdWUgfAogICAgICAgfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKICAgICAgIHwgZ2VuYmFua1xfZmlsZXMgfCBgIHsidmFsdWVzIjogW3siaWQiOiAxMiwgInNyYyI6ICJoZGNhIn1dfSBgIHwKICAgICAgIHwgZG9tZXN0aWNhdGVkXF9pbnB1dCB8IGAgeyJ2YWx1ZXMiOiBbeyJpZCI6IDExLCAic3JjIjogImhkY2EifV19IGAgfAogICAgICAgfCBqc29uXF91c2UgfCBgIHsiX19jdXJyZW50X2Nhc2VfXyI6IDAsICJhc3NlbWJseV9wbGFuX25hbWUiOiAiVHlwZTJzUmVzdHJpY3Rpb25Bc3NlbWJseSIsICJlbnp5bWUiOiAiYXV0byIsICJ0b3BvbG9neSI6ICJjaXJjdWxhciIsICJ1c2VfanNvbl9wYXJhbWVycyI6IGZhbHNlfSBgIHwKICAgICAgIHwgdXNlXF9maWxlXF9uYW1lc1xfYXNcX2lkcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBlNnBtZzdqdy9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCiogPGRldGFpbHMgY2xhc3M9InJjb3JuZXJzIGxpZ2h0LWdyZWVuIj48c3VtbWFyeSBjbGFzcz0ibGlnaHQtZ3JlZW4iPiYjOTk4OTsgY2xvbmluZ19zaW11bGF0aW9uIChUZXN0ICMgNyk8L3N1bW1hcnk+PGRpdiBjbGFzcz0icGFkZGVkIj4KCiAgICAqKkNvbW1hbmQgTGluZToqKgoKICAgICogYGBgY29uc29sZQogICAgICBta2RpciAnb3V0ZGlyX3ppcCcgJiYgbWtkaXIgJ291dGRpcl9nYicgJiYgY3AgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvMi84LzQvZGF0YXNldF8yODQ0ZmM5OS0zZGIyLTQ1OGItOTY1Ni05YzE4OTYyYWVkMTMuZGF0JyAnYXNzZW1ibHlfY3N2LmNzdicgJiYgcHl0aG9uICcvaG9tZS9ya2hhbGVkL2dhbGF4eXRvb2xzL3Rvb2xzL2Nsb25pbmdfc2ltdWxhdGlvbi9jbG9uaW5nX3NpbXVsYXRpb24ucHknIC0tcGFydHNfZmlsZXMgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvMy82LzcvZGF0YXNldF8zNjdjOGFkYi02MjNiLTRmYzItODcxMC0xNDAyYjkwZGMyN2EuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYi84L2MvZGF0YXNldF9iOGMxNTY4My1hMzY5LTRiNTItYjk0ZC01MmU4MjNlMmRiYzQuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvNy9iLzcvZGF0YXNldF83YjcxMTk3Yi05Y2VjLTRlYmMtYTBhYi05YTkwNzA4NTY2ODAuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMC84LzIvZGF0YXNldF8wODIwM2JmNC1lMjg1LTRlNDEtODQ1ZC1jN2RiMTA3MDlhMTQuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYi8xLzcvZGF0YXNldF9iMTc0ZjZmOC1lYjBjLTQ0YjktOWQxYi04OWI3YTYyYmM0OTQuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYy81LzkvZGF0YXNldF9jNTk4ZDNiNi01OGFiLTQ2OTUtOTlhNS01ZmI2MTk3YTQ4MjMuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMC85L2UvZGF0YXNldF8wOWVlYzQ1Ny0zN2RlLTRjMmMtOGI3ZS0xYmUxZGZiYWZmZDYuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvZS84LzQvZGF0YXNldF9lODRiYzY2Zi1mMzI3LTQwNzAtODUxMS1jNTczNDE2MWVhNGIuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvZC9iLzAvZGF0YXNldF9kYjBjMGYxNy0wOTczLTQ4ZjItYTcwYS0yNzYwYzc1MjFhZjMuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYS9mLzEvZGF0YXNldF9hZjE3MTYyNS0wYmI3LTRhNWYtYTg1OC1mOTI5ODNlOWY1NGUuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMy81LzEvZGF0YXNldF8zNTE1ZmQzMS0wNzU4LTRlMTQtYTZhYy1iMDFiYTk5NDE4NTAuZGF0LC90bXAvdG1wZTZwbWc3ancvZmlsZXMvZi8yLzEvZGF0YXNldF9mMjExOWViNC1jOWNhLTQ2MWYtOGQ0MC02Mjg0ZWZmYmVmYTEuZGF0JyAtLWRvbWVzdGljYXRlZF9zZXEgJycgLS1hc3NlbWJseV9jc3YgJ2Fzc2VtYmx5X2Nzdi5jc3YnIC0tZmlsZV9uYW1lX21hcHBpbmcgJy90bXAvdG1wZTZwbWc3ancvZmlsZXMvMy82LzcvZGF0YXNldF8zNjdjOGFkYi02MjNiLTRmYzItODcxMC0xNDAyYjkwZGMyN2EuZGF0OnBhcnRfQS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvOC9jL2RhdGFzZXRfYjhjMTU2ODMtYTM2OS00YjUyLWI5NGQtNTJlODIzZTJkYmM0LmRhdDpwYXJ0X0IuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy83L2IvNy9kYXRhc2V0XzdiNzExOTdiLTljZWMtNGViYy1hMGFiLTlhOTA3MDg1NjY4MC5kYXQ6cGFydF9DLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMC84LzIvZGF0YXNldF8wODIwM2JmNC1lMjg1LTRlNDEtODQ1ZC1jN2RiMTA3MDlhMTQuZGF0OnBhcnRfRC5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2IvMS83L2RhdGFzZXRfYjE3NGY2ZjgtZWIwYy00NGI5LTlkMWItODliN2E2MmJjNDk0LmRhdDpwYXJ0X0UuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9jLzUvOS9kYXRhc2V0X2M1OThkM2I2LTU4YWItNDY5NS05OWE1LTVmYjYxOTdhNDgyMy5kYXQ6cGFydF9GLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMC85L2UvZGF0YXNldF8wOWVlYzQ1Ny0zN2RlLTRjMmMtOGI3ZS0xYmUxZGZiYWZmZDYuZGF0OnBhcnRfRy5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2UvOC80L2RhdGFzZXRfZTg0YmM2NmYtZjMyNy00MDcwLTg1MTEtYzU3MzQxNjFlYTRiLmRhdDpwYXJ0X0guZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9kL2IvMC9kYXRhc2V0X2RiMGMwZjE3LTA5NzMtNDhmMi1hNzBhLTI3NjBjNzUyMWFmMy5kYXQ6cGFydF9JLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYS9mLzEvZGF0YXNldF9hZjE3MTYyNS0wYmI3LTRhNWYtYTg1OC1mOTI5ODNlOWY1NGUuZGF0OnBhcnRfSi5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzMvNS8xL2RhdGFzZXRfMzUxNWZkMzEtMDc1OC00ZTE0LWE2YWMtYjAxYmE5OTQxODUwLmRhdDpwYXJ0X0suZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9mLzIvMS9kYXRhc2V0X2YyMTE5ZWI0LWM5Y2EtNDYxZi04ZDQwLTYyODRlZmZiZWZhMS5kYXQ6cGFydF9MLmdiJyAtLWZpbGVfbmFtZV9tYXBwaW5nX2RvbSAnJyAtLXVzZV9qc29uX3BhcmFtZXJzICdmYWxzZScgLS1lbnp5bWUgJ2F1dG8nIC0tdG9wb2xvZ3kgJ2NpcmN1bGFyJyAtLWFzc2VtYmx5X3BsYW5fbmFtZSAnVHlwZTJzUmVzdHJpY3Rpb25Bc3NlbWJseScgLS11c2VfZmlsZV9uYW1lc19hc19pZCAndHJ1ZScgLS1vdXRkaXJfc2ltdWxhdGlvbiAnb3V0ZGlyX3ppcCcgLS1vdXRkaXJfZ2IgJ291dGRpcl9nYicgLS1vdXRwdXRfc2ltdWxhdGlvbiAnb3V0cHV0X3ppcC56aXAnICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wZTZwbWc3ancvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC82My9vdXRwdXRzL2RhdGFzZXRfZmM0YTk1YmEtNDM2OC00NDU3LWIxNzUtZWJmMjZhZjY1OWFhLmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNTAlfOKWiOKWiOKWiOKWiOKWiCAgICAgfCAyLzQgWzAwOjAwPDAwOjAwLCAgMi40MGl0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDc1JXzilojilojilojilojilojilojilojilowgIHwgMy80IFswMDowMTwwMDowMCwgIDIuMTlpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6IDEwMCV84paI4paI4paI4paI4paI4paI4paI4paI4paI4paIfCA0LzQgWzAwOjAyPDAwOjAwLCAgMS44MGl0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIFNpbXVsYXRpbmcgYXNzZW1ibHkgcGxhbiBhc3NhbWJseS4uLgogICAgICB7J2NhbmNlbGxlZF9hc3NlbWJsaWVzJzogMCwgJ2Vycm9yZWRfYXNzZW1ibGllcyc6IDAsICd2YWxpZF9hc3NlbWJsaWVzJzogNH0KICAgICAgR2VuZXJhdGluZyBhc3NlbWJsaWVzIHJlcG9ydHMuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGdlbmJhbmtcX2ZpbGVzIHwgYCBOb25lIGAgfAogICAgICAgfCBkb21lc3RpY2F0ZWRcX2lucHV0IHwgYCB7InZhbHVlcyI6IFt7ImlkIjogMTQsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGpzb25cX3VzZSB8IGAgeyJfX2N1cnJlbnRfY2FzZV9fIjogMCwgImFzc2VtYmx5X3BsYW5fbmFtZSI6ICJUeXBlMnNSZXN0cmljdGlvbkFzc2VtYmx5IiwgImVuenltZSI6ICJhdXRvIiwgInRvcG9sb2d5IjogImNpcmN1bGFyIiwgInVzZV9qc29uX3BhcmFtZXJzIjogZmFsc2V9IGAgfAogICAgICAgfCB1c2VcX2ZpbGVcX25hbWVzXF9hc1xfaWRzIHwgYCB0cnVlIGAgfAogICAgICAgfCBjaHJvbUluZm8gfCBgICIvdG1wL3RtcGU2cG1nN2p3L2dhbGF4eS1kZXYvdG9vbC1kYXRhL3NoYXJlZC91Y3NjL2Nocm9tLz8ubGVuIiBgIHwKICAgICAgIHwgZGJrZXkgfCBgICI/IiBgIHwKICAgICAgIHwgXF9cX2lucHV0XF9leHQgfCBgICJpbnB1dCIgYCB8CgoKCiAgICA8L2Rpdj48L2RldGFpbHM+CgoKKiA8ZGV0YWlscyBjbGFzcz0icmNvcm5lcnMgbGlnaHQtZ3JlZW4iPjxzdW1tYXJ5IGNsYXNzPSJsaWdodC1ncmVlbiI+JiM5OTg5OyBjbG9uaW5nX3NpbXVsYXRpb24gKFRlc3QgIyA4KTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYWRkZWQiPgoKICAgICoqQ29tbWFuZCBMaW5lOioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIG1rZGlyICdvdXRkaXJfemlwJyAmJiBta2RpciAnb3V0ZGlyX2diJyAmJiBjcCAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy8xLzUvZS9kYXRhc2V0XzE1ZTc2MzkzLThiNmQtNDRhNC1hZDU0LTYxZTkwOTBmMjI4MS5kYXQnICdhc3NlbWJseV9jc3YuY3N2JyAmJiBweXRob24gJy9ob21lL3JraGFsZWQvZ2FsYXh5dG9vbHMvdG9vbHMvY2xvbmluZ19zaW11bGF0aW9uL2Nsb25pbmdfc2ltdWxhdGlvbi5weScgLS1wYXJ0c19maWxlcyAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy81LzkvNS9kYXRhc2V0XzU5NTJlYWM3LTcyYzUtNGU4Ny1iYWM0LTk0YTZlYjNkNzI1OC5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9jLzYvYy9kYXRhc2V0X2M2Y2FmMGI2LThkMDctNDk5OC04ZDBkLTI5YjVkNzZmYWY0Ni5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9jLzMvZS9kYXRhc2V0X2MzZTFlZjlkLWQ4NzctNDQyMy05ZjZkLTBjMWQxMDljMDEwMS5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy84LzYvYS9kYXRhc2V0Xzg2YTI0MzY1LTZlZWQtNDQxNS1iNTZmLWQwZmY5ODU0ZjBkYi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy82LzkvNi9kYXRhc2V0XzY5Njk4NzQ5LWFiMTAtNDg2NS1iMTlhLWVmNGM1Y2I0Nzk5Ni5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy84L2UvZC9kYXRhc2V0XzhlZGE1MGRjLTZiNGItNGFmOC05MDg3LWM2NDczZTM0NWE0Ny5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9mLzkvOS9kYXRhc2V0X2Y5OWVjMTA4LWEzYzYtNGU4MC04ZWZmLTY4ZDliOGU5ZjY3Yy5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8xLzgvNy9kYXRhc2V0XzE4N2MyYzkzLTBhNjMtNDFjZS1iZjRmLTg4YjdjNzcwNTU3Yi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy8zL2QvNy9kYXRhc2V0XzNkN2YwNjI3LWJhMWMtNDU0MS05NWY3LTI3ZWQ0MWU2MDFmYS5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy80L2MvMS9kYXRhc2V0XzRjMThkOWE1LWUzN2MtNDI4ZS1hNWEzLThmNjk4YmJkOWIzZi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9jL2QvMi9kYXRhc2V0X2NkMjE1MjVlLWQ0ZTQtNGUwMy1hNjMyLTVhNzE1MjUyOWQ4Mi5kYXQsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9jL2EvYS9kYXRhc2V0X2NhYTRhMTY2LWYzMGItNDVmNS1iMWE5LWNkYWNjNmI0MDA3My5kYXQnIC0tZG9tZXN0aWNhdGVkX3NlcSAnJyAtLWFzc2VtYmx5X2NzdiAnYXNzZW1ibHlfY3N2LmNzdicgLS1maWxlX25hbWVfbWFwcGluZyAnL3RtcC90bXBlNnBtZzdqdy9maWxlcy81LzkvNS9kYXRhc2V0XzU5NTJlYWM3LTcyYzUtNGU4Ny1iYWM0LTk0YTZlYjNkNzI1OC5kYXQ6cGFydF9BLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYy82L2MvZGF0YXNldF9jNmNhZjBiNi04ZDA3LTQ5OTgtOGQwZC0yOWI1ZDc2ZmFmNDYuZGF0OnBhcnRfQi5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2MvMy9lL2RhdGFzZXRfYzNlMWVmOWQtZDg3Ny00NDIzLTlmNmQtMGMxZDEwOWMwMTAxLmRhdDpwYXJ0X0MuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy84LzYvYS9kYXRhc2V0Xzg2YTI0MzY1LTZlZWQtNDQxNS1iNTZmLWQwZmY5ODU0ZjBkYi5kYXQ6cGFydF9ELmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvNi85LzYvZGF0YXNldF82OTY5ODc0OS1hYjEwLTQ4NjUtYjE5YS1lZjRjNWNiNDc5OTYuZGF0OnBhcnRfRS5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzgvZS9kL2RhdGFzZXRfOGVkYTUwZGMtNmI0Yi00YWY4LTkwODctYzY0NzNlMzQ1YTQ3LmRhdDpwYXJ0X0YuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy9mLzkvOS9kYXRhc2V0X2Y5OWVjMTA4LWEzYzYtNGU4MC04ZWZmLTY4ZDliOGU5ZjY3Yy5kYXQ6cGFydF9HLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvMS84LzcvZGF0YXNldF8xODdjMmM5My0wYTYzLTQxY2UtYmY0Zi04OGI3Yzc3MDU1N2IuZGF0OnBhcnRfSC5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzMvZC83L2RhdGFzZXRfM2Q3ZjA2MjctYmExYy00NTQxLTk1ZjctMjdlZDQxZTYwMWZhLmRhdDpwYXJ0X0kuZ2IsL3RtcC90bXBlNnBtZzdqdy9maWxlcy80L2MvMS9kYXRhc2V0XzRjMThkOWE1LWUzN2MtNDI4ZS1hNWEzLThmNjk4YmJkOWIzZi5kYXQ6cGFydF9KLmdiLC90bXAvdG1wZTZwbWc3ancvZmlsZXMvYy9kLzIvZGF0YXNldF9jZDIxNTI1ZS1kNGU0LTRlMDMtYTYzMi01YTcxNTI1MjlkODIuZGF0OnBhcnRfSy5nYiwvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzL2MvYS9hL2RhdGFzZXRfY2FhNGExNjYtZjMwYi00NWY1LWIxYTktY2RhY2M2YjQwMDczLmRhdDpwYXJ0X0wuZ2InIC0tZmlsZV9uYW1lX21hcHBpbmdfZG9tICcnIC0tdXNlX2pzb25fcGFyYW1lcnMgJ3RydWUnIC0tanNvbl9jb25mICcvdG1wL3RtcGU2cG1nN2p3L2ZpbGVzLzkvYi84L2RhdGFzZXRfOWI4OTlhZmYtMjgzNS00ZjEwLTg0ZjMtNTIwMzRjNTViNWRjLmRhdCcgLS11c2VfZmlsZV9uYW1lc19hc19pZCAndHJ1ZScgLS1vdXRkaXJfc2ltdWxhdGlvbiAnb3V0ZGlyX3ppcCcgLS1vdXRkaXJfZ2IgJ291dGRpcl9nYicgLS1vdXRwdXRfc2ltdWxhdGlvbiAnb3V0cHV0X3ppcC56aXAnICYmIGNwICdvdXRwdXRfemlwLnppcCcgJy90bXAvdG1wZTZwbWc3ancvam9iX3dvcmtpbmdfZGlyZWN0b3J5LzAwMC83OC9vdXRwdXRzL2RhdGFzZXRfNmVlMmNkNWMtZDQzYy00ZmM3LTllYmMtMjY1Zjg5YTg3Njk2LmRhdCcKICAgICAgYGBgCiAgICAqKkV4aXQgQ29kZToqKgoKICAgICogYGBgY29uc29sZQogICAgICAwCiAgICAgIGBgYAogICAgKipTdGFuZGFyZCBFcnJvcjoqKgoKICAgICogYGBgY29uc29sZQogICAgICAKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgYXNzZW1ibHk6ICAgMCV8ICAgICAgICAgIHwgMC80IFswMDowMDw/LCA/aXQvcywgbm93PU5vbmVdCiAgICAgIGFzc2VtYmx5OiAgNTAlfOKWiOKWiOKWiOKWiOKWiCAgICAgfCAyLzQgWzAwOjAwPDAwOjAwLCAgMi4zOWl0L3MsIG5vdz1Ob25lXQogICAgICBhc3NlbWJseTogIDc1JXzilojilojilojilojilojilojilojilowgIHwgMy80IFswMDowMTwwMDowMCwgIDIuMTlpdC9zLCBub3c9Tm9uZV0KICAgICAgYXNzZW1ibHk6IDEwMCV84paI4paI4paI4paI4paI4paI4paI4paI4paI4paIfCA0LzQgWzAwOjAyPDAwOjAwLCAgMS44MWl0L3MsIG5vdz1Ob25lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICBgYGAKICAgICoqU3RhbmRhcmQgT3V0cHV0OioqCgogICAgKiBgYGBjb25zb2xlCiAgICAgIFNpbXVsYXRpbmcgYXNzZW1ibHkgcGxhbiBhc3NhbWJseS4uLgogICAgICB7J2NhbmNlbGxlZF9hc3NlbWJsaWVzJzogMCwgJ2Vycm9yZWRfYXNzZW1ibGllcyc6IDAsICd2YWxpZF9hc3NlbWJsaWVzJzogNH0KICAgICAgR2VuZXJhdGluZyBhc3NlbWJsaWVzIHJlcG9ydHMuLi4KCiAgICAgIGBgYAogICAgKipUcmFjZWJhY2s6KioKCiAgICAqIGBgYGNvbnNvbGUKICAgICAgCiAgICAgIGBgYAogICAqKkpvYiBQYXJhbWV0ZXJzOioqCgogICAqICAgfCBKb2IgcGFyYW1ldGVyIHwgUGFyYW1ldGVyIHZhbHVlIHwKICAgICAgIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CiAgICAgICB8IGdlbmJhbmtcX2ZpbGVzIHwgYCB7InZhbHVlcyI6IFt7ImlkIjogMTYsICJzcmMiOiAiaGRjYSJ9XX0gYCB8CiAgICAgICB8IGRvbWVzdGljYXRlZFxfaW5wdXQgfCBgIE5vbmUgYCB8CiAgICAgICB8IGpzb25cX3VzZSB8IGAgeyJfX2N1cnJlbnRfY2FzZV9fIjogMSwgImpzb25fY29uZiI6IHsidmFsdWVzIjogW3siaWQiOiA5NSwgInNyYyI6ICJoZGEifV19LCAidXNlX2pzb25fcGFyYW1lcnMiOiB0cnVlfSBgIHwKICAgICAgIHwgdXNlXF9maWxlXF9uYW1lc1xfYXNcX2lkcyB8IGAgdHJ1ZSBgIHwKICAgICAgIHwgY2hyb21JbmZvIHwgYCAiL3RtcC90bXBlNnBtZzdqdy9nYWxheHktZGV2L3Rvb2wtZGF0YS9zaGFyZWQvdWNzYy9jaHJvbS8/LmxlbiIgYCB8CiAgICAgICB8IGRia2V5IHwgYCAiPyIgYCB8CiAgICAgICB8IFxfXF9pbnB1dFxfZXh0IHwgYCAiaW5wdXQiIGAgfAoKCgogICAgPC9kaXY+PC9kZXRhaWxzPgoKCjwvZGV0YWlscz4K')); \ No newline at end of file diff -r 074a76e84b80 -r fbb241adf6c2 output.json --- a/output.json Mon May 26 13:39:57 2025 +0000 +++ b/output.json Thu Jul 17 10:17:24 2025 +0000 @@ -3,101 +3,102 @@ "num_errors": 0, "num_failures": 0, "num_skips": 0, - "num_tests": 7 + "num_tests": 8 }, "tests": [ { "data": { "inputs": { - "adv|use_file_names_as_ids": true, "assembly_csv": { - "id": "1e8e6749bc68d8e8", + "id": "54d710fc68386373", "src": "hda" }, - "assembly_plan_name": "Type2sRestrictionAssembly", "genbank_files": { - "id": "e2ca7f14a85a8d44", + "id": "986c9b47c580ae59", "src": "hdca" }, - "topology": "circular" + "json_use|assembly_plan_name": "Type2sRestrictionAssembly", + "json_use|topology": "circular", + "json_use|use_json_paramers": false, + "use_file_names_as_ids": true }, "job": { - "command_line": "mkdir 'outdir_zip' && mkdir 'outdir_gb' && cp '/tmp/tmpm1fyob3t/files/2/0/d/dataset_20d4061a-81e4-4915-a841-ae8aa595c7b4.dat' 'assembly_csv.csv' && python '/home/rkhaled/galaxytools/tools/cloning_simulation/cloning_simulation.py' --parts_files '/tmp/tmpm1fyob3t/files/d/d/8/dataset_dd844d61-fc05-41d9-8179-21233649407d.dat,/tmp/tmpm1fyob3t/files/c/b/2/dataset_cb2362f3-4b32-46cc-a227-dc15742bf9e7.dat,/tmp/tmpm1fyob3t/files/6/d/7/dataset_6d72dfe4-3e6b-4baf-b7b5-9fb2e843461a.dat,/tmp/tmpm1fyob3t/files/3/3/e/dataset_33e804b2-0fbe-4844-9b5d-420e8a2db772.dat,/tmp/tmpm1fyob3t/files/2/d/b/dataset_2db3825c-538b-483f-b6ff-8dc4ecc03780.dat,/tmp/tmpm1fyob3t/files/0/4/8/dataset_048ee7ed-5f4c-41ef-aed4-f2cf975aac92.dat,/tmp/tmpm1fyob3t/files/c/5/0/dataset_c505c12e-7089-4a17-a605-4f11dad6f1d7.dat,/tmp/tmpm1fyob3t/files/4/9/1/dataset_4912f12d-0842-46b7-8aaf-2a94a52f04f8.dat,/tmp/tmpm1fyob3t/files/b/2/b/dataset_b2b96d41-c7c8-49c1-9d35-ceaa1c7d3027.dat,/tmp/tmpm1fyob3t/files/b/8/f/dataset_b8fd4610-2f6d-475c-8405-8bf8c2bc0306.dat,/tmp/tmpm1fyob3t/files/0/9/f/dataset_09f4b020-4e7b-4939-b3ba-348f91cb92bc.dat,/tmp/tmpm1fyob3t/files/e/b/7/dataset_eb730263-9442-4dca-a2dc-34b1cae450d7.dat' --domesticated_seq '' --assembly_csv 'assembly_csv.csv' --assembly_plan_name 'Type2sRestrictionAssembly' --file_name_mapping '/tmp/tmpm1fyob3t/files/d/d/8/dataset_dd844d61-fc05-41d9-8179-21233649407d.dat:part_A.gb,/tmp/tmpm1fyob3t/files/c/b/2/dataset_cb2362f3-4b32-46cc-a227-dc15742bf9e7.dat:part_B.gb,/tmp/tmpm1fyob3t/files/6/d/7/dataset_6d72dfe4-3e6b-4baf-b7b5-9fb2e843461a.dat:part_C.gb,/tmp/tmpm1fyob3t/files/3/3/e/dataset_33e804b2-0fbe-4844-9b5d-420e8a2db772.dat:part_D.gb,/tmp/tmpm1fyob3t/files/2/d/b/dataset_2db3825c-538b-483f-b6ff-8dc4ecc03780.dat:part_E.gb,/tmp/tmpm1fyob3t/files/0/4/8/dataset_048ee7ed-5f4c-41ef-aed4-f2cf975aac92.dat:part_F.gb,/tmp/tmpm1fyob3t/files/c/5/0/dataset_c505c12e-7089-4a17-a605-4f11dad6f1d7.dat:part_G.gb,/tmp/tmpm1fyob3t/files/4/9/1/dataset_4912f12d-0842-46b7-8aaf-2a94a52f04f8.dat:part_H.gb,/tmp/tmpm1fyob3t/files/b/2/b/dataset_b2b96d41-c7c8-49c1-9d35-ceaa1c7d3027.dat:part_I.gb,/tmp/tmpm1fyob3t/files/b/8/f/dataset_b8fd4610-2f6d-475c-8405-8bf8c2bc0306.dat:part_J.gb,/tmp/tmpm1fyob3t/files/0/9/f/dataset_09f4b020-4e7b-4939-b3ba-348f91cb92bc.dat:part_K.gb,/tmp/tmpm1fyob3t/files/e/b/7/dataset_eb730263-9442-4dca-a2dc-34b1cae450d7.dat:part_L.gb' --file_name_mapping_dom '' --use_file_names_as_id 'true' --outdir_simulation 'outdir_zip' --outdir_gb 'outdir_gb' --output_simulation 'output_zip.zip' --enzyme 'auto' --topology 'circular' && cp 'output_zip.zip' '/tmp/tmpm1fyob3t/job_working_directory/000/14/outputs/dataset_64d1d8ac-32f0-4095-be30-22eee31e24a4.dat'", + "command_line": "mkdir 'outdir_zip' && mkdir 'outdir_gb' && cp '/tmp/tmpe6pmg7jw/files/0/b/1/dataset_0b1d9a31-e124-42cf-b995-f7c136900f29.dat' 'assembly_csv.csv' && python '/home/rkhaled/galaxytools/tools/cloning_simulation/cloning_simulation.py' --parts_files '/tmp/tmpe6pmg7jw/files/7/6/9/dataset_76952c3c-fc12-4748-87cb-b6af38db9d3e.dat,/tmp/tmpe6pmg7jw/files/9/a/6/dataset_9a60f4af-d7d4-4bce-ab79-3718dac468ed.dat,/tmp/tmpe6pmg7jw/files/f/e/c/dataset_fec08236-4b1b-4174-af9c-7c3a84487424.dat,/tmp/tmpe6pmg7jw/files/2/0/6/dataset_206ca419-7921-4fc1-9be0-12c35c84bd65.dat,/tmp/tmpe6pmg7jw/files/3/1/b/dataset_31bb0b24-e75c-493f-a016-3796d54eaa18.dat,/tmp/tmpe6pmg7jw/files/6/f/a/dataset_6fa953c7-a9a7-4ba7-a030-da147eadefdc.dat,/tmp/tmpe6pmg7jw/files/7/e/f/dataset_7ef147cb-f331-435c-9a1e-6f0e52abd102.dat,/tmp/tmpe6pmg7jw/files/9/b/6/dataset_9b611c55-c19e-42ce-b45c-40ac049b94cb.dat,/tmp/tmpe6pmg7jw/files/9/b/d/dataset_9bd8627e-0417-475f-b855-352bcd890630.dat,/tmp/tmpe6pmg7jw/files/1/6/4/dataset_164135c0-7b54-4ea0-86d3-e9e928cbc398.dat,/tmp/tmpe6pmg7jw/files/b/e/9/dataset_be927bb4-1a34-43bb-8680-81589459732b.dat,/tmp/tmpe6pmg7jw/files/8/a/4/dataset_8a4bab33-b3e8-4586-b375-ae904dc06793.dat' --domesticated_seq '' --assembly_csv 'assembly_csv.csv' --file_name_mapping '/tmp/tmpe6pmg7jw/files/7/6/9/dataset_76952c3c-fc12-4748-87cb-b6af38db9d3e.dat:part_A.gb,/tmp/tmpe6pmg7jw/files/9/a/6/dataset_9a60f4af-d7d4-4bce-ab79-3718dac468ed.dat:part_B.gb,/tmp/tmpe6pmg7jw/files/f/e/c/dataset_fec08236-4b1b-4174-af9c-7c3a84487424.dat:part_C.gb,/tmp/tmpe6pmg7jw/files/2/0/6/dataset_206ca419-7921-4fc1-9be0-12c35c84bd65.dat:part_D.gb,/tmp/tmpe6pmg7jw/files/3/1/b/dataset_31bb0b24-e75c-493f-a016-3796d54eaa18.dat:part_E.gb,/tmp/tmpe6pmg7jw/files/6/f/a/dataset_6fa953c7-a9a7-4ba7-a030-da147eadefdc.dat:part_F.gb,/tmp/tmpe6pmg7jw/files/7/e/f/dataset_7ef147cb-f331-435c-9a1e-6f0e52abd102.dat:part_G.gb,/tmp/tmpe6pmg7jw/files/9/b/6/dataset_9b611c55-c19e-42ce-b45c-40ac049b94cb.dat:part_H.gb,/tmp/tmpe6pmg7jw/files/9/b/d/dataset_9bd8627e-0417-475f-b855-352bcd890630.dat:part_I.gb,/tmp/tmpe6pmg7jw/files/1/6/4/dataset_164135c0-7b54-4ea0-86d3-e9e928cbc398.dat:part_J.gb,/tmp/tmpe6pmg7jw/files/b/e/9/dataset_be927bb4-1a34-43bb-8680-81589459732b.dat:part_K.gb,/tmp/tmpe6pmg7jw/files/8/a/4/dataset_8a4bab33-b3e8-4586-b375-ae904dc06793.dat:part_L.gb' --file_name_mapping_dom '' --use_json_paramers 'false' --enzyme 'auto' --topology 'circular' --assembly_plan_name 'Type2sRestrictionAssembly' --use_file_names_as_id 'true' --outdir_simulation 'outdir_zip' --outdir_gb 'outdir_gb' --output_simulation 'output_zip.zip' && cp 'output_zip.zip' '/tmp/tmpe6pmg7jw/job_working_directory/000/14/outputs/dataset_95e21ebc-5bff-4544-a5d4-06db22e91066.dat'", "command_version": "", "copied_from_job_id": null, - "create_time": "2025-05-26T12:02:32.643157", + "create_time": "2025-07-17T10:10:24.406223", "dependencies": [], "exit_code": 0, - "external_id": "172939", - "galaxy_version": "24.2", + "external_id": "75641", + "galaxy_version": "25.0", "handler": null, - "history_id": "e2ca7f14a85a8d44", - "id": "a36db940f4513bd9", + "history_id": "986c9b47c580ae59", + "id": "98a2432f1cff4f91", "inputs": { "assembly_csv": { - "id": "1e8e6749bc68d8e8", + "id": "54d710fc68386373", "src": "hda", - "uuid": "20d4061a-81e4-4915-a841-ae8aa595c7b4" + "uuid": "0b1d9a31-e124-42cf-b995-f7c136900f29" }, "genbank_files1": { - "id": "e2ca7f14a85a8d44", + "id": "986c9b47c580ae59", "src": "hda", - "uuid": "dd844d61-fc05-41d9-8179-21233649407d" + "uuid": "76952c3c-fc12-4748-87cb-b6af38db9d3e" }, "genbank_files10": { - "id": "fbec4a551130f847", + "id": "8de66704b7df8b5e", "src": "hda", - "uuid": "b8fd4610-2f6d-475c-8405-8bf8c2bc0306" + "uuid": "164135c0-7b54-4ea0-86d3-e9e928cbc398" }, "genbank_files11": { - "id": "5bd8560352cb0b69", + "id": "54c6d71c8dc7cb11", "src": "hda", - "uuid": "09f4b020-4e7b-4939-b3ba-348f91cb92bc" + "uuid": "be927bb4-1a34-43bb-8680-81589459732b" }, "genbank_files12": { - "id": "cb2fe7fb50f38553", + "id": "2592d2c705ba0baa", "src": "hda", - "uuid": "eb730263-9442-4dca-a2dc-34b1cae450d7" + "uuid": "8a4bab33-b3e8-4586-b375-ae904dc06793" }, "genbank_files2": { - "id": "62e98d1a229b6ef5", + "id": "8354ecc64d56337d", "src": "hda", - "uuid": "cb2362f3-4b32-46cc-a227-dc15742bf9e7" + "uuid": "9a60f4af-d7d4-4bce-ab79-3718dac468ed" }, "genbank_files3": { - "id": "f8fe24202fc5b2e5", + "id": "c06bae188baa9490", "src": "hda", - "uuid": "6d72dfe4-3e6b-4baf-b7b5-9fb2e843461a" + "uuid": "fec08236-4b1b-4174-af9c-7c3a84487424" }, "genbank_files4": { - "id": "0d58e12bbe78a903", + "id": "71d208f6d8b613ba", "src": "hda", - "uuid": "33e804b2-0fbe-4844-9b5d-420e8a2db772" + "uuid": "206ca419-7921-4fc1-9be0-12c35c84bd65" }, "genbank_files5": { - "id": "3937d5ff7c0e1373", + "id": "58ad66a9f93223b8", "src": "hda", - "uuid": "2db3825c-538b-483f-b6ff-8dc4ecc03780" + "uuid": "31bb0b24-e75c-493f-a016-3796d54eaa18" }, "genbank_files6": { - "id": "473b1992d5f5b84f", + "id": "e9003a596293e37c", "src": "hda", - "uuid": "048ee7ed-5f4c-41ef-aed4-f2cf975aac92" + "uuid": "6fa953c7-a9a7-4ba7-a030-da147eadefdc" }, "genbank_files7": { - "id": "9b5c1fe7a52a75e0", + "id": "8c39a9a410cc0a00", "src": "hda", - "uuid": "c505c12e-7089-4a17-a605-4f11dad6f1d7" + "uuid": "7ef147cb-f331-435c-9a1e-6f0e52abd102" }, "genbank_files8": { - "id": "c32c50a47ebf8564", + "id": "f7b25594aba42961", "src": "hda", - "uuid": "4912f12d-0842-46b7-8aaf-2a94a52f04f8" + "uuid": "9b611c55-c19e-42ce-b45c-40ac049b94cb" }, "genbank_files9": { - "id": "5f035ce298b798b0", + "id": "5f098a2d242af5ee", "src": "hda", - "uuid": "b2b96d41-c7c8-49c1-9d35-ceaa1c7d3027" + "uuid": "9bd8627e-0417-475f-b855-352bcd890630" } }, "job_messages": [], @@ -108,60 +109,59 @@ "model_class": "Job", "output_collections": { "construct_gb": { - "id": "62e98d1a229b6ef5", + "id": "8354ecc64d56337d", "src": "hdca" } }, "outputs": { "__new_primary_file_construct_gb|construct_1__": { - "id": "182eefa577c2a56d", + "id": "172543d29b19f394", "src": "hda", - "uuid": "991437a5-bbe4-4adb-8831-c9a871adb17f" + "uuid": "c12d7e47-49c5-4805-8a24-5d4fb0aa8cfa" }, "__new_primary_file_construct_gb|construct_2__": { - "id": "979fd704a8b37879", + "id": "018c827a8e5b161a", "src": "hda", - "uuid": "9ebdb527-8609-4bc8-85a3-f8775156c356" + "uuid": "be0c60c4-c33d-4855-95d4-ffdb53751eea" }, "__new_primary_file_construct_gb|construct_3__": { - "id": "b53ff5232a859d40", + "id": "494079827008dff1", "src": "hda", - "uuid": "235361e4-93cc-4b56-ad81-c33ce8f593f0" + "uuid": "77ec05f3-e147-4ff3-af59-1d173fbc6d27" }, "__new_primary_file_construct_gb|construct_4__": { - "id": "1ce0e68b6cd95b3c", + "id": "665c2a499b613b70", "src": "hda", - "uuid": "49100d5c-134b-4cb0-a86b-2cf03a336b1c" + "uuid": "fd3ed880-c345-47d7-8a38-1ce5c507b417" }, "output_zip": { - "id": "a36db940f4513bd9", + "id": "98a2432f1cff4f91", "src": "hda", - "uuid": "64d1d8ac-32f0-4095-be30-22eee31e24a4" + "uuid": "95e21ebc-5bff-4544-a5d4-06db22e91066" } }, "params": { "__input_ext": "\"input\"", - "adv": "{\"enzyme\": \"auto\", \"use_file_names_as_ids\": true}", - "assembly_plan_name": "\"Type2sRestrictionAssembly\"", - "chromInfo": "\"/tmp/tmpm1fyob3t/galaxy-dev/tool-data/shared/ucsc/chrom/?.len\"", + "chromInfo": "\"/tmp/tmpe6pmg7jw/galaxy-dev/tool-data/shared/ucsc/chrom/?.len\"", "dbkey": "\"?\"", "domesticated_input": null, "genbank_files": "{\"values\": [{\"id\": 1, \"src\": \"hdca\"}]}", - "topology": "\"circular\"" + "json_use": "{\"__current_case__\": 0, \"assembly_plan_name\": \"Type2sRestrictionAssembly\", \"enzyme\": \"auto\", \"topology\": \"circular\", \"use_json_paramers\": false}", + "use_file_names_as_ids": "true" }, "state": "ok", - "stderr": "\rassembly: 0%| | 0/4 [00:00